From david@fromorbit.com Tue Mar 1 01:20:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AF2767CA0 for ; Tue, 1 Mar 2016 01:20:24 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 31ED7AC001 for ; Mon, 29 Feb 2016 23:20:21 -0800 (PST) X-ASG-Debug-ID: 1456816813-04bdf002ecbc740001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id GsmjV3TAp6fneNBB for ; Mon, 29 Feb 2016 23:20:14 -0800 (PST) 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: A2A4CABrQdVWOT0ILHleKAECgw+BP4Jsg3mfaQEBAQEBAQaLdYlQhg0CAgEBAoE2TQEBAQEBAQcBAQEBQAFAhEEBAQEEJxMcIxAIAxUDCSUPBSUDBxoTiB6/bAEBAQEBBQEBAQEcGIUyhQKHYIEPBYdUhwiEGYQZjViBaYdphS2OTIJlGYFcKC6ITAEBAQ Received: from ppp121-44-8-61.lns20.syd4.internode.on.net (HELO dastard) ([121.44.8.61]) by ipmail06.adl6.internode.on.net with ESMTP; 01 Mar 2016 17:50:12 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aaebL-00035h-9P; Tue, 01 Mar 2016 18:20:11 +1100 Date: Tue, 1 Mar 2016 18:20:11 +1100 From: Dave Chinner To: Alex Lyakas Cc: Christoph Hellwig , Danny Shavit , Shyam Kaushik , Yair Hershko , xfs@oss.sgi.com Subject: Re: xfs resize: primary superblock is not updated immediately Message-ID: <20160301072011.GF30721@dastard> X-ASG-Orig-Subj: Re: xfs resize: primary superblock is not updated immediately References: <3685DFAD20214109878873CF81232704@alyakaslap> <20160222212019.GI25832@dastard> <20160222235628.GK25832@dastard> <20160223225926.GN25832@dastard> <20160229211628.GK29057@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160229211628.GK29057@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: 1456816813 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27461 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Mar 01, 2016 at 08:16:28AM +1100, Dave Chinner wrote: > On Mon, Feb 29, 2016 at 11:47:54AM +0200, Alex Lyakas wrote: > Which means it's through the first phase of log recovery and it's > not failing in log recovery. i.e. we are now running > xfs_initialize_perag_data() after log recovery. So, as I said a > couple of posts back up this thread: > > | If log recovery succeeds, then yes, I can see that there is a > | problem here because the per-ag tree is not reinitialised after > | the superblock is re-read. That's a pretty easy fix, though (3-4 > | lines of code in xlog_do_recover() to detect a change in > | filesystem block count and call xfs_initialize_perag() again.. Patch below. -- Dave Chinner david@fromorbit.com xfs: reinitialise per-AG structures if geometry changes during recovery From: Dave Chinner If a crash occurs immediately after a filesystem grow operation, the updated superblock geometry is found only in the log. After we recover the log, the superblock is reread and re-initialised and so has the new geometry in memory. If the new geometry has more AGs than prior to the grow operation, then the new AGs will not have in-memory xfs_perag structurea associated with them. This will result in an oops when the first metadata buffer from a new AG is looked up in the buffer cache, as the block lies within the new geometry but then fails to find a perag structure on lookup. This is easily fixed by simply re-initialising the perag structure after re-reading the superblock at the conclusion of the first pahse of log recovery. This, however, does not fix the case of log recovery requiring access to metadata in the newly grown space. Fortunately for us, because the in-core superblock has not been updated, this will result in detection of access beyond the end of the filesystem and so recovery will fail at that point. If this proves to be a problem, then we can address it separately to the current reported issue. Reported-by: Alex Lyakas Signed-off-by: Dave Chinner --- fs/xfs/xfs_log_recover.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 1dc0e14..520471b 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -4898,6 +4898,7 @@ xlog_do_recover( xfs_daddr_t head_blk, xfs_daddr_t tail_blk) { + struct xfs_mount *mp = log->l_mp; int error; xfs_buf_t *bp; xfs_sb_t *sbp; @@ -4912,7 +4913,7 @@ xlog_do_recover( /* * If IO errors happened during recovery, bail out. */ - if (XFS_FORCED_SHUTDOWN(log->l_mp)) { + if (XFS_FORCED_SHUTDOWN(mp)) { return -EIO; } @@ -4925,13 +4926,13 @@ xlog_do_recover( * or iunlinks they will have some entries in the AIL; so we look at * the AIL to determine how to set the tail_lsn. */ - xlog_assign_tail_lsn(log->l_mp); + xlog_assign_tail_lsn(mp); /* * Now that we've finished replaying all buffer and inode * updates, re-read in the superblock and reverify it. */ - bp = xfs_getsb(log->l_mp, 0); + bp = xfs_getsb(mp, 0); bp->b_flags &= ~(XBF_DONE | XBF_ASYNC); ASSERT(!(bp->b_flags & XBF_WRITE)); bp->b_flags |= XBF_READ; @@ -4939,7 +4940,7 @@ xlog_do_recover( error = xfs_buf_submit_wait(bp); if (error) { - if (!XFS_FORCED_SHUTDOWN(log->l_mp)) { + if (!XFS_FORCED_SHUTDOWN(mp)) { xfs_buf_ioerror_alert(bp, __func__); ASSERT(0); } @@ -4948,14 +4949,17 @@ xlog_do_recover( } /* Convert superblock from on-disk format */ - sbp = &log->l_mp->m_sb; + sbp = &mp->m_sb; xfs_sb_from_disk(sbp, XFS_BUF_TO_SBP(bp)); - ASSERT(sbp->sb_magicnum == XFS_SB_MAGIC); - ASSERT(xfs_sb_good_version(sbp)); - xfs_reinit_percpu_counters(log->l_mp); - xfs_buf_relse(bp); + /* re-initialise in-core superblock and geometry structures */ + xfs_reinit_percpu_counters(mp); + error = xfs_initialize_perag(mp, sbp->sb_agcount, &mp->m_maxagi); + if (error) { + xfs_warn(mp, "Failed post-recovery per-ag init: %d", error); + return error; + } xlog_recover_check_summary(log); From eguan@redhat.com Tue Mar 1 02:01:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 34F4D7CA0 for ; Tue, 1 Mar 2016 02:01:12 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EA846304043 for ; Tue, 1 Mar 2016 00:01:11 -0800 (PST) X-ASG-Debug-ID: 1456819266-04cb6c5831a7cc0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id r5IO0qB7CTPwusl9 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 01 Mar 2016 00:01:08 -0800 (PST) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id AA391627C0; Tue, 1 Mar 2016 08:01:06 +0000 (UTC) Received: from localhost (dhcp-13-211.nay.redhat.com [10.66.13.211]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u21811Ew016095; Tue, 1 Mar 2016 03:01:05 -0500 Date: Tue, 1 Mar 2016 16:00:57 +0800 From: Eryu Guan To: Dan Williams Cc: Ross Zwisler , XFS Developers Subject: Re: generic/320 triggers "list_add attempted on force-poisoned entry" warning on XFS Message-ID: <20160301080057.GL11419@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: generic/320 triggers "list_add attempted on force-poisoned entry" warning on XFS References: <20160227130256.GJ11419@eguan.usersys.redhat.com> <20160228053158.GK11419@eguan.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Tue, 01 Mar 2016 08:01:06 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1456819267 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Feb 29, 2016 at 10:22:06AM -0800, Dan Williams wrote: > On Sat, Feb 27, 2016 at 9:31 PM, Eryu Guan wrote: > > On Sat, Feb 27, 2016 at 12:10:51PM -0800, Dan Williams wrote: > >> On Sat, Feb 27, 2016 at 5:02 AM, Eryu Guan wrote: > >> > Hi, > >> > > >> > Starting from 4.5-rc1 kernel, I sometimes see generic/320 triggers > >> > "list_add attempted on force-poisoned entry" warnings on XFS, test hosts > >> > are arm64/ppc64/ppc64le, haven't seen it on x86_64 hosts. > >> > >> Hmm, this triggers when a list_head has ->next or ->prev pointing at > >> the address of force_poison which is only defined in lib/list_debug.c. > >> The only call site that uses list_force_poison() is in > >> devm_memremap_pages(). That currently depends on CONFIG_ZONE_DEVICE > >> which in turn depends on X86_64. > >> > >> So, this appears to be a false positive and the address of > >> force_poison is somehow ending up on the stack by accident as that is > >> the random value being passed in from __down_common: > >> > >> struct semaphore_waiter waiter; > >> > >> list_add_tail(&waiter.list, &sem->wait_list); > >> > >> So, I think we need a more unique poison value that should never > >> appear on the stack: > > > > Unfortunately I can still see the warning after applying this test patch. > > > > Then I added debug code to print the pointer value and re-ran the test. > > All five failures printed the same pointer value, failed in the same > > pattern: > > > > list_add attempted on force-poisoned entry(0000000000000500), new->next = c00000000136bc00, new->prev = 0000000000000500 > > > > I think this means that no matter what we do the stack will pick up > these poison values unless the list_head is explicitly initialized. > Something like the following: Umm, it's still reproducible... but seems harder than before, it took me 200+ iterations to hit (less than 10 iterations in previous runs) [ 5465.401191] run fstests generic/320 at 2016-03-01 00:11:13 [ 5465.561754] XFS (sda5): Unmounting Filesystem [ 5466.202130] XFS (sda5): Mounting V4 Filesystem [ 5466.260396] XFS (sda5): Ending clean mount [ 5482.629036] list_add attempted on force-poisoned entry(0000000000000500), new->next == d0000000059ecdb0, new->prev == 0000000000000500 [ 5482.629070] ------------[ cut here ]------------ [ 5482.629077] WARNING: at lib/list_debug.c:33 [ 5482.629082] Modules linked in: pseries_rng(E) sg(E) nfsd(E) auth_rpcgss(E) nfs_acl(E) lockd(E) sunrpc(E) grace(E) ip_tables(E) xfs(E) libcrc32c(E) sd_mod(E) ibmvscsi(E) scsi_transport_srp(E) ibmveth(E) [ 5482.629121] CPU: 4 PID: 7203 Comm: rm Tainted: G E 4.5.0-rc5+ #4 [ 5482.629129] task: c0000005f0712d00 ti: c0000004c749c000 task.ti: c0000004c749c000 [ 5482.629136] NIP: c00000000042db78 LR: c00000000042db74 CTR: 00000000013abb8c [ 5482.629144] REGS: c0000004c749f3a0 TRAP: 0700 Tainted: G E (4.5.0-rc5+) [ 5482.629150] MSR: 8000000100029032 CR: 22002822 XER: 0000000b [ 5482.629173] CFAR: c00000000080a5e4 SOFTE: 0 GPR00: c00000000042db74 c0000004c749f620 c00000000136bc00 000000000000007a GPR04: c0000005ffc09c58 c0000005ffc1b490 000005cf29ac0100 0000000000000000 GPR08: 0000000000000000 c000000000c3b27c 00000005fefd0000 0000000000000f97 GPR12: 0000000042002844 c00000000e822400 0000000000000002 0000000000000000 GPR16: 000000001000da78 000000001000d758 0000010018009cd0 000000001000dab8 GPR20: 0000000000000001 c0000004c749f960 c0000005f5931e00 c0000005f5931e80 GPR24: c0000000fd01c000 c0000000fbe0a400 fffffffffffff000 0000000000000000 GPR28: c0000005ea59f938 c0000005f5931e88 c0000005f1f6b890 c0000004c749f720 [ 5482.629270] NIP [c00000000042db78] .__list_add+0xa8/0x140 [ 5482.629277] LR [c00000000042db74] .__list_add+0xa4/0x140 [ 5482.629282] Call Trace: [ 5482.629288] [c0000004c749f620] [c00000000042db74] .__list_add+0xa4/0x140 (unreliable) [ 5482.629299] [c0000004c749f6b0] [c0000000008010ec] .rwsem_down_read_failed+0x6c/0x1a0 [ 5482.629310] [c0000004c749f760] [c000000000800828] .down_read+0x58/0x60 [ 5482.629396] [c0000004c749f7e0] [d000000005a1a6bc] .xfs_log_commit_cil+0x7c/0x600 [xfs] [ 5482.629482] [c0000004c749f8f0] [d000000005a12848] .__xfs_trans_commit+0x178/0x300 [xfs] [ 5482.629567] [c0000004c749f990] [d000000005a12f14] .__xfs_trans_roll+0x74/0x130 [xfs] [ 5482.629653] [c0000004c749fa30] [d0000000059e8994] .xfs_bmap_finish+0xd4/0x1e0 [xfs] [ 5482.629738] [c0000004c749fae0] [d000000005a06acc] .xfs_inactive_ifree+0x20c/0x2a0 [xfs] [ 5482.629830] [c0000004c749fb90] [d000000005a06c14] .xfs_inactive+0xb4/0x190 [xfs] [ 5482.629913] [c0000004c749fc10] [d000000005a0d8f8] .xfs_fs_evict_inode+0xd8/0x170 [xfs] [ 5482.629923] [c0000004c749fca0] [c0000000002b60d8] .evict+0xe8/0x220 [ 5482.629932] [c0000004c749fd30] [c0000000002a9278] .do_unlinkat+0x248/0x360 [ 5482.629942] [c0000004c749fe30] [c000000000009204] system_call+0x38/0xb4 [ 5482.629948] Instruction dump: [ 5482.629953] e8010010 eba1ffe8 ebc1fff0 ebe1fff8 7c0803a6 4e800020 3c62ff77 38800500 [ 5482.629969] 38632550 7d254b78 483dca15 60000000 <0fe00000> 4bffff90 3c62ff77 7fe4fb78 [ 5482.629985] ---[ end trace 71e305f825b24cc9 ]--- Thanks, Eryu From david@fromorbit.com Tue Mar 1 02:03:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E08267CA0 for ; Tue, 1 Mar 2016 02:03:11 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A3F54304039 for ; Tue, 1 Mar 2016 00:03:11 -0800 (PST) X-ASG-Debug-ID: 1456819384-04bdf002ecbe4b0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id qi4cdEOwMMVjMzhZ for ; Tue, 01 Mar 2016 00:03:05 -0800 (PST) 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: A2C8CADVS9VWOT0ILHleKAECgw8iMG2CbIN5n1ECCgwBAQEBAQEGgQ+KZoVIhAgXAoV0BIE7TQEBAQEBAQcBAQEBQAFAhR47JDQFJQMHLYgeoH+fEggYhTKJEXKBfAtAgScFknWEGYVZh3+OfQKOTIIYAQoBAQGCNCguhxGBOwEBAQ Received: from ppp121-44-8-61.lns20.syd4.internode.on.net (HELO dastard) ([121.44.8.61]) by ipmail06.adl6.internode.on.net with ESMTP; 01 Mar 2016 18:33:03 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aafGn-0003Be-Ub for xfs@oss.sgi.com; Tue, 01 Mar 2016 19:03:01 +1100 Date: Tue, 1 Mar 2016 19:03:01 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfs: for-next branch updated to fa3a3a8 Message-ID: <20160301080301.GG30721@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfs: for-next branch updated to fa3a3a8 MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="BXVAT5kNtrzKuDFl" 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: 1456819384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27462 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --BXVAT5kNtrzKuDFl Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The for-next branch of the xfs kernel repository at git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git has just been updated. The new head of the for-next branch is commit: fa3a3a8 Merge branch 'xfs-dax-fixes-4.6' into for-next New Commits: Dave Chinner (5): [e889752] xfs: XFS_DIFLAG_DAX is only for regular files or directories [db10c69] xfs: S_DAX is only for regular files [3a6a854] xfs: dynamically switch modes when XFS_DIFLAG2_DAX is set/c= leared [6448543] xfs: XFS_DIFLAG2_DAX limited by PAGE_SIZE [fa3a3a8] Merge branch 'xfs-dax-fixes-4.6' into for-next Code Diffstat: fs/xfs/xfs_ioctl.c | 105 +++++++++++++++++++++++++++++++++++++++++++++++++= ++---- fs/xfs/xfs_iops.c | 6 ++-- 2 files changed, 102 insertions(+), 9 deletions(-) --=20 Dave Chinner david@fromorbit.com --BXVAT5kNtrzKuDFl Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJW1Uy1AAoJEK3oKUf0dfodowQQAI/pkplKTOUWeaLDwyDIxWfx 75NGi9pvnEP1xebJQ6/IeVT3TW/s6QmSbndCKCsgXKBP4FTu1Mvc4Rc92YG3nYLs ybQSvcCzSQ9kpdUSOhenaW2YwqHY5MrW/qBgfT2e4mYTYPbAOYRZQD5v0Ej50EFk /h1auxfQlCXmMDSmQbbbwpW2pkuVRLkzKlR1Bkkx4FpGGvM/sseE6vwaG96etAcX vru1wcurO2f/mswtsXVcWQSZsFXAks/QmPnJzbPPvskdSj91KfyqhZO4AsKqJeJ8 uMEsHBk+hFG77svXKnDfRP+7YajXUf8ak4nhqjPT37NXdi6jOJIOhKdvb7swt5EE Ah1JSDbM7bAafYk0GGjVFoQPK26LjEDypnuxGfbADe9vlOrsWzPKM62lFkiwRhFk Nv/xd/2enGnm/V//NX6XSyclLjASvchI5GyThgAvl9JnLYsgXw8Wsg7XAwmkIcy1 Eklm2k+judU4VGJJjp350KIYnn9PQpjv5TaXD1Az7Lme5RvTUz8eSy6QLrdJ0Mnw vYiFH+LZ+GoK/jGsXTWWPPH8xYU8oRDVKw0lQMY+7HfGaXEyOTlL4KReQLsDOWNH s2ifeKJfuXWze8kiC9FwyH9HoGvZl+8QvBgX1Xs1dR+9PhwHLLx1EKge7706ZjXS S5tEr5mR2vqCsYw/gRmb =RWKd -----END PGP SIGNATURE----- --BXVAT5kNtrzKuDFl-- From ajondreyy@yahoo.com Tue Mar 1 05:40:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.4 required=5.0 tests=FORGED_YAHOO_RCVD, FREEMAIL_FROM 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 B82BA7CBB for ; Tue, 1 Mar 2016 05:40:52 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 38B00AC002 for ; Tue, 1 Mar 2016 03:40:49 -0800 (PST) X-ASG-Debug-ID: 1456832446-04cbb00b70ea070001-NocioJ Received: from meng.elmk.net (meng.elmk.net [78.142.18.109]) by cuda.sgi.com with ESMTP id alMosO56wH5RmKZC for ; Tue, 01 Mar 2016 03:40:47 -0800 (PST) X-Barracuda-Envelope-From: ajondreyy@yahoo.com X-Barracuda-Apparent-Source-IP: 78.142.18.109 To: xfs@oss.sgi.com Subject: Custom Shaped USB drives with your logo Message-ID: X-ASG-Orig-Subj: Custom Shaped USB drives with your logo Date: Tue, 01 Mar 2016 12:39:53 +0100 From: "Christina Devlin" Reply-To: borguio@aliyun.com MIME-Version: 1.0 X-Mailer-LID: 8 X-Mailer-RecptId: 10449103 X-Mailer-SID: 1163 X-Mailer-Sent-By: 1 Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: meng.elmk.net[78.142.18.109] X-Barracuda-Start-Time: 1456832446 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.41 X-Barracuda-Spam-Status: No, SCORE=1.41 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=FORGED_YAHOO_RCVD, FORGED_YAHOO_RCVD_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27465 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 FORGED_YAHOO_RCVD 'From' yahoo.com does not match 'Received' headers 1.41 FORGED_YAHOO_RCVD_2 'From' yahoo.com does not match 'Received' headers Hi, I wanted to follow up from last week. Did you receive the email I sent you? I am looking to reach the person that does your buying of branded promotional products for your company? Our company manufactures USB Flash Drives, printed with your logo, the perfect marketing tool for your business or organization. We offer low minimum quantities, and all memory sizes. We are always running a promotion, just ask! 1-888-445-1773 We can pre-load your media files, images, presentations and files onto the drives for you. These are ideal handouts for trade shows, branding, corporate gifts and employees. Our USB Pricing is at an ALL TIME LOW - now is the time to get your USB drives. Let us send you a quote! We will EARN your business! *Please reply back and let me know what quantity and memory size you need for a Fast Quote!* Are you a school or nonprofit? Please let us know for even further discounts. Thanks! Christina Devlin USB Drive Representative Promo / Branded Flash Drives 1-888-445-1773 Email: mibernyi@sina.com From ajondreyy@yahoo.com Tue Mar 1 05:46:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.4 required=5.0 tests=FORGED_YAHOO_RCVD, FREEMAIL_FROM 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 B56367CB1 for ; Tue, 1 Mar 2016 05:46:42 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 36E32AC002 for ; Tue, 1 Mar 2016 03:46:42 -0800 (PST) X-ASG-Debug-ID: 1456832795-04bdf002ecc97d0001-NocioJ Received: from meng.elmk.net (meng.elmk.net [78.142.18.109]) by cuda.sgi.com with ESMTP id 8EEF4wkQS5UpbQ8n for ; Tue, 01 Mar 2016 03:46:39 -0800 (PST) X-Barracuda-Envelope-From: ajondreyy@yahoo.com X-Barracuda-Apparent-Source-IP: 78.142.18.109 To: xfs@oss.sgi.com Subject: Custom Shaped USB drives Message-ID: <32430dbe934295a31a21aa27cd7b9228@surfstitch.com> X-ASG-Orig-Subj: Custom Shaped USB drives Date: Tue, 01 Mar 2016 12:35:41 +0100 From: "Christina Devlin" Reply-To: borguio@aliyun.com MIME-Version: 1.0 X-Mailer-LID: 3 X-Mailer-RecptId: 4686092 X-Mailer-SID: 1265 X-Mailer-Sent-By: 1 Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: meng.elmk.net[78.142.18.109] X-Barracuda-Start-Time: 1456832795 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.41 X-Barracuda-Spam-Status: No, SCORE=1.41 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=FORGED_YAHOO_RCVD, FORGED_YAHOO_RCVD_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27465 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 FORGED_YAHOO_RCVD 'From' yahoo.com does not match 'Received' headers 1.41 FORGED_YAHOO_RCVD_2 'From' yahoo.com does not match 'Received' headers Hi, I wanted to follow up from last week. Did you receive the email I sent you? I am looking to reach the person that does your buying of branded promotional products for your company? Our company manufactures USB Flash Drives, printed with your logo, the perfect marketing tool for your business or organization. We offer low minimum quantities, and all memory sizes. We are always running a promotion, just ask! 1-888-445-1773 We can pre-load your media files, images, presentations and files onto the drives for you. These are ideal handouts for trade shows, branding, corporate gifts and employees. Our USB Pricing is at an ALL TIME LOW - now is the time to get your USB drives. Let us send you a quote! We will EARN your business! *Please reply back and let me know what quantity and memory size you need for a Fast Quote!* Are you a school or nonprofit? Please let us know for even further discounts. Thanks! Christina Devlin USB Drive Representative Promo / Branded Flash Drives 1-888-445-1773 Email: mibernyi@sina.com From BATV+1b5cdc388977d944d066+4573+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 1 06:08:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1CF0C7CB7 for ; Tue, 1 Mar 2016 06:08:27 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E501F304032 for ; Tue, 1 Mar 2016 04:08:23 -0800 (PST) X-ASG-Debug-ID: 1456834101-04cbb00b70ec5d0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id Fp9Y418dBjsWaGnl (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 01 Mar 2016 04:08:21 -0800 (PST) X-Barracuda-Envelope-From: BATV+1b5cdc388977d944d066+4573+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 1aaj66-0004cF-R7; Tue, 01 Mar 2016 12:08:14 +0000 Date: Tue, 1 Mar 2016 04:08:14 -0800 From: Christoph Hellwig To: Luis de Bethencourt Cc: linux-kernel@vger.kernel.org, cmaiolino@redhat.com, darrick.wong@oracle.com, namjae.jeon@samsung.com, bfoster@redhat.com, sandeen@sandeen.net, xfs@oss.sgi.com, billodo@redhat.com Subject: Re: [PATCH] xfs: remove impossible condition Message-ID: <20160301120814.GA5217@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: remove impossible condition References: <1456404237-18169-1-git-send-email-luisbg@osg.samsung.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1456404237-18169-1-git-send-email-luisbg@osg.samsung.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1456834101 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27466 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Feb 25, 2016 at 12:43:57PM +0000, Luis de Bethencourt wrote: > bp_release is set to 0 just before the breakpoint of the for loop before > the conditional check (in line 458). The other breakpoint is a goto that > skips the dead code. Yes, this looks correct: Reviewed-by: Christoph Hellwig The whole code around this is rather grotty and could use some more work, though.. From BATV+1b5cdc388977d944d066+4573+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 1 06:09:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B2BDA7CB7 for ; Tue, 1 Mar 2016 06:09:16 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 30F93AC001 for ; Tue, 1 Mar 2016 04:09:13 -0800 (PST) X-ASG-Debug-ID: 1456834151-04bdf002edcb5a0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id CjXhi7NJBiIKZeLj (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 01 Mar 2016 04:09:11 -0800 (PST) X-Barracuda-Envelope-From: BATV+1b5cdc388977d944d066+4573+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 1aaj71-0005CI-L9; Tue, 01 Mar 2016 12:09:11 +0000 Date: Tue, 1 Mar 2016 04:09:11 -0800 From: Christoph Hellwig To: Dmitry Monakhov Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs_io: Prevent devide by zero from {pread,pwrite}_random Message-ID: <20160301120911.GB5217@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs_io: Prevent devide by zero from {pread,pwrite}_random References: <8760xc3jfu.fsf@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <8760xc3jfu.fsf@openvz.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1456834151 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27466 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Feb 25, 2016 at 07:20:53PM +0400, Dmitry Monakhov wrote: > > Math is wrong if range requested is less or equals to block size > > xfs_io -c 'pwrite -b 4k 8k 4k -R' \ > -c 'pread -b 4k 4k 4k -R' -f file > > Signed-off-by: Dmitry Monakhov Looks fine, Reviewed-by: Christoph Hellwig Are we going to see a new testcase that relies on this soon? :) From BATV+1b5cdc388977d944d066+4573+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 1 06:48:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 464077CB4 for ; Tue, 1 Mar 2016 06:48:53 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id F01498F8035 for ; Tue, 1 Mar 2016 04:48:49 -0800 (PST) X-ASG-Debug-ID: 1456836527-04bdf002eecf750001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id tGikPyH6Rwa08fXH (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 01 Mar 2016 04:48:47 -0800 (PST) X-Barracuda-Envelope-From: BATV+1b5cdc388977d944d066+4573+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 1aajjL-00018B-OB; Tue, 01 Mar 2016 12:48:47 +0000 Date: Tue, 1 Mar 2016 04:48:47 -0800 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/3] xfs: update icsb freeblocks counter after extent deletion Message-ID: <20160301124847.GA3540@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/3] xfs: update icsb freeblocks counter after extent deletion References: <1456756170-51248-1-git-send-email-bfoster@redhat.com> <1456756170-51248-3-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1456756170-51248-3-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1456836527 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27466 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Feb 29, 2016 at 09:29:29AM -0500, Brian Foster wrote: > xfs_bunmapi() currently updates the icsb fdblocks counter, unreserves > quota, etc. before the extent is deleted by xfs_bmap_del_extent(). The > function has problems dividing up the indirect reserved blocks for > scenarios where a single delalloc extent is split in two. Particularly, > there aren't always enough blocks reserved for multiple extents in a > single extent reservation. > > The solution to this problem is to allow the extent removal code to > steal from the deleted extent to meet indirect reservation requirements. > Move the block of code in xfs_bmapi() that updates the icsb fdblocks > counter to after the call to xfs_bmap_del_extent() to allow the codepath > to update the extent record before the free blocks are accounted. Also, > reshuffle the code slightly so the delalloc accounting occurs near the > xfs_bmap_del_extent() call to provide context for the comments. > > Signed-off-by: Brian Foster Looks fine, Reviewed-by: Christoph Hellwig From BATV+1b5cdc388977d944d066+4573+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 1 06:55:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DC86A7CBB for ; Tue, 1 Mar 2016 06:55:18 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id AD93E8F8039 for ; Tue, 1 Mar 2016 04:55:18 -0800 (PST) X-ASG-Debug-ID: 1456836916-04cb6c5830ba110001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 8XSsM3mywQ1nSBiX (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 01 Mar 2016 04:55:16 -0800 (PST) X-Barracuda-Envelope-From: BATV+1b5cdc388977d944d066+4573+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 1aajpc-0005gy-Bn; Tue, 01 Mar 2016 12:55:16 +0000 Date: Tue, 1 Mar 2016 04:55:16 -0800 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH RFC 1/3] xfs: debug mode forced buffered write failure Message-ID: <20160301125516.GB3540@infradead.org> X-ASG-Orig-Subj: Re: [PATCH RFC 1/3] xfs: debug mode forced buffered write failure References: <1456756170-51248-1-git-send-email-bfoster@redhat.com> <1456756170-51248-2-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1456756170-51248-2-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1456836916 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27467 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Feb 29, 2016 at 09:29:28AM -0500, Brian Foster wrote: > Add a DEBUG mode-only sysfs knob to enable forced buffered write > failure. An additional side effect of this mode is brute force killing > of delayed allocation blocks in the range of the write. The latter is > the prime motiviation behind this patch, as userspace test > infrastructure requires a reliable mechanism to create and split > delalloc extents without causing extent conversion. > > Certain fallocate operations (i.e., zero range) were used for this in > the past, but the implementations have changed such that delalloc > extents are flushed and converted to real blocks, rendering the test > useless. Looks harmless, but I'd add a inline function to check for the failed writes field so that we can compile it away entirely for !DEBUG builds. From BATV+1b5cdc388977d944d066+4573+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 1 07:00:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D60257CB3 for ; Tue, 1 Mar 2016 07:00:20 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 971168F8035 for ; Tue, 1 Mar 2016 05:00:20 -0800 (PST) X-ASG-Debug-ID: 1456837218-04cbb00b70f0400001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id oeZP43EAxoqHFe5n (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 01 Mar 2016 05:00:19 -0800 (PST) X-Barracuda-Envelope-From: BATV+1b5cdc388977d944d066+4573+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 1aajuU-0000du-Rs; Tue, 01 Mar 2016 13:00:18 +0000 Date: Tue, 1 Mar 2016 05:00:18 -0800 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/3] xfs: borrow indirect blocks from freed extent when available Message-ID: <20160301130018.GA28675@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 3/3] xfs: borrow indirect blocks from freed extent when available References: <1456756170-51248-1-git-send-email-bfoster@redhat.com> <1456756170-51248-4-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1456756170-51248-4-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1456837219 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27467 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS I've been wrapping my head around this since yersterday.. It looks reasonable, but I'd be much more comfortable if you could split this into two patches: - one to just factor out a helper to update the temp and temp2 values (great variable names while we're at it.. not your fault, though) - one to actually change the algorithm used. From BATV+1b5cdc388977d944d066+4573+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 1 07:01:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 078E87CB3 for ; Tue, 1 Mar 2016 07:01:19 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 77332AC001 for ; Tue, 1 Mar 2016 05:01:15 -0800 (PST) X-ASG-Debug-ID: 1456837273-04cbb00b6ff0510001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id Cg4fA9R9Sa8GlPRL (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 01 Mar 2016 05:01:14 -0800 (PST) X-Barracuda-Envelope-From: BATV+1b5cdc388977d944d066+4573+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 1aajvN-0001LA-KP for xfs@oss.sgi.com; Tue, 01 Mar 2016 13:01:13 +0000 Date: Tue, 1 Mar 2016 05:01:13 -0800 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: Re: futher writeback updates Message-ID: <20160301130113.GA3901@infradead.org> X-ASG-Orig-Subj: Re: futher writeback updates References: <1456302011-18915-1-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1456302011-18915-1-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1456837274 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA606_RN_OB, BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27467 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 2.00 BSF_SC0_SA606_RN_OB Custom Outbreak Rule SA606_RN_OB Any comments? From bfoster@redhat.com Tue Mar 1 07:10:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F0F3E7CB3 for ; Tue, 1 Mar 2016 07:10:46 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B4010304032 for ; Tue, 1 Mar 2016 05:10:43 -0800 (PST) X-ASG-Debug-ID: 1456837841-04cbb00b71f10b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id roc79EqEHaPp5qdO (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 01 Mar 2016 05:10:42 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 9CCBE3A433B; Tue, 1 Mar 2016 13:10:41 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-186.bos.redhat.com [10.18.41.186]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u21DAf3a019196; Tue, 1 Mar 2016 08:10:41 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 575BC120037; Tue, 1 Mar 2016 08:10:40 -0500 (EST) Date: Tue, 1 Mar 2016 08:10:39 -0500 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH RFC 1/3] xfs: debug mode forced buffered write failure Message-ID: <20160301131039.GA22465@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH RFC 1/3] xfs: debug mode forced buffered write failure References: <1456756170-51248-1-git-send-email-bfoster@redhat.com> <1456756170-51248-2-git-send-email-bfoster@redhat.com> <20160301125516.GB3540@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160301125516.GB3540@infradead.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1456837842 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Mar 01, 2016 at 04:55:16AM -0800, Christoph Hellwig wrote: > On Mon, Feb 29, 2016 at 09:29:28AM -0500, Brian Foster wrote: > > Add a DEBUG mode-only sysfs knob to enable forced buffered write > > failure. An additional side effect of this mode is brute force killing > > of delayed allocation blocks in the range of the write. The latter is > > the prime motiviation behind this patch, as userspace test > > infrastructure requires a reliable mechanism to create and split > > delalloc extents without causing extent conversion. > > > > Certain fallocate operations (i.e., zero range) were used for this in > > the past, but the implementations have changed such that delalloc > > extents are flushed and converted to real blocks, rendering the test > > useless. > > Looks harmless, but I'd add a inline function to check for the failed > writes field so that we can compile it away entirely for !DEBUG builds. Good idea. The thought of burying this further down in get_blocks or somewhere around there has also crossed my mind since sending this, so I'll look into that as well. I'm mainly just curious whether it helps isolate the necessary changes any better than the current form... Brian From bfoster@redhat.com Tue Mar 1 07:11:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3B1FB7CB3 for ; Tue, 1 Mar 2016 07:11:11 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B3308AC001 for ; Tue, 1 Mar 2016 05:11:10 -0800 (PST) X-ASG-Debug-ID: 1456837864-04bdf002ebd31b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cCgvZ63MAZ9XZDpJ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 01 Mar 2016 05:11:05 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id C979D627D1; Tue, 1 Mar 2016 13:11:04 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-186.bos.redhat.com [10.18.41.186]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u21DB4Pi019382; Tue, 1 Mar 2016 08:11:04 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 131A4120037; Tue, 1 Mar 2016 08:11:03 -0500 (EST) Date: Tue, 1 Mar 2016 08:11:03 -0500 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/3] xfs: borrow indirect blocks from freed extent when available Message-ID: <20160301131103.GB22465@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 3/3] xfs: borrow indirect blocks from freed extent when available References: <1456756170-51248-1-git-send-email-bfoster@redhat.com> <1456756170-51248-4-git-send-email-bfoster@redhat.com> <20160301130018.GA28675@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160301130018.GA28675@infradead.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Tue, 01 Mar 2016 13:11:04 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1456837865 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Mar 01, 2016 at 05:00:18AM -0800, Christoph Hellwig wrote: > I've been wrapping my head around this since yersterday.. > > It looks reasonable, but I'd be much more comfortable if you could > split this into two patches: > > - one to just factor out a helper to update the temp and temp2 > values (great variable names while we're at it.. not your fault, > though) > - one to actually change the algorithm used. Sure, will do. Brian From luisbg@osg.samsung.com Tue Mar 1 07:23:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C780F7CB3 for ; Tue, 1 Mar 2016 07:23:49 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9897F304039 for ; Tue, 1 Mar 2016 05:23:49 -0800 (PST) X-ASG-Debug-ID: 1456838626-04cbb00b70f2110001-NocioJ Received: from lists.s-osg.org (lists.s-osg.org [54.187.51.154]) by cuda.sgi.com with ESMTP id 0nLOA0D0akSx6Gsz for ; Tue, 01 Mar 2016 05:23:46 -0800 (PST) X-Barracuda-Envelope-From: luisbg@osg.samsung.com X-Barracuda-Apparent-Source-IP: 54.187.51.154 Received: from [106.1.9.3] (unknown [212.250.200.210]) by lists.s-osg.org (Postfix) with ESMTPSA id 74530462A0; Tue, 1 Mar 2016 05:23:44 -0800 (PST) Message-ID: <56D597D5.3040002@osg.samsung.com> Date: Tue, 01 Mar 2016 13:23:33 +0000 From: Luis de Bethencourt User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Icedove/31.7.0 MIME-Version: 1.0 To: Christoph Hellwig CC: linux-kernel@vger.kernel.org, cmaiolino@redhat.com, darrick.wong@oracle.com, namjae.jeon@samsung.com, bfoster@redhat.com, sandeen@sandeen.net, xfs@oss.sgi.com, billodo@redhat.com Subject: Re: [PATCH] xfs: remove impossible condition References: <1456404237-18169-1-git-send-email-luisbg@osg.samsung.com> <20160301120814.GA5217@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: remove impossible condition In-Reply-To: <20160301120814.GA5217@infradead.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: lists.s-osg.org[54.187.51.154] X-Barracuda-Start-Time: 1456838626 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27467 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 01/03/16 12:08, Christoph Hellwig wrote: > On Thu, Feb 25, 2016 at 12:43:57PM +0000, Luis de Bethencourt wrote: >> bp_release is set to 0 just before the breakpoint of the for loop before >> the conditional check (in line 458). The other breakpoint is a goto that >> skips the dead code. > > Yes, this looks correct: > > Reviewed-by: Christoph Hellwig > > The whole code around this is rather grotty and could use some more > work, though.. > Thanks for the review Christoph! If you have some specific things in mind that I could fix in the code around this, I am happy to add it to my ToDo list. Or I can continue reading it and let you know of anything I see, so you can confirm before I try to fix it. Regards, Luis From dan.j.williams@intel.com Tue Mar 1 10:28:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 6BF3B7CBB for ; Tue, 1 Mar 2016 10:28:07 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3BC648F8035 for ; Tue, 1 Mar 2016 08:28:04 -0800 (PST) X-ASG-Debug-ID: 1456849678-04cb6c5832cf240001-NocioJ Received: from mail-oi0-f53.google.com (mail-oi0-f53.google.com [209.85.218.53]) by cuda.sgi.com with ESMTP id 9MGEIHHrYQycqXvr (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 01 Mar 2016 08:27:59 -0800 (PST) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Apparent-Source-IP: 209.85.218.53 Received: by mail-oi0-f53.google.com with SMTP id d205so49899270oia.0 for ; Tue, 01 Mar 2016 08:27:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=zGf/bO+OZep6fANJEBhq9QM1PMIEIOFgHoQQd3CD+8w=; b=ioJTXgCeMoXWCfXXkp/6HlvXxlzImtC8Ja39g8xhjz99tkCJkmPpRtNR+Vx/uWnwCn kU9PcsN+ape2ePMtoFiXOnXRcb9CDLlQxZDe4Fu/+ASg4VlJOoXpalzyRnQxpkdXq/xW fNXgNUeJpWAllf6AuA+0tPCu6xdPcZ1IGo8wbMyPr06ebUnjMU/gjaDr+aZTEVsf9TCE UyfgOts9Bar9ysNM/Byuttuo62X2rqotmpwJVDaPfibXz7iq8dgFOftaRn2xcISicpDq /y1vvTYoJmoucyF8/eD+2cPX8g2ys1IYz6pPGKXXd1Z7j4fmIMeNa3pm48bAhMXJXS2H 4TQg== 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; bh=zGf/bO+OZep6fANJEBhq9QM1PMIEIOFgHoQQd3CD+8w=; b=No2rP5Q3zbkGq/2CzFbK7DtGFNx/ObqcXwjp3iOuh6TQrQHnbdd+ZJrINIvqLkoLL8 OV97+rX4101wCUYWxW8jmNQEzXa5uzEO0W1LxcH3+VQ3raoKMAEmWd3jmBPgfVbSok88 qRMSU5erE0PPxhONrqjhL3u7GN5hOMYGvn/E+gzRp7235HFfomu8/2d+H3RIwyGztX3/ 8conR2kgeTCffYS6W/Pz4aYAShs6qO/qvH5vbXSlBSE2q0P9oxKgRh2f5qmX820kiRaf 94/6SD+G5qRgqDfI16TF7hJD871eBFnGn/IkdEczAz9kVamOlQz6skZFPjxI1hxNSoaA 2Nhw== X-Gm-Message-State: AD7BkJKwS+Kyp5d7tM0I7J+Eybdy6UDkZ090CW6RSn2Fi3QdikAAdnisyrsfJ1oFUj73GHYox2axjd9ppUqupX9s MIME-Version: 1.0 X-Received: by 10.202.202.87 with SMTP id a84mr7134399oig.57.1456849678614; Tue, 01 Mar 2016 08:27:58 -0800 (PST) Received: by 10.157.31.107 with HTTP; Tue, 1 Mar 2016 08:27:58 -0800 (PST) In-Reply-To: <20160301080057.GL11419@eguan.usersys.redhat.com> References: <20160227130256.GJ11419@eguan.usersys.redhat.com> <20160228053158.GK11419@eguan.usersys.redhat.com> <20160301080057.GL11419@eguan.usersys.redhat.com> Date: Tue, 1 Mar 2016 08:27:58 -0800 Message-ID: Subject: Re: generic/320 triggers "list_add attempted on force-poisoned entry" warning on XFS From: Dan Williams X-ASG-Orig-Subj: Re: generic/320 triggers "list_add attempted on force-poisoned entry" warning on XFS To: Eryu Guan Cc: Ross Zwisler , XFS Developers Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-oi0-f53.google.com[209.85.218.53] X-Barracuda-Start-Time: 1456849679 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/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, DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27470 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Mar 1, 2016 at 12:00 AM, Eryu Guan wrote: > On Mon, Feb 29, 2016 at 10:22:06AM -0800, Dan Williams wrote: >> On Sat, Feb 27, 2016 at 9:31 PM, Eryu Guan wrote: >> > On Sat, Feb 27, 2016 at 12:10:51PM -0800, Dan Williams wrote: >> >> On Sat, Feb 27, 2016 at 5:02 AM, Eryu Guan wrote: >> >> > Hi, >> >> > >> >> > Starting from 4.5-rc1 kernel, I sometimes see generic/320 triggers >> >> > "list_add attempted on force-poisoned entry" warnings on XFS, test hosts >> >> > are arm64/ppc64/ppc64le, haven't seen it on x86_64 hosts. >> >> >> >> Hmm, this triggers when a list_head has ->next or ->prev pointing at >> >> the address of force_poison which is only defined in lib/list_debug.c. >> >> The only call site that uses list_force_poison() is in >> >> devm_memremap_pages(). That currently depends on CONFIG_ZONE_DEVICE >> >> which in turn depends on X86_64. >> >> >> >> So, this appears to be a false positive and the address of >> >> force_poison is somehow ending up on the stack by accident as that is >> >> the random value being passed in from __down_common: >> >> >> >> struct semaphore_waiter waiter; >> >> >> >> list_add_tail(&waiter.list, &sem->wait_list); >> >> >> >> So, I think we need a more unique poison value that should never >> >> appear on the stack: >> > >> > Unfortunately I can still see the warning after applying this test patch. >> > >> > Then I added debug code to print the pointer value and re-ran the test. >> > All five failures printed the same pointer value, failed in the same >> > pattern: >> > >> > list_add attempted on force-poisoned entry(0000000000000500), new->next = c00000000136bc00, new->prev = 0000000000000500 >> > >> >> I think this means that no matter what we do the stack will pick up >> these poison values unless the list_head is explicitly initialized. >> Something like the following: > > Umm, it's still reproducible... but seems harder than before, it took me > 200+ iterations to hit (less than 10 iterations in previous runs) Similar fix, just in rwsem_down_read_failed() this time: diff --git a/kernel/locking/rwsem-xadd.c b/kernel/locking/rwsem-xadd.c index a4d4de05b2d1..68678a20da52 100644 --- a/kernel/locking/rwsem-xadd.c +++ b/kernel/locking/rwsem-xadd.c @@ -214,8 +214,10 @@ __visible struct rw_semaphore __sched *rwsem_down_read_failed(struct rw_semaphore *sem) { long count, adjustment = -RWSEM_ACTIVE_READ_BIAS; - struct rwsem_waiter waiter; struct task_struct *tsk = current; + struct rwsem_waiter waiter = { + .list = LIST_HEAD_INIT(waiter.list), + }; /* set up my own style of waitqueue */ waiter.task = tsk; From darrick.wong@oracle.com Tue Mar 1 12:18:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5C9937CBB for ; Tue, 1 Mar 2016 12:18:51 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1C14A304032 for ; Tue, 1 Mar 2016 10:18:48 -0800 (PST) X-ASG-Debug-ID: 1456856325-04bdf002eced930001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id eLBTPNa9iJJAmXwC (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 01 Mar 2016 10:18:45 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u21IIHI7001275 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 1 Mar 2016 18:18:18 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u21IIHpZ011347 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Tue, 1 Mar 2016 18:18:17 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u21IIBSf005699; Tue, 1 Mar 2016 18:18:16 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 01 Mar 2016 10:18:10 -0800 Date: Tue, 1 Mar 2016 10:18:09 -0800 From: "Darrick J. Wong" To: Christoph Hellwig Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: block allocations for the refcount btree Message-ID: <20160301181809.GC27973@birch.djwong.org> X-ASG-Orig-Subj: Re: block allocations for the refcount btree References: <20160210093011.GA19147@infradead.org> <20160210095010.GC23904@birch.djwong.org> <20160210190738.GA13051@infradead.org> <20160210214058.GN14668@dastard> <20160212191046.GA28421@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160212191046.GA28421@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1456856325 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27474 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Fri, Feb 12, 2016 at 11:10:46AM -0800, Christoph Hellwig wrote: > On Thu, Feb 11, 2016 at 08:40:58AM +1100, Dave Chinner wrote: > > I run into that from time to time (maybe once a month) on a vanilla > > kernel. > > > > IIRC, the problem is the delayed allocation extent split runs out of > > it's reserved block count if you split it enough times. The case > > I've seen is that the indlen calculated in xfs_bmap_worst_indlen() > > ends up too small for a subsequent allocation after we've called > > xfs_bmap_del_extent() to delete the middle of a delalloc extent too > > many times. > > > > Brian had some patches that attempted to solve it - we may have > > simply dropped the ball on this (again). > > > > http://oss.sgi.com/archives/xfs/2014-09/msg00337.html > > I'm pretty sure that is a separate issue. With the refcount btree we may > allocate an extent (or rather just a single block) in xfs_alloc_ag_vextent > as called from xfs_refcountbt_alloc_block. The reservation helps us to > ensure this block is always available, but we still need to account for > that in xfs_trans_reserve(), which we currently don't do for itruncate > transactions. One side effect of the per-ag block reservation code is that it reserves all the blocks that the refcountbt will ever need at mount time, which includes decreasing the incore fdblocks counter at mount and putting it back at unmount time. This /should/ eliminate the need for reserving blocks in truncate transactions, though clearly this isn't being done correctly. The AGresv code as of a couple weeks ago tried to monkey with the transaction block reservation counts after the allocator does its usual accounting, which as you observe, doesn't work. Dave suggested that I embed the AGresv structures directly into xfs_perag, and I realized that we'll only ever need two of these things -- one to feed the AGFL (rmapbt) and another to feed the higher level btrees (refcountbt). At the same time, I decided that because the AGresv code ultimately knows whether an allocation request was satisfied from a reservation or from the free space btree, it should also have a hand in deciding whether or not to update the transaction's block reservation. So what I'm saying is that I think this problem was with the AGresv code not doing accounting correctly, and that I've fixed it in a subsequent rewrite of the AGresv code. I'll post it later, after I figure out why generic/333 regresses with the new code. However, there's one thing to be aware of -- if the AGresv uses up all the blocks that were preallocated at mount time, the allocator will grab any free blocks available and charge the blocks to the transaction, just like before. If this ever happens (in theory we reserve enough blocks so that we can have a refcount record for every block in the AG) then we'll still have this problem. The most cautious thing to do, I think, is to combine the AGresv fixes with this patch that adds a block reservation to truncate transactions in case the AGresv can't supply a block to the refcount btree. The problem here is that for most cases we'll have both the AGresv and the transaction reserving blocks for the same purpose, which seems excessive. Moreover, it introduces the possibility of userspace seeing ENOSPC while truncating files even if there's actually sufficient space to handle a refcountbt split. What does everyone else think? --D From BATV+1b5cdc388977d944d066+4573+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 1 12:22:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 77EFE7CBB for ; Tue, 1 Mar 2016 12:22:39 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E210BAC001 for ; Tue, 1 Mar 2016 10:22:35 -0800 (PST) X-ASG-Debug-ID: 1456856553-04cb6c5830d5700001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 08xFzfVuLzN0ABu5 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 01 Mar 2016 10:22:33 -0800 (PST) X-Barracuda-Envelope-From: BATV+1b5cdc388977d944d066+4573+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 1aaowF-0006Cv-8B; Tue, 01 Mar 2016 18:22:27 +0000 Date: Tue, 1 Mar 2016 10:22:27 -0800 From: Christoph Hellwig To: Luis de Bethencourt Cc: Christoph Hellwig , cmaiolino@redhat.com, darrick.wong@oracle.com, namjae.jeon@samsung.com, bfoster@redhat.com, sandeen@sandeen.net, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, billodo@redhat.com Subject: Re: [PATCH] xfs: remove impossible condition Message-ID: <20160301182227.GA21238@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: remove impossible condition References: <1456404237-18169-1-git-send-email-luisbg@osg.samsung.com> <20160301120814.GA5217@infradead.org> <56D597D5.3040002@osg.samsung.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56D597D5.3040002@osg.samsung.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1456856553 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27474 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Mar 01, 2016 at 01:23:33PM +0000, Luis de Bethencourt wrote: > If you have some specific things in mind that I could fix in the code around > this, I am happy to add it to my ToDo list. Or I can continue reading it and > let you know of anything I see, so you can confirm before I try to fix it. I don't think this mess is something I want to let newbies loose on :) Thanks a lot for the patch again! From sandeen@redhat.com Tue Mar 1 13:05:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A66847CB4 for ; Tue, 1 Mar 2016 13:05:08 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7FA8B8F8033 for ; Tue, 1 Mar 2016 11:05:05 -0800 (PST) X-ASG-Debug-ID: 1456859101-04cbb00b72109f20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id wGfOoKP1vDsjHPjb (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 01 Mar 2016 11:05:01 -0800 (PST) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id CF7047EBA3; Tue, 1 Mar 2016 19:05:00 +0000 (UTC) Received: from Liberator.local (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u21J4xPC014912 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 1 Mar 2016 14:05:00 -0500 To: xfs@oss.sgi.com Cc: Al Viro From: Eric Sandeen Subject: ASSERT in xlog_find_verify_log_record during xfs/098 Message-ID: <56D5E7DA.3080900@redhat.com> X-ASG-Orig-Subj: ASSERT in xlog_find_verify_log_record during xfs/098 Date: Tue, 1 Mar 2016 13:04:58 -0600 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 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: 1456859101 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Al mentioned that he hit an ASSERT during xfs/098, a log fuzzer test, in xlog_find_verify_log_record(): for (i = (*last_blk) - 1; i >= 0; i--) { if (i < start_blk) { /* valid log record not found */ xfs_warn(log->l_mp, "Log inconsistent (didn't find previous header)"); ASSERT(0); error = -EIO; goto out; } Should that assert even be there? Looks like it's gracefully handled, I don't see offhand that anything should have caught this corruption earlier, and we don't really want to bug on disk corruption. Am I missing something? Thanks, -Eric From dan.j.williams@intel.com Tue Mar 1 13:55:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EE9CC7CAE for ; Tue, 1 Mar 2016 13:55:32 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 55823AC001 for ; Tue, 1 Mar 2016 11:55:29 -0800 (PST) X-ASG-Debug-ID: 1456862127-04cbb00b7010e4b0001-NocioJ Received: from mga11.intel.com ([192.55.52.93]) by cuda.sgi.com with ESMTP id TGI3Aebcz9IghlH8 for ; Tue, 01 Mar 2016 11:55:28 -0800 (PST) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.93 X-ASG-Whitelist: Client Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga102.fm.intel.com with ESMTP; 01 Mar 2016 11:55:27 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.22,524,1449561600"; d="scan'208";a="662021376" Received: from dwillia2-desk3.jf.intel.com (HELO dwillia2-desk3.amr.corp.intel.com) ([10.54.39.136]) by FMSMGA003.fm.intel.com with ESMTP; 01 Mar 2016 11:55:28 -0800 Subject: [RFC PATCH] semaphore: fix uninitialized list_head vs list_force_poison From: Dan Williams X-ASG-Orig-Subj: [RFC PATCH] semaphore: fix uninitialized list_head vs list_force_poison To: linux-kernel@vger.kernel.org Cc: Eryu Guan , Peter Zijlstra , xfs@oss.sgi.com, linux-mm@kvack.org, Ingo Molnar , Ross Zwisler , akpm@linux-foundation.org Date: Tue, 01 Mar 2016 11:55:04 -0800 Message-ID: <20160301195504.40400.79558.stgit@dwillia2-desk3.amr.corp.intel.com> User-Agent: StGit/0.17.1-9-g687f MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: UNKNOWN[192.55.52.93] X-Barracuda-Start-Time: 1456862127 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 list_force_poison is a debug mechanism to make sure that ZONE_DEVICE pages never appear on an lru. Those pages only exist for enabling DMA to device discovered memory ranges and are not suitable for general purpose allocations. list_force_poison() explicitly initializes a list_head with a poison value that list_add() can use to detect mistaken use of page->lru. Unfortunately, it seems calling list_add() leads to the poison value leaking on to the stack and occasionally cause stack-allocated list_heads to be inadvertently "force poisoned". list_add attempted on force-poisoned entry WARNING: at lib/list_debug.c:34 [..] NIP [c00000000043c390] __list_add+0xb0/0x150 LR [c00000000043c38c] __list_add+0xac/0x150 Call Trace: [c000000fb5fc3320] [c00000000043c38c] __list_add+0xac/0x150 (unreliable) [c000000fb5fc33a0] [c00000000081b454] __down+0x4c/0xf8 [c000000fb5fc3410] [c00000000010b6f8] down+0x68/0x70 [c000000fb5fc3450] [d0000000201ebf4c] xfs_buf_lock+0x4c/0x150 [xfs] list_add attempted on force-poisoned entry(0000000000000500), new->next == d0000000059ecdb0, new->prev == 0000000000000500 WARNING: at lib/list_debug.c:33 [..] NIP [c00000000042db78] __list_add+0xa8/0x140 LR [c00000000042db74] __list_add+0xa4/0x140 Call Trace: [c0000004c749f620] [c00000000042db74] __list_add+0xa4/0x140 (unreliable) [c0000004c749f6b0] [c0000000008010ec] rwsem_down_read_failed+0x6c/0x1a0 [c0000004c749f760] [c000000000800828] down_read+0x58/0x60 [c0000004c749f7e0] [d000000005a1a6bc] xfs_log_commit_cil+0x7c/0x600 [xfs] We can squash these uninitialized list_heads as they pop-up as this patch does, or maybe need to rethink how to implement the list_force_poison() safety mechanism. Reported-by: Eryu Guan Cc: Ross Zwisler Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Fixes: commit 5c2c2587b132 ("mm, dax, pmem: introduce {get|put}_dev_pagemap() for dax-gup") Signed-off-by: Dan Williams --- kernel/locking/rwsem-xadd.c | 4 +++- kernel/locking/semaphore.c | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/kernel/locking/rwsem-xadd.c b/kernel/locking/rwsem-xadd.c index a4d4de05b2d1..68678a20da52 100644 --- a/kernel/locking/rwsem-xadd.c +++ b/kernel/locking/rwsem-xadd.c @@ -214,8 +214,10 @@ __visible struct rw_semaphore __sched *rwsem_down_read_failed(struct rw_semaphore *sem) { long count, adjustment = -RWSEM_ACTIVE_READ_BIAS; - struct rwsem_waiter waiter; struct task_struct *tsk = current; + struct rwsem_waiter waiter = { + .list = LIST_HEAD_INIT(waiter.list), + }; /* set up my own style of waitqueue */ waiter.task = tsk; diff --git a/kernel/locking/semaphore.c b/kernel/locking/semaphore.c index b8120abe594b..39929b4e6fbb 100644 --- a/kernel/locking/semaphore.c +++ b/kernel/locking/semaphore.c @@ -205,7 +205,9 @@ static inline int __sched __down_common(struct semaphore *sem, long state, long timeout) { struct task_struct *task = current; - struct semaphore_waiter waiter; + struct semaphore_waiter waiter = { + .list = LIST_HEAD_INIT(waiter.list), + }; list_add_tail(&waiter.list, &sem->wait_list); waiter.task = task; From BATV+1b5cdc388977d944d066+4573+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 1 14:40:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 008F47CB9 for ; Tue, 1 Mar 2016 14:40:20 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 65F92AC001 for ; Tue, 1 Mar 2016 12:40:16 -0800 (PST) X-ASG-Debug-ID: 1456864813-04cbb00b72111d00001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id nkhbOcl9TDizq2Sg (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 01 Mar 2016 12:40:13 -0800 (PST) X-Barracuda-Envelope-From: BATV+1b5cdc388977d944d066+4573+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 1aar5Z-0001Jd-4X; Tue, 01 Mar 2016 20:40:13 +0000 Date: Tue, 1 Mar 2016 12:40:13 -0800 From: Christoph Hellwig To: "Darrick J. Wong" Cc: xfs@oss.sgi.com Subject: Re: block allocations for the refcount btree Message-ID: <20160301204013.GA23128@infradead.org> X-ASG-Orig-Subj: Re: block allocations for the refcount btree References: <20160210093011.GA19147@infradead.org> <20160210095010.GC23904@birch.djwong.org> <20160210190738.GA13051@infradead.org> <20160210214058.GN14668@dastard> <20160212191046.GA28421@infradead.org> <20160301181809.GC27973@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160301181809.GC27973@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1456864813 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27479 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Mar 01, 2016 at 10:18:09AM -0800, Darrick J. Wong wrote: > One side effect of the per-ag block reservation code is that it reserves all > the blocks that the refcountbt will ever need at mount time, which includes > decreasing the incore fdblocks counter at mount and putting it back at unmount > time. This /should/ eliminate the need for reserving blocks in truncate > transactions, though clearly this isn't being done correctly. We're still accouting these blocks in t_blk_res_used through xfs_alloc_vextent -> xfs_alloc_ag_vextent -> xfs_trans_mod_sb. I don't really see how the reservation code changes anything about that accounting. It just ensures the allocation will succeed through xfs_ag_resv_needed in xfs_alloc_ag_vextent, and then removes the allocated block from the reservation using xfs_ag_resv_alloc_block. Maybe we need to find a way to not account for these blocks. > So what I'm saying is that I think this problem was with the AGresv code not > doing accounting correctly, and that I've fixed it in a subsequent rewrite of > the AGresv code. I'll post it later, after I figure out why generic/333 > regresses with the new code. Ok, let's see if the new version helps with the above issue. > However, there's one thing to be aware of -- if the AGresv uses up all the > blocks that were preallocated at mount time, the allocator will grab any free > blocks available and charge the blocks to the transaction, just like before. > If this ever happens (in theory we reserve enough blocks so that we can have a > refcount record for every block in the AG) then we'll still have this problem. It seems like we should simply avoid that this case ever happens. From BATV+1b5cdc388977d944d066+4573+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 1 14:45:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3731E7CB9 for ; Tue, 1 Mar 2016 14:45:50 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1311F8F8035 for ; Tue, 1 Mar 2016 12:45:41 -0800 (PST) X-ASG-Debug-ID: 1456865138-04cb6c5830e0970001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 8ohOA4cFHFLDfKQo (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 01 Mar 2016 12:45:39 -0800 (PST) X-Barracuda-Envelope-From: BATV+1b5cdc388977d944d066+4573+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 1aarAo-0002sR-Gq; Tue, 01 Mar 2016 20:45:38 +0000 Date: Tue, 1 Mar 2016 12:45:38 -0800 From: Christoph Hellwig To: Eric Sandeen Cc: xfs@oss.sgi.com, Al Viro Subject: Re: ASSERT in xlog_find_verify_log_record during xfs/098 Message-ID: <20160301204538.GA6371@infradead.org> X-ASG-Orig-Subj: Re: ASSERT in xlog_find_verify_log_record during xfs/098 References: <56D5E7DA.3080900@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56D5E7DA.3080900@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1456865139 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27479 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Mar 01, 2016 at 01:04:58PM -0600, Eric Sandeen wrote: > Should that assert even be there? Looks like it's gracefully > handled, I don't see offhand that anything should have caught > this corruption earlier, and we don't really want to bug on disk > corruption. Am I missing something? We used to have a couple of these, especially in log recovery - whoever wrote this code probably though trapping on these corruptions for a debug kernel makes sense. I'm fine with dropping them, and a little audit for more of them might not hurt. From akpm@linux-foundation.org Tue Mar 1 14:53:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B2AF67CB9 for ; Tue, 1 Mar 2016 14:53:45 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 644A9304039 for ; Tue, 1 Mar 2016 12:53:45 -0800 (PST) X-ASG-Debug-ID: 1456865622-04bdf002ecfa440001-NocioJ Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) by cuda.sgi.com with ESMTP id ofCeHJbn87LtiROb (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 01 Mar 2016 12:53:42 -0800 (PST) X-Barracuda-Envelope-From: akpm@linux-foundation.org X-Barracuda-Apparent-Source-IP: 140.211.169.12 Received: from akpm3.mtv.corp.google.com (unknown [104.132.1.65]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id 7CBE1C3A; Tue, 1 Mar 2016 20:53:41 +0000 (UTC) Date: Tue, 1 Mar 2016 12:53:40 -0800 From: Andrew Morton To: Dan Williams Cc: linux-kernel@vger.kernel.org, Eryu Guan , Peter Zijlstra , xfs@oss.sgi.com, linux-mm@kvack.org, Ingo Molnar , Ross Zwisler Subject: Re: [RFC PATCH] semaphore: fix uninitialized list_head vs list_force_poison Message-Id: <20160301125340.ffcc278e7f35fc3a28268e08@linux-foundation.org> X-ASG-Orig-Subj: Re: [RFC PATCH] semaphore: fix uninitialized list_head vs list_force_poison In-Reply-To: <20160301195504.40400.79558.stgit@dwillia2-desk3.amr.corp.intel.com> References: <20160301195504.40400.79558.stgit@dwillia2-desk3.amr.corp.intel.com> X-Mailer: Sylpheed 3.4.1 (GTK+ 2.24.23; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail.linuxfoundation.org[140.211.169.12] X-Barracuda-Start-Time: 1456865622 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27480 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, 01 Mar 2016 11:55:04 -0800 Dan Williams wrote: > list_force_poison is a debug mechanism to make sure that ZONE_DEVICE > pages never appear on an lru. Those pages only exist for enabling DMA > to device discovered memory ranges and are not suitable for general > purpose allocations. list_force_poison() explicitly initializes a > list_head with a poison value that list_add() can use to detect mistaken > use of page->lru. > > Unfortunately, it seems calling list_add() leads to the poison value > leaking on to the stack and occasionally cause stack-allocated > list_heads to be inadvertently "force poisoned". > > list_add attempted on force-poisoned entry > WARNING: at lib/list_debug.c:34 > [..] > NIP [c00000000043c390] __list_add+0xb0/0x150 > LR [c00000000043c38c] __list_add+0xac/0x150 > Call Trace: > [c000000fb5fc3320] [c00000000043c38c] __list_add+0xac/0x150 (unreliable) > [c000000fb5fc33a0] [c00000000081b454] __down+0x4c/0xf8 > [c000000fb5fc3410] [c00000000010b6f8] down+0x68/0x70 > [c000000fb5fc3450] [d0000000201ebf4c] xfs_buf_lock+0x4c/0x150 [xfs] > > list_add attempted on force-poisoned entry(0000000000000500), > new->next == d0000000059ecdb0, new->prev == 0000000000000500 > WARNING: at lib/list_debug.c:33 > [..] > NIP [c00000000042db78] __list_add+0xa8/0x140 > LR [c00000000042db74] __list_add+0xa4/0x140 > Call Trace: > [c0000004c749f620] [c00000000042db74] __list_add+0xa4/0x140 (unreliable) > [c0000004c749f6b0] [c0000000008010ec] rwsem_down_read_failed+0x6c/0x1a0 > [c0000004c749f760] [c000000000800828] down_read+0x58/0x60 > [c0000004c749f7e0] [d000000005a1a6bc] xfs_log_commit_cil+0x7c/0x600 [xfs] > > We can squash these uninitialized list_heads as they pop-up as this > patch does, or maybe need to rethink how to implement the > list_force_poison() safety mechanism. Yes, problem. > kernel/locking/rwsem-xadd.c | 4 +++- > kernel/locking/semaphore.c | 4 +++- The patch adds slight overhead and there will be other uninitialized list_heads around the place and more will turn up in the future. I don't see how list_force_poison is fixable, really - we're relying upon some uninitialized word of memory not having some particular value. Good luck with that. Maybe we simply remove list_force_poison() - it isn't terribly important? /* ZONE_DEVICE pages must never appear on a slab lru */ Can we instead add a check of page_zone(page) into the lru-addition sites? There are probably quite a few possible places. (Why does the comment say "slab"?). From dan.j.williams@intel.com Tue Mar 1 15:07:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 7000C7CBB for ; Tue, 1 Mar 2016 15:07:16 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id E559DAC001 for ; Tue, 1 Mar 2016 13:07:12 -0800 (PST) X-ASG-Debug-ID: 1456866430-04bdf002ecfb440001-NocioJ Received: from mail-oi0-f44.google.com (mail-oi0-f44.google.com [209.85.218.44]) by cuda.sgi.com with ESMTP id RFD6SCAjpcm2eNwb (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 01 Mar 2016 13:07:10 -0800 (PST) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Apparent-Source-IP: 209.85.218.44 Received: by mail-oi0-f44.google.com with SMTP id m82so138716500oif.1 for ; Tue, 01 Mar 2016 13:07:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=ZmkHoENnxN6BQiWQTy52PTCrpAvJJaakUQFcCUDij9A=; b=qmYXPK8Zj+j8rme0+rNIDZNZW1WgCVpzLgGdF0bvL4jTRyj+CETXwExGFNLcEBLzvS Hra83np0MsnSJHa5xE6/bEryPzs8px0I2Yu0dp7j7jd8zT55WCuzOqmIOOcgg/4SYthx y4XyK9x22Rl9MaOt+SAAG/jPUq51ud2Or88NAj/ngcS1IrmPmgi/I3HUhVz+mELe5i0X LK59Q+m41nmBRazt3JEoG+I1jqgnuBcAlwhv6h6I4obYn410zT+dRURxfKEWJBny6dyp 7heuWC6ubD4ORlnNUaNbZdugYAolSJcaM8Pmy8OLjp1INVrTYB6gf5e5yxfwhCvUYOtN f++w== 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; bh=ZmkHoENnxN6BQiWQTy52PTCrpAvJJaakUQFcCUDij9A=; b=Fv+bCezhFa+pjA46eET0vij4yPp/JLxzXawgvQNKlB3l6N9aKU8JZ8AxIr0yFLOlEL gaZ/vnhDbdqwN+t4Wp6b98v3NMS5amGN3wVhW0QY0GYZUm5ZuxocwB4/ek62ayc4UVTg NvL6RTB6QMT6MRV7noSFNFM9b4wqQTFq36rgFt5Q5xkpY6014rrfgjghvDHCkO5XRA5y LasiIrJ67fLLOWrqQI5jvN0PNnR5w/uEnw3oF/PXTuvsO33jiUL071E/4yDdIFMtLCfe /rMRSCBCsnhhvS3Wjo6Ta6a1BTq0/+FEJUY/ROqqZiiGJ2eK1rSnZfvaBt88MkRh1Bgt 6B2w== X-Gm-Message-State: AD7BkJLNbDHgT6hKTgg7PuPnDFooZMbM9A6+XYx5Zo2dggEdPLEUOAfBZODWPMIxcDf1P4uFip08mZeijIR9wqaN MIME-Version: 1.0 X-Received: by 10.202.71.87 with SMTP id u84mr17806257oia.75.1456866430191; Tue, 01 Mar 2016 13:07:10 -0800 (PST) Received: by 10.157.15.186 with HTTP; Tue, 1 Mar 2016 13:07:10 -0800 (PST) In-Reply-To: <20160301125340.ffcc278e7f35fc3a28268e08@linux-foundation.org> References: <20160301195504.40400.79558.stgit@dwillia2-desk3.amr.corp.intel.com> <20160301125340.ffcc278e7f35fc3a28268e08@linux-foundation.org> Date: Tue, 1 Mar 2016 13:07:10 -0800 Message-ID: Subject: Re: [RFC PATCH] semaphore: fix uninitialized list_head vs list_force_poison From: Dan Williams X-ASG-Orig-Subj: Re: [RFC PATCH] semaphore: fix uninitialized list_head vs list_force_poison To: Andrew Morton Cc: "linux-kernel@vger.kernel.org" , Eryu Guan , Peter Zijlstra , XFS Developers , Linux MM , Ingo Molnar , Ross Zwisler Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-oi0-f44.google.com[209.85.218.44] X-Barracuda-Start-Time: 1456866430 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27480 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Mar 1, 2016 at 12:53 PM, Andrew Morton wrote: > On Tue, 01 Mar 2016 11:55:04 -0800 Dan Williams wrote: > >> list_force_poison is a debug mechanism to make sure that ZONE_DEVICE >> pages never appear on an lru. Those pages only exist for enabling DMA >> to device discovered memory ranges and are not suitable for general >> purpose allocations. list_force_poison() explicitly initializes a >> list_head with a poison value that list_add() can use to detect mistaken >> use of page->lru. >> >> Unfortunately, it seems calling list_add() leads to the poison value >> leaking on to the stack and occasionally cause stack-allocated >> list_heads to be inadvertently "force poisoned". >> >> list_add attempted on force-poisoned entry >> WARNING: at lib/list_debug.c:34 >> [..] >> NIP [c00000000043c390] __list_add+0xb0/0x150 >> LR [c00000000043c38c] __list_add+0xac/0x150 >> Call Trace: >> [c000000fb5fc3320] [c00000000043c38c] __list_add+0xac/0x150 (unreliable) >> [c000000fb5fc33a0] [c00000000081b454] __down+0x4c/0xf8 >> [c000000fb5fc3410] [c00000000010b6f8] down+0x68/0x70 >> [c000000fb5fc3450] [d0000000201ebf4c] xfs_buf_lock+0x4c/0x150 [xfs] >> >> list_add attempted on force-poisoned entry(0000000000000500), >> new->next == d0000000059ecdb0, new->prev == 0000000000000500 >> WARNING: at lib/list_debug.c:33 >> [..] >> NIP [c00000000042db78] __list_add+0xa8/0x140 >> LR [c00000000042db74] __list_add+0xa4/0x140 >> Call Trace: >> [c0000004c749f620] [c00000000042db74] __list_add+0xa4/0x140 (unreliable) >> [c0000004c749f6b0] [c0000000008010ec] rwsem_down_read_failed+0x6c/0x1a0 >> [c0000004c749f760] [c000000000800828] down_read+0x58/0x60 >> [c0000004c749f7e0] [d000000005a1a6bc] xfs_log_commit_cil+0x7c/0x600 [xfs] >> >> We can squash these uninitialized list_heads as they pop-up as this >> patch does, or maybe need to rethink how to implement the >> list_force_poison() safety mechanism. > > Yes, problem. > >> kernel/locking/rwsem-xadd.c | 4 +++- >> kernel/locking/semaphore.c | 4 +++- > > The patch adds slight overhead and there will be other uninitialized > list_heads around the place and more will turn up in the future. > > I don't see how list_force_poison is fixable, really - we're relying > upon some uninitialized word of memory not having some particular value. > Good luck with that. > > Maybe we simply remove list_force_poison() - it isn't terribly > important? > > /* ZONE_DEVICE pages must never appear on a slab lru */ > > Can we instead add a check of page_zone(page) into the lru-addition > sites? That's a possibility although I also wanted to catch drivers that think they can use page->lru as long as they have a reference against the page. However, moving the safety mechanism to the individual call sites guarantees that we'll miss some. It trades one form of wack-a-mole for another, so I think just killing list_force_poison() is our best option. > There are probably quite a few possible places. (Why does the > comment say "slab"?). Yeah, it should say zone lru, I was referring to placing a ZONE_DEVICE page on a free list that would allow it to be allocated via alloc_page(). From david@fromorbit.com Tue Mar 1 15:42:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0E1C17CBB for ; Tue, 1 Mar 2016 15:42:27 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 82AA4AC001 for ; Tue, 1 Mar 2016 13:42:26 -0800 (PST) X-ASG-Debug-ID: 1456868543-04bdf002edfd950001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id PmBUFP448MWwcAKF for ; Tue, 01 Mar 2016 13:42:23 -0800 (PST) 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: A2DNBwAcB9ZWOT0ILHlcKAECgw+BP4Zln3QBAQEGi3aJT4YNBAICgU1NAQEBAQEBBwEBAQFAAUCEQgEBBDocIxAIAw4KCSUPBSUDBxoTiB6+LgEBCAIeGIUyhQKIbwWXDo1YgVWNK45MhFooLohBAQEB Received: from ppp121-44-8-61.lns20.syd4.internode.on.net (HELO dastard) ([121.44.8.61]) by ipmail06.adl6.internode.on.net with ESMTP; 02 Mar 2016 08:12:22 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aas3i-0004qi-6a; Wed, 02 Mar 2016 08:42:22 +1100 Date: Wed, 2 Mar 2016 08:42:22 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: futher writeback updates Message-ID: <20160301214222.GK30721@dastard> X-ASG-Orig-Subj: Re: futher writeback updates References: <1456302011-18915-1-git-send-email-hch@lst.de> <20160301130113.GA3901@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160301130113.GA3901@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: 1456868543 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27481 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Mar 01, 2016 at 05:01:13AM -0800, Christoph Hellwig wrote: > Any comments? I pulled them in to my testing stack yesterday afternoon. There's a good chance I'll end up delaying commiting these to the next merge window, simply because I don't have the bandwidth at this point to process any more significant changes to the for-next tree. I think it's much more important right now to get the rmap/reflink in the the 4.6 merge window than these writeback changes. Cheers, Dave. -- Dave Chinner david@fromorbit.com From dan.j.williams@intel.com Tue Mar 1 15:44:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CBBF67CBB for ; Tue, 1 Mar 2016 15:44:57 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7B7E2304039 for ; Tue, 1 Mar 2016 13:44:57 -0800 (PST) X-ASG-Debug-ID: 1456868696-04bdf002edfdc30001-NocioJ Received: from mga14.intel.com ([192.55.52.115]) by cuda.sgi.com with ESMTP id wmBorXALxRsaDxuC for ; Tue, 01 Mar 2016 13:44:56 -0800 (PST) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.115 X-ASG-Whitelist: Client Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga103.fm.intel.com with ESMTP; 01 Mar 2016 13:44:56 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.22,524,1449561600"; d="scan'208";a="756257518" Received: from dwillia2-desk3.jf.intel.com (HELO dwillia2-desk3.amr.corp.intel.com) ([10.54.39.136]) by orsmga003.jf.intel.com with ESMTP; 01 Mar 2016 13:44:55 -0800 Subject: [PATCH] list: kill list_force_poison() From: Dan Williams X-ASG-Orig-Subj: [PATCH] list: kill list_force_poison() To: akpm@linux-foundation.org Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Ross Zwisler , Eryu Guan , xfs@oss.sgi.com Date: Tue, 01 Mar 2016 13:44:32 -0800 Message-ID: <20160301214432.4473.76919.stgit@dwillia2-desk3.amr.corp.intel.com> User-Agent: StGit/0.17.1-9-g687f MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: UNKNOWN[192.55.52.115] X-Barracuda-Start-Time: 1456868696 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Given we have uninitialized list_heads being passed to list_add() it will always be the case that those uninitialized values randomly trigger the poison value. Especially since a list_add() operation will seed the stack with the poison value for later stack allocations to trip over. For example, see these two false positive reports: list_add attempted on force-poisoned entry WARNING: at lib/list_debug.c:34 [..] NIP [c00000000043c390] __list_add+0xb0/0x150 LR [c00000000043c38c] __list_add+0xac/0x150 Call Trace: [c000000fb5fc3320] [c00000000043c38c] __list_add+0xac/0x150 (unreliable) [c000000fb5fc33a0] [c00000000081b454] __down+0x4c/0xf8 [c000000fb5fc3410] [c00000000010b6f8] down+0x68/0x70 [c000000fb5fc3450] [d0000000201ebf4c] xfs_buf_lock+0x4c/0x150 [xfs] list_add attempted on force-poisoned entry(0000000000000500), new->next == d0000000059ecdb0, new->prev == 0000000000000500 WARNING: at lib/list_debug.c:33 [..] NIP [c00000000042db78] __list_add+0xa8/0x140 LR [c00000000042db74] __list_add+0xa4/0x140 Call Trace: [c0000004c749f620] [c00000000042db74] __list_add+0xa4/0x140 (unreliable) [c0000004c749f6b0] [c0000000008010ec] rwsem_down_read_failed+0x6c/0x1a0 [c0000004c749f760] [c000000000800828] down_read+0x58/0x60 [c0000004c749f7e0] [d000000005a1a6bc] xfs_log_commit_cil+0x7c/0x600 [xfs] Reported-by: Eryu Guan Cc: Ross Zwisler Cc: Fixes: commit 5c2c2587b132 ("mm, dax, pmem: introduce {get|put}_dev_pagemap() for dax-gup") Signed-off-by: Dan Williams --- include/linux/list.h | 11 ----------- kernel/memremap.c | 9 +++++++-- lib/list_debug.c | 9 --------- 3 files changed, 7 insertions(+), 22 deletions(-) diff --git a/include/linux/list.h b/include/linux/list.h index 30cf4200ab40..5356f4d661a7 100644 --- a/include/linux/list.h +++ b/include/linux/list.h @@ -113,17 +113,6 @@ extern void __list_del_entry(struct list_head *entry); extern void list_del(struct list_head *entry); #endif -#ifdef CONFIG_DEBUG_LIST -/* - * See devm_memremap_pages() which wants DEBUG_LIST=y to assert if one - * of the pages it allocates is ever passed to list_add() - */ -extern void list_force_poison(struct list_head *entry); -#else -/* fallback to the less strict LIST_POISON* definitions */ -#define list_force_poison list_del -#endif - /** * list_replace - replace old entry by new one * @old : the element to be replaced diff --git a/kernel/memremap.c b/kernel/memremap.c index b981a7b023f0..778191e3e887 100644 --- a/kernel/memremap.c +++ b/kernel/memremap.c @@ -351,8 +351,13 @@ void *devm_memremap_pages(struct device *dev, struct resource *res, for_each_device_pfn(pfn, page_map) { struct page *page = pfn_to_page(pfn); - /* ZONE_DEVICE pages must never appear on a slab lru */ - list_force_poison(&page->lru); + /* + * ZONE_DEVICE pages union ->lru with a ->pgmap back + * pointer. It is a bug if a ZONE_DEVICE page is ever + * freed or placed on a driver-private list. Seed the + * storage with LIST_POISON* values. + */ + list_del(&page->lru); page->pgmap = pgmap; } devres_add(dev, page_map); diff --git a/lib/list_debug.c b/lib/list_debug.c index 3345a089ef7b..3859bf63561c 100644 --- a/lib/list_debug.c +++ b/lib/list_debug.c @@ -12,13 +12,6 @@ #include #include -static struct list_head force_poison; -void list_force_poison(struct list_head *entry) -{ - entry->next = &force_poison; - entry->prev = &force_poison; -} - /* * Insert a new entry between two known consecutive entries. * @@ -30,8 +23,6 @@ void __list_add(struct list_head *new, struct list_head *prev, struct list_head *next) { - WARN(new->next == &force_poison || new->prev == &force_poison, - "list_add attempted on force-poisoned entry\n"); WARN(next->prev != prev, "list_add corruption. next->prev should be " "prev (%p), but was %p. (next=%p).\n", From david@fromorbit.com Tue Mar 1 18:40:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D15097CBB for ; Tue, 1 Mar 2016 18:40:32 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A2A1E304048 for ; Tue, 1 Mar 2016 16:40:32 -0800 (PST) X-ASG-Debug-ID: 1456879226-04cbb00b721209f0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 9XtWXa1OSGvHJD3K for ; Tue, 01 Mar 2016 16:40:27 -0800 (PST) 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: A2C0CwC4NdZWOT0ILHlcKAECgw8iMG2CbIN5n1kCCgwBAQEBAQEGgQ+KZ4VIhAcXAoV0BIFRTQEBAQEBAQcBAQEBQAFAhR47JDQFJQMHLYgen0KfDggYhTKKA4F8C0CBJwWHV4sehBmFWYd/jn4CjkyCGAwBgjUoLohBAQEB Received: from ppp121-44-8-61.lns20.syd4.internode.on.net (HELO dastard) ([121.44.8.61]) by ipmail04.adl6.internode.on.net with ESMTP; 02 Mar 2016 11:02:58 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aatVX-00051R-8L for xfs@oss.sgi.com; Wed, 02 Mar 2016 10:15:11 +1100 Date: Wed, 2 Mar 2016 10:15:11 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfs; for-next branch updated to 31bb236 Message-ID: <20160301231511.GM30721@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfs; for-next branch updated to 31bb236 MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="WYTEVAkct0FjGQmd" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1456879226 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27487 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --WYTEVAkct0FjGQmd Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The for-next branch of the xfs kernel repository at git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git has just been updated. The new head of the for-next branch is commit: 31bb236 Merge branch 'xfs-misc-fixes-4.6-2' into for-next New Commits: Christoph Hellwig (1): [a7e5d03] xfs: remove xfs_trans_get_block_res Colin Ian King (1): [5d518bd] xfs: fix format specifier , should be %llx and not %llu Dave Chinner (1): [31bb236] Merge branch 'xfs-misc-fixes-4.6-2' into for-next Eric Sandeen (3): [2e74af0] xfs: convert mount option parsing to tokens [a08ee40] xfs: sanitize remount options [12c3f05] xfs: fix up inode32/64 (re)mount handling Mateusz Guzik (1): [2e83b79] xfs: fix two memory leaks in xfs_attr_list.c error paths Code Diffstat: fs/xfs/libxfs/xfs_bmap.c | 6 +- fs/xfs/libxfs/xfs_bmap_btree.c | 4 +- fs/xfs/xfs_attr_list.c | 19 +- fs/xfs/xfs_discard.c | 2 +- fs/xfs/xfs_mount.c | 20 +- fs/xfs/xfs_mount.h | 5 +- fs/xfs/xfs_super.c | 525 +++++++++++++++++++++++--------------= ------ fs/xfs/xfs_super.h | 4 +- fs/xfs/xfs_trans.h | 1 - 9 files changed, 304 insertions(+), 282 deletions(-) --=20 Dave Chinner david@fromorbit.com --WYTEVAkct0FjGQmd Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJW1iJ+AAoJEK3oKUf0dfodUrsP/i9U30bIJeSd2dmoGQlKPtL4 zpgTEu13ZVN+XjpFeV0OViAze0aG8ITlNKmSGERN3sx05IhbugfHJM6ok7YOvxfj m9si6G66eoAAb2MJUrfjh9XZoq59mpWmOehjidrAqB9+YGDABhp1rMdlCg+xXgTr PGbT/53/buwxoVN7FI32bo2sdSVAV17GUfla3Dh+d4wKUKud3J4vw2jx2K8VBoqM 4HezNR0qml96+85F/hZ1oauzbP0AGTg8aRCUc/2DbdZCX7SoRS80cyGMXl5FASis /UZYk1sUeXLnIGTOsifqgE+98ycYg5oFtEPYZTLDvf070KbBvEEZxn/dsN87OubN EywjdB3xO9mfFWCyyuZZdIR1Xp5h/OPaf1wvD6P2g3MBCNd1vjTbpvRPydEE7lVb yRrFOivTTkHjr58RqK3C384FQzpXEatYeDP7jOPT7aO6KfPa/BpfYvEurCdBlBu8 1cYcVvGR90o8dwXjcz3NHHpeGic4GNjUirnuoBNv7mE67K5gfeVti4QjVHbVyTZD PtJUC5TaEqkNJk1eOUok5lEyU1wyoTzMpHqCq+qK4k/4Acq/rkJ4evTkKFTZ9mE5 8rtrSMG7u6QP+HM4Canu+JZhykRTA636FiqO434x3un1xTY0yf9pMofboozwW4uP T4rWjxcszb7+lmtEnc6u =eLos -----END PGP SIGNATURE----- --WYTEVAkct0FjGQmd-- From darrick.wong@oracle.com Tue Mar 1 23:09:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 998487CBB for ; Tue, 1 Mar 2016 23:09:43 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 01F00AC001 for ; Tue, 1 Mar 2016 21:09:39 -0800 (PST) X-ASG-Debug-ID: 1456895375-04cbb00b72129c40001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id R1r8PW53fkl0iofR (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 01 Mar 2016 21:09:35 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u2259YLP011886 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 2 Mar 2016 05:09:35 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u2259Y71018484 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Wed, 2 Mar 2016 05:09:34 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u2259Vl8021358; Wed, 2 Mar 2016 05:09:32 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 01 Mar 2016 21:09:31 -0800 Date: Tue, 1 Mar 2016 21:09:30 -0800 From: "Darrick J. Wong" To: Dave Chinner Cc: xfs@oss.sgi.com Subject: [PATCH] xfs: fix computation of inode btree maxlevels Message-ID: <20160302050930.GD27973@birch.djwong.org> X-ASG-Orig-Subj: [PATCH] xfs: fix computation of inode btree maxlevels MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1456895375 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27495 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Commit 88740da18[1] introduced a function to compute the maximum height of the inode btree back in 1994. Back then, apparently, the freespace and inode btrees shared the same geometry; however, it has long since been the case that the inode and freespace btrees have different record and key sizes. Therefore, we must use m_inobt_mnr if we want a correct calculation/log reservation/etc. (Yes, this bug has been around for 21 years and ten months.) (Yes, I was in middle school when this bug was committed. 8-) ) [1] http://oss.sgi.com/cgi-bin/gitweb.cgi?p=archive/xfs-import.git;a=commitdiff;h=88740da18ddd9d7ba3ebaa9502fefc6ef2fd19cd Historical-research-by: Dave Chinner Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_ialloc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 66d702e..22297f9 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -2403,8 +2403,8 @@ xfs_ialloc_compute_maxlevels( maxleafents = (1LL << XFS_INO_AGINO_BITS(mp)) >> XFS_INODES_PER_CHUNK_LOG; - minleafrecs = mp->m_alloc_mnr[0]; - minnoderecs = mp->m_alloc_mnr[1]; + minleafrecs = mp->m_inobt_mnr[0]; + minnoderecs = mp->m_inobt_mnr[1]; maxblocks = (maxleafents + minleafrecs - 1) / minleafrecs; for (level = 1; maxblocks > 1; level++) maxblocks = (maxblocks + minnoderecs - 1) / minnoderecs; From darrick.wong@oracle.com Tue Mar 1 23:24:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DCCD77CBB for ; Tue, 1 Mar 2016 23:24:47 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3EF57AC004 for ; Tue, 1 Mar 2016 21:24:47 -0800 (PST) X-ASG-Debug-ID: 1456896284-04cbb00b7012a0e0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id pqKIUzq7BNvY1ZaB (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 01 Mar 2016 21:24:44 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u225OEKf020864 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 2 Mar 2016 05:24:14 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u225OELG027694 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Wed, 2 Mar 2016 05:24:14 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u225OCaJ007055; Wed, 2 Mar 2016 05:24:13 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 01 Mar 2016 21:24:12 -0800 Date: Tue, 1 Mar 2016 21:24:11 -0800 From: "Darrick J. Wong" To: Christoph Hellwig , Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: block allocations for the refcount btree Message-ID: <20160302052411.GB1902@birch.djwong.org> X-ASG-Orig-Subj: Re: block allocations for the refcount btree References: <20160210093011.GA19147@infradead.org> <20160210095010.GC23904@birch.djwong.org> <20160210190738.GA13051@infradead.org> <20160210214058.GN14668@dastard> <20160212191046.GA28421@infradead.org> <20160301181809.GC27973@birch.djwong.org> <20160301204013.GA23128@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160301204013.GA23128@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1456896284 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27495 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Tue, Mar 01, 2016 at 12:40:13PM -0800, Christoph Hellwig wrote: > On Tue, Mar 01, 2016 at 10:18:09AM -0800, Darrick J. Wong wrote: > > One side effect of the per-ag block reservation code is that it reserves all > > the blocks that the refcountbt will ever need at mount time, which includes > > decreasing the incore fdblocks counter at mount and putting it back at unmount > > time. This /should/ eliminate the need for reserving blocks in truncate > > transactions, though clearly this isn't being done correctly. > > We're still accouting these blocks in t_blk_res_used through > xfs_alloc_vextent -> xfs_alloc_ag_vextent -> xfs_trans_mod_sb. > > I don't really see how the reservation code changes anything about > that accounting. It just ensures the allocation will succeed through > xfs_ag_resv_needed in xfs_alloc_ag_vextent, and then removes the > allocated block from the reservation using xfs_ag_resv_alloc_block. > > Maybe we need to find a way to not account for these blocks. > > > So what I'm saying is that I think this problem was with the AGresv code not > > doing accounting correctly, and that I've fixed it in a subsequent rewrite of > > the AGresv code. I'll post it later, after I figure out why generic/333 > > regresses with the new code. > > Ok, let's see if the new version helps with the above issue. > > > However, there's one thing to be aware of -- if the AGresv uses up all the > > blocks that were preallocated at mount time, the allocator will grab any free > > blocks available and charge the blocks to the transaction, just like before. > > If this ever happens (in theory we reserve enough blocks so that we can have a > > refcount record for every block in the AG) then we'll still have this problem. > > It seems like we should simply avoid that this case ever happens. I've rebased my trees and pushed them all to github. The for-dave-for-4.6 kernel and progs branches are the giant piles of patches against Dave's for-next integration trees which (I think) are being reviewed for 4.6. The for-dave branches are against upstream as they've always been. New patches have been added on the end of the patchset. I noticed that generic/139 crashes for-dave with a 1k block size due something or other sending us bio->bi_bdev == NULL. This seems to be sorted out somehow in for-next. Other than that I haven't seen any problems... but I've only run against x64 on bare XFS. Will run other arches/NFS/etc tonight/tomorrow. The transaction block reservation complaints should be fixed now, and I think the transaction reservations have been fixed too... or at least they don't show up on the tinydisk test setup. But all that means is that someone else will find it, probably within the first 3 minutes of testing. :P kernel: for-dave-for-4.6: 31bb2360d45ae3920244a808caffd500ad85f2b6 -> b07b3e650891dc3bd439c5c296bfc22b90c1b9a5 for-dave: fc77dbd34c5c99bce46d40a2491937c3bcbd10af -> 163e86bdb2a2dc1ebb91867a247b4e671298fde7 xfsprogs: for-dave-for-4.6: c062cfe7dbc568ec9ec308ef6a1bf4ef5cd9af2a -> b147a7ea86bf1f3697cea3bfa7909197ee374aba for-dave: 1abecdabbc9190db2fa7c3dab15931b7b9ddbb0d -> cbda21d47a9ecde446660bb8ffd808e2ac008554 --D From generalitye2@yahoo.com Wed Mar 2 00:48:08 2016 Return-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.6 required=5.0 tests=FORGED_YAHOO_RCVD, FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM 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 824E77CBB for ; Wed, 2 Mar 2016 00:48:08 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 07153AC003 for ; Tue, 1 Mar 2016 22:48:04 -0800 (PST) X-ASG-Debug-ID: 1456901279-04bdf002ee116a10001-NocioJ Received: from bba137540.alshamil.net.ae (bba137540.alshamil.net.ae [217.165.125.126]) by cuda.sgi.com with ESMTP id 1Bv2lHEH7JqMh0KM for ; Tue, 01 Mar 2016 22:48:00 -0800 (PST) X-Barracuda-Envelope-From: generalitye2@yahoo.com X-Barracuda-Apparent-Source-IP: 217.165.125.126 Date: Wed, 2 Mar 2016 10:42:45 +0400 To: Message-Id: <20160302104245.K4HOJY5AR5FJ7@KIB.yahoo.com> Content-Type: text/plain; charset="koi8-r" Subject: =?koi8-r?B?7c7Px8/Lwc7BzNjO2cog1MHSycYh+tfPzsnUxSE=?= From: =?koi8-r?B?8MHOxsnMz9c=?= X-ASG-Orig-Subj: =?koi8-r?B?7c7Px8/Lwc7BzNjO2cog1MHSycYh+tfPzsnUxSE=?= X-Mailer: EDMAIL R6.00.02 X-Barracuda-Connect: bba137540.alshamil.net.ae[217.165.125.126] X-Barracuda-Start-Time: 1456901279 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.41 X-Barracuda-Spam-Status: No, SCORE=1.41 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=FORGED_YAHOO_RCVD, FORGED_YAHOO_RCVD_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27496 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 FORGED_YAHOO_RCVD 'From' yahoo.com does not match 'Received' headers 1.41 FORGED_YAHOO_RCVD_2 'From' yahoo.com does not match 'Received' headers ïÂßÑ×ÌÑÅÍ Ï áëãéé! óõðåòðòåäìïöåîéå ÄÌÑ ïæéóá! ðÏÄËÌÀÞÅÎÉÅ - âåóðìáôîï! åÖÅÍÅÓÑÞÎÙÊ ÐÌÁÔÅÖ ÐÒÉ ÓËÏÒÏÓÔÉ: 10 ÍÂÉÔ/ÓÅË - 3.000 ÒÕÂ. 20 ÍÂÉÔ/ÓÅË - 4.000 ÒÕÂ. 30 ÍÂÉÔ/ÓÅË - 5.000 ÒÕÂ. ðÏÄËÌÀÞÅÎÉÅ - ÂÅÓÐÌÁÔÎÏ! ÁÂÏÎÅÎÔÓËÁÑ ÐÌÁÔÁ × ÍÅÓÑà - 500 ÒÕÂ. ðÏÄÒÏÂÎÏÓÔÉ ÐÏ ÔÅÌÅÆÏÎÕ: +7 495 225 08 74 From BATV+7fc10ca489ce5a2f9509+4574+infradead.org+hch@bombadil.srs.infradead.org Wed Mar 2 03:45:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B86B67CBB for ; Wed, 2 Mar 2016 03:45:28 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3B2BAAC007 for ; Wed, 2 Mar 2016 01:45:28 -0800 (PST) X-ASG-Debug-ID: 1456911920-04cb6c5831fffb0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id grZjdv4Od6z8yVWg (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 02 Mar 2016 01:45:21 -0800 (PST) X-Barracuda-Envelope-From: BATV+7fc10ca489ce5a2f9509+4574+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 1ab3LM-0006AC-7e; Wed, 02 Mar 2016 09:45:20 +0000 Date: Wed, 2 Mar 2016 01:45:20 -0800 From: Christoph Hellwig To: "Darrick J. Wong" Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix computation of inode btree maxlevels Message-ID: <20160302094520.GA18130@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix computation of inode btree maxlevels References: <20160302050930.GD27973@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160302050930.GD27973@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1456911921 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27499 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Mar 01, 2016 at 09:09:30PM -0800, Darrick J. Wong wrote: > Commit 88740da18[1] introduced a function to compute the maximum > height of the inode btree back in 1994. Back then, apparently, the > freespace and inode btrees shared the same geometry; however, it has > long since been the case that the inode and freespace btrees have > different record and key sizes. I think that's always been the case, so this has been buggy since day one. Congrat for gfinding one of the probably oldest bugs so far! Reviewed-by: Christoph Hellwig From BATV+7fc10ca489ce5a2f9509+4574+infradead.org+hch@bombadil.srs.infradead.org Wed Mar 2 03:46:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AA17B7CBB for ; Wed, 2 Mar 2016 03:46:02 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1795EAC004 for ; Wed, 2 Mar 2016 01:46:02 -0800 (PST) X-ASG-Debug-ID: 1456911959-04cbb00b721334c0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 9hXNbEPy8JoAow9Q (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 02 Mar 2016 01:46:00 -0800 (PST) X-Barracuda-Envelope-From: BATV+7fc10ca489ce5a2f9509+4574+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 1ab3Lz-0006IU-LW; Wed, 02 Mar 2016 09:45:59 +0000 Date: Wed, 2 Mar 2016 01:45:59 -0800 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [ANNOUNCE] xfs; for-next branch updated to 31bb236 Message-ID: <20160302094559.GB18130@infradead.org> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfs; for-next branch updated to 31bb236 References: <20160301231511.GM30721@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160301231511.GM30721@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1456911960 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27499 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > Mateusz Guzik (1): > [2e83b79] xfs: fix two memory leaks in xfs_attr_list.c error paths This didn't seem to address the comment about using a goto for error handling? From BATV+7fc10ca489ce5a2f9509+4574+infradead.org+hch@bombadil.srs.infradead.org Wed Mar 2 03:59:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C9E617CBB for ; Wed, 2 Mar 2016 03:59:40 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 42E11AC003 for ; Wed, 2 Mar 2016 01:59:40 -0800 (PST) X-ASG-Debug-ID: 1456912773-04bdf002ed11c3a0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id EsqTKuTdLcgsHI8R (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 02 Mar 2016 01:59:33 -0800 (PST) X-Barracuda-Envelope-From: BATV+7fc10ca489ce5a2f9509+4574+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 1ab3Z6-0004Ps-ST; Wed, 02 Mar 2016 09:59:32 +0000 Date: Wed, 2 Mar 2016 01:59:32 -0800 From: Christoph Hellwig To: "Darrick J. Wong" Cc: Christoph Hellwig , Dave Chinner , xfs@oss.sgi.com Subject: Re: block allocations for the refcount btree Message-ID: <20160302095932.GA9141@infradead.org> X-ASG-Orig-Subj: Re: block allocations for the refcount btree References: <20160210093011.GA19147@infradead.org> <20160210095010.GC23904@birch.djwong.org> <20160210190738.GA13051@infradead.org> <20160210214058.GN14668@dastard> <20160212191046.GA28421@infradead.org> <20160301181809.GC27973@birch.djwong.org> <20160301204013.GA23128@infradead.org> <20160302052411.GB1902@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160302052411.GB1902@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1456912773 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27500 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Mar 01, 2016 at 09:24:11PM -0800, Darrick J. Wong wrote: > I've rebased my trees and pushed them all to github. > > The for-dave-for-4.6 kernel and progs branches are the giant piles of patches > against Dave's for-next integration trees which (I think) are being reviewed > for 4.6. > > The for-dave branches are against upstream as they've always been. BTW, what's the point of for-dave vs for-dave-for-4.6 for xfsprogs? > New patches have been added on the end of the patchset. > > I noticed that generic/139 crashes for-dave with a 1k block size due something > or other sending us bio->bi_bdev == NULL. This seems to be sorted out somehow > in for-next. Other than that I haven't seen any problems... but I've only > run against x64 on bare XFS. Will run other arches/NFS/etc tonight/tomorrow. > > The transaction block reservation complaints should be fixed now, and I > think the transaction reservations have been fixed too... or at least they > don't show up on the tinydisk test setup. But all that means is that someone > else will find it, probably within the first 3 minutes of testing. :P Passes on NFS without hitting the space reservation issue, and passes on XFS without new regression. The odd transaction (not space) reservation assert in xfs/140 that I started to myesteriously 100% reproduce last week still is around on XFS. I'll see if I can fix that or at least triage it further.. From gavin.guo@canonical.com Wed Mar 2 06:45:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 356B67CB1 for ; Wed, 2 Mar 2016 06:45:54 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 02F938F8033 for ; Wed, 2 Mar 2016 04:45:50 -0800 (PST) X-ASG-Debug-ID: 1456922746-04cbb00b6f13be20001-NocioJ Received: from mail-yw0-f175.google.com (mail-yw0-f175.google.com [209.85.161.175]) by cuda.sgi.com with ESMTP id 8Dr6VntNlBLdhiGb (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 02 Mar 2016 04:45:47 -0800 (PST) X-Barracuda-Envelope-From: gavin.guo@canonical.com X-Barracuda-Apparent-Source-IP: 209.85.161.175 Received: by mail-yw0-f175.google.com with SMTP id u200so175353883ywf.0 for ; Wed, 02 Mar 2016 04:45:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=8d3mSvUWaxeSMjM+R6JlPZROk8HFFwWOPHVCivg25iM=; b=tslELC+oojd8Af/EO0wAkatAFoPkAEksj5DufTGNUTRqJ54p1Inll8umnJfhOeUmP3 5Mxnn2aF6bTCiZitmShgZNm8Bo3S0uxR+I2Z4zG56yVWGSwNmm1MPb4MM2WdEJ28NWti w2Ia+Qa7+523UTfYJNTrjJmwhtafmDPksPrKyFty515RelETcmXrBelrCZu3oe92r4aw tUzRqaBm6vo9Tzc69qXohPr2QE3zbfpaCjVgjjWbn0FNLB/Th5GvRm28Rx/B0KOlw7vI IDFCStQ3hPTGvdpkqBfCZ5Wux0BMAS+83dcnyU4aVxpZFk+xs3LnW3+PsDSM9J6iuFrn ypmQ== 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; bh=8d3mSvUWaxeSMjM+R6JlPZROk8HFFwWOPHVCivg25iM=; b=iSqS7X5LC/a//IWkNvkZySO6OWiNI15HbxnLVYWZeuZLPbPsHN4C2Mk5mRiPuA1C9W Dd+GbwU8NNf+xQKVNL0TQxXnfx6v0gt2RxUxQ/JAvW70j5XWrUIwGTGIAcdgoHteqFPM SE+tL/NaE+42J/XzfiksBTFim/4wJHctghCqj6vwP4RURktafQYClKOlWPaXfFeqx8yx 8eMfrkxAS5EKwYxrVfvL8832CoPFQAbSrRcCzggagrFkO1az0rATiAf2kaFYNoyNU+4v xiu8MLkDwWw7us1dIVWdlv8OMYeT2SbwheJC+/zQ1lkuFYP/zwu8kM+DCXWr6JYiXiX4 TaLg== X-Gm-Message-State: AD7BkJJX0EyOh5gICdjDppyhrSOjC2qfKKgrs/cbOCauNsOHhxBFMPtsH6lnEQ8TjlYvRDlme/tadHyx4tiqTdwR MIME-Version: 1.0 X-Received: by 10.13.255.194 with SMTP id p185mr14759422ywf.10.1456922746497; Wed, 02 Mar 2016 04:45:46 -0800 (PST) Received: by 10.37.57.203 with HTTP; Wed, 2 Mar 2016 04:45:46 -0800 (PST) In-Reply-To: <20160215132824.GH14668@dastard> References: <1453177919-17849-1-git-send-email-david@fromorbit.com> <20160120015853.GU6033@dastard> <20160126141733.GA48264@bfoster.bfoster> <20160214001645.GF14668@dastard> <20160215132824.GH14668@dastard> Date: Wed, 2 Mar 2016 20:45:46 +0800 Message-ID: Subject: Re: [PATCH v2] [RFC] xfs: allocate log vector buffers outside CIL context lock From: Gavin Guo X-ASG-Orig-Subj: Re: [PATCH v2] [RFC] xfs: allocate log vector buffers outside CIL context lock To: Dave Chinner Cc: Jens Rosenboom , Brian Foster , xfs@oss.sgi.com Content-Type: multipart/mixed; boundary=94eb2c088930c577c3052d1042b8 X-Barracuda-Connect: mail-yw0-f175.google.com[209.85.161.175] X-Barracuda-Start-Time: 1456922747 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27502 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature --94eb2c088930c577c3052d1042b8 Content-Type: text/plain; charset=UTF-8 On Mon, Feb 15, 2016 at 9:28 PM, Dave Chinner wrote: > On Mon, Feb 15, 2016 at 12:57:51PM +0100, Jens Rosenboom wrote: >> 2016-02-14 1:16 GMT+01:00 Dave Chinner : >> > On Sat, Feb 13, 2016 at 06:09:17PM +0100, Jens Rosenboom wrote: >> >> 2016-01-26 15:17 GMT+01:00 Brian Foster : >> >> > On Wed, Jan 20, 2016 at 12:58:53PM +1100, Dave Chinner wrote: >> >> We have seen this issue on our production Ceph cluster sporadically >> >> and have tried a long time to reproduce it in a lab environment. >> > .... >> >> kmem_alloc (mode:0x2408240) >> >> Feb 13 10:51:57 storage-node35 kernel: [10562.614089] XFS: >> >> ceph-osd(10078) possible memory allocation deadlock size 32856 in >> >> kmem_alloc (mode:0x2408240) >> > >> > High order allocation of 32k. That implies a buffer size of at least >> > 32k is in use. Can you tell me what the output of xfs_info >> > is for one of your filesystems? >> >> $ xfs_info /tmp/cbt/mnt/osd-device-0-data/ >> meta-data=/dev/sda2 isize=2048 agcount=4, agsize=97370688 blks >> = sectsz=512 attr=2, projid32bit=1 >> = crc=0 finobt=0 >> data = bsize=4096 blocks=389482752, imaxpct=5 >> = sunit=0 swidth=0 blks >> naming =version 2 bsize=65536 ascii-ci=0 ftype=0 >> log =internal bsize=4096 blocks=190177, version=2 >> = sectsz=512 sunit=0 blks, lazy-count=1 >> realtime =none extsz=4096 blocks=0, rtextents=0 > > OK, so 64k directory block size. > >> > I suspect you are using a 64k directory block size, in which case >> > I'll ask "are you storing millions of files in a single directory"? >> > If your answer is no, then "don't do that" is an appropriate >> > solution because large directory block sizes are slower than the >> > default (4k) for almost all operations until you get up into the >> > millions of files per directory range. >> >> These options are kind of standard folklore for setting up Ceph >> clusters, I must admit that I delayed testing their performance >> implications up to now, so many knobs to turn, so little time. >> >> mkfs_opts: '-f -i size=2048 -n size=64k' >> mount_opts: '-o inode64,noatime,logbsize=256k' > > /me shakes his head sadly. > > Can you please go nuke where ever you read that from orbit? Please? > It's the only way to be sure that the contagious cargo-cult > stupidity doesn't spread further. > >> It turns out that when running with '-n size=4k' > > i.e. the default. > >> , indeed I do not get >> any warnings during a 10h test run. I'll try to come up with some more >> detailed benchmarking of the possible performance impacts, too. > > No surprise there. :/ > > FWIW, for small file Ceph workloads (e.g swift stores) we've found > that 8k directory block sizes give marginal improvements over the > default 4k, but it's all down hill from there. > >> Am I right in assuming that this parameter can not be tuned after the >> initial mkfs? > > That's right. > >> In that case getting a production-ready version of your >> patch would probably still be valuable for cluster admins wanting to >> avoid having to move all of their data to new filesystems. > > Well, yes, that's why I'm working on it. But it's critical core > code, it's also damn tricky and complex, and if I get it wrong it > will corrupt filesystems. So I'm not going to rush a prototype fix > out into production systems no matter how much pressure people put > on me to ship a fix. > >> >> Soon after this, operations get so slow that the OSDs die because of >> >> their suicide timeouts. >> >> >> >> Then I installed onto 3 servers this patch (applied onto kernel >> >> v4.4.1). The bad news is that I am still getting the kernel messages >> >> on these machines. The good news, though, is that they appear at a >> >> much lower frequency and also the impact on performance seems to be >> >> lower, so the OSD processes on these three nodes did not get killed. >> > >> > Right, the patch doesn't fix the underlying issue that memory >> > fragmentation can prevent high order allocation from succeeding for >> > long periods. However, it does ensure that the filesystem does not >> > immediately deadlock memory reclaim when it happens so the system >> > has a chance to recover. It still can deadlock the filesystem, >> > because if we can't commit the transaction we can't unlock the >> > objects in the transaction and everything can get stuck behind that >> > if there's something sufficiently important in the blocked >> > transaction. >> >> So how would your success criteria for getting this patch into >> upstream look like? > > It's already "successful". I've proved locally that it avoids a memory > reclaim deadlock that many people have reported over the past year. > So there's no question that we need a fix to the problem; it's now > just a matter of determining if the issues with this fix (e.g. > doubling memory usage of the CIL) are an acceptible tradeoff for > production workloads, or whether I've got to go back and prototype a > fourth attempt at fixing the problem... > > And, of course, there's only some many hours int eh day. I'm into my > 19th right now, and I havent' got through everything on my list for > today yet. Tomorrow's list is even longer, and when I get through > that, I hit the big one: "read, understand and review 10000 lines of > complex new code".... > >> Would a benchmark of the 64k directory block size >> case on machines all running with patched kernels be interesting? Or >> would that scenario disqualify itself as being mistuned in the first >> place? > > Not really - I've confirmed it doesn't cause performance issues on > my usual tranche of benhmarks, so I'mnot conerned about that (it;s > the same amount of work being done, anyway). Correctness is much > more important right now, and that takes time, effort and focus to > verify. > > And speaking of focus, it's now time for me to sleep. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs I've recently backported the patch to the v3.13 kernel to see if the bug can be fixed by the patch. Currently, since the bug only can be reproduced on the production system, I need to ensure the code work correctly before deploying the kernel. The following is the v3.13 backported kernel source: http://kernel.ubuntu.com/git/gavinguo/ubuntu-trusty-amd64.git/log/?h=hf00084724v20160219b0hc57647a I also did the xfstests verification and the log is attached. There are failed 7 of 93 tests. Investigation is still ongoing to determine if these errors are related to the file system core functionality failure due to the backporting incorrection. I'll appreciate if you can give any suggestion to do the testing, give a glance to the backported patch or the xfstests error log to see if there is any thing wrong. --94eb2c088930c577c3052d1042b8 Content-Type: text/x-log; charset=US-ASCII; name="testresult.log" Content-Disposition: attachment; filename="testresult.log" Content-Transfer-Encoding: base64 X-Attachment-Id: f_ilau4i1e0 dWJ1bnR1QHhmcy10ZXN0LXZtOn4vb3MveGZzdGVzdHMkIHVuYW1lIC1hCkxpbnV4IHhmcy10ZXN0 LXZtIDMuMTMuMC03Ny1nZW5lcmljICMxMjFoZjAwMDg0NzI0djIwMTYwMjE5YjBoYzU3NjQ3YSBT TVAgRnJpIEZlYiAxOSAwODo0OToxOCBVVEMgMjAgeDg2XzY0IHg4Nl82NCB4ODZfNjQgR05VL0xp bnV4CnVidW50dUB4ZnMtdGVzdC12bTp+L29zL3hmc3Rlc3RzJCBURVNUX0RFVj0iL2Rldi92ZGIi IFRFU1RfRElSPSIvbW50L3hmc19tbnQvIiAuL2NoZWNrCmNoZWNrOiBRQSBtdXN0IGJlIHJ1biBh cyByb290CnVidW50dUB4ZnMtdGVzdC12bTp+L29zL3hmc3Rlc3RzJCBzdWRvICEhCnN1ZG8gVEVT VF9ERVY9Ii9kZXYvdmRiIiBURVNUX0RJUj0iL21udC94ZnNfbW50LyIgLi9jaGVjawpzdWRvOiB1 bmFibGUgdG8gcmVzb2x2ZSBob3N0IHhmcy10ZXN0LXZtCkZTVFlQICAgICAgICAgLS0geGZzIChu b24tZGVidWcpClBMQVRGT1JNICAgICAgLS0gTGludXgveDg2XzY0IHhmcy10ZXN0LXZtIDMuMTMu MC03Ny1nZW5lcmljCgpnZW5lcmljLzAwMSAgICAgIDNzCmdlbmVyaWMvMDAyICAgICAgMHMKZ2Vu ZXJpYy8wMDMgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFU Q0hfREVWCmdlbmVyaWMvMDA0ICAgICAgW25vdCBydW5dIHhmc19pbyBmbGluayBzdXBwb3J0IGlz IG1pc3NpbmcKZ2VuZXJpYy8wMDUgICAgICAwcwpnZW5lcmljLzAwNiAgICAgIDBzCmdlbmVyaWMv MDA3ICAgICAgMXMKZ2VuZXJpYy8wMDggICAgICBbbm90IHJ1bl0geGZzX2lvIGZ6ZXJvIHN1cHBv cnQgaXMgbWlzc2luZwpnZW5lcmljLzAwOSAgICAgIFtub3QgcnVuXSB4ZnNfaW8gZnplcm8gc3Vw cG9ydCBpcyBtaXNzaW5nCmdlbmVyaWMvMDEwICAgICAgMHMKZ2VuZXJpYy8wMTEgICAgICAxcwpn ZW5lcmljLzAxMiAgICAgIFtub3QgcnVuXSB4ZnNfaW8gZmNvbGxhcHNlIHN1cHBvcnQgaXMgbWlz c2luZwpnZW5lcmljLzAxMyAgICAgIDI0cwpnZW5lcmljLzAxNCAgICAgIDlzCmdlbmVyaWMvMDE1 ICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpn ZW5lcmljLzAxNiAgICAgIFtub3QgcnVuXSB4ZnNfaW8gZmNvbGxhcHNlIHN1cHBvcnQgaXMgbWlz c2luZwpnZW5lcmljLzAxNyAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxp ZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8wMTggICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVp cmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMDE5ICAgICAgW25vdCBydW5dIHRoaXMg dGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzAyMCAgICAgIDNzCmdl bmVyaWMvMDIxICAgICAgW25vdCBydW5dIHhmc19pbyBmY29sbGFwc2Ugc3VwcG9ydCBpcyBtaXNz aW5nCmdlbmVyaWMvMDIyICAgICAgW25vdCBydW5dIHhmc19pbyBmY29sbGFwc2Ugc3VwcG9ydCBp cyBtaXNzaW5nCmdlbmVyaWMvMDIzICAgICAgW25vdCBydW5dIGtlcm5lbCBkb2Vzbid0IHN1cHBv cnQgcmVuYW1lYXQyIHN5c2NhbGwKZ2VuZXJpYy8wMjQgICAgICBbbm90IHJ1bl0ga2VybmVsIGRv ZXNuJ3Qgc3VwcG9ydCByZW5hbWVhdDIgc3lzY2FsbApnZW5lcmljLzAyNSAgICAgIFtub3QgcnVu XSBrZXJuZWwgZG9lc24ndCBzdXBwb3J0IHJlbmFtZWF0MiBzeXNjYWxsCmdlbmVyaWMvMDI2ICAg ICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5l cmljLzAyNyAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRD SF9ERVYKZ2VuZXJpYy8wMjggICAgICA1cwpnZW5lcmljLzAyOSAgICAgIFtub3QgcnVuXSB0aGlz IHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8wMzAgICAgICBbbm90 IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMDMx ICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpn ZW5lcmljLzAzMiAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NS QVRDSF9ERVYKZ2VuZXJpYy8wMzMgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEg dmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMDM0ICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCBy ZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzAzNSAgICAgIDBzCmdlbmVyaWMv MDM2ICAgICAgMTBzCmdlbmVyaWMvMDM3ICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJl cyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzAzOCAgICAgIFtub3QgcnVuXSB0aGlzIHRl c3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8wMzkgICAgICBbbm90IHJ1 bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMDQwICAg ICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5l cmljLzA0MSAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRD SF9ERVYKZ2VuZXJpYy8wNDIgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFs aWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMDQzICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1 aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzA0NCAgICAgIFtub3QgcnVuXSB0aGlz IHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8wNDUgICAgICBbbm90 IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMDQ2 ICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpn ZW5lcmljLzA0NyAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NS QVRDSF9ERVYKZ2VuZXJpYy8wNDggICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEg dmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMDQ5ICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCBy ZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzA1MCAgICAgIFtub3QgcnVuXSB0 aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8wNTEgICAgICBb bm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMv MDUyICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RF VgpnZW5lcmljLzA1MyAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAk U0NSQVRDSF9ERVYKZ2VuZXJpYy8wNTQgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVz IGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMDU1ICAgICAgW25vdCBydW5dIHRoaXMgdGVz dCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzA1NiAgICAgIFtub3QgcnVu XSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8wNTcgICAg ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVy aWMvMDU4ICAgICAgW25vdCBydW5dIHhmc19pbyBmaW5zZXJ0IHN1cHBvcnQgaXMgbWlzc2luZwpn ZW5lcmljLzA1OSAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NS QVRDSF9ERVYKZ2VuZXJpYy8wNjAgICAgICBbbm90IHJ1bl0geGZzX2lvIGZpbnNlcnQgc3VwcG9y dCBpcyBtaXNzaW5nCmdlbmVyaWMvMDYxICAgICAgW25vdCBydW5dIHhmc19pbyBmaW5zZXJ0IHN1 cHBvcnQgaXMgbWlzc2luZwpnZW5lcmljLzA2MiAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVx dWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8wNjMgICAgICBbbm90IHJ1bl0geGZz X2lvIGZpbnNlcnQgc3VwcG9ydCBpcyBtaXNzaW5nCmdlbmVyaWMvMDY0ICAgICAgW25vdCBydW5d IHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzA2NSAgICAg IFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJp Yy8wNjYgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hf REVWCmdlbmVyaWMvMDY3ICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlk ICRTQ1JBVENIX0RFVgpnZW5lcmljLzA2OCAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWly ZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8wNjkgICAgICBbbm90IHJ1bl0gdGhpcyB0 ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMDcwICAgICAgNnMKZ2Vu ZXJpYy8wNzEgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFU Q0hfREVWCmdlbmVyaWMvMDcyICAgICAgW25vdCBydW5dIHhmc19pbyBmY29sbGFwc2Ugc3VwcG9y dCBpcyBtaXNzaW5nCmdlbmVyaWMvMDczICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJl cyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzA3NCAgICAgIDEwNHMKZ2VuZXJpYy8wNzUg ICAgICAyOXMKZ2VuZXJpYy8wNzYgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEg dmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMDc3ICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCBy ZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzA3OCAgICAgIFtub3QgcnVuXSBr ZXJuZWwgZG9lc24ndCBzdXBwb3J0IHJlbmFtZWF0MiBzeXNjYWxsCmdlbmVyaWMvMDc5ICAgICAg W25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmlj LzA4MCAgICAgIDNzCmdlbmVyaWMvMDgxICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJl cyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzA4MiAgICAgIFtub3QgcnVuXSB0aGlzIHRl c3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8wODMgICAgICBbbm90IHJ1 bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMDg0ICAg ICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5l cmljLzA4NSAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRD SF9ERVYKZ2VuZXJpYy8wODYgICAgICAxcwpnZW5lcmljLzA4NyAgICAgIDFzCmdlbmVyaWMvMDg4 ICAgICAgMXMKZ2VuZXJpYy8wODkgICAgICA1cwpnZW5lcmljLzA5MCAgICAgIFtub3QgcnVuXSB0 aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8wOTEgICAgICA3 MHMKZ2VuZXJpYy8wOTIgICAgICAwcwpnZW5lcmljLzA5MyAgICAgIFtub3QgcnVuXSBub3Qgc3Vp dGFibGUgZm9yIHRoaXMgT1M6IExpbnV4CmdlbmVyaWMvMDk0ICAgICAgW25vdCBydW5dIHRoaXMg dGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzA5NSAgICAgIFtub3Qg cnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8wOTYg ICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdl bmVyaWMvMDk3ICAgICAgW25vdCBydW5dIG5vdCBzdWl0YWJsZSBmb3IgdGhpcyBPUzogTGludXgK Z2VuZXJpYy8wOTggICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFND UkFUQ0hfREVWCmdlbmVyaWMvMDk5ICAgICAgW25vdCBydW5dIG5vdCBzdWl0YWJsZSBmb3IgdGhp cyBPUzogTGludXgKZ2VuZXJpYy8xMDAgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVz IGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMTAxICAgICAgW25vdCBydW5dIHRoaXMgdGVz dCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzEwMiAgICAgIFtub3QgcnVu XSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8xMDMgICAg ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVy aWMvMTA0ICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENI X0RFVgpnZW5lcmljLzEwNSAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxp ZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8xMDYgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVp cmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMTA3ICAgICAgW25vdCBydW5dIHRoaXMg dGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzEwOCAgICAgIFtub3Qg cnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8xMDkg ICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdl bmVyaWMvMTEwICAgICAgW25vdCBydW5dIHhmc19pbyByZWZsaW5rIHN1cHBvcnQgaXMgbWlzc2lu ZwpnZW5lcmljLzExMSAgICAgIFtub3QgcnVuXSB4ZnNfaW8gcmVmbGluayBzdXBwb3J0IGlzIG1p c3NpbmcKZ2VuZXJpYy8xMTIgICAgICAzNXMKZ2VuZXJpYy8xMTMgICAgICAzOXMKZ2VuZXJpYy8x MTQgICAgICA1M3MKZ2VuZXJpYy8xMTUgICAgICBbbm90IHJ1bl0geGZzX2lvIHJlZmxpbmsgc3Vw cG9ydCBpcyBtaXNzaW5nCmdlbmVyaWMvMTE2ICAgICAgW25vdCBydW5dIHhmc19pbyByZWZsaW5r IHN1cHBvcnQgaXMgbWlzc2luZwpnZW5lcmljLzExNyAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3Qg cmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8xMTggICAgICBbbm90IHJ1bl0g eGZzX2lvIHJlZmxpbmsgc3VwcG9ydCBpcyBtaXNzaW5nCmdlbmVyaWMvMTE5ICAgICAgW25vdCBy dW5dIHhmc19pbyByZWZsaW5rIHN1cHBvcnQgaXMgbWlzc2luZwpnZW5lcmljLzEyMCAgICAgIFtu b3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8x MjEgICAgICBbbm90IHJ1bl0geGZzX2lvIGRlZHVwZSBzdXBwb3J0IGlzIG1pc3NpbmcKZ2VuZXJp Yy8xMjIgICAgICBbbm90IHJ1bl0geGZzX2lvIGRlZHVwZSBzdXBwb3J0IGlzIG1pc3NpbmcKZ2Vu ZXJpYy8xMjMgICAgICAxcwpnZW5lcmljLzEyNCAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVx dWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8xMjUgICAgICA2MnMKZ2VuZXJpYy8x MjYgICAgICAwcwpnZW5lcmljLzEyNyAgICAgIDcxNXMKZ2VuZXJpYy8xMjggICAgICBbbm90IHJ1 bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMTI5ICAg ICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5l cmljLzEzMCAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRD SF9ERVYKZ2VuZXJpYy8xMzEgICAgICAxcwpnZW5lcmljLzEzMiAgICAgIFtub3QgcnVuXSB0aGlz IHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8xMzMgICAgICAyNjhz CmdlbmVyaWMvMTM0ICAgICAgW25vdCBydW5dIHhmc19pbyByZWZsaW5rIHN1cHBvcnQgaXMgbWlz c2luZwpnZW5lcmljLzEzNSAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxp ZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8xMzYgICAgICBbbm90IHJ1bl0geGZzX2lvIGRlZHVwZSBz dXBwb3J0IGlzIG1pc3NpbmcKZ2VuZXJpYy8xMzcgICAgICBbbm90IHJ1bl0geGZzX2lvIHJlZmxp bmsgc3VwcG9ydCBpcyBtaXNzaW5nCmdlbmVyaWMvMTM4ICAgICAgW25vdCBydW5dIHhmc19pbyBy ZWZsaW5rIHN1cHBvcnQgaXMgbWlzc2luZwpnZW5lcmljLzEzOSAgICAgIFtub3QgcnVuXSB4ZnNf aW8gcmVmbGluayBzdXBwb3J0IGlzIG1pc3NpbmcKZ2VuZXJpYy8xNDAgICAgICBbbm90IHJ1bl0g eGZzX2lvIHJlZmxpbmsgc3VwcG9ydCBpcyBtaXNzaW5nCmdlbmVyaWMvMTQxICAgICAgW25vdCBy dW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzE0MiAg ICAgIFtub3QgcnVuXSB4ZnNfaW8gcmVmbGluayBzdXBwb3J0IGlzIG1pc3NpbmcKZ2VuZXJpYy8x NDMgICAgICBbbm90IHJ1bl0geGZzX2lvIHJlZmxpbmsgc3VwcG9ydCBpcyBtaXNzaW5nCmdlbmVy aWMvMTQ0ICAgICAgW25vdCBydW5dIHhmc19pbyByZWZsaW5rIHN1cHBvcnQgaXMgbWlzc2luZwpn ZW5lcmljLzE0NSAgICAgIFtub3QgcnVuXSB4ZnNfaW8gcmVmbGluayBzdXBwb3J0IGlzIG1pc3Np bmcKZ2VuZXJpYy8xNDYgICAgICBbbm90IHJ1bl0geGZzX2lvIHJlZmxpbmsgc3VwcG9ydCBpcyBt aXNzaW5nCmdlbmVyaWMvMTQ3ICAgICAgW25vdCBydW5dIHhmc19pbyByZWZsaW5rIHN1cHBvcnQg aXMgbWlzc2luZwpnZW5lcmljLzE0OCAgICAgIFtub3QgcnVuXSB4ZnNfaW8gcmVmbGluayBzdXBw b3J0IGlzIG1pc3NpbmcKZ2VuZXJpYy8xNDkgICAgICBbbm90IHJ1bl0geGZzX2lvIHJlZmxpbmsg c3VwcG9ydCBpcyBtaXNzaW5nCmdlbmVyaWMvMTUwICAgICAgW25vdCBydW5dIHhmc19pbyByZWZs aW5rIHN1cHBvcnQgaXMgbWlzc2luZwpnZW5lcmljLzE1MSAgICAgIFtub3QgcnVuXSB4ZnNfaW8g cmVmbGluayBzdXBwb3J0IGlzIG1pc3NpbmcKZ2VuZXJpYy8xNTIgICAgICBbbm90IHJ1bl0geGZz X2lvIHJlZmxpbmsgc3VwcG9ydCBpcyBtaXNzaW5nCmdlbmVyaWMvMTUzICAgICAgW25vdCBydW5d IHhmc19pbyByZWZsaW5rIHN1cHBvcnQgaXMgbWlzc2luZwpnZW5lcmljLzE1NCAgICAgIFtub3Qg cnVuXSB4ZnNfaW8gcmVmbGluayBzdXBwb3J0IGlzIG1pc3NpbmcKZ2VuZXJpYy8xNTUgICAgICBb bm90IHJ1bl0geGZzX2lvIHJlZmxpbmsgc3VwcG9ydCBpcyBtaXNzaW5nCmdlbmVyaWMvMTU2ICAg ICAgW25vdCBydW5dIHhmc19pbyByZWZsaW5rIHN1cHBvcnQgaXMgbWlzc2luZwpnZW5lcmljLzE1 NyAgICAgIFtub3QgcnVuXSB4ZnNfaW8gcmVmbGluayBzdXBwb3J0IGlzIG1pc3NpbmcKZ2VuZXJp Yy8xNTggICAgICBbbm90IHJ1bl0geGZzX2lvIGRlZHVwZSBzdXBwb3J0IGlzIG1pc3NpbmcKZ2Vu ZXJpYy8xNTkgICAgICBbbm90IHJ1bl0geGZzX2lvIHJlZmxpbmsgc3VwcG9ydCBpcyBtaXNzaW5n CmdlbmVyaWMvMTYwICAgICAgW25vdCBydW5dIHhmc19pbyBkZWR1cGUgc3VwcG9ydCBpcyBtaXNz aW5nCmdlbmVyaWMvMTYxICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlk ICRTQ1JBVENIX0RFVgpnZW5lcmljLzE2MiAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWly ZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8xNjMgICAgICBbbm90IHJ1bl0gdGhpcyB0 ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMTY0ICAgICAgW25vdCBy dW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzE2NSAg ICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2Vu ZXJpYy8xNjYgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFU Q0hfREVWCmdlbmVyaWMvMTY3ICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZh bGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzE2OCAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVx dWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8xNjkgICAgICBbbm90IHJ1bl0gdGhp cyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMTcwICAgICAgW25v dCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzE3 MSAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYK Z2VuZXJpYy8xNzIgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFND UkFUQ0hfREVWCmdlbmVyaWMvMTczICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBh IHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzE3NCAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3Qg cmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8xNzUgICAgICBbbm90IHJ1bl0g dGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMTc2ICAgICAg W25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmlj LzE3NyAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9E RVYKZ2VuZXJpYy8xNzggICAgICBbbm90IHJ1bl0geGZzX2lvIHJlZmxpbmsgc3VwcG9ydCBpcyBt aXNzaW5nCmdlbmVyaWMvMTc5ICAgICAgW25vdCBydW5dIHhmc19pbyByZWZsaW5rIHN1cHBvcnQg aXMgbWlzc2luZwpnZW5lcmljLzE4MCAgICAgIFtub3QgcnVuXSB4ZnNfaW8gcmVmbGluayBzdXBw b3J0IGlzIG1pc3NpbmcKZ2VuZXJpYy8xODEgICAgICBbbm90IHJ1bl0geGZzX2lvIHJlZmxpbmsg c3VwcG9ydCBpcyBtaXNzaW5nCmdlbmVyaWMvMTgyICAgICAgW25vdCBydW5dIHhmc19pbyBkZWR1 cGUgc3VwcG9ydCBpcyBtaXNzaW5nCmdlbmVyaWMvMTgzICAgICAgW25vdCBydW5dIHRoaXMgdGVz dCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzE4NCAgICAgIDBzCmdlbmVy aWMvMTg1ICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENI X0RFVgpnZW5lcmljLzE4NiAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxp ZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8xODcgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVp cmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMTg4ICAgICAgW25vdCBydW5dIHRoaXMg dGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzE4OSAgICAgIFtub3Qg cnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8xOTAg ICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdl bmVyaWMvMTkxICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JB VENIX0RFVgpnZW5lcmljLzE5MiAgICAgIDQycwpnZW5lcmljLzE5MyAgICAgIDBzCmdlbmVyaWMv MTk0ICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RF VgpnZW5lcmljLzE5NSAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAk U0NSQVRDSF9ERVYKZ2VuZXJpYy8xOTYgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVz IGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMTk3ICAgICAgW25vdCBydW5dIHRoaXMgdGVz dCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzE5OCAgICAgIDFzCmdlbmVy aWMvMTk5ICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENI X0RFVgpnZW5lcmljLzIwMCAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxp ZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8yMDEgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVp cmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMjAyICAgICAgW25vdCBydW5dIHRoaXMg dGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzIwMyAgICAgIFtub3Qg cnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8yMDQg ICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdl bmVyaWMvMjA1ICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JB VENIX0RFVgpnZW5lcmljLzIwNiAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2 YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8yMDcgICAgICAxM3MKZ2VuZXJpYy8yMDggICAgICAy MDFzCnVtb3VudDogL21udC94ZnNfbW50OiBkZXZpY2UgaXMgYnVzeS4KICAgICAgICAoSW4gc29t ZSBjYXNlcyB1c2VmdWwgaW5mbyBhYm91dCBwcm9jZXNzZXMgdGhhdCB1c2UKICAgICAgICAgdGhl IGRldmljZSBpcyBmb3VuZCBieSBsc29mKDgpIG9yIGZ1c2VyKDEpKQpfY2hlY2tfeGZzX2ZpbGVz eXN0ZW06IGZpbGVzeXN0ZW0gb24gL2Rldi92ZGIgaGFzIGRpcnR5IGxvZyAoc2VlIC9ob21lL3Vi dW50dS9vcy94ZnN0ZXN0cy9yZXN1bHRzLy9nZW5lcmljLzIwOC5mdWxsKQpfY2hlY2tfeGZzX2Zp bGVzeXN0ZW06IGZpbGVzeXN0ZW0gb24gL2Rldi92ZGIgaXMgaW5jb25zaXN0ZW50IChjKSAoc2Vl IC9ob21lL3VidW50dS9vcy94ZnN0ZXN0cy9yZXN1bHRzLy9nZW5lcmljLzIwOC5mdWxsKQpfY2hl Y2tfeGZzX2ZpbGVzeXN0ZW06IGZpbGVzeXN0ZW0gb24gL2Rldi92ZGIgaXMgaW5jb25zaXN0ZW50 IChyKSAoc2VlIC9ob21lL3VidW50dS9vcy94ZnN0ZXN0cy9yZXN1bHRzLy9nZW5lcmljLzIwOC5m dWxsKQpnZW5lcmljLzIwOSAgICAgIDM3cwpnZW5lcmljLzIxMCAgICAgIDBzCmdlbmVyaWMvMjEx ICAgICAgMHMKZ2VuZXJpYy8yMTIgICAgICAwcwpnZW5lcmljLzIxMyAgICAgIDFzCmdlbmVyaWMv MjE0ICAgICAgMHMKZ2VuZXJpYy8yMTUgICAgICAycwpnZW5lcmljLzIxNiAgICAgIFtub3QgcnVu XSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8yMTcgICAg ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVy aWMvMjE4ICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENI X0RFVgpnZW5lcmljLzIxOSAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxp ZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8yMjAgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVp cmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMjIxICAgICAgMXMKZ2VuZXJpYy8yMjIg ICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdl bmVyaWMvMjIzICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JB VENIX0RFVgpnZW5lcmljLzIyNCAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2 YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8yMjUgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJl cXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMjI2ICAgICAgW25vdCBydW5dIHRo aXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzIyNyAgICAgIFtu b3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8y MjggICAgICAwcwpnZW5lcmljLzIyOSAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMg YSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8yMzAgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0 IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMjMxICAgICAgW25vdCBydW5d IHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzIzMiAgICAg IFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJp Yy8yMzMgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hf REVWCmdlbmVyaWMvMjM0ICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlk ICRTQ1JBVENIX0RFVgpnZW5lcmljLzIzNSAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWly ZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8yMzYgICAgICAycwpnZW5lcmljLzIzNyAg ICAgIFtub3QgcnVuXSBjaGFjbCBjb21tYW5kIG5vdCBmb3VuZApnZW5lcmljLzIzOCAgICAgIFtu b3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8y MzkgICAgICAzcwpnZW5lcmljLzI0MCAgICAgIDBzCmdlbmVyaWMvMjQxICAgICAgNzJzCmdlbmVy aWMvMjQyICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENI X0RFVgpnZW5lcmljLzI0MyAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxp ZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8yNDQgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVp cmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMjQ1ICAgICAgMHMKZ2VuZXJpYy8yNDYg ICAgICAxcwpnZW5lcmljLzI0NyAgICAgIDI4cwpfY2hlY2tfZG1lc2c6IHNvbWV0aGluZyBmb3Vu ZCBpbiBkbWVzZyAoc2VlIC9ob21lL3VidW50dS9vcy94ZnN0ZXN0cy9yZXN1bHRzLy9nZW5lcmlj LzI0Ny5kbWVzZykKZ2VuZXJpYy8yNDggICAgICAwcwpnZW5lcmljLzI0OSAgICAgIDFzCmdlbmVy aWMvMjUwICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENI X0RFVgpnZW5lcmljLzI1MSAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxp ZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8yNTIgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVp cmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMjUzICAgICAgW25vdCBydW5dIHRoaXMg dGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzI1NCAgICAgIFtub3Qg cnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8yNTUg ICAgICAxcwpnZW5lcmljLzI1NiAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2 YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8yNTcgICAgICAwcwpnZW5lcmljLzI1OCAgICAgIDBz CmdlbmVyaWMvMjU5ICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRT Q1JBVENIX0RFVgpnZW5lcmljLzI2MCAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMg YSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8yNjEgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0 IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMjYyICAgICAgW25vdCBydW5d IHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzI2MyAgICAg IFtmYWlsZWQsIGV4aXQgc3RhdHVzIDFdIC0gb3V0cHV0IG1pc21hdGNoIChzZWUgL2hvbWUvdWJ1 bnR1L29zL3hmc3Rlc3RzL3Jlc3VsdHMvL2dlbmVyaWMvMjYzLm91dC5iYWQpCiAgICAtLS0gdGVz dHMvZ2VuZXJpYy8yNjMub3V0ICAgMjAxNi0wMy0wMiAwNzowMzowNC4wNjM4MDgzMTkgKzAwMDAK ICAgICsrKyAvaG9tZS91YnVudHUvb3MveGZzdGVzdHMvcmVzdWx0cy8vZ2VuZXJpYy8yNjMub3V0 LmJhZCAgIDIwMTYtMDMtMDIgMDc6NTM6MjAuNTExODA4MzE5ICswMDAwCiAgICBAQCAtMSwzICsx LDg4ODcgQEAKICAgICBRQSBvdXRwdXQgY3JlYXRlZCBieSAyNjMKICAgICBmc3ggLU4gMTAwMDAg LW8gODE5MiAtbCA1MDAwMDAgLXIgUFNJWkUgLXQgQlNJWkUgLXcgQlNJWkUgLVoKICAgICBmc3gg LU4gMTAwMDAgLW8gMTI4MDAwIC1sIDUwMDAwMCAtciBQU0laRSAtdCBCU0laRSAtdyBCU0laRSAt WgogICAgK21haW46IGZpbGVzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBmYWxsb2NhdGUgbW9kZSBG QUxMT0NfRkxfWkVST19SQU5HRSwgZGlzYWJsaW5nIQogICAgK21haW46IGZpbGVzeXN0ZW0gZG9l cyBub3Qgc3VwcG9ydCBmYWxsb2NhdGUgbW9kZSBGQUxMT0NfRkxfQ09MTEFQU0VfUkFOR0UsIGRp c2FibGluZyEKICAgICttYWluOiBmaWxlc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgZmFsbG9jYXRl IG1vZGUgRkFMTE9DX0ZMX0lOU0VSVF9SQU5HRSwgZGlzYWJsaW5nIQogICAgK3RydW5jYXRpbmcg dG8gbGFyZ2VzdCBldmVyOiAweDExZTAwCiAgICAuLi4KICAgIChSdW4gJ2RpZmYgLXUgdGVzdHMv Z2VuZXJpYy8yNjMub3V0IC9ob21lL3VidW50dS9vcy94ZnN0ZXN0cy9yZXN1bHRzLy9nZW5lcmlj LzI2My5vdXQuYmFkJyAgdG8gc2VlIHRoZSBlbnRpcmUgZGlmZikKZ2VuZXJpYy8yNjQgICAgICBb bm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMv MjY1ICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RF VgpnZW5lcmljLzI2NiAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAk U0NSQVRDSF9ERVYKZ2VuZXJpYy8yNjcgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVz IGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMjY4ICAgICAgW25vdCBydW5dIHRoaXMgdGVz dCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzI2OSAgICAgIFtub3QgcnVu XSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8yNzAgICAg ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVy aWMvMjcxICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENI X0RFVgpnZW5lcmljLzI3MiAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxp ZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8yNzMgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVp cmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMjc0ICAgICAgW25vdCBydW5dIHRoaXMg dGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzI3NSAgICAgIFtub3Qg cnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8yNzYg ICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdl bmVyaWMvMjc3ICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JB VENIX0RFVgpnZW5lcmljLzI3OCAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2 YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8yNzkgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJl cXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMjgwICAgICAgW25vdCBydW5dIHRo aXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzI4MSAgICAgIFtu b3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8y ODIgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVW CmdlbmVyaWMvMjgzICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRT Q1JBVENIX0RFVgpnZW5lcmljLzI4NCAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMg YSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8yODUgICAgICAwcwpnZW5lcmljLzI4NiAgICAg IDVzCmdlbmVyaWMvMjg3ICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlk ICRTQ1JBVENIX0RFVgpnZW5lcmljLzI4OCAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWly ZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8yODkgICAgICBbbm90IHJ1bl0gdGhpcyB0 ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMjkwICAgICAgW25vdCBy dW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzI5MSAg ICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2Vu ZXJpYy8yOTIgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFU Q0hfREVWCmdlbmVyaWMvMjkzICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZh bGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzI5NCAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVx dWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8yOTUgICAgICBbbm90IHJ1bl0gdGhp cyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMjk2ICAgICAgW25v dCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzI5 NyAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYK Z2VuZXJpYy8yOTggICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFND UkFUQ0hfREVWCmdlbmVyaWMvMjk5ICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBh IHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzMwMCAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3Qg cmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8zMDEgICAgICBbbm90IHJ1bl0g dGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMzAyICAgICAg W25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmlj LzMwMyAgICAgIFtub3QgcnVuXSB4ZnNfaW8gcmVmbGluayBzdXBwb3J0IGlzIG1pc3NpbmcKZ2Vu ZXJpYy8zMDQgICAgICBbbm90IHJ1bl0geGZzX2lvIGRlZHVwZSBzdXBwb3J0IGlzIG1pc3NpbmcK Z2VuZXJpYy8zMDUgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFND UkFUQ0hfREVWCmdlbmVyaWMvMzA2ICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBh IHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzMwNyAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3Qg cmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8zMDggICAgICAwcwpnZW5lcmlj LzMwOSAgICAgIDFzCmdlbmVyaWMvMzEwICAgICAgNjVzCmdlbmVyaWMvMzExICAgICAgW25vdCBy dW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzMxMiAg ICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2Vu ZXJpYy8zMTMgICAgICA0cwpnZW5lcmljLzMxNCAgICAgIFtub3QgcnVuXSBjaGFjbCBjb21tYW5k IG5vdCBmb3VuZApnZW5lcmljLzMxNSAgICAgIDBzCmdlbmVyaWMvMzE2ICAgICAgMXMKZ2VuZXJp Yy8zMTcgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hf REVWCmdlbmVyaWMvMzE4ICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlk ICRTQ1JBVENIX0RFVgpnZW5lcmljLzMxOSAgICAgIFtub3QgcnVuXSBjaGFjbCBjb21tYW5kIG5v dCBmb3VuZApnZW5lcmljLzMyMCAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2 YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8zMjEgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJl cXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMzIyICAgICAgW25vdCBydW5dIHRo aXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzMyMyAgICAgIDEy MXMKZ2VuZXJpYy8zMjQgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQg JFNDUkFUQ0hfREVWCmdlbmVyaWMvMzI1ICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJl cyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzMyNiAgICAgIFtub3QgcnVuXSB0aGlzIHRl c3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8zMjcgICAgICBbbm90IHJ1 bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMzI4ICAg ICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5l cmljLzMyOSAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRD SF9ERVYKZ2VuZXJpYy8zMzAgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFs aWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMzMxICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1 aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpnZW5lcmljLzMzMiAgICAgIFtub3QgcnVuXSB0aGlz IHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKZ2VuZXJpYy8zMzMgICAgICBbbm90 IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMzM0 ICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpn ZW5lcmljLzMzNSAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NS QVRDSF9ERVYKZ2VuZXJpYy8zMzYgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEg dmFsaWQgJFNDUkFUQ0hfREVWCmdlbmVyaWMvMzM3ICAgICAgW25vdCBydW5dIHRoaXMgdGVzdCBy ZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgpzaGFyZWQvMDAxICAgICAgIFtub3QgcnVuXSBu b3Qgc3VpdGFibGUgZm9yIHRoaXMgZmlsZXN5c3RlbSB0eXBlOiB4ZnMKc2hhcmVkLzAwMiAgICAg ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnNoYXJl ZC8wMDMgICAgICAgW25vdCBydW5dIG5vdCBzdWl0YWJsZSBmb3IgdGhpcyBmaWxlc3lzdGVtIHR5 cGU6IHhmcwpzaGFyZWQvMDA2ICAgICAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2 YWxpZCAkU0NSQVRDSF9ERVYKc2hhcmVkLzAzMiAgICAgICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJl cXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnNoYXJlZC8wNTEgICAgICAgW25vdCBydW5dIGNo YWNsIGNvbW1hbmQgbm90IGZvdW5kCnNoYXJlZC8yNzIgICAgICAgW25vdCBydW5dIG5vdCBzdWl0 YWJsZSBmb3IgdGhpcyBmaWxlc3lzdGVtIHR5cGU6IHhmcwpzaGFyZWQvMjg5ICAgICAgIFtub3Qg cnVuXSBub3Qgc3VpdGFibGUgZm9yIHRoaXMgZmlsZXN5c3RlbSB0eXBlOiB4ZnMKc2hhcmVkLzI5 OCAgICAgICA0NXMKeGZzLzAwMSAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlk ICRTQ1JBVENIX0RFVgp4ZnMvMDAyICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFs aWQgJFNDUkFUQ0hfREVWCnhmcy8wMDMgIDBzCnhmcy8wMDQgIFtub3QgcnVuXSB0aGlzIHRlc3Qg cmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzAwNSAgW25vdCBydW5dIHRoaXMgdGVz dCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMDA2ICBbbm90IHJ1bl0gdGhpcyB0 ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8wMDcgIFtub3QgcnVuXSB0aGlz IHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzAwOCAgMnMKeGZzLzAwOSAg W25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMDEw ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8w MTEgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZz LzAxMiAgMnMKeGZzLzAxMyAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRT Q1JBVENIX0RFVgp4ZnMvMDE0ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQg JFNDUkFUQ0hfREVWCnhmcy8wMTUgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxp ZCAkU0NSQVRDSF9ERVYKeGZzLzAxNiAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZh bGlkICRTQ1JBVENIX0RFVgp4ZnMvMDE3ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEg dmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8wMTggIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMg YSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzAxOSAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJl cyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMDIwICBbZmFpbGVkLCBleGl0IHN0YXR1cyAxMzld IC0gb3V0cHV0IG1pc21hdGNoIChzZWUgL2hvbWUvdWJ1bnR1L29zL3hmc3Rlc3RzL3Jlc3VsdHMv L3hmcy8wMjAub3V0LmJhZCkKICAgIC0tLSB0ZXN0cy94ZnMvMDIwLm91dCAgICAgICAyMDE2LTAz LTAyIDA3OjAzOjA0LjA4MzgwODMxOSArMDAwMAogICAgKysrIC9ob21lL3VidW50dS9vcy94ZnN0 ZXN0cy9yZXN1bHRzLy94ZnMvMDIwLm91dC5iYWQgICAgICAgMjAxNi0wMy0wMiAwNzo1ODo1Ni4w NjM4MDgzMTkgKzAwMDAKICAgIEBAIC0xLDIgKzEsMyBAQAogICAgIFFBIG91dHB1dCBjcmVhdGVk IGJ5IDAyMAogICAgIFNpbGVuY2UgaXMgZ29sZGVuCiAgICArLi90ZXN0cy94ZnMvMDIwOiBsaW5l IDU4OiAyODY1OCBTZWdtZW50YXRpb24gZmF1bHQgICAgICAkWEZTX1JFUEFJUl9QUk9HIC1mIC1v IGFnX3N0cmlkZT0zMiAtdCAxICRmc2ZpbGUgPiAvZGV2L251bGwgMj4mMQogICAgLi4uCiAgICAo UnVuICdkaWZmIC11IHRlc3RzL3hmcy8wMjAub3V0IC9ob21lL3VidW50dS9vcy94ZnN0ZXN0cy9y ZXN1bHRzLy94ZnMvMDIwLm91dC5iYWQnICB0byBzZWUgdGhlIGVudGlyZSBkaWZmKQp4ZnMvMDIx ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8w MjIgIFtub3QgcnVuXSB4ZnNkdW1wIG5vdCBmb3VuZAp4ZnMvMDIzICBbbm90IHJ1bl0geGZzZHVt cCBub3QgZm91bmQKeGZzLzAyNCAgW25vdCBydW5dIHhmc2R1bXAgbm90IGZvdW5kCnhmcy8wMjUg IFtub3QgcnVuXSB4ZnNkdW1wIG5vdCBmb3VuZAp4ZnMvMDI2ICBbbm90IHJ1bl0geGZzZHVtcCBu b3QgZm91bmQKeGZzLzAyNyAgW25vdCBydW5dIHhmc2R1bXAgbm90IGZvdW5kCnhmcy8wMjggIFtu b3QgcnVuXSB4ZnNkdW1wIG5vdCBmb3VuZAp4ZnMvMDI5ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJl cXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8wMzAgIFtub3QgcnVuXSB0aGlzIHRlc3Qg cmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzAzMSAgW25vdCBydW5dIHRoaXMgdGVz dCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMDMyICBbbm90IHJ1bl0gdGhpcyB0 ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8wMzMgIFtub3QgcnVuXSB0aGlz IHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzAzNCAgW25vdCBydW5dIHRo aXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMDM1ICBbbm90IHJ1bl0g eGZzZHVtcCBub3QgZm91bmQKeGZzLzAzNiAgW25vdCBydW5dIHhmc2R1bXAgbm90IGZvdW5kCnhm cy8wMzcgIFtub3QgcnVuXSB4ZnNkdW1wIG5vdCBmb3VuZAp4ZnMvMDM4ICBbbm90IHJ1bl0geGZz ZHVtcCBub3QgZm91bmQKeGZzLzAzOSAgW25vdCBydW5dIHhmc2R1bXAgbm90IGZvdW5kCnhmcy8w NDAgIFtub3QgcnVuXSBDYW4ndCBydW4gc3JjZGlmZiB3aXRob3V0IEtXT1JLQVJFQSBzZXQKeGZz LzA0MSAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4 ZnMvMDQyICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVW Cnhmcy8wNDMgIFtub3QgcnVuXSB4ZnNkdW1wIG5vdCBmb3VuZAp4ZnMvMDQ0ICBbbm90IHJ1bl0g VGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfTE9HREVWCnhmcy8wNDUgIFtub3Qg cnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzA0NiAgW25v dCBydW5dIHhmc2R1bXAgbm90IGZvdW5kCnhmcy8wNDcgIFtub3QgcnVuXSB4ZnNkdW1wIG5vdCBm b3VuZAp4ZnMvMDQ4ICAwcwp4ZnMvMDQ5ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEg dmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8wNTAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMg YSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzA1MSAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJl cyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMDUyICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVp cmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8wNTMgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVx dWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzA1NCAgW25vdCBydW5dIHRoaXMgdGVzdCBy ZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMDU1ICBbbm90IHJ1bl0geGZzZHVtcCBu b3QgZm91bmQKeGZzLzA1NiAgW25vdCBydW5dIHhmc2R1bXAgbm90IGZvdW5kCnhmcy8wNTcgIFtu b3QgcnVuXSBQbGFjZSBob2xkZXIgZm9yIElSSVggdGVzdCAwNTcKeGZzLzA1OCAgW25vdCBydW5d IFBsYWNlIGhvbGRlciBmb3IgSVJJWCB0ZXN0IDA1OAp4ZnMvMDU5ICBbbm90IHJ1bl0geGZzZHVt cCBub3QgZm91bmQKeGZzLzA2MCAgW25vdCBydW5dIHhmc2R1bXAgbm90IGZvdW5kCnhmcy8wNjEg IFtub3QgcnVuXSB4ZnNkdW1wIG5vdCBmb3VuZAp4ZnMvMDYyICBbbm90IHJ1bl0gdGhpcyB0ZXN0 IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8wNjMgIFtub3QgcnVuXSB4ZnNkdW1w IG5vdCBmb3VuZAp4ZnMvMDY0ICBbbm90IHJ1bl0geGZzZHVtcCBub3QgZm91bmQKeGZzLzA2NSAg W25vdCBydW5dIHhmc2R1bXAgbm90IGZvdW5kCnhmcy8wNjYgIFtub3QgcnVuXSB4ZnNkdW1wIG5v dCBmb3VuZAp4ZnMvMDY3ICBbbm90IHJ1bl0gY2hhY2wgY29tbWFuZCBub3QgZm91bmQKeGZzLzA2 OCAgW25vdCBydW5dIHhmc2R1bXAgbm90IGZvdW5kCnhmcy8wNjkgIFtub3QgcnVuXSB0aGlzIHRl c3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzA3MCAgW25vdCBydW5dIHRoaXMg dGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMDcxICBbbm90IHJ1bl0gdGhp cyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8wNzIgIFtub3QgcnVuXSB0 aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzA3MyAgW25vdCBydW5d IHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMDc0ICBbZmFpbGVk LCBleGl0IHN0YXR1cyAxXSAtIG91dHB1dCBtaXNtYXRjaCAoc2VlIC9ob21lL3VidW50dS9vcy94 ZnN0ZXN0cy9yZXN1bHRzLy94ZnMvMDc0Lm91dC5iYWQpCiAgICAtLS0gdGVzdHMveGZzLzA3NC5v dXQgICAgICAgMjAxNi0wMy0wMiAwNzowMzowNC4wOTU4MDgzMTkgKzAwMDAKICAgICsrKyAvaG9t ZS91YnVudHUvb3MveGZzdGVzdHMvcmVzdWx0cy8veGZzLzA3NC5vdXQuYmFkICAgICAgIDIwMTYt MDMtMDIgMDc6NTk6MTkuOTQzODA4MzE5ICswMDAwCiAgICBAQCAtMSwyICsxLDQgQEAKICAgICBR QSBvdXRwdXQgY3JlYXRlZCBieSAwNzQKICAgIC1TaWxlbmNlIGlzIGdvbGRlbgogICAgK2ZhbGxv Y2F0ZTogTm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UKICAgICtfY2hlY2tfeGZzX2ZpbGVzeXN0ZW06 IGZpbGVzeXN0ZW0gb24gL2Rldi9sb29wMCBpcyBpbmNvbnNpc3RlbnQgKGMpIChzZWUgL2hvbWUv dWJ1bnR1L29zL3hmc3Rlc3RzL3Jlc3VsdHMvL3hmcy8wNzQuZnVsbCkKICAgICtfY2hlY2tfeGZz X2ZpbGVzeXN0ZW06IGZpbGVzeXN0ZW0gb24gL2Rldi9sb29wMCBpcyBpbmNvbnNpc3RlbnQgKHIp IChzZWUgL2hvbWUvdWJ1bnR1L29zL3hmc3Rlc3RzL3Jlc3VsdHMvL3hmcy8wNzQuZnVsbCkKICAg IC4uLgogICAgKFJ1biAnZGlmZiAtdSB0ZXN0cy94ZnMvMDc0Lm91dCAvaG9tZS91YnVudHUvb3Mv eGZzdGVzdHMvcmVzdWx0cy8veGZzLzA3NC5vdXQuYmFkJyAgdG8gc2VlIHRoZSBlbnRpcmUgZGlm ZikKeGZzLzA3NSAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENI X0RFVgp4ZnMvMDc2ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFU Q0hfREVWCnhmcy8wNzcgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NS QVRDSF9ERVYKeGZzLzA3OCAgNDhzCnhmcy8wNzkgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWly ZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzA4MCAgNXMKeGZzLzA4MSAgW25vdCBydW5dIHRo aXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMDgyICBbbm90IHJ1bl0g dGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8wODMgIFtub3QgcnVu XSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzA4NCAgNjBzCnhm cy8wODUgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYK eGZzLzA4NiAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RF Vgp4ZnMvMDg3ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hf REVWCnhmcy8wODggIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRD SF9ERVYKeGZzLzA4OSAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JB VENIX0RFVgp4ZnMvMDkwICBbbm90IHJ1bl0gRXh0ZXJuYWwgdm9sdW1lcyBub3QgaW4gdXNlLCBz a2lwcGVkIHRoaXMgdGVzdAp4ZnMvMDkxICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEg dmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8wOTIgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMg YSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzA5MyAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJl cyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMDk0ICBbbm90IHJ1bl0gRXh0ZXJuYWwgdm9sdW1l cyBub3QgaW4gdXNlLCBza2lwcGVkIHRoaXMgdGVzdAp4ZnMvMDk1ICBbbm90IHJ1bl0gbm90IHN1 aXRhYmxlIGZvciB0aGlzIE9TOiBMaW51eAp4ZnMvMDk2ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJl cXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8wOTcgIFtub3QgcnVuXSB0aGlzIHRlc3Qg cmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzA5OCAgW25vdCBydW5dIHRoaXMgdGVz dCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMDk5ICBbbm90IHJ1bl0gdGhpcyB0 ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8xMDAgIFtub3QgcnVuXSB0aGlz IHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzEwMSAgW25vdCBydW5dIHRo aXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMTAyICBbbm90IHJ1bl0g dGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8xMDMgIFtub3QgcnVu XSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzEwNCAgW25vdCBy dW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMTA1ICBbbm90 IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8xMDYgIFtu b3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzEwNyAg W25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMTA4 ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8x MDkgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZz LzExMCAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4 ZnMvMTExICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVW Cnhmcy8xMTIgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9E RVYKeGZzLzExMyAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENI X0RFVgp4ZnMvMTE0ICBbbm90IHJ1bl0gbm90IHN1aXRhYmxlIGZvciB0aGlzIE9TOiBMaW51eAp4 ZnMvMTE1ICBbbm90IHJ1bl0gbm90IHN1aXRhYmxlIGZvciB0aGlzIE9TOiBMaW51eAp4ZnMvMTE2 ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8x MTcgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZz LzExOCAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4 ZnMvMTE5ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVW Cnhmcy8xMjAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9E RVYKeGZzLzEyMSAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENI X0RFVgp4ZnMvMTIyICBbbm90IHJ1bl0gaW5kZW50IHV0aWxpdHkgcmVxdWlyZWQsIHNraXBwZWQg dGhpcyB0ZXN0Cnhmcy8xMjMgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAk U0NSQVRDSF9ERVYKeGZzLzEyNCAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlk ICRTQ1JBVENIX0RFVgp4ZnMvMTI1ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFs aWQgJFNDUkFUQ0hfREVWCnhmcy8xMjYgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2 YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzEyNyAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBh IHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMTI4ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVz IGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8xMjkgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWly ZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzEzMCAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1 aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMTMxICBbbm90IHJ1bl0gRXh0ZXJuYWwgdm9s dW1lcyBub3QgaW4gdXNlLCBza2lwcGVkIHRoaXMgdGVzdAp4ZnMvMTMyICBbbm90IHJ1bl0geGZz X2lvIHJlZmxpbmsgc3VwcG9ydCBpcyBtaXNzaW5nCnhmcy8xMzMgIFtub3QgcnVuXSB0aGlzIHRl c3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzEzNCAgW25vdCBydW5dIHRoaXMg dGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMTM1ICBbbm90IHJ1bl0gdGhp cyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8xMzYgIFtub3QgcnVuXSB0 aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzEzNyAgW25vdCBydW5d IHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMTM4ICBbbm90IHJ1 bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8xMzkgIFtub3Qg cnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzE0MCAgW25v dCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMTQxICBb bm90IHJ1bl0gbm8ga2VybmVsIHN1cHBvcnQgZm9yIFhGUyBzeXNmcyBhdHRyaWJ1dGVzCnhmcy8x NDIgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZz LzE0MyAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4 ZnMvMTQ0ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVW Cnhmcy8xNDUgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9E RVYKeGZzLzE0NiAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENI X0RFVgp4ZnMvMTQ3ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFU Q0hfREVWCnhmcy8xNDggIFtub3QgcnVuXSBwYXJhbGxlbCByZXBhaXIgYmluYXJ5IHhmc19wcmVw YWlyNjQgaXMgbm90IGluc3RhbGxlZAp4ZnMvMTQ5ICBbbm90IHJ1bl0gcGFyYWxsZWwgcmVwYWly IGJpbmFyeSB4ZnNfcHJlcGFpciBpcyBub3QgaW5zdGFsbGVkCnhmcy8xNTAgIFtub3QgcnVuXSB0 aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzE1MSAgW25vdCBydW5d IHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMTUyICBbbm90IHJ1 bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8xNTMgIFtub3Qg cnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzE1NCAgW25v dCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMTU1ICBb bm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8xNTYg IFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzE1 NyAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMv MTU4ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhm cy8xNTkgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYK eGZzLzE2MCAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RF Vgp4ZnMvMTYxICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hf REVWCnhmcy8xNjIgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRD SF9ERVYKeGZzLzE2MyAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JB VENIX0RFVgp4ZnMvMTY0ICAwcwp4ZnMvMTY1ICAwcwp4ZnMvMTY2ICBbbm90IHJ1bl0gdGhpcyB0 ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8xNjcgIFtub3QgcnVuXSB0aGlz IHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzE2OCAgW25vdCBydW5dIHRo aXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMTY5ICBbbm90IHJ1bl0g dGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8xNzAgIFtub3QgcnVu XSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzE3MSAgW25vdCBy dW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMTcyICBbbm90 IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8xNzMgIFtu b3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzE3NCAg W25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMTc1 ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8x NzYgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZz LzE3NyAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4 ZnMvMTc4ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVW Cnhmcy8xNzkgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9E RVYKeGZzLzE4MCAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENI X0RFVgp4ZnMvMTgxICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFU Q0hfREVWCnhmcy8xODIgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NS QVRDSF9ERVYKeGZzLzE4MyAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRT Q1JBVENIX0RFVgp4ZnMvMTg0ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQg JFNDUkFUQ0hfREVWCnhmcy8xODUgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxp ZCAkU0NSQVRDSF9ERVYKeGZzLzE4NiAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZh bGlkICRTQ1JBVENIX0RFVgp4ZnMvMTg3ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEg dmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8xODggIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMg YSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzE4OSAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJl cyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMTkwICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVp cmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8xOTEgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVx dWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzE5MiAgW25vdCBydW5dIHRoaXMgdGVzdCBy ZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMTkzICBbbm90IHJ1bl0gdGhpcyB0ZXN0 IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8xOTQgIFtub3QgcnVuXSBzZWN0b3Ig c2l6ZSg0MDk2KSB0b28gbGFyZ2UgZm9yIHBsYXRmb3JtIHBhZ2Ugc2l6ZSg0MDk2KQp4ZnMvMTk1 ICBbbm90IHJ1bl0geGZzZHVtcCB1dGlsaXR5IHJlcXVpcmVkLCBza2lwcGVkIHRoaXMgdGVzdAp4 ZnMvMTk2ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVW Cnhmcy8xOTcgIFtub3QgcnVuXSBUaGlzIHRlc3QgaXMgb25seSB2YWxpZCBvbiAzMiBiaXQgbWFj aGluZXMKeGZzLzE5OCAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JB VENIX0RFVgp4ZnMvMTk5ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFND UkFUQ0hfREVWCnhmcy8yMDAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAk U0NSQVRDSF9ERVYKeGZzLzIwMSAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlk ICRTQ1JBVENIX0RFVgp4ZnMvMjAyICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFs aWQgJFNDUkFUQ0hfREVWCnhmcy8yMDMgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2 YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzIwNCAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBh IHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMjA1ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVz IGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8yMDYgIDRzCnhmcy8yMDcgIFtub3QgcnVuXSB0aGlz IHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzIwOCAgW25vdCBydW5dIHRo aXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMjA5ICBbbm90IHJ1bl0g dGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8yMTAgIFtub3QgcnVu XSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzIxMSAgW25vdCBy dW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMjEyICBbbm90 IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8yMTMgIFtu b3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzIxNCAg W25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMjE1 ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8y MTYgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZz LzIxNyAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4 ZnMvMjE4ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVW Cnhmcy8yMTkgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9E RVYKeGZzLzIyMCAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENI X0RFVgp4ZnMvMjIxICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFU Q0hfREVWCnhmcy8yMjIgIDBzCnhmcy8yMjMgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMg YSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzIyNCAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJl cyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMjI1ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVp cmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8yMjYgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVx dWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzIyNyAgW25vdCBydW5dIHRoaXMgdGVzdCBy ZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMjI4ICBbbm90IHJ1bl0gdGhpcyB0ZXN0 IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8yMjkgIDc1cwp4ZnMvMjMwICBbbm90 IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8yMzEgIFtu b3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzIzMiAg W25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMjMz ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8y MzQgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZz LzIzNSAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4 ZnMvMjM2ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVW Cnhmcy8yMzcgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9E RVYKeGZzLzIzOCAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENI X0RFVgp4ZnMvMjM5ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFU Q0hfREVWCnhmcy8yNDAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NS QVRDSF9ERVYKeGZzLzI0MSAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRT Q1JBVENIX0RFVgp4ZnMvMjQyICAxcwp4ZnMvMjQzICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVp cmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8yNDQgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVx dWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzI0NSAgW25vdCBydW5dIHRoaXMgdGVzdCBy ZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMjQ2ICBbbm90IHJ1bl0geGZzX2lvIGJt YXAgZG9lc24ndCBzdXBwb3J0IC1jCnhmcy8yNDcgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWly ZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzI0OCAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1 aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMjQ5ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJl cXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8yNTAgIFtmYWlsZWQsIGV4aXQgc3RhdHVz IDFdIC0gb3V0cHV0IG1pc21hdGNoIChzZWUgL2hvbWUvdWJ1bnR1L29zL3hmc3Rlc3RzL3Jlc3Vs dHMvL3hmcy8yNTAub3V0LmJhZCkKICAgIC0tLSB0ZXN0cy94ZnMvMjUwLm91dCAgICAgICAyMDE2 LTAzLTAyIDA3OjAzOjA0LjExOTgwODMxOSArMDAwMAogICAgKysrIC9ob21lL3VidW50dS9vcy94 ZnN0ZXN0cy9yZXN1bHRzLy94ZnMvMjUwLm91dC5iYWQgICAgICAgMjAxNi0wMy0wMiAwODowMzo0 OS44NDc4MDgzMTkgKzAwMDAKICAgIEBAIC0xMSw0ICsxMSw0IEBACiAgICAgKioqIHByZWFsbG9j YXRlIGxhcmdlIGZpbGUKICAgICAqKiogdW5tb3VudCBsb29wIGZpbGVzeXN0ZW0KICAgICAqKiog Y2hlY2sgbG9vcCBmaWxlc3lzdGVtCiAgICAtKioqIGRvbmUKICAgICtfY2hlY2tfeGZzX2ZpbGVz eXN0ZW06IGZpbGVzeXN0ZW0gb24gL21udC94ZnNfbW50LzI1MC5mcyBpcyBpbmNvbnNpc3RlbnQg KHIpIChzZWUgL2hvbWUvdWJ1bnR1L29zL3hmc3Rlc3RzL3Jlc3VsdHMvL3hmcy8yNTAuZnVsbCkK ICAgIC4uLgogICAgKFJ1biAnZGlmZiAtdSB0ZXN0cy94ZnMvMjUwLm91dCAvaG9tZS91YnVudHUv b3MveGZzdGVzdHMvcmVzdWx0cy8veGZzLzI1MC5vdXQuYmFkJyAgdG8gc2VlIHRoZSBlbnRpcmUg ZGlmZikKeGZzLzI1MSAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JB VENIX0RFVgp4ZnMvMjUyICAycwp4ZnMvMjUzICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVz IGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8yNTQgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWly ZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzI1NSAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1 aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMjU2ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJl cXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8yNTcgIFtub3QgcnVuXSB0aGlzIHRlc3Qg cmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzI1OCAgW25vdCBydW5dIHRoaXMgdGVz dCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMjU5ICAycwp4ZnMvMjYwICBbbm90 IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8yNjEgIFtu b3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzI2MiAg W25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRTQ1JBVENIX0RFVgp4ZnMvMjY2 ICBbbm90IHJ1bl0geGZzZHVtcCBub3QgZm91bmQKeGZzLzI2NyAgW25vdCBydW5dIHhmc2R1bXAg bm90IGZvdW5kCnhmcy8yNjggIFtub3QgcnVuXSB4ZnNkdW1wIG5vdCBmb3VuZAp4ZnMvMjc4ICBb bm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8yNzkg IDdzCnhmcy8yODEgIFtub3QgcnVuXSB4ZnNkdW1wIG5vdCBmb3VuZAp4ZnMvMjgyICBbbm90IHJ1 bl0geGZzZHVtcCBub3QgZm91bmQKeGZzLzI4MyAgW25vdCBydW5dIHhmc2R1bXAgbm90IGZvdW5k Cnhmcy8yODcgIFtub3QgcnVuXSB4ZnNkdW1wIG5vdCBmb3VuZAp4ZnMvMjkwICAxcwp4ZnMvMjkx ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8y OTIgIC0gb3V0cHV0IG1pc21hdGNoIChzZWUgL2hvbWUvdWJ1bnR1L29zL3hmc3Rlc3RzL3Jlc3Vs dHMvL3hmcy8yOTIub3V0LmJhZCkKICAgIC0tLSB0ZXN0cy94ZnMvMjkyLm91dCAgICAgICAyMDE2 LTAzLTAyIDA3OjAzOjA0LjEyMzgwODMxOSArMDAwMAogICAgKysrIC9ob21lL3VidW50dS9vcy94 ZnN0ZXN0cy9yZXN1bHRzLy94ZnMvMjkyLm91dC5iYWQgICAgICAgMjAxNi0wMy0wMiAwODowNDox OS40ODc4MDgzMTkgKzAwMDAKICAgIEBAIC01LDUgKzUsNSBAQAogICAgIGFnc2l6ZT0xNjc3NzIx NgogICAgIG1rZnMueGZzIHdpdGggY21kbGluZSBnZW9tZXRyeQogICAgIGRkZXY9RklMRU5BTUUK ICAgIC1hZ2NvdW50PTE2CiAgICAtYWdzaXplPTQxOTQzMDQKICAgICthZ2NvdW50PTQKICAgICth Z3NpemU9MTY3NzcyMTYKICAgIC4uLgogICAgKFJ1biAnZGlmZiAtdSB0ZXN0cy94ZnMvMjkyLm91 dCAvaG9tZS91YnVudHUvb3MveGZzdGVzdHMvcmVzdWx0cy8veGZzLzI5Mi5vdXQuYmFkJyAgdG8g c2VlIHRoZSBlbnRpcmUgZGlmZikKeGZzLzI5MyAgLSBvdXRwdXQgbWlzbWF0Y2ggKHNlZSAvaG9t ZS91YnVudHUvb3MveGZzdGVzdHMvcmVzdWx0cy8veGZzLzI5My5vdXQuYmFkKQogICAgLS0tIHRl c3RzL3hmcy8yOTMub3V0ICAgICAgIDIwMTYtMDMtMDIgMDc6MDM6MDQuMTIzODA4MzE5ICswMDAw CiAgICArKysgL2hvbWUvdWJ1bnR1L29zL3hmc3Rlc3RzL3Jlc3VsdHMvL3hmcy8yOTMub3V0LmJh ZCAgICAgICAyMDE2LTAzLTAyIDA4OjA0OjIyLjQ5OTgwODMxOSArMDAwMAogICAgQEAgLTEsMiAr MSw4IEBACiAgICAgUUEgb3V0cHV0IGNyZWF0ZWQgYnkgMjkzCiAgICAgU2lsZW5jZSBpcyBnb2xk ZW4KICAgICtjaHByb2ogbm90IGRvY3VtZW50ZWQgaW4gdGhlIHhmc19pbyBtYW5wYWdlCiAgICAr ZmllbWFwIG5vdCBkb2N1bWVudGVkIGluIHRoZSB4ZnNfaW8gbWFucGFnZQogICAgK2ZwdW5jaCBu b3QgZG9jdW1lbnRlZCBpbiB0aGUgeGZzX2lvIG1hbnBhZ2UKICAgICtsc3Byb2ogbm90IGRvY3Vt ZW50ZWQgaW4gdGhlIHhmc19pbyBtYW5wYWdlCiAgICArc2V0Zmwgbm90IGRvY3VtZW50ZWQgaW4g dGhlIHhmc19pbyBtYW5wYWdlCiAgICAuLi4KICAgIChSdW4gJ2RpZmYgLXUgdGVzdHMveGZzLzI5 My5vdXQgL2hvbWUvdWJ1bnR1L29zL3hmc3Rlc3RzL3Jlc3VsdHMvL3hmcy8yOTMub3V0LmJhZCcg IHRvIHNlZSB0aGUgZW50aXJlIGRpZmYpCnhmcy8yOTUgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVx dWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKeGZzLzI5NiAgW25vdCBydW5dIHhmc2R1bXAgbm90 IGZvdW5kCnhmcy8yOTcgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NS QVRDSF9ERVYKeGZzLzI5OCAgW25vdCBydW5dIHRoaXMgdGVzdCByZXF1aXJlcyBhIHZhbGlkICRT Q1JBVENIX0RFVgp4ZnMvMjk5ICBbbm90IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQg JFNDUkFUQ0hfREVWCnhmcy8zMDAgIFtub3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxp ZCAkU0NSQVRDSF9ERVYKeGZzLzMwMSAgW25vdCBydW5dIHhmc2R1bXAgbm90IGZvdW5kCnhmcy8z MDIgIFtub3QgcnVuXSB4ZnNkdW1wIG5vdCBmb3VuZAp4ZnMvMzAzICAxcwp4ZnMvMzA0ICBbbm90 IHJ1bl0gdGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFsaWQgJFNDUkFUQ0hfREVWCnhmcy8zMDUgIFtu b3QgcnVuXSB0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCAkU0NSQVRDSF9ERVYKUmFuOiBnZW5l cmljLzAwMSBnZW5lcmljLzAwMiBnZW5lcmljLzAwNSBnZW5lcmljLzAwNiBnZW5lcmljLzAwNyBn ZW5lcmljLzAxMCBnZW5lcmljLzAxMSBnZW5lcmljLzAxMyBnZW5lcmljLzAxNCBnZW5lcmljLzAy MCBnZW5lcmljLzAyOCBnZW5lcmljLzAzNSBnZW5lcmljLzAzNiBnZW5lcmljLzA3MCBnZW5lcmlj LzA3NCBnZW5lcmljLzA3NSBnZW5lcmljLzA4MCBnZW5lcmljLzA4NiBnZW5lcmljLzA4NyBnZW5l cmljLzA4OCBnZW5lcmljLzA4OSBnZW5lcmljLzA5MSBnZW5lcmljLzA5MiBnZW5lcmljLzExMiBn ZW5lcmljLzExMyBnZW5lcmljLzExNCBnZW5lcmljLzEyMyBnZW5lcmljLzEyNSBnZW5lcmljLzEy NiBnZW5lcmljLzEyNyBnZW5lcmljLzEzMSBnZW5lcmljLzEzMyBnZW5lcmljLzE4NCBnZW5lcmlj LzE5MiBnZW5lcmljLzE5MyBnZW5lcmljLzE5OCBnZW5lcmljLzIwNyBnZW5lcmljLzIwOCBnZW5l cmljLzIwOSBnZW5lcmljLzIxMCBnZW5lcmljLzIxMSBnZW5lcmljLzIxMiBnZW5lcmljLzIxMyBn ZW5lcmljLzIxNCBnZW5lcmljLzIxNSBnZW5lcmljLzIyMSBnZW5lcmljLzIyOCBnZW5lcmljLzIz NiBnZW5lcmljLzIzOSBnZW5lcmljLzI0MCBnZW5lcmljLzI0MSBnZW5lcmljLzI0NSBnZW5lcmlj LzI0NiBnZW5lcmljLzI0NyBnZW5lcmljLzI0OCBnZW5lcmljLzI0OSBnZW5lcmljLzI1NSBnZW5l cmljLzI1NyBnZW5lcmljLzI1OCBnZW5lcmljLzI2MyBnZW5lcmljLzI4NSBnZW5lcmljLzI4NiBn ZW5lcmljLzMwOCBnZW5lcmljLzMwOSBnZW5lcmljLzMxMCBnZW5lcmljLzMxMyBnZW5lcmljLzMx NSBnZW5lcmljLzMxNiBnZW5lcmljLzMyMyBzaGFyZWQvMjk4IHhmcy8wMDMgeGZzLzAwOCB4ZnMv MDEyIHhmcy8wMjAgeGZzLzA0OCB4ZnMvMDc0IHhmcy8wNzggeGZzLzA4MCB4ZnMvMDg0IHhmcy8x NjQgeGZzLzE2NSB4ZnMvMjA2IHhmcy8yMjIgeGZzLzIyOSB4ZnMvMjQyIHhmcy8yNTAgeGZzLzI1 MiB4ZnMvMjU5IHhmcy8yNzkgeGZzLzI5MCB4ZnMvMjkyIHhmcy8yOTMgeGZzLzMwMwpOb3QgcnVu OiBnZW5lcmljLzAwMyBnZW5lcmljLzAwNCBnZW5lcmljLzAwOCBnZW5lcmljLzAwOSBnZW5lcmlj LzAxMiBnZW5lcmljLzAxNSBnZW5lcmljLzAxNiBnZW5lcmljLzAxNyBnZW5lcmljLzAxOCBnZW5l cmljLzAxOSBnZW5lcmljLzAyMSBnZW5lcmljLzAyMiBnZW5lcmljLzAyMyBnZW5lcmljLzAyNCBn ZW5lcmljLzAyNSBnZW5lcmljLzAyNiBnZW5lcmljLzAyNyBnZW5lcmljLzAyOSBnZW5lcmljLzAz MCBnZW5lcmljLzAzMSBnZW5lcmljLzAzMiBnZW5lcmljLzAzMyBnZW5lcmljLzAzNCBnZW5lcmlj LzAzNyBnZW5lcmljLzAzOCBnZW5lcmljLzAzOSBnZW5lcmljLzA0MCBnZW5lcmljLzA0MSBnZW5l cmljLzA0MiBnZW5lcmljLzA0MyBnZW5lcmljLzA0NCBnZW5lcmljLzA0NSBnZW5lcmljLzA0NiBn ZW5lcmljLzA0NyBnZW5lcmljLzA0OCBnZW5lcmljLzA0OSBnZW5lcmljLzA1MCBnZW5lcmljLzA1 MSBnZW5lcmljLzA1MiBnZW5lcmljLzA1MyBnZW5lcmljLzA1NCBnZW5lcmljLzA1NSBnZW5lcmlj LzA1NiBnZW5lcmljLzA1NyBnZW5lcmljLzA1OCBnZW5lcmljLzA1OSBnZW5lcmljLzA2MCBnZW5l cmljLzA2MSBnZW5lcmljLzA2MiBnZW5lcmljLzA2MyBnZW5lcmljLzA2NCBnZW5lcmljLzA2NSBn ZW5lcmljLzA2NiBnZW5lcmljLzA2NyBnZW5lcmljLzA2OCBnZW5lcmljLzA2OSBnZW5lcmljLzA3 MSBnZW5lcmljLzA3MiBnZW5lcmljLzA3MyBnZW5lcmljLzA3NiBnZW5lcmljLzA3NyBnZW5lcmlj LzA3OCBnZW5lcmljLzA3OSBnZW5lcmljLzA4MSBnZW5lcmljLzA4MiBnZW5lcmljLzA4MyBnZW5l cmljLzA4NCBnZW5lcmljLzA4NSBnZW5lcmljLzA5MCBnZW5lcmljLzA5MyBnZW5lcmljLzA5NCBn ZW5lcmljLzA5NSBnZW5lcmljLzA5NiBnZW5lcmljLzA5NyBnZW5lcmljLzA5OCBnZW5lcmljLzA5 OSBnZW5lcmljLzEwMCBnZW5lcmljLzEwMSBnZW5lcmljLzEwMiBnZW5lcmljLzEwMyBnZW5lcmlj LzEwNCBnZW5lcmljLzEwNSBnZW5lcmljLzEwNiBnZW5lcmljLzEwNyBnZW5lcmljLzEwOCBnZW5l cmljLzEwOSBnZW5lcmljLzExMCBnZW5lcmljLzExMSBnZW5lcmljLzExNSBnZW5lcmljLzExNiBn ZW5lcmljLzExNyBnZW5lcmljLzExOCBnZW5lcmljLzExOSBnZW5lcmljLzEyMCBnZW5lcmljLzEy MSBnZW5lcmljLzEyMiBnZW5lcmljLzEyNCBnZW5lcmljLzEyOCBnZW5lcmljLzEyOSBnZW5lcmlj LzEzMCBnZW5lcmljLzEzMiBnZW5lcmljLzEzNCBnZW5lcmljLzEzNSBnZW5lcmljLzEzNiBnZW5l cmljLzEzNyBnZW5lcmljLzEzOCBnZW5lcmljLzEzOSBnZW5lcmljLzE0MCBnZW5lcmljLzE0MSBn ZW5lcmljLzE0MiBnZW5lcmljLzE0MyBnZW5lcmljLzE0NCBnZW5lcmljLzE0NSBnZW5lcmljLzE0 NiBnZW5lcmljLzE0NyBnZW5lcmljLzE0OCBnZW5lcmljLzE0OSBnZW5lcmljLzE1MCBnZW5lcmlj LzE1MSBnZW5lcmljLzE1MiBnZW5lcmljLzE1MyBnZW5lcmljLzE1NCBnZW5lcmljLzE1NSBnZW5l cmljLzE1NiBnZW5lcmljLzE1NyBnZW5lcmljLzE1OCBnZW5lcmljLzE1OSBnZW5lcmljLzE2MCBn ZW5lcmljLzE2MSBnZW5lcmljLzE2MiBnZW5lcmljLzE2MyBnZW5lcmljLzE2NCBnZW5lcmljLzE2 NSBnZW5lcmljLzE2NiBnZW5lcmljLzE2NyBnZW5lcmljLzE2OCBnZW5lcmljLzE2OSBnZW5lcmlj LzE3MCBnZW5lcmljLzE3MSBnZW5lcmljLzE3MiBnZW5lcmljLzE3MyBnZW5lcmljLzE3NCBnZW5l cmljLzE3NSBnZW5lcmljLzE3NiBnZW5lcmljLzE3NyBnZW5lcmljLzE3OCBnZW5lcmljLzE3OSBn ZW5lcmljLzE4MCBnZW5lcmljLzE4MSBnZW5lcmljLzE4MiBnZW5lcmljLzE4MyBnZW5lcmljLzE4 NSBnZW5lcmljLzE4NiBnZW5lcmljLzE4NyBnZW5lcmljLzE4OCBnZW5lcmljLzE4OSBnZW5lcmlj LzE5MCBnZW5lcmljLzE5MSBnZW5lcmljLzE5NCBnZW5lcmljLzE5NSBnZW5lcmljLzE5NiBnZW5l cmljLzE5NyBnZW5lcmljLzE5OSBnZW5lcmljLzIwMCBnZW5lcmljLzIwMSBnZW5lcmljLzIwMiBn ZW5lcmljLzIwMyBnZW5lcmljLzIwNCBnZW5lcmljLzIwNSBnZW5lcmljLzIwNiBnZW5lcmljLzIx NiBnZW5lcmljLzIxNyBnZW5lcmljLzIxOCBnZW5lcmljLzIxOSBnZW5lcmljLzIyMCBnZW5lcmlj LzIyMiBnZW5lcmljLzIyMyBnZW5lcmljLzIyNCBnZW5lcmljLzIyNSBnZW5lcmljLzIyNiBnZW5l cmljLzIyNyBnZW5lcmljLzIyOSBnZW5lcmljLzIzMCBnZW5lcmljLzIzMSBnZW5lcmljLzIzMiBn ZW5lcmljLzIzMyBnZW5lcmljLzIzNCBnZW5lcmljLzIzNSBnZW5lcmljLzIzNyBnZW5lcmljLzIz OCBnZW5lcmljLzI0MiBnZW5lcmljLzI0MyBnZW5lcmljLzI0NCBnZW5lcmljLzI1MCBnZW5lcmlj LzI1MSBnZW5lcmljLzI1MiBnZW5lcmljLzI1MyBnZW5lcmljLzI1NCBnZW5lcmljLzI1NiBnZW5l cmljLzI1OSBnZW5lcmljLzI2MCBnZW5lcmljLzI2MSBnZW5lcmljLzI2MiBnZW5lcmljLzI2NCBn ZW5lcmljLzI2NSBnZW5lcmljLzI2NiBnZW5lcmljLzI2NyBnZW5lcmljLzI2OCBnZW5lcmljLzI2 OSBnZW5lcmljLzI3MCBnZW5lcmljLzI3MSBnZW5lcmljLzI3MiBnZW5lcmljLzI3MyBnZW5lcmlj LzI3NCBnZW5lcmljLzI3NSBnZW5lcmljLzI3NiBnZW5lcmljLzI3NyBnZW5lcmljLzI3OCBnZW5l cmljLzI3OSBnZW5lcmljLzI4MCBnZW5lcmljLzI4MSBnZW5lcmljLzI4MiBnZW5lcmljLzI4MyBn ZW5lcmljLzI4NCBnZW5lcmljLzI4NyBnZW5lcmljLzI4OCBnZW5lcmljLzI4OSBnZW5lcmljLzI5 MCBnZW5lcmljLzI5MSBnZW5lcmljLzI5MiBnZW5lcmljLzI5MyBnZW5lcmljLzI5NCBnZW5lcmlj LzI5NSBnZW5lcmljLzI5NiBnZW5lcmljLzI5NyBnZW5lcmljLzI5OCBnZW5lcmljLzI5OSBnZW5l cmljLzMwMCBnZW5lcmljLzMwMSBnZW5lcmljLzMwMiBnZW5lcmljLzMwMyBnZW5lcmljLzMwNCBn ZW5lcmljLzMwNSBnZW5lcmljLzMwNiBnZW5lcmljLzMwNyBnZW5lcmljLzMxMSBnZW5lcmljLzMx MiBnZW5lcmljLzMxNCBnZW5lcmljLzMxNyBnZW5lcmljLzMxOCBnZW5lcmljLzMxOSBnZW5lcmlj LzMyMCBnZW5lcmljLzMyMSBnZW5lcmljLzMyMiBnZW5lcmljLzMyNCBnZW5lcmljLzMyNSBnZW5l cmljLzMyNiBnZW5lcmljLzMyNyBnZW5lcmljLzMyOCBnZW5lcmljLzMyOSBnZW5lcmljLzMzMCBn ZW5lcmljLzMzMSBnZW5lcmljLzMzMiBnZW5lcmljLzMzMyBnZW5lcmljLzMzNCBnZW5lcmljLzMz NSBnZW5lcmljLzMzNiBnZW5lcmljLzMzNyBzaGFyZWQvMDAxIHNoYXJlZC8wMDIgc2hhcmVkLzAw MyBzaGFyZWQvMDA2IHNoYXJlZC8wMzIgc2hhcmVkLzA1MSBzaGFyZWQvMjcyIHNoYXJlZC8yODkg eGZzLzAwMSB4ZnMvMDAyIHhmcy8wMDQgeGZzLzAwNSB4ZnMvMDA2IHhmcy8wMDcgeGZzLzAwOSB4 ZnMvMDEwIHhmcy8wMTEgeGZzLzAxMyB4ZnMvMDE0IHhmcy8wMTUgeGZzLzAxNiB4ZnMvMDE3IHhm cy8wMTggeGZzLzAxOSB4ZnMvMDIxIHhmcy8wMjIgeGZzLzAyMyB4ZnMvMDI0IHhmcy8wMjUgeGZz LzAyNiB4ZnMvMDI3IHhmcy8wMjggeGZzLzAyOSB4ZnMvMDMwIHhmcy8wMzEgeGZzLzAzMiB4ZnMv MDMzIHhmcy8wMzQgeGZzLzAzNSB4ZnMvMDM2IHhmcy8wMzcgeGZzLzAzOCB4ZnMvMDM5IHhmcy8w NDAgeGZzLzA0MSB4ZnMvMDQyIHhmcy8wNDMgeGZzLzA0NCB4ZnMvMDQ1IHhmcy8wNDYgeGZzLzA0 NyB4ZnMvMDQ5IHhmcy8wNTAgeGZzLzA1MSB4ZnMvMDUyIHhmcy8wNTMgeGZzLzA1NCB4ZnMvMDU1 IHhmcy8wNTYgeGZzLzA1NyB4ZnMvMDU4IHhmcy8wNTkgeGZzLzA2MCB4ZnMvMDYxIHhmcy8wNjIg eGZzLzA2MyB4ZnMvMDY0IHhmcy8wNjUgeGZzLzA2NiB4ZnMvMDY3IHhmcy8wNjggeGZzLzA2OSB4 ZnMvMDcwIHhmcy8wNzEgeGZzLzA3MiB4ZnMvMDczIHhmcy8wNzUgeGZzLzA3NiB4ZnMvMDc3IHhm cy8wNzkgeGZzLzA4MSB4ZnMvMDgyIHhmcy8wODMgeGZzLzA4NSB4ZnMvMDg2IHhmcy8wODcgeGZz LzA4OCB4ZnMvMDg5IHhmcy8wOTAgeGZzLzA5MSB4ZnMvMDkyIHhmcy8wOTMgeGZzLzA5NCB4ZnMv MDk1IHhmcy8wOTYgeGZzLzA5NyB4ZnMvMDk4IHhmcy8wOTkgeGZzLzEwMCB4ZnMvMTAxIHhmcy8x MDIgeGZzLzEwMyB4ZnMvMTA0IHhmcy8xMDUgeGZzLzEwNiB4ZnMvMTA3IHhmcy8xMDggeGZzLzEw OSB4ZnMvMTEwIHhmcy8xMTEgeGZzLzExMiB4ZnMvMTEzIHhmcy8xMTQgeGZzLzExNSB4ZnMvMTE2 IHhmcy8xMTcgeGZzLzExOCB4ZnMvMTE5IHhmcy8xMjAgeGZzLzEyMSB4ZnMvMTIyIHhmcy8xMjMg eGZzLzEyNCB4ZnMvMTI1IHhmcy8xMjYgeGZzLzEyNyB4ZnMvMTI4IHhmcy8xMjkgeGZzLzEzMCB4 ZnMvMTMxIHhmcy8xMzIgeGZzLzEzMyB4ZnMvMTM0IHhmcy8xMzUgeGZzLzEzNiB4ZnMvMTM3IHhm cy8xMzggeGZzLzEzOSB4ZnMvMTQwIHhmcy8xNDEgeGZzLzE0MiB4ZnMvMTQzIHhmcy8xNDQgeGZz LzE0NSB4ZnMvMTQ2IHhmcy8xNDcgeGZzLzE0OCB4ZnMvMTQ5IHhmcy8xNTAgeGZzLzE1MSB4ZnMv MTUyIHhmcy8xNTMgeGZzLzE1NCB4ZnMvMTU1IHhmcy8xNTYgeGZzLzE1NyB4ZnMvMTU4IHhmcy8x NTkgeGZzLzE2MCB4ZnMvMTYxIHhmcy8xNjIgeGZzLzE2MyB4ZnMvMTY2IHhmcy8xNjcgeGZzLzE2 OCB4ZnMvMTY5IHhmcy8xNzAgeGZzLzE3MSB4ZnMvMTcyIHhmcy8xNzMgeGZzLzE3NCB4ZnMvMTc1 IHhmcy8xNzYgeGZzLzE3NyB4ZnMvMTc4IHhmcy8xNzkgeGZzLzE4MCB4ZnMvMTgxIHhmcy8xODIg eGZzLzE4MyB4ZnMvMTg0IHhmcy8xODUgeGZzLzE4NiB4ZnMvMTg3IHhmcy8xODggeGZzLzE4OSB4 ZnMvMTkwIHhmcy8xOTEgeGZzLzE5MiB4ZnMvMTkzIHhmcy8xOTQgeGZzLzE5NSB4ZnMvMTk2IHhm cy8xOTcgeGZzLzE5OCB4ZnMvMTk5IHhmcy8yMDAgeGZzLzIwMSB4ZnMvMjAyIHhmcy8yMDMgeGZz LzIwNCB4ZnMvMjA1IHhmcy8yMDcgeGZzLzIwOCB4ZnMvMjA5IHhmcy8yMTAgeGZzLzIxMSB4ZnMv MjEyIHhmcy8yMTMgeGZzLzIxNCB4ZnMvMjE1IHhmcy8yMTYgeGZzLzIxNyB4ZnMvMjE4IHhmcy8y MTkgeGZzLzIyMCB4ZnMvMjIxIHhmcy8yMjMgeGZzLzIyNCB4ZnMvMjI1IHhmcy8yMjYgeGZzLzIy NyB4ZnMvMjI4IHhmcy8yMzAgeGZzLzIzMSB4ZnMvMjMyIHhmcy8yMzMgeGZzLzIzNCB4ZnMvMjM1 IHhmcy8yMzYgeGZzLzIzNyB4ZnMvMjM4IHhmcy8yMzkgeGZzLzI0MCB4ZnMvMjQxIHhmcy8yNDMg eGZzLzI0NCB4ZnMvMjQ1IHhmcy8yNDYgeGZzLzI0NyB4ZnMvMjQ4IHhmcy8yNDkgeGZzLzI1MSB4 ZnMvMjUzIHhmcy8yNTQgeGZzLzI1NSB4ZnMvMjU2IHhmcy8yNTcgeGZzLzI1OCB4ZnMvMjYwIHhm cy8yNjEgeGZzLzI2MiB4ZnMvMjY2IHhmcy8yNjcgeGZzLzI2OCB4ZnMvMjc4IHhmcy8yODEgeGZz LzI4MiB4ZnMvMjgzIHhmcy8yODcgeGZzLzI5MSB4ZnMvMjk1IHhmcy8yOTYgeGZzLzI5NyB4ZnMv Mjk4IHhmcy8yOTkgeGZzLzMwMCB4ZnMvMzAxIHhmcy8zMDIgeGZzLzMwNCB4ZnMvMzA1CkZhaWx1 cmVzOiBnZW5lcmljLzI0NyBnZW5lcmljLzI2MyB4ZnMvMDIwIHhmcy8wNzQgeGZzLzI1MCB4ZnMv MjkyIHhmcy8yOTMKRmFpbGVkIDcgb2YgOTMgdGVzdHMKCg== --94eb2c088930c577c3052d1042b8-- From fanael4@gmail.com Wed Mar 2 07:14:52 2016 Return-Path: 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 2432B7CB1 for ; Wed, 2 Mar 2016 07:14:52 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DBAE2304032 for ; Wed, 2 Mar 2016 05:14:48 -0800 (PST) X-ASG-Debug-ID: 1456924486-04cbb00b7013ded0001-NocioJ Received: from mail-oi0-f41.google.com (mail-oi0-f41.google.com [209.85.218.41]) by cuda.sgi.com with ESMTP id xyRmzq5Nw7AGSqVX (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 02 Mar 2016 05:14:46 -0800 (PST) X-Barracuda-Envelope-From: fanael4@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.218.41 Received: by mail-oi0-f41.google.com with SMTP id c203so59925504oia.2 for ; Wed, 02 Mar 2016 05:14:46 -0800 (PST) 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; bh=wEgzJAR1wfBnmNRizffS2wakVgMZ45iImFUDucwTPo4=; b=O3xapr7mq1Fzlt8k5S0M5ip9UTeGhCk8888xsuWODJrOWEvo+Qi0cfyPbfVz4Exp/V 3Eq0+QCuwyh/2qiCpFtXJBah6uVuBfB4pNyR+R3QMIzwopQLGnwUSAZeOXJLGBzRoZYw k3/G0vh04v78NghbHxk64vv83oW3T+1ZvsNYVU38sR0lZIYNhawV4bSysbsfiPngfV+V B/CpImVio3kei7eD1rsXhBie5P7zzCLh9X8obzhFnZ83FBeFyT/sOGpU5Gjubt3tg7Fx u2MtIUbm+8BZehnno4gE1vHIywB8N/kHLd8thBlwZMJQd81Tx+ngoDikiMj3Wul01kgK B5ZA== 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; bh=wEgzJAR1wfBnmNRizffS2wakVgMZ45iImFUDucwTPo4=; b=OHWGBDp56N0Ow83iNuMx8FIOd1Rp1qnAKnTv4zy4hs/G1kz8zMVIDPxYt2MIXDrYPd 57X5qNszj1QlMOqIlt9vlYcbC4Q8oRKYtYpe0m4YWgWivkNPIFCXej1DOCu7HIvNUx+w j3+EQfcC+miEShEicJ9TZqWcy9vXEA3YsQA4Fa1UQCmUhVwtEotGcsdr2z/sZAiqKUVO GkWLSWVcFa6IidWZ4+o0XpLP6umtlzpcUwjW8vhLW1YNPjUrU4+a6oGUO2QV66MZq0G0 gc7X7qL2wMLEb7CWZGxSi0rSUFJ0LQ1Bec08cVOv6AtiwwhyH94KrJWwzVyIum0fzh1T MsNA== X-Gm-Message-State: AD7BkJJqZYN6odP2i4ktF17QXmMjdazjHys7WLgmZ8XwohJM1d0xzrouz6ojdfxFOk8zE66CFFs9ihBGPls3Vg== MIME-Version: 1.0 X-Received: by 10.202.188.134 with SMTP id m128mr20700832oif.4.1456924486163; Wed, 02 Mar 2016 05:14:46 -0800 (PST) Received: by 10.202.203.212 with HTTP; Wed, 2 Mar 2016 05:14:46 -0800 (PST) In-Reply-To: <20160301072011.GF30721@dastard> References: <3685DFAD20214109878873CF81232704@alyakaslap> <20160222212019.GI25832@dastard> <20160222235628.GK25832@dastard> <20160223225926.GN25832@dastard> <20160229211628.GK29057@dastard> <20160301072011.GF30721@dastard> Date: Wed, 2 Mar 2016 14:14:46 +0100 Message-ID: Subject: Re: xfs resize: primary superblock is not updated immediately From: Fanael Linithien X-ASG-Orig-Subj: Re: xfs resize: primary superblock is not updated immediately To: Dave Chinner Cc: Alex Lyakas , Christoph Hellwig , Danny Shavit , Shyam Kaushik , Yair Hershko , xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-oi0-f41.google.com[209.85.218.41] X-Barracuda-Start-Time: 1456924486 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27503 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 2016-03-01 8:20 GMT+01:00 Dave Chinner : > than prior to the grow operation, then the new AGs will not have > in-memory xfs_perag structurea associated with them. ^^^^^^^^^^ structures > This is easily fixed by simply re-initialising the perag structure > after re-reading the superblock at the conclusion of the first pahse > of log recovery. ^^^^^ phase From eguan@redhat.com Wed Mar 2 08:01:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 725FF7CB4 for ; Wed, 2 Mar 2016 08:01:38 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4E24E304048 for ; Wed, 2 Mar 2016 06:01:35 -0800 (PST) X-ASG-Debug-ID: 1456927293-04cbb00b6f140ac0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 29KHabyTM34dRgfz (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 02 Mar 2016 06:01:34 -0800 (PST) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 48AE8D56E8; Wed, 2 Mar 2016 14:01:33 +0000 (UTC) Received: from localhost ([10.66.18.115]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u22E1Ux8006446; Wed, 2 Mar 2016 09:01:31 -0500 Date: Wed, 2 Mar 2016 22:01:29 +0800 From: Eryu Guan To: Dan Williams Cc: akpm@linux-foundation.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Ross Zwisler , xfs@oss.sgi.com Subject: Re: [PATCH] list: kill list_force_poison() Message-ID: <20160302140129.GQ11419@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] list: kill list_force_poison() References: <20160301214432.4473.76919.stgit@dwillia2-desk3.amr.corp.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160301214432.4473.76919.stgit@dwillia2-desk3.amr.corp.intel.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Wed, 02 Mar 2016 14:01:33 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1456927294 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Mar 01, 2016 at 01:44:32PM -0800, Dan Williams wrote: > Given we have uninitialized list_heads being passed to list_add() it > will always be the case that those uninitialized values randomly trigger > the poison value. Especially since a list_add() operation will seed the > stack with the poison value for later stack allocations to trip over. > For example, see these two false positive reports: > > list_add attempted on force-poisoned entry > WARNING: at lib/list_debug.c:34 > [..] > NIP [c00000000043c390] __list_add+0xb0/0x150 > LR [c00000000043c38c] __list_add+0xac/0x150 > Call Trace: > [c000000fb5fc3320] [c00000000043c38c] __list_add+0xac/0x150 (unreliable) > [c000000fb5fc33a0] [c00000000081b454] __down+0x4c/0xf8 > [c000000fb5fc3410] [c00000000010b6f8] down+0x68/0x70 > [c000000fb5fc3450] [d0000000201ebf4c] xfs_buf_lock+0x4c/0x150 [xfs] > > list_add attempted on force-poisoned entry(0000000000000500), > new->next == d0000000059ecdb0, new->prev == 0000000000000500 > WARNING: at lib/list_debug.c:33 > [..] > NIP [c00000000042db78] __list_add+0xa8/0x140 > LR [c00000000042db74] __list_add+0xa4/0x140 > Call Trace: > [c0000004c749f620] [c00000000042db74] __list_add+0xa4/0x140 (unreliable) > [c0000004c749f6b0] [c0000000008010ec] rwsem_down_read_failed+0x6c/0x1a0 > [c0000004c749f760] [c000000000800828] down_read+0x58/0x60 > [c0000004c749f7e0] [d000000005a1a6bc] xfs_log_commit_cil+0x7c/0x600 [xfs] > > Reported-by: Eryu Guan > Cc: Ross Zwisler > Cc: > Fixes: commit 5c2c2587b132 ("mm, dax, pmem: introduce {get|put}_dev_pagemap() for dax-gup") > Signed-off-by: Dan Williams With this patch applied, I don't see the warning after 1000 iterations (of course, the warning has been removed :-)). Thanks! Eryu P.S. With the RFC patch posted eariler, warnings are still triggered. > --- > include/linux/list.h | 11 ----------- > kernel/memremap.c | 9 +++++++-- > lib/list_debug.c | 9 --------- > 3 files changed, 7 insertions(+), 22 deletions(-) > > diff --git a/include/linux/list.h b/include/linux/list.h > index 30cf4200ab40..5356f4d661a7 100644 > --- a/include/linux/list.h > +++ b/include/linux/list.h > @@ -113,17 +113,6 @@ extern void __list_del_entry(struct list_head *entry); > extern void list_del(struct list_head *entry); > #endif > > -#ifdef CONFIG_DEBUG_LIST > -/* > - * See devm_memremap_pages() which wants DEBUG_LIST=y to assert if one > - * of the pages it allocates is ever passed to list_add() > - */ > -extern void list_force_poison(struct list_head *entry); > -#else > -/* fallback to the less strict LIST_POISON* definitions */ > -#define list_force_poison list_del > -#endif > - > /** > * list_replace - replace old entry by new one > * @old : the element to be replaced > diff --git a/kernel/memremap.c b/kernel/memremap.c > index b981a7b023f0..778191e3e887 100644 > --- a/kernel/memremap.c > +++ b/kernel/memremap.c > @@ -351,8 +351,13 @@ void *devm_memremap_pages(struct device *dev, struct resource *res, > for_each_device_pfn(pfn, page_map) { > struct page *page = pfn_to_page(pfn); > > - /* ZONE_DEVICE pages must never appear on a slab lru */ > - list_force_poison(&page->lru); > + /* > + * ZONE_DEVICE pages union ->lru with a ->pgmap back > + * pointer. It is a bug if a ZONE_DEVICE page is ever > + * freed or placed on a driver-private list. Seed the > + * storage with LIST_POISON* values. > + */ > + list_del(&page->lru); > page->pgmap = pgmap; > } > devres_add(dev, page_map); > diff --git a/lib/list_debug.c b/lib/list_debug.c > index 3345a089ef7b..3859bf63561c 100644 > --- a/lib/list_debug.c > +++ b/lib/list_debug.c > @@ -12,13 +12,6 @@ > #include > #include > > -static struct list_head force_poison; > -void list_force_poison(struct list_head *entry) > -{ > - entry->next = &force_poison; > - entry->prev = &force_poison; > -} > - > /* > * Insert a new entry between two known consecutive entries. > * > @@ -30,8 +23,6 @@ void __list_add(struct list_head *new, > struct list_head *prev, > struct list_head *next) > { > - WARN(new->next == &force_poison || new->prev == &force_poison, > - "list_add attempted on force-poisoned entry\n"); > WARN(next->prev != prev, > "list_add corruption. next->prev should be " > "prev (%p), but was %p. (next=%p).\n", > From mguzik@redhat.com Wed Mar 2 09:28:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E33127CB4 for ; Wed, 2 Mar 2016 09:28:39 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A6869304039 for ; Wed, 2 Mar 2016 07:28:36 -0800 (PST) X-ASG-Debug-ID: 1456932515-04bdf002eb133560001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id nskFujAOOoa5JFBQ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 02 Mar 2016 07:28:35 -0800 (PST) X-Barracuda-Envelope-From: mguzik@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 2052D8E3CC; Wed, 2 Mar 2016 15:28:35 +0000 (UTC) Received: from mguzik.localdomain (ovpn-116-111.ams2.redhat.com [10.36.116.111]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u22FSWCw007090; Wed, 2 Mar 2016 10:28:33 -0500 From: Mateusz Guzik To: xfs@oss.sgi.com Cc: Christoph Hellwig Subject: [PATCH] xfs: tidy up xfs_attr_shortform_list Date: Wed, 2 Mar 2016 16:28:31 +0100 X-ASG-Orig-Subj: [PATCH] xfs: tidy up xfs_attr_shortform_list Message-Id: <1456932511-19305-1-git-send-email-mguzik@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: 1456932515 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Remove an unnecessary i == nsbuf test and replace a common label for error handling after sbuf is allocated. Signed-off-by: Mateusz Guzik --- fs/xfs/xfs_attr_list.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index 4fa1482..7129fbc 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -74,7 +74,7 @@ xfs_attr_shortform_list(xfs_attr_list_context_t *context) xfs_attr_sf_entry_t *sfe; xfs_inode_t *dp; int sbsize, nsbuf, count, i; - int error; + int error = 0; ASSERT(context != NULL); dp = context->dp; @@ -146,8 +146,8 @@ xfs_attr_shortform_list(xfs_attr_list_context_t *context) XFS_CORRUPTION_ERROR("xfs_attr_shortform_list", XFS_ERRLEVEL_LOW, context->dp->i_mount, sfe); - kmem_free(sbuf); - return -EFSCORRUPTED; + error = -EFSCORRUPTED; + goto out; } sbp->entno = i; @@ -183,10 +183,6 @@ xfs_attr_shortform_list(xfs_attr_list_context_t *context) break; } } - if (i == nsbuf) { - kmem_free(sbuf); - return 0; - } /* * Loop putting entries into the user buffer. @@ -202,17 +198,16 @@ xfs_attr_shortform_list(xfs_attr_list_context_t *context) sbp->namelen, sbp->valuelen, &sbp->name[sbp->namelen]); - if (error) { - kmem_free(sbuf); - return error; - } + if (error) + break; if (context->seen_enough) break; cursor->offset++; } +out: kmem_free(sbuf); - return 0; + return error; } STATIC int -- 1.8.3.1 From BATV+7fc10ca489ce5a2f9509+4574+infradead.org+hch@bombadil.srs.infradead.org Wed Mar 2 09:47:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2898E7CB4 for ; Wed, 2 Mar 2016 09:47:43 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8DD25AC004 for ; Wed, 2 Mar 2016 07:47:39 -0800 (PST) X-ASG-Debug-ID: 1456933652-04cb6c5831112430001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id VUazvK9uQf8e7JUa (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 02 Mar 2016 07:47:32 -0800 (PST) X-Barracuda-Envelope-From: BATV+7fc10ca489ce5a2f9509+4574+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 1ab8zs-0002Ob-8h; Wed, 02 Mar 2016 15:47:32 +0000 Date: Wed, 2 Mar 2016 07:47:32 -0800 From: Christoph Hellwig To: Mateusz Guzik Cc: xfs@oss.sgi.com, Christoph Hellwig Subject: Re: [PATCH] xfs: tidy up xfs_attr_shortform_list Message-ID: <20160302154732.GA7125@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: tidy up xfs_attr_shortform_list References: <1456932511-19305-1-git-send-email-mguzik@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1456932511-19305-1-git-send-email-mguzik@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1456933652 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27506 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Mar 02, 2016 at 04:28:31PM +0100, Mateusz Guzik wrote: > Remove an unnecessary i == nsbuf test and replace a common label for error > handling after sbuf is allocated. > > Signed-off-by: Mateusz Guzik Looks good, Reviewed-by: Christoph Hellwig From BATV+7fc10ca489ce5a2f9509+4574+infradead.org+hch@bombadil.srs.infradead.org Wed Mar 2 09:50:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3E7827CB4 for ; Wed, 2 Mar 2016 09:50:11 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9DC41AC001 for ; Wed, 2 Mar 2016 07:50:10 -0800 (PST) X-ASG-Debug-ID: 1456933807-04cbb00b6f1469b0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id NFiCRgp1GsYoGoo8 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 02 Mar 2016 07:50:08 -0800 (PST) X-Barracuda-Envelope-From: BATV+7fc10ca489ce5a2f9509+4574+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 1ab92N-0004JI-Kr; Wed, 02 Mar 2016 15:50:07 +0000 Date: Wed, 2 Mar 2016 07:50:07 -0800 From: Christoph Hellwig To: "Darrick J. Wong" Cc: xfs@oss.sgi.com Subject: falloc vs reflink revisited Message-ID: <20160302155007.GB7125@infradead.org> X-ASG-Orig-Subj: falloc vs reflink revisited MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1456933808 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27506 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Hi Darrick, I know that I suggested unsharing blocks on fallocate, but it turns out this is causing problems. Applications expect falloc to be a fast metadata operation, and copying a potentially large number of blocks is against that expextation. This is especially bad for the NFS server, which should not be blocked for a long time in a synchronous operation. I think we'll have to remove the unshare and just fail the fallocate for a reflinked region for now. I still think it makes sense to expose an unshare operation, and we probably should make that anyother fallocate mode. Opininions? From BATV+30b184af19bdc41add7f+4574+infradead.org+hch@casper.srs.infradead.org Wed Mar 2 10:35:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A92747CB4 for ; Wed, 2 Mar 2016 10:35:00 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 88B248F8035 for ; Wed, 2 Mar 2016 08:34:54 -0800 (PST) X-ASG-Debug-ID: 1456936487-04cb6c5831114260001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id iGZ2JElOgW1kLXoL (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 02 Mar 2016 08:34:48 -0800 (PST) X-Barracuda-Envelope-From: BATV+30b184af19bdc41add7f+4574+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from chello080109146114.tirol.surfer.at ([80.109.146.114] helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85 #2 (Red Hat Linux)) id 1ab9ja-00024i-R8; Wed, 02 Mar 2016 16:34:46 +0000 From: Christoph Hellwig To: darrick.wong@oracle.com Cc: xfs@oss.sgi.com Subject: [PATCH] xfs: don't hand out pNFS layouts for reflink inodes Date: Wed, 2 Mar 2016 17:34:45 +0100 X-ASG-Orig-Subj: [PATCH] xfs: don't hand out pNFS layouts for reflink inodes Message-Id: <1456936485-21940-1-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1456936488 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27506 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Although the protocol allows for it, the Linux NFS server code doesn't support reflink-like functionality yet. It's been added to by TODO list.. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_pnfs.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/fs/xfs/xfs_pnfs.c b/fs/xfs/xfs_pnfs.c index ade236e..9708fef 100644 --- a/fs/xfs/xfs_pnfs.c +++ b/fs/xfs/xfs_pnfs.c @@ -139,6 +139,13 @@ xfs_fs_map_blocks( return -ENXIO; /* + * The pNFS block layout spec actually supports reflink like + * functionality, but the Linux pNFS server doesn't implement it yet. + */ + if (!xfs_is_reflink_inode(ip)) + return -ENXIO; + + /* * Lock out any other I/O before we flush and invalidate the pagecache, * and then hand out a layout to the remote system. This is very * similar to direct I/O, except that the synchronization is much more -- 2.1.4 From darrick.wong@oracle.com Wed Mar 2 10:41:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A0D207CB4 for ; Wed, 2 Mar 2016 10:41:35 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0A8F3AC003 for ; Wed, 2 Mar 2016 08:41:31 -0800 (PST) X-ASG-Debug-ID: 1456936888-04cbb00b70148c90001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id bpzZuAW6UXqPpyOi (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 02 Mar 2016 08:41:29 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u22Gf4GE015833 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 2 Mar 2016 16:41:05 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u22Gf4Pp015966 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Wed, 2 Mar 2016 16:41:04 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u22Gf32b022286; Wed, 2 Mar 2016 16:41:04 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 02 Mar 2016 08:41:03 -0800 Date: Wed, 2 Mar 2016 08:41:02 -0800 From: "Darrick J. Wong" To: Christoph Hellwig Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: block allocations for the refcount btree Message-ID: <20160302164102.GA20109@birch.djwong.org> X-ASG-Orig-Subj: Re: block allocations for the refcount btree References: <20160210093011.GA19147@infradead.org> <20160210095010.GC23904@birch.djwong.org> <20160210190738.GA13051@infradead.org> <20160210214058.GN14668@dastard> <20160212191046.GA28421@infradead.org> <20160301181809.GC27973@birch.djwong.org> <20160301204013.GA23128@infradead.org> <20160302052411.GB1902@birch.djwong.org> <20160302095932.GA9141@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160302095932.GA9141@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1456936889 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27506 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Wed, Mar 02, 2016 at 01:59:32AM -0800, Christoph Hellwig wrote: > On Tue, Mar 01, 2016 at 09:24:11PM -0800, Darrick J. Wong wrote: > > I've rebased my trees and pushed them all to github. > > > > The for-dave-for-4.6 kernel and progs branches are the giant piles of patches > > against Dave's for-next integration trees which (I think) are being reviewed > > for 4.6. > > > > The for-dave branches are against upstream as they've always been. > > BTW, what's the point of for-dave vs for-dave-for-4.6 for xfsprogs? for-dave-for-4.6 = all the stuff I'm pushing to Dave for 4.6 for-dave = all the stuff from my dev tree minus the non-XFS stuff ("non XFS stuff" means all the ext4 fixes, etc.) > > New patches have been added on the end of the patchset. > > > > I noticed that generic/139 crashes for-dave with a 1k block size due something > > or other sending us bio->bi_bdev == NULL. This seems to be sorted out somehow > > in for-next. Other than that I haven't seen any problems... but I've only > > run against x64 on bare XFS. Will run other arches/NFS/etc tonight/tomorrow. > > > > The transaction block reservation complaints should be fixed now, and I > > think the transaction reservations have been fixed too... or at least they > > don't show up on the tinydisk test setup. But all that means is that someone > > else will find it, probably within the first 3 minutes of testing. :P > > Passes on NFS without hitting the space reservation issue, and passes > on XFS without new regression. The odd transaction (not space) > reservation assert in xfs/140 that I started to myesteriously 100% > reproduce last week still is around on XFS. I'll see if I can fix that > or at least triage it further.. Hmm, I'll give it a spin when I get in later. Can you send me xfs_info output so I can try to construct an equivalent reproducer setup? --D From darrick.wong@oracle.com Wed Mar 2 10:42:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5A5E07CB4 for ; Wed, 2 Mar 2016 10:42:43 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 19107304043 for ; Wed, 2 Mar 2016 08:42:43 -0800 (PST) X-ASG-Debug-ID: 1456936960-04bdf002eb137c40001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id MkyivxGRnqd2eAh7 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 02 Mar 2016 08:42:41 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u22GgGGm017809 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 2 Mar 2016 16:42:17 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u22GgGug028598 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Wed, 2 Mar 2016 16:42:16 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u22GgG0e011475; Wed, 2 Mar 2016 16:42:16 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 02 Mar 2016 08:42:16 -0800 Date: Wed, 2 Mar 2016 08:42:15 -0800 From: "Darrick J. Wong" To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: falloc vs reflink revisited Message-ID: <20160302164215.GB20109@birch.djwong.org> X-ASG-Orig-Subj: Re: falloc vs reflink revisited References: <20160302155007.GB7125@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160302155007.GB7125@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1456936960 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27506 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Wed, Mar 02, 2016 at 07:50:07AM -0800, Christoph Hellwig wrote: > Hi Darrick, > > I know that I suggested unsharing blocks on fallocate, but it turns out > this is causing problems. Applications expect falloc to be a fast > metadata operation, and copying a potentially large number of blocks > is against that expextation. This is especially bad for the NFS > server, which should not be blocked for a long time in a synchronous > operation. > > I think we'll have to remove the unshare and just fail the fallocate > for a reflinked region for now. I still think it makes sense to expose > an unshare operation, and we probably should make that anyother > fallocate mode. > > Opininions? Back in the day I had a new FALLOC_FL_FUNSHARE_RANGE flag to force-cow a bunch of file blocks. I don't mind reintroducing it. Just think of all the fun we can share! :P --D From eguan@redhat.com Wed Mar 2 10:52:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 345877CB4 for ; Wed, 2 Mar 2016 10:52:17 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9E635AC001 for ; Wed, 2 Mar 2016 08:52:16 -0800 (PST) X-ASG-Debug-ID: 1456937535-04cb6c5832114ca0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Oh6jwiaxSqcaHGFq (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 02 Mar 2016 08:52:15 -0800 (PST) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id C8E7C72088; Wed, 2 Mar 2016 16:52:14 +0000 (UTC) Received: from localhost (dhcp-13-211.nay.redhat.com [10.66.13.211]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u22GqBcn021924; Wed, 2 Mar 2016 11:52:13 -0500 From: Eryu Guan To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com, Eryu Guan Subject: [PATCH] xfs/259: disable CRC if testing with 512 bytes block size Date: Thu, 3 Mar 2016 00:51:58 +0800 X-ASG-Orig-Subj: [PATCH] xfs/259: disable CRC if testing with 512 bytes block size Message-Id: <1456937518-20505-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Wed, 02 Mar 2016 16:52:14 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1456937535 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 With CRCs being the default, TEST_DEV can still be created with "-m crc=0" option explicitly, then 512 bytes block size is picked up by the test, which causes mkfs failure in later mkfs tests. Fix it by adding "-m crc=0" mkfs option in this case. Signed-off-by: Eryu Guan --- tests/xfs/259 | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tests/xfs/259 b/tests/xfs/259 index 16c1935..b5681fe 100755 --- a/tests/xfs/259 +++ b/tests/xfs/259 @@ -62,6 +62,12 @@ else sizes_to_check="512 1024 2048 4096" fi +# If XFS mounted at $TEST_DIR is created with crc disabled explicitly, option +# "-m crc=0" should be added to mkfs option as blocksize is 512 +mkfs_opts="-l size=32m -b size=$blocksize" +if [ $_fs_has_crcs -ne 1 -a "$XFS_MKFS_HAS_NO_META_SUPPORT" == "" ]; then + mkfs_opts="$mkfs_opts -m crc=0" +fi four_TB=$(_math "2^42") for del in $sizes_to_check; do ddseek=$(_math "$four_TB - $del") @@ -71,8 +77,7 @@ for del in $sizes_to_check; do >/dev/null 2>&1 || echo "dd failed" lofile=$(losetup -f) losetup $lofile "$testfile" - "$MKFS_XFS_PROG" -l size=32m -b size=$blocksize $lofile \ - >/dev/null || echo "mkfs failed!" + "$MKFS_XFS_PROG" $mkfs_opts $lofile >/dev/null || echo "mkfs failed!" sync losetup -d $lofile done -- 2.5.0 From BATV+7fc10ca489ce5a2f9509+4574+infradead.org+hch@bombadil.srs.infradead.org Wed Mar 2 10:57:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E94027CB4 for ; Wed, 2 Mar 2016 10:57:06 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A97D58F8039 for ; Wed, 2 Mar 2016 08:57:06 -0800 (PST) X-ASG-Debug-ID: 1456937824-04bdf002ee138450001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id LzJIMQCKsyMPa7sN (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 02 Mar 2016 08:57:04 -0800 (PST) X-Barracuda-Envelope-From: BATV+7fc10ca489ce5a2f9509+4574+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 1abA5A-0001l4-Jy; Wed, 02 Mar 2016 16:57:04 +0000 Date: Wed, 2 Mar 2016 08:57:04 -0800 From: Christoph Hellwig To: "Darrick J. Wong" Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: block allocations for the refcount btree Message-ID: <20160302165704.GA31438@infradead.org> X-ASG-Orig-Subj: Re: block allocations for the refcount btree References: <20160210093011.GA19147@infradead.org> <20160210095010.GC23904@birch.djwong.org> <20160210190738.GA13051@infradead.org> <20160210214058.GN14668@dastard> <20160212191046.GA28421@infradead.org> <20160301181809.GC27973@birch.djwong.org> <20160301204013.GA23128@infradead.org> <20160302052411.GB1902@birch.djwong.org> <20160302095932.GA9141@infradead.org> <20160302164102.GA20109@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160302164102.GA20109@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1456937824 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27507 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Mar 02, 2016 at 08:41:02AM -0800, Darrick J. Wong wrote: > Hmm, I'll give it a spin when I get in later. Can you send me xfs_info > output so I can try to construct an equivalent reproducer setup? root@vm:~/xfstests# xfs_info /mnt/scratch/ meta-data=/dev/vdc isize=512 agcount=320, agsize=8192 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1 spinodes=0 rmapbt=0 = reflink=1 data = bsize=4096 blocks=2621440, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 From darrick.wong@oracle.com Wed Mar 2 12:01:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2E0A37CB3 for ; Wed, 2 Mar 2016 12:01:15 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5888BAC001 for ; Wed, 2 Mar 2016 10:01:11 -0800 (PST) X-ASG-Debug-ID: 1456941665-04cb6c58331170a0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id EL9nop1rgBVPN6Dy (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 02 Mar 2016 10:01:05 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u22I10Pk025873 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 2 Mar 2016 18:01:00 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u22I0xOn030980 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Wed, 2 Mar 2016 18:00:59 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u22I0vba006876; Wed, 2 Mar 2016 18:00:57 GMT Received: from localhost (/10.145.179.157) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 02 Mar 2016 10:00:56 -0800 Date: Wed, 2 Mar 2016 10:00:55 -0800 From: "Darrick J. Wong" To: Gavin Guo Cc: Dave Chinner , Brian Foster , Jens Rosenboom , xfs@oss.sgi.com Subject: Re: [PATCH v2] [RFC] xfs: allocate log vector buffers outside CIL context lock Message-ID: <20160302180055.GE27973@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH v2] [RFC] xfs: allocate log vector buffers outside CIL context lock References: <1453177919-17849-1-git-send-email-david@fromorbit.com> <20160120015853.GU6033@dastard> <20160126141733.GA48264@bfoster.bfoster> <20160214001645.GF14668@dastard> <20160215132824.GH14668@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.21 (2010-09-15) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1456941665 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27508 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Wed, Mar 02, 2016 at 08:45:46PM +0800, Gavin Guo wrote: > On Mon, Feb 15, 2016 at 9:28 PM, Dave Chinner wrote: > > On Mon, Feb 15, 2016 at 12:57:51PM +0100, Jens Rosenboom wrote: > >> 2016-02-14 1:16 GMT+01:00 Dave Chinner : > >> > On Sat, Feb 13, 2016 at 06:09:17PM +0100, Jens Rosenboom wrote: > >> >> 2016-01-26 15:17 GMT+01:00 Brian Foster : > >> >> > On Wed, Jan 20, 2016 at 12:58:53PM +1100, Dave Chinner wrote: > >> >> We have seen this issue on our production Ceph cluster sporadically > >> >> and have tried a long time to reproduce it in a lab environment. > >> > .... > >> >> kmem_alloc (mode:0x2408240) > >> >> Feb 13 10:51:57 storage-node35 kernel: [10562.614089] XFS: > >> >> ceph-osd(10078) possible memory allocation deadlock size 32856 in > >> >> kmem_alloc (mode:0x2408240) > >> > > >> > High order allocation of 32k. That implies a buffer size of at least > >> > 32k is in use. Can you tell me what the output of xfs_info > >> > is for one of your filesystems? > >> > >> $ xfs_info /tmp/cbt/mnt/osd-device-0-data/ > >> meta-data=3D/dev/sda2 isize=3D2048 agcount=3D4, agsize= =3D97370688 blks > >> =3D sectsz=3D512 attr=3D2, projid32bi= t=3D1 > >> =3D crc=3D0 finobt=3D0 > >> data =3D bsize=3D4096 blocks=3D389482752, = imaxpct=3D5 > >> =3D sunit=3D0 swidth=3D0 blks > >> naming =3Dversion 2 bsize=3D65536 ascii-ci=3D0 ftype= =3D0 > >> log =3Dinternal bsize=3D4096 blocks=3D190177, ver= sion=3D2 > >> =3D sectsz=3D512 sunit=3D0 blks, lazy= -count=3D1 > >> realtime =3Dnone extsz=3D4096 blocks=3D0, rtextent= s=3D0 > > > > OK, so 64k directory block size. > > > >> > I suspect you are using a 64k directory block size, in which case > >> > I'll ask "are you storing millions of files in a single directory"? > >> > If your answer is no, then "don't do that" is an appropriate > >> > solution because large directory block sizes are slower than the > >> > default (4k) for almost all operations until you get up into the > >> > millions of files per directory range. > >> > >> These options are kind of standard folklore for setting up Ceph > >> clusters, I must admit that I delayed testing their performance > >> implications up to now, so many knobs to turn, so little time. > >> > >> mkfs_opts: '-f -i size=3D2048 -n size=3D64k' > >> mount_opts: '-o inode64,noatime,logbsize=3D256k' > > > > /me shakes his head sadly. > > > > Can you please go nuke where ever you read that from orbit? Please? > > It's the only way to be sure that the contagious cargo-cult > > stupidity doesn't spread further. > > > >> It turns out that when running with '-n size=3D4k' > > > > i.e. the default. > > > >> , indeed I do not get > >> any warnings during a 10h test run. I'll try to come up with some more > >> detailed benchmarking of the possible performance impacts, too. > > > > No surprise there. :/ > > > > FWIW, for small file Ceph workloads (e.g swift stores) we've found > > that 8k directory block sizes give marginal improvements over the > > default 4k, but it's all down hill from there. > > > >> Am I right in assuming that this parameter can not be tuned after the > >> initial mkfs? > > > > That's right. > > > >> In that case getting a production-ready version of your > >> patch would probably still be valuable for cluster admins wanting to > >> avoid having to move all of their data to new filesystems. > > > > Well, yes, that's why I'm working on it. But it's critical core > > code, it's also damn tricky and complex, and if I get it wrong it > > will corrupt filesystems. So I'm not going to rush a prototype fix > > out into production systems no matter how much pressure people put > > on me to ship a fix. > > > >> >> Soon after this, operations get so slow that the OSDs die because of > >> >> their suicide timeouts. > >> >> > >> >> Then I installed onto 3 servers this patch (applied onto kernel > >> >> v4.4.1). The bad news is that I am still getting the kernel messages > >> >> on these machines. The good news, though, is that they appear at a > >> >> much lower frequency and also the impact on performance seems to be > >> >> lower, so the OSD processes on these three nodes did not get killed. > >> > > >> > Right, the patch doesn't fix the underlying issue that memory > >> > fragmentation can prevent high order allocation from succeeding for > >> > long periods. However, it does ensure that the filesystem does not > >> > immediately deadlock memory reclaim when it happens so the system > >> > has a chance to recover. It still can deadlock the filesystem, > >> > because if we can't commit the transaction we can't unlock the > >> > objects in the transaction and everything can get stuck behind that > >> > if there's something sufficiently important in the blocked > >> > transaction. > >> > >> So how would your success criteria for getting this patch into > >> upstream look like? > > > > It's already "successful". I've proved locally that it avoids a memory > > reclaim deadlock that many people have reported over the past year. > > So there's no question that we need a fix to the problem; it's now > > just a matter of determining if the issues with this fix (e.g. > > doubling memory usage of the CIL) are an acceptible tradeoff for > > production workloads, or whether I've got to go back and prototype a > > fourth attempt at fixing the problem... > > > > And, of course, there's only some many hours int eh day. I'm into my > > 19th right now, and I havent' got through everything on my list for > > today yet. Tomorrow's list is even longer, and when I get through > > that, I hit the big one: "read, understand and review 10000 lines of > > complex new code".... > > > >> Would a benchmark of the 64k directory block size > >> case on machines all running with patched kernels be interesting? Or > >> would that scenario disqualify itself as being mistuned in the first > >> place? > > > > Not really - I've confirmed it doesn't cause performance issues on > > my usual tranche of benhmarks, so I'mnot conerned about that (it;s > > the same amount of work being done, anyway). Correctness is much > > more important right now, and that takes time, effort and focus to > > verify. > > > > And speaking of focus, it's now time for me to sleep. > > > > Cheers, > > > > Dave. > > -- > > Dave Chinner > > david@fromorbit.com > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs >=20 > I've recently backported the patch to the v3.13 kernel to see if the bug > can be fixed by the patch. Currently, since the bug only can be reproduced > on the production system, I need to ensure the code work correctly before > deploying the kernel. The following is the v3.13 backported kernel source: >=20 > http://kernel.ubuntu.com/git/gavinguo/ubuntu-trusty-amd64.git/log/?h=3Dhf= 00084724v20160219b0hc57647a >=20 > I also did the xfstests verification and the log is attached. There are > failed 7 of 93 tests. Investigation is still ongoing to determine if these > errors are related to the file system core functionality failure due to t= he > backporting incorrection. >=20 > I'll appreciate if you can give any suggestion to do the testing, give a > glance to the backported patch or the xfstests error log to see if there = is > any thing wrong. > ubuntu@xfs-test-vm:~/os/xfstests$ uname -a > Linux xfs-test-vm 3.13.0-77-generic #121hf00084724v20160219b0hc57647a SMP= Fri Feb 19 08:49:18 UTC 20 x86_64 x86_64 x86_64 GNU/Linux > ubuntu@xfs-test-vm:~/os/xfstests$ TEST_DEV=3D"/dev/vdb" TEST_DIR=3D"/mnt/= xfs_mnt/" ./check > check: QA must be run as root > ubuntu@xfs-test-vm:~/os/xfstests$ sudo !! > sudo TEST_DEV=3D"/dev/vdb" TEST_DIR=3D"/mnt/xfs_mnt/" ./check > sudo: unable to resolve host xfs-test-vm > FSTYP -- xfs (non-debug) > PLATFORM -- Linux/x86_64 xfs-test-vm 3.13.0-77-generic >=20 > generic/001 3s > generic/002 0s > generic/003 [not run] this test requires a valid $SCRATCH_DEV Got a second hard drive? Point SCRATCH_DEV to it (and SCRATCH_MNT to a second empty directory) and you'll get way more testing coverage. > generic/004 [not run] xfs_io flink support is missing Heh, old xfsprogs/kernel. :) (Some of those xfs_repair segfaults are probably fixed in newer xfsprogs...) --D > generic/005 0s > generic/006 0s > generic/007 1s > generic/008 [not run] xfs_io fzero support is missing > generic/009 [not run] xfs_io fzero support is missing > generic/010 0s > generic/011 1s > generic/012 [not run] xfs_io fcollapse support is missing > generic/013 24s > generic/014 9s > generic/015 [not run] this test requires a valid $SCRATCH_DEV > generic/016 [not run] xfs_io fcollapse support is missing > generic/017 [not run] this test requires a valid $SCRATCH_DEV > generic/018 [not run] this test requires a valid $SCRATCH_DEV > generic/019 [not run] this test requires a valid $SCRATCH_DEV > generic/020 3s > generic/021 [not run] xfs_io fcollapse support is missing > generic/022 [not run] xfs_io fcollapse support is missing > generic/023 [not run] kernel doesn't support renameat2 syscall > generic/024 [not run] kernel doesn't support renameat2 syscall > generic/025 [not run] kernel doesn't support renameat2 syscall > generic/026 [not run] this test requires a valid $SCRATCH_DEV > generic/027 [not run] this test requires a valid $SCRATCH_DEV > generic/028 5s > generic/029 [not run] this test requires a valid $SCRATCH_DEV > generic/030 [not run] this test requires a valid $SCRATCH_DEV > generic/031 [not run] this test requires a valid $SCRATCH_DEV > generic/032 [not run] this test requires a valid $SCRATCH_DEV > generic/033 [not run] this test requires a valid $SCRATCH_DEV > generic/034 [not run] this test requires a valid $SCRATCH_DEV > generic/035 0s > generic/036 10s > generic/037 [not run] this test requires a valid $SCRATCH_DEV > generic/038 [not run] this test requires a valid $SCRATCH_DEV > generic/039 [not run] this test requires a valid $SCRATCH_DEV > generic/040 [not run] this test requires a valid $SCRATCH_DEV > generic/041 [not run] this test requires a valid $SCRATCH_DEV > generic/042 [not run] this test requires a valid $SCRATCH_DEV > generic/043 [not run] this test requires a valid $SCRATCH_DEV > generic/044 [not run] this test requires a valid $SCRATCH_DEV > generic/045 [not run] this test requires a valid $SCRATCH_DEV > generic/046 [not run] this test requires a valid $SCRATCH_DEV > generic/047 [not run] this test requires a valid $SCRATCH_DEV > generic/048 [not run] this test requires a valid $SCRATCH_DEV > generic/049 [not run] this test requires a valid $SCRATCH_DEV > generic/050 [not run] this test requires a valid $SCRATCH_DEV > generic/051 [not run] this test requires a valid $SCRATCH_DEV > generic/052 [not run] this test requires a valid $SCRATCH_DEV > generic/053 [not run] this test requires a valid $SCRATCH_DEV > generic/054 [not run] this test requires a valid $SCRATCH_DEV > generic/055 [not run] this test requires a valid $SCRATCH_DEV > generic/056 [not run] this test requires a valid $SCRATCH_DEV > generic/057 [not run] this test requires a valid $SCRATCH_DEV > generic/058 [not run] xfs_io finsert support is missing > generic/059 [not run] this test requires a valid $SCRATCH_DEV > generic/060 [not run] xfs_io finsert support is missing > generic/061 [not run] xfs_io finsert support is missing > generic/062 [not run] this test requires a valid $SCRATCH_DEV > generic/063 [not run] xfs_io finsert support is missing > generic/064 [not run] this test requires a valid $SCRATCH_DEV > generic/065 [not run] this test requires a valid $SCRATCH_DEV > generic/066 [not run] this test requires a valid $SCRATCH_DEV > generic/067 [not run] this test requires a valid $SCRATCH_DEV > generic/068 [not run] this test requires a valid $SCRATCH_DEV > generic/069 [not run] this test requires a valid $SCRATCH_DEV > generic/070 6s > generic/071 [not run] this test requires a valid $SCRATCH_DEV > generic/072 [not run] xfs_io fcollapse support is missing > generic/073 [not run] this test requires a valid $SCRATCH_DEV > generic/074 104s > generic/075 29s > generic/076 [not run] this test requires a valid $SCRATCH_DEV > generic/077 [not run] this test requires a valid $SCRATCH_DEV > generic/078 [not run] kernel doesn't support renameat2 syscall > generic/079 [not run] this test requires a valid $SCRATCH_DEV > generic/080 3s > generic/081 [not run] this test requires a valid $SCRATCH_DEV > generic/082 [not run] this test requires a valid $SCRATCH_DEV > generic/083 [not run] this test requires a valid $SCRATCH_DEV > generic/084 [not run] this test requires a valid $SCRATCH_DEV > generic/085 [not run] this test requires a valid $SCRATCH_DEV > generic/086 1s > generic/087 1s > generic/088 1s > generic/089 5s > generic/090 [not run] this test requires a valid $SCRATCH_DEV > generic/091 70s > generic/092 0s > generic/093 [not run] not suitable for this OS: Linux > generic/094 [not run] this test requires a valid $SCRATCH_DEV > generic/095 [not run] this test requires a valid $SCRATCH_DEV > generic/096 [not run] this test requires a valid $SCRATCH_DEV > generic/097 [not run] not suitable for this OS: Linux > generic/098 [not run] this test requires a valid $SCRATCH_DEV > generic/099 [not run] not suitable for this OS: Linux > generic/100 [not run] this test requires a valid $SCRATCH_DEV > generic/101 [not run] this test requires a valid $SCRATCH_DEV > generic/102 [not run] this test requires a valid $SCRATCH_DEV > generic/103 [not run] this test requires a valid $SCRATCH_DEV > generic/104 [not run] this test requires a valid $SCRATCH_DEV > generic/105 [not run] this test requires a valid $SCRATCH_DEV > generic/106 [not run] this test requires a valid $SCRATCH_DEV > generic/107 [not run] this test requires a valid $SCRATCH_DEV > generic/108 [not run] this test requires a valid $SCRATCH_DEV > generic/109 [not run] this test requires a valid $SCRATCH_DEV > generic/110 [not run] xfs_io reflink support is missing > generic/111 [not run] xfs_io reflink support is missing > generic/112 35s > generic/113 39s > generic/114 53s > generic/115 [not run] xfs_io reflink support is missing > generic/116 [not run] xfs_io reflink support is missing > generic/117 [not run] this test requires a valid $SCRATCH_DEV > generic/118 [not run] xfs_io reflink support is missing > generic/119 [not run] xfs_io reflink support is missing > generic/120 [not run] this test requires a valid $SCRATCH_DEV > generic/121 [not run] xfs_io dedupe support is missing > generic/122 [not run] xfs_io dedupe support is missing > generic/123 1s > generic/124 [not run] this test requires a valid $SCRATCH_DEV > generic/125 62s > generic/126 0s > generic/127 715s > generic/128 [not run] this test requires a valid $SCRATCH_DEV > generic/129 [not run] this test requires a valid $SCRATCH_DEV > generic/130 [not run] this test requires a valid $SCRATCH_DEV > generic/131 1s > generic/132 [not run] this test requires a valid $SCRATCH_DEV > generic/133 268s > generic/134 [not run] xfs_io reflink support is missing > generic/135 [not run] this test requires a valid $SCRATCH_DEV > generic/136 [not run] xfs_io dedupe support is missing > generic/137 [not run] xfs_io reflink support is missing > generic/138 [not run] xfs_io reflink support is missing > generic/139 [not run] xfs_io reflink support is missing > generic/140 [not run] xfs_io reflink support is missing > generic/141 [not run] this test requires a valid $SCRATCH_DEV > generic/142 [not run] xfs_io reflink support is missing > generic/143 [not run] xfs_io reflink support is missing > generic/144 [not run] xfs_io reflink support is missing > generic/145 [not run] xfs_io reflink support is missing > generic/146 [not run] xfs_io reflink support is missing > generic/147 [not run] xfs_io reflink support is missing > generic/148 [not run] xfs_io reflink support is missing > generic/149 [not run] xfs_io reflink support is missing > generic/150 [not run] xfs_io reflink support is missing > generic/151 [not run] xfs_io reflink support is missing > generic/152 [not run] xfs_io reflink support is missing > generic/153 [not run] xfs_io reflink support is missing > generic/154 [not run] xfs_io reflink support is missing > generic/155 [not run] xfs_io reflink support is missing > generic/156 [not run] xfs_io reflink support is missing > generic/157 [not run] xfs_io reflink support is missing > generic/158 [not run] xfs_io dedupe support is missing > generic/159 [not run] xfs_io reflink support is missing > generic/160 [not run] xfs_io dedupe support is missing > generic/161 [not run] this test requires a valid $SCRATCH_DEV > generic/162 [not run] this test requires a valid $SCRATCH_DEV > generic/163 [not run] this test requires a valid $SCRATCH_DEV > generic/164 [not run] this test requires a valid $SCRATCH_DEV > generic/165 [not run] this test requires a valid $SCRATCH_DEV > generic/166 [not run] this test requires a valid $SCRATCH_DEV > generic/167 [not run] this test requires a valid $SCRATCH_DEV > generic/168 [not run] this test requires a valid $SCRATCH_DEV > generic/169 [not run] this test requires a valid $SCRATCH_DEV > generic/170 [not run] this test requires a valid $SCRATCH_DEV > generic/171 [not run] this test requires a valid $SCRATCH_DEV > generic/172 [not run] this test requires a valid $SCRATCH_DEV > generic/173 [not run] this test requires a valid $SCRATCH_DEV > generic/174 [not run] this test requires a valid $SCRATCH_DEV > generic/175 [not run] this test requires a valid $SCRATCH_DEV > generic/176 [not run] this test requires a valid $SCRATCH_DEV > generic/177 [not run] this test requires a valid $SCRATCH_DEV > generic/178 [not run] xfs_io reflink support is missing > generic/179 [not run] xfs_io reflink support is missing > generic/180 [not run] xfs_io reflink support is missing > generic/181 [not run] xfs_io reflink support is missing > generic/182 [not run] xfs_io dedupe support is missing > generic/183 [not run] this test requires a valid $SCRATCH_DEV > generic/184 0s > generic/185 [not run] this test requires a valid $SCRATCH_DEV > generic/186 [not run] this test requires a valid $SCRATCH_DEV > generic/187 [not run] this test requires a valid $SCRATCH_DEV > generic/188 [not run] this test requires a valid $SCRATCH_DEV > generic/189 [not run] this test requires a valid $SCRATCH_DEV > generic/190 [not run] this test requires a valid $SCRATCH_DEV > generic/191 [not run] this test requires a valid $SCRATCH_DEV > generic/192 42s > generic/193 0s > generic/194 [not run] this test requires a valid $SCRATCH_DEV > generic/195 [not run] this test requires a valid $SCRATCH_DEV > generic/196 [not run] this test requires a valid $SCRATCH_DEV > generic/197 [not run] this test requires a valid $SCRATCH_DEV > generic/198 1s > generic/199 [not run] this test requires a valid $SCRATCH_DEV > generic/200 [not run] this test requires a valid $SCRATCH_DEV > generic/201 [not run] this test requires a valid $SCRATCH_DEV > generic/202 [not run] this test requires a valid $SCRATCH_DEV > generic/203 [not run] this test requires a valid $SCRATCH_DEV > generic/204 [not run] this test requires a valid $SCRATCH_DEV > generic/205 [not run] this test requires a valid $SCRATCH_DEV > generic/206 [not run] this test requires a valid $SCRATCH_DEV > generic/207 13s > generic/208 201s > umount: /mnt/xfs_mnt: device is busy. > (In some cases useful info about processes that use > the device is found by lsof(8) or fuser(1)) > _check_xfs_filesystem: filesystem on /dev/vdb has dirty log (see /home/ub= untu/os/xfstests/results//generic/208.full) > _check_xfs_filesystem: filesystem on /dev/vdb is inconsistent (c) (see /h= ome/ubuntu/os/xfstests/results//generic/208.full) > _check_xfs_filesystem: filesystem on /dev/vdb is inconsistent (r) (see /h= ome/ubuntu/os/xfstests/results//generic/208.full) > generic/209 37s > generic/210 0s > generic/211 0s > generic/212 0s > generic/213 1s > generic/214 0s > generic/215 2s > generic/216 [not run] this test requires a valid $SCRATCH_DEV > generic/217 [not run] this test requires a valid $SCRATCH_DEV > generic/218 [not run] this test requires a valid $SCRATCH_DEV > generic/219 [not run] this test requires a valid $SCRATCH_DEV > generic/220 [not run] this test requires a valid $SCRATCH_DEV > generic/221 1s > generic/222 [not run] this test requires a valid $SCRATCH_DEV > generic/223 [not run] this test requires a valid $SCRATCH_DEV > generic/224 [not run] this test requires a valid $SCRATCH_DEV > generic/225 [not run] this test requires a valid $SCRATCH_DEV > generic/226 [not run] this test requires a valid $SCRATCH_DEV > generic/227 [not run] this test requires a valid $SCRATCH_DEV > generic/228 0s > generic/229 [not run] this test requires a valid $SCRATCH_DEV > generic/230 [not run] this test requires a valid $SCRATCH_DEV > generic/231 [not run] this test requires a valid $SCRATCH_DEV > generic/232 [not run] this test requires a valid $SCRATCH_DEV > generic/233 [not run] this test requires a valid $SCRATCH_DEV > generic/234 [not run] this test requires a valid $SCRATCH_DEV > generic/235 [not run] this test requires a valid $SCRATCH_DEV > generic/236 2s > generic/237 [not run] chacl command not found > generic/238 [not run] this test requires a valid $SCRATCH_DEV > generic/239 3s > generic/240 0s > generic/241 72s > generic/242 [not run] this test requires a valid $SCRATCH_DEV > generic/243 [not run] this test requires a valid $SCRATCH_DEV > generic/244 [not run] this test requires a valid $SCRATCH_DEV > generic/245 0s > generic/246 1s > generic/247 28s > _check_dmesg: something found in dmesg (see /home/ubuntu/os/xfstests/resu= lts//generic/247.dmesg) > generic/248 0s > generic/249 1s > generic/250 [not run] this test requires a valid $SCRATCH_DEV > generic/251 [not run] this test requires a valid $SCRATCH_DEV > generic/252 [not run] this test requires a valid $SCRATCH_DEV > generic/253 [not run] this test requires a valid $SCRATCH_DEV > generic/254 [not run] this test requires a valid $SCRATCH_DEV > generic/255 1s > generic/256 [not run] this test requires a valid $SCRATCH_DEV > generic/257 0s > generic/258 0s > generic/259 [not run] this test requires a valid $SCRATCH_DEV > generic/260 [not run] this test requires a valid $SCRATCH_DEV > generic/261 [not run] this test requires a valid $SCRATCH_DEV > generic/262 [not run] this test requires a valid $SCRATCH_DEV > generic/263 [failed, exit status 1] - output mismatch (see /home/ubu= ntu/os/xfstests/results//generic/263.out.bad) > --- tests/generic/263.out 2016-03-02 07:03:04.063808319 +0000 > +++ /home/ubuntu/os/xfstests/results//generic/263.out.bad 2016-03-0= 2 07:53:20.511808319 +0000 > @@ -1,3 +1,8887 @@ > QA output created by 263 > fsx -N 10000 -o 8192 -l 500000 -r PSIZE -t BSIZE -w BSIZE -Z > fsx -N 10000 -o 128000 -l 500000 -r PSIZE -t BSIZE -w BSIZE -Z > +main: filesystem does not support fallocate mode FALLOC_FL_ZERO_RANG= E, disabling! > +main: filesystem does not support fallocate mode FALLOC_FL_COLLAPSE_= RANGE, disabling! > +main: filesystem does not support fallocate mode FALLOC_FL_INSERT_RA= NGE, disabling! > +truncating to largest ever: 0x11e00 > ... > (Run 'diff -u tests/generic/263.out /home/ubuntu/os/xfstests/results/= /generic/263.out.bad' to see the entire diff) > generic/264 [not run] this test requires a valid $SCRATCH_DEV > generic/265 [not run] this test requires a valid $SCRATCH_DEV > generic/266 [not run] this test requires a valid $SCRATCH_DEV > generic/267 [not run] this test requires a valid $SCRATCH_DEV > generic/268 [not run] this test requires a valid $SCRATCH_DEV > generic/269 [not run] this test requires a valid $SCRATCH_DEV > generic/270 [not run] this test requires a valid $SCRATCH_DEV > generic/271 [not run] this test requires a valid $SCRATCH_DEV > generic/272 [not run] this test requires a valid $SCRATCH_DEV > generic/273 [not run] this test requires a valid $SCRATCH_DEV > generic/274 [not run] this test requires a valid $SCRATCH_DEV > generic/275 [not run] this test requires a valid $SCRATCH_DEV > generic/276 [not run] this test requires a valid $SCRATCH_DEV > generic/277 [not run] this test requires a valid $SCRATCH_DEV > generic/278 [not run] this test requires a valid $SCRATCH_DEV > generic/279 [not run] this test requires a valid $SCRATCH_DEV > generic/280 [not run] this test requires a valid $SCRATCH_DEV > generic/281 [not run] this test requires a valid $SCRATCH_DEV > generic/282 [not run] this test requires a valid $SCRATCH_DEV > generic/283 [not run] this test requires a valid $SCRATCH_DEV > generic/284 [not run] this test requires a valid $SCRATCH_DEV > generic/285 0s > generic/286 5s > generic/287 [not run] this test requires a valid $SCRATCH_DEV > generic/288 [not run] this test requires a valid $SCRATCH_DEV > generic/289 [not run] this test requires a valid $SCRATCH_DEV > generic/290 [not run] this test requires a valid $SCRATCH_DEV > generic/291 [not run] this test requires a valid $SCRATCH_DEV > generic/292 [not run] this test requires a valid $SCRATCH_DEV > generic/293 [not run] this test requires a valid $SCRATCH_DEV > generic/294 [not run] this test requires a valid $SCRATCH_DEV > generic/295 [not run] this test requires a valid $SCRATCH_DEV > generic/296 [not run] this test requires a valid $SCRATCH_DEV > generic/297 [not run] this test requires a valid $SCRATCH_DEV > generic/298 [not run] this test requires a valid $SCRATCH_DEV > generic/299 [not run] this test requires a valid $SCRATCH_DEV > generic/300 [not run] this test requires a valid $SCRATCH_DEV > generic/301 [not run] this test requires a valid $SCRATCH_DEV > generic/302 [not run] this test requires a valid $SCRATCH_DEV > generic/303 [not run] xfs_io reflink support is missing > generic/304 [not run] xfs_io dedupe support is missing > generic/305 [not run] this test requires a valid $SCRATCH_DEV > generic/306 [not run] this test requires a valid $SCRATCH_DEV > generic/307 [not run] this test requires a valid $SCRATCH_DEV > generic/308 0s > generic/309 1s > generic/310 65s > generic/311 [not run] this test requires a valid $SCRATCH_DEV > generic/312 [not run] this test requires a valid $SCRATCH_DEV > generic/313 4s > generic/314 [not run] chacl command not found > generic/315 0s > generic/316 1s > generic/317 [not run] this test requires a valid $SCRATCH_DEV > generic/318 [not run] this test requires a valid $SCRATCH_DEV > generic/319 [not run] chacl command not found > generic/320 [not run] this test requires a valid $SCRATCH_DEV > generic/321 [not run] this test requires a valid $SCRATCH_DEV > generic/322 [not run] this test requires a valid $SCRATCH_DEV > generic/323 121s > generic/324 [not run] this test requires a valid $SCRATCH_DEV > generic/325 [not run] this test requires a valid $SCRATCH_DEV > generic/326 [not run] this test requires a valid $SCRATCH_DEV > generic/327 [not run] this test requires a valid $SCRATCH_DEV > generic/328 [not run] this test requires a valid $SCRATCH_DEV > generic/329 [not run] this test requires a valid $SCRATCH_DEV > generic/330 [not run] this test requires a valid $SCRATCH_DEV > generic/331 [not run] this test requires a valid $SCRATCH_DEV > generic/332 [not run] this test requires a valid $SCRATCH_DEV > generic/333 [not run] this test requires a valid $SCRATCH_DEV > generic/334 [not run] this test requires a valid $SCRATCH_DEV > generic/335 [not run] this test requires a valid $SCRATCH_DEV > generic/336 [not run] this test requires a valid $SCRATCH_DEV > generic/337 [not run] this test requires a valid $SCRATCH_DEV > shared/001 [not run] not suitable for this filesystem type: xfs > shared/002 [not run] this test requires a valid $SCRATCH_DEV > shared/003 [not run] not suitable for this filesystem type: xfs > shared/006 [not run] this test requires a valid $SCRATCH_DEV > shared/032 [not run] this test requires a valid $SCRATCH_DEV > shared/051 [not run] chacl command not found > shared/272 [not run] not suitable for this filesystem type: xfs > shared/289 [not run] not suitable for this filesystem type: xfs > shared/298 45s > xfs/001 [not run] this test requires a valid $SCRATCH_DEV > xfs/002 [not run] this test requires a valid $SCRATCH_DEV > xfs/003 0s > xfs/004 [not run] this test requires a valid $SCRATCH_DEV > xfs/005 [not run] this test requires a valid $SCRATCH_DEV > xfs/006 [not run] this test requires a valid $SCRATCH_DEV > xfs/007 [not run] this test requires a valid $SCRATCH_DEV > xfs/008 2s > xfs/009 [not run] this test requires a valid $SCRATCH_DEV > xfs/010 [not run] this test requires a valid $SCRATCH_DEV > xfs/011 [not run] this test requires a valid $SCRATCH_DEV > xfs/012 2s > xfs/013 [not run] this test requires a valid $SCRATCH_DEV > xfs/014 [not run] this test requires a valid $SCRATCH_DEV > xfs/015 [not run] this test requires a valid $SCRATCH_DEV > xfs/016 [not run] this test requires a valid $SCRATCH_DEV > xfs/017 [not run] this test requires a valid $SCRATCH_DEV > xfs/018 [not run] this test requires a valid $SCRATCH_DEV > xfs/019 [not run] this test requires a valid $SCRATCH_DEV > xfs/020 [failed, exit status 139] - output mismatch (see /home/ubuntu/os= /xfstests/results//xfs/020.out.bad) > --- tests/xfs/020.out 2016-03-02 07:03:04.083808319 +0000 > +++ /home/ubuntu/os/xfstests/results//xfs/020.out.bad 2016-03-0= 2 07:58:56.063808319 +0000 > @@ -1,2 +1,3 @@ > QA output created by 020 > Silence is golden > +./tests/xfs/020: line 58: 28658 Segmentation fault $XFS_REPAIR_= PROG -f -o ag_stride=3D32 -t 1 $fsfile > /dev/null 2>&1 > ... > (Run 'diff -u tests/xfs/020.out /home/ubuntu/os/xfstests/results//xfs= /020.out.bad' to see the entire diff) > xfs/021 [not run] this test requires a valid $SCRATCH_DEV > xfs/022 [not run] xfsdump not found > xfs/023 [not run] xfsdump not found > xfs/024 [not run] xfsdump not found > xfs/025 [not run] xfsdump not found > xfs/026 [not run] xfsdump not found > xfs/027 [not run] xfsdump not found > xfs/028 [not run] xfsdump not found > xfs/029 [not run] this test requires a valid $SCRATCH_DEV > xfs/030 [not run] this test requires a valid $SCRATCH_DEV > xfs/031 [not run] this test requires a valid $SCRATCH_DEV > xfs/032 [not run] this test requires a valid $SCRATCH_DEV > xfs/033 [not run] this test requires a valid $SCRATCH_DEV > xfs/034 [not run] this test requires a valid $SCRATCH_DEV > xfs/035 [not run] xfsdump not found > xfs/036 [not run] xfsdump not found > xfs/037 [not run] xfsdump not found > xfs/038 [not run] xfsdump not found > xfs/039 [not run] xfsdump not found > xfs/040 [not run] Can't run srcdiff without KWORKAREA set > xfs/041 [not run] this test requires a valid $SCRATCH_DEV > xfs/042 [not run] this test requires a valid $SCRATCH_DEV > xfs/043 [not run] xfsdump not found > xfs/044 [not run] This test requires a valid $SCRATCH_LOGDEV > xfs/045 [not run] this test requires a valid $SCRATCH_DEV > xfs/046 [not run] xfsdump not found > xfs/047 [not run] xfsdump not found > xfs/048 0s > xfs/049 [not run] this test requires a valid $SCRATCH_DEV > xfs/050 [not run] this test requires a valid $SCRATCH_DEV > xfs/051 [not run] this test requires a valid $SCRATCH_DEV > xfs/052 [not run] this test requires a valid $SCRATCH_DEV > xfs/053 [not run] this test requires a valid $SCRATCH_DEV > xfs/054 [not run] this test requires a valid $SCRATCH_DEV > xfs/055 [not run] xfsdump not found > xfs/056 [not run] xfsdump not found > xfs/057 [not run] Place holder for IRIX test 057 > xfs/058 [not run] Place holder for IRIX test 058 > xfs/059 [not run] xfsdump not found > xfs/060 [not run] xfsdump not found > xfs/061 [not run] xfsdump not found > xfs/062 [not run] this test requires a valid $SCRATCH_DEV > xfs/063 [not run] xfsdump not found > xfs/064 [not run] xfsdump not found > xfs/065 [not run] xfsdump not found > xfs/066 [not run] xfsdump not found > xfs/067 [not run] chacl command not found > xfs/068 [not run] xfsdump not found > xfs/069 [not run] this test requires a valid $SCRATCH_DEV > xfs/070 [not run] this test requires a valid $SCRATCH_DEV > xfs/071 [not run] this test requires a valid $SCRATCH_DEV > xfs/072 [not run] this test requires a valid $SCRATCH_DEV > xfs/073 [not run] this test requires a valid $SCRATCH_DEV > xfs/074 [failed, exit status 1] - output mismatch (see /home/ubuntu/os/x= fstests/results//xfs/074.out.bad) > --- tests/xfs/074.out 2016-03-02 07:03:04.095808319 +0000 > +++ /home/ubuntu/os/xfstests/results//xfs/074.out.bad 2016-03-0= 2 07:59:19.943808319 +0000 > @@ -1,2 +1,4 @@ > QA output created by 074 > -Silence is golden > +fallocate: No space left on device > +_check_xfs_filesystem: filesystem on /dev/loop0 is inconsistent (c) = (see /home/ubuntu/os/xfstests/results//xfs/074.full) > +_check_xfs_filesystem: filesystem on /dev/loop0 is inconsistent (r) = (see /home/ubuntu/os/xfstests/results//xfs/074.full) > ... > (Run 'diff -u tests/xfs/074.out /home/ubuntu/os/xfstests/results//xfs= /074.out.bad' to see the entire diff) > xfs/075 [not run] this test requires a valid $SCRATCH_DEV > xfs/076 [not run] this test requires a valid $SCRATCH_DEV > xfs/077 [not run] this test requires a valid $SCRATCH_DEV > xfs/078 48s > xfs/079 [not run] this test requires a valid $SCRATCH_DEV > xfs/080 5s > xfs/081 [not run] this test requires a valid $SCRATCH_DEV > xfs/082 [not run] this test requires a valid $SCRATCH_DEV > xfs/083 [not run] this test requires a valid $SCRATCH_DEV > xfs/084 60s > xfs/085 [not run] this test requires a valid $SCRATCH_DEV > xfs/086 [not run] this test requires a valid $SCRATCH_DEV > xfs/087 [not run] this test requires a valid $SCRATCH_DEV > xfs/088 [not run] this test requires a valid $SCRATCH_DEV > xfs/089 [not run] this test requires a valid $SCRATCH_DEV > xfs/090 [not run] External volumes not in use, skipped this test > xfs/091 [not run] this test requires a valid $SCRATCH_DEV > xfs/092 [not run] this test requires a valid $SCRATCH_DEV > xfs/093 [not run] this test requires a valid $SCRATCH_DEV > xfs/094 [not run] External volumes not in use, skipped this test > xfs/095 [not run] not suitable for this OS: Linux > xfs/096 [not run] this test requires a valid $SCRATCH_DEV > xfs/097 [not run] this test requires a valid $SCRATCH_DEV > xfs/098 [not run] this test requires a valid $SCRATCH_DEV > xfs/099 [not run] this test requires a valid $SCRATCH_DEV > xfs/100 [not run] this test requires a valid $SCRATCH_DEV > xfs/101 [not run] this test requires a valid $SCRATCH_DEV > xfs/102 [not run] this test requires a valid $SCRATCH_DEV > xfs/103 [not run] this test requires a valid $SCRATCH_DEV > xfs/104 [not run] this test requires a valid $SCRATCH_DEV > xfs/105 [not run] this test requires a valid $SCRATCH_DEV > xfs/106 [not run] this test requires a valid $SCRATCH_DEV > xfs/107 [not run] this test requires a valid $SCRATCH_DEV > xfs/108 [not run] this test requires a valid $SCRATCH_DEV > xfs/109 [not run] this test requires a valid $SCRATCH_DEV > xfs/110 [not run] this test requires a valid $SCRATCH_DEV > xfs/111 [not run] this test requires a valid $SCRATCH_DEV > xfs/112 [not run] this test requires a valid $SCRATCH_DEV > xfs/113 [not run] this test requires a valid $SCRATCH_DEV > xfs/114 [not run] not suitable for this OS: Linux > xfs/115 [not run] not suitable for this OS: Linux > xfs/116 [not run] this test requires a valid $SCRATCH_DEV > xfs/117 [not run] this test requires a valid $SCRATCH_DEV > xfs/118 [not run] this test requires a valid $SCRATCH_DEV > xfs/119 [not run] this test requires a valid $SCRATCH_DEV > xfs/120 [not run] this test requires a valid $SCRATCH_DEV > xfs/121 [not run] this test requires a valid $SCRATCH_DEV > xfs/122 [not run] indent utility required, skipped this test > xfs/123 [not run] this test requires a valid $SCRATCH_DEV > xfs/124 [not run] this test requires a valid $SCRATCH_DEV > xfs/125 [not run] this test requires a valid $SCRATCH_DEV > xfs/126 [not run] this test requires a valid $SCRATCH_DEV > xfs/127 [not run] this test requires a valid $SCRATCH_DEV > xfs/128 [not run] this test requires a valid $SCRATCH_DEV > xfs/129 [not run] this test requires a valid $SCRATCH_DEV > xfs/130 [not run] this test requires a valid $SCRATCH_DEV > xfs/131 [not run] External volumes not in use, skipped this test > xfs/132 [not run] xfs_io reflink support is missing > xfs/133 [not run] this test requires a valid $SCRATCH_DEV > xfs/134 [not run] this test requires a valid $SCRATCH_DEV > xfs/135 [not run] this test requires a valid $SCRATCH_DEV > xfs/136 [not run] this test requires a valid $SCRATCH_DEV > xfs/137 [not run] this test requires a valid $SCRATCH_DEV > xfs/138 [not run] this test requires a valid $SCRATCH_DEV > xfs/139 [not run] this test requires a valid $SCRATCH_DEV > xfs/140 [not run] this test requires a valid $SCRATCH_DEV > xfs/141 [not run] no kernel support for XFS sysfs attributes > xfs/142 [not run] this test requires a valid $SCRATCH_DEV > xfs/143 [not run] this test requires a valid $SCRATCH_DEV > xfs/144 [not run] this test requires a valid $SCRATCH_DEV > xfs/145 [not run] this test requires a valid $SCRATCH_DEV > xfs/146 [not run] this test requires a valid $SCRATCH_DEV > xfs/147 [not run] this test requires a valid $SCRATCH_DEV > xfs/148 [not run] parallel repair binary xfs_prepair64 is not installed > xfs/149 [not run] parallel repair binary xfs_prepair is not installed > xfs/150 [not run] this test requires a valid $SCRATCH_DEV > xfs/151 [not run] this test requires a valid $SCRATCH_DEV > xfs/152 [not run] this test requires a valid $SCRATCH_DEV > xfs/153 [not run] this test requires a valid $SCRATCH_DEV > xfs/154 [not run] this test requires a valid $SCRATCH_DEV > xfs/155 [not run] this test requires a valid $SCRATCH_DEV > xfs/156 [not run] this test requires a valid $SCRATCH_DEV > xfs/157 [not run] this test requires a valid $SCRATCH_DEV > xfs/158 [not run] this test requires a valid $SCRATCH_DEV > xfs/159 [not run] this test requires a valid $SCRATCH_DEV > xfs/160 [not run] this test requires a valid $SCRATCH_DEV > xfs/161 [not run] this test requires a valid $SCRATCH_DEV > xfs/162 [not run] this test requires a valid $SCRATCH_DEV > xfs/163 [not run] this test requires a valid $SCRATCH_DEV > xfs/164 0s > xfs/165 0s > xfs/166 [not run] this test requires a valid $SCRATCH_DEV > xfs/167 [not run] this test requires a valid $SCRATCH_DEV > xfs/168 [not run] this test requires a valid $SCRATCH_DEV > xfs/169 [not run] this test requires a valid $SCRATCH_DEV > xfs/170 [not run] this test requires a valid $SCRATCH_DEV > xfs/171 [not run] this test requires a valid $SCRATCH_DEV > xfs/172 [not run] this test requires a valid $SCRATCH_DEV > xfs/173 [not run] this test requires a valid $SCRATCH_DEV > xfs/174 [not run] this test requires a valid $SCRATCH_DEV > xfs/175 [not run] this test requires a valid $SCRATCH_DEV > xfs/176 [not run] this test requires a valid $SCRATCH_DEV > xfs/177 [not run] this test requires a valid $SCRATCH_DEV > xfs/178 [not run] this test requires a valid $SCRATCH_DEV > xfs/179 [not run] this test requires a valid $SCRATCH_DEV > xfs/180 [not run] this test requires a valid $SCRATCH_DEV > xfs/181 [not run] this test requires a valid $SCRATCH_DEV > xfs/182 [not run] this test requires a valid $SCRATCH_DEV > xfs/183 [not run] this test requires a valid $SCRATCH_DEV > xfs/184 [not run] this test requires a valid $SCRATCH_DEV > xfs/185 [not run] this test requires a valid $SCRATCH_DEV > xfs/186 [not run] this test requires a valid $SCRATCH_DEV > xfs/187 [not run] this test requires a valid $SCRATCH_DEV > xfs/188 [not run] this test requires a valid $SCRATCH_DEV > xfs/189 [not run] this test requires a valid $SCRATCH_DEV > xfs/190 [not run] this test requires a valid $SCRATCH_DEV > xfs/191 [not run] this test requires a valid $SCRATCH_DEV > xfs/192 [not run] this test requires a valid $SCRATCH_DEV > xfs/193 [not run] this test requires a valid $SCRATCH_DEV > xfs/194 [not run] sector size(4096) too large for platform page size(409= 6) > xfs/195 [not run] xfsdump utility required, skipped this test > xfs/196 [not run] this test requires a valid $SCRATCH_DEV > xfs/197 [not run] This test is only valid on 32 bit machines > xfs/198 [not run] this test requires a valid $SCRATCH_DEV > xfs/199 [not run] this test requires a valid $SCRATCH_DEV > xfs/200 [not run] this test requires a valid $SCRATCH_DEV > xfs/201 [not run] this test requires a valid $SCRATCH_DEV > xfs/202 [not run] this test requires a valid $SCRATCH_DEV > xfs/203 [not run] this test requires a valid $SCRATCH_DEV > xfs/204 [not run] this test requires a valid $SCRATCH_DEV > xfs/205 [not run] this test requires a valid $SCRATCH_DEV > xfs/206 4s > xfs/207 [not run] this test requires a valid $SCRATCH_DEV > xfs/208 [not run] this test requires a valid $SCRATCH_DEV > xfs/209 [not run] this test requires a valid $SCRATCH_DEV > xfs/210 [not run] this test requires a valid $SCRATCH_DEV > xfs/211 [not run] this test requires a valid $SCRATCH_DEV > xfs/212 [not run] this test requires a valid $SCRATCH_DEV > xfs/213 [not run] this test requires a valid $SCRATCH_DEV > xfs/214 [not run] this test requires a valid $SCRATCH_DEV > xfs/215 [not run] this test requires a valid $SCRATCH_DEV > xfs/216 [not run] this test requires a valid $SCRATCH_DEV > xfs/217 [not run] this test requires a valid $SCRATCH_DEV > xfs/218 [not run] this test requires a valid $SCRATCH_DEV > xfs/219 [not run] this test requires a valid $SCRATCH_DEV > xfs/220 [not run] this test requires a valid $SCRATCH_DEV > xfs/221 [not run] this test requires a valid $SCRATCH_DEV > xfs/222 0s > xfs/223 [not run] this test requires a valid $SCRATCH_DEV > xfs/224 [not run] this test requires a valid $SCRATCH_DEV > xfs/225 [not run] this test requires a valid $SCRATCH_DEV > xfs/226 [not run] this test requires a valid $SCRATCH_DEV > xfs/227 [not run] this test requires a valid $SCRATCH_DEV > xfs/228 [not run] this test requires a valid $SCRATCH_DEV > xfs/229 75s > xfs/230 [not run] this test requires a valid $SCRATCH_DEV > xfs/231 [not run] this test requires a valid $SCRATCH_DEV > xfs/232 [not run] this test requires a valid $SCRATCH_DEV > xfs/233 [not run] this test requires a valid $SCRATCH_DEV > xfs/234 [not run] this test requires a valid $SCRATCH_DEV > xfs/235 [not run] this test requires a valid $SCRATCH_DEV > xfs/236 [not run] this test requires a valid $SCRATCH_DEV > xfs/237 [not run] this test requires a valid $SCRATCH_DEV > xfs/238 [not run] this test requires a valid $SCRATCH_DEV > xfs/239 [not run] this test requires a valid $SCRATCH_DEV > xfs/240 [not run] this test requires a valid $SCRATCH_DEV > xfs/241 [not run] this test requires a valid $SCRATCH_DEV > xfs/242 1s > xfs/243 [not run] this test requires a valid $SCRATCH_DEV > xfs/244 [not run] this test requires a valid $SCRATCH_DEV > xfs/245 [not run] this test requires a valid $SCRATCH_DEV > xfs/246 [not run] xfs_io bmap doesn't support -c > xfs/247 [not run] this test requires a valid $SCRATCH_DEV > xfs/248 [not run] this test requires a valid $SCRATCH_DEV > xfs/249 [not run] this test requires a valid $SCRATCH_DEV > xfs/250 [failed, exit status 1] - output mismatch (see /home/ubuntu/os/x= fstests/results//xfs/250.out.bad) > --- tests/xfs/250.out 2016-03-02 07:03:04.119808319 +0000 > +++ /home/ubuntu/os/xfstests/results//xfs/250.out.bad 2016-03-0= 2 08:03:49.847808319 +0000 > @@ -11,4 +11,4 @@ > *** preallocate large file > *** unmount loop filesystem > *** check loop filesystem > -*** done > +_check_xfs_filesystem: filesystem on /mnt/xfs_mnt/250.fs is inconsis= tent (r) (see /home/ubuntu/os/xfstests/results//xfs/250.full) > ... > (Run 'diff -u tests/xfs/250.out /home/ubuntu/os/xfstests/results//xfs= /250.out.bad' to see the entire diff) > xfs/251 [not run] this test requires a valid $SCRATCH_DEV > xfs/252 2s > xfs/253 [not run] this test requires a valid $SCRATCH_DEV > xfs/254 [not run] this test requires a valid $SCRATCH_DEV > xfs/255 [not run] this test requires a valid $SCRATCH_DEV > xfs/256 [not run] this test requires a valid $SCRATCH_DEV > xfs/257 [not run] this test requires a valid $SCRATCH_DEV > xfs/258 [not run] this test requires a valid $SCRATCH_DEV > xfs/259 2s > xfs/260 [not run] this test requires a valid $SCRATCH_DEV > xfs/261 [not run] this test requires a valid $SCRATCH_DEV > xfs/262 [not run] this test requires a valid $SCRATCH_DEV > xfs/266 [not run] xfsdump not found > xfs/267 [not run] xfsdump not found > xfs/268 [not run] xfsdump not found > xfs/278 [not run] this test requires a valid $SCRATCH_DEV > xfs/279 7s > xfs/281 [not run] xfsdump not found > xfs/282 [not run] xfsdump not found > xfs/283 [not run] xfsdump not found > xfs/287 [not run] xfsdump not found > xfs/290 1s > xfs/291 [not run] this test requires a valid $SCRATCH_DEV > xfs/292 - output mismatch (see /home/ubuntu/os/xfstests/results//xfs/292= =2Eout.bad) > --- tests/xfs/292.out 2016-03-02 07:03:04.123808319 +0000 > +++ /home/ubuntu/os/xfstests/results//xfs/292.out.bad 2016-03-0= 2 08:04:19.487808319 +0000 > @@ -5,5 +5,5 @@ > agsize=3D16777216 > mkfs.xfs with cmdline geometry > ddev=3DFILENAME > -agcount=3D16 > -agsize=3D4194304 > +agcount=3D4 > +agsize=3D16777216 > ... > (Run 'diff -u tests/xfs/292.out /home/ubuntu/os/xfstests/results//xfs= /292.out.bad' to see the entire diff) > xfs/293 - output mismatch (see /home/ubuntu/os/xfstests/results//xfs/293= =2Eout.bad) > --- tests/xfs/293.out 2016-03-02 07:03:04.123808319 +0000 > +++ /home/ubuntu/os/xfstests/results//xfs/293.out.bad 2016-03-0= 2 08:04:22.499808319 +0000 > @@ -1,2 +1,8 @@ > QA output created by 293 > Silence is golden > +chproj not documented in the xfs_io manpage > +fiemap not documented in the xfs_io manpage > +fpunch not documented in the xfs_io manpage > +lsproj not documented in the xfs_io manpage > +setfl not documented in the xfs_io manpage > ... > (Run 'diff -u tests/xfs/293.out /home/ubuntu/os/xfstests/results//xfs= /293.out.bad' to see the entire diff) > xfs/295 [not run] this test requires a valid $SCRATCH_DEV > xfs/296 [not run] xfsdump not found > xfs/297 [not run] this test requires a valid $SCRATCH_DEV > xfs/298 [not run] this test requires a valid $SCRATCH_DEV > xfs/299 [not run] this test requires a valid $SCRATCH_DEV > xfs/300 [not run] this test requires a valid $SCRATCH_DEV > xfs/301 [not run] xfsdump not found > xfs/302 [not run] xfsdump not found > xfs/303 1s > xfs/304 [not run] this test requires a valid $SCRATCH_DEV > xfs/305 [not run] this test requires a valid $SCRATCH_DEV > Ran: generic/001 generic/002 generic/005 generic/006 generic/007 generic/= 010 generic/011 generic/013 generic/014 generic/020 generic/028 generic/035= generic/036 generic/070 generic/074 generic/075 generic/080 generic/086 ge= neric/087 generic/088 generic/089 generic/091 generic/092 generic/112 gener= ic/113 generic/114 generic/123 generic/125 generic/126 generic/127 generic/= 131 generic/133 generic/184 generic/192 generic/193 generic/198 generic/207= generic/208 generic/209 generic/210 generic/211 generic/212 generic/213 ge= neric/214 generic/215 generic/221 generic/228 generic/236 generic/239 gener= ic/240 generic/241 generic/245 generic/246 generic/247 generic/248 generic/= 249 generic/255 generic/257 generic/258 generic/263 generic/285 generic/286= generic/308 generic/309 generic/310 generic/313 generic/315 generic/316 ge= neric/323 shared/298 xfs/003 xfs/008 xfs/012 xfs/020 xfs/048 xfs/074 xfs/07= 8 xfs/080 xfs/084 xfs/164 xfs/165 xfs/206 xfs/222 xfs/229 xfs/242 xfs/250 x= fs/252 xfs/259 xfs/279 xfs/290 xfs/292 xfs/293 xfs/303 > Not run: generic/003 generic/004 generic/008 generic/009 generic/012 gene= ric/015 generic/016 generic/017 generic/018 generic/019 generic/021 generic= /022 generic/023 generic/024 generic/025 generic/026 generic/027 generic/02= 9 generic/030 generic/031 generic/032 generic/033 generic/034 generic/037 g= eneric/038 generic/039 generic/040 generic/041 generic/042 generic/043 gene= ric/044 generic/045 generic/046 generic/047 generic/048 generic/049 generic= /050 generic/051 generic/052 generic/053 generic/054 generic/055 generic/05= 6 generic/057 generic/058 generic/059 generic/060 generic/061 generic/062 g= eneric/063 generic/064 generic/065 generic/066 generic/067 generic/068 gene= ric/069 generic/071 generic/072 generic/073 generic/076 generic/077 generic= /078 generic/079 generic/081 generic/082 generic/083 generic/084 generic/08= 5 generic/090 generic/093 generic/094 generic/095 generic/096 generic/097 g= eneric/098 generic/099 generic/100 generic/101 generic/102 generic/103 gene= ric/104 generic/105 generic/106 generic/107 generic/108 generic/109 generic= /110 generic/111 generic/115 generic/116 generic/117 generic/118 generic/11= 9 generic/120 generic/121 generic/122 generic/124 generic/128 generic/129 g= eneric/130 generic/132 generic/134 generic/135 generic/136 generic/137 gene= ric/138 generic/139 generic/140 generic/141 generic/142 generic/143 generic= /144 generic/145 generic/146 generic/147 generic/148 generic/149 generic/15= 0 generic/151 generic/152 generic/153 generic/154 generic/155 generic/156 g= eneric/157 generic/158 generic/159 generic/160 generic/161 generic/162 gene= ric/163 generic/164 generic/165 generic/166 generic/167 generic/168 generic= /169 generic/170 generic/171 generic/172 generic/173 generic/174 generic/17= 5 generic/176 generic/177 generic/178 generic/179 generic/180 generic/181 g= eneric/182 generic/183 generic/185 generic/186 generic/187 generic/188 gene= ric/189 generic/190 generic/191 generic/194 generic/195 generic/196 generic= /197 generic/199 generic/200 generic/201 generic/202 generic/203 generic/20= 4 generic/205 generic/206 generic/216 generic/217 generic/218 generic/219 g= eneric/220 generic/222 generic/223 generic/224 generic/225 generic/226 gene= ric/227 generic/229 generic/230 generic/231 generic/232 generic/233 generic= /234 generic/235 generic/237 generic/238 generic/242 generic/243 generic/24= 4 generic/250 generic/251 generic/252 generic/253 generic/254 generic/256 g= eneric/259 generic/260 generic/261 generic/262 generic/264 generic/265 gene= ric/266 generic/267 generic/268 generic/269 generic/270 generic/271 generic= /272 generic/273 generic/274 generic/275 generic/276 generic/277 generic/27= 8 generic/279 generic/280 generic/281 generic/282 generic/283 generic/284 g= eneric/287 generic/288 generic/289 generic/290 generic/291 generic/292 gene= ric/293 generic/294 generic/295 generic/296 generic/297 generic/298 generic= /299 generic/300 generic/301 generic/302 generic/303 generic/304 generic/30= 5 generic/306 generic/307 generic/311 generic/312 generic/314 generic/317 g= eneric/318 generic/319 generic/320 generic/321 generic/322 generic/324 gene= ric/325 generic/326 generic/327 generic/328 generic/329 generic/330 generic= /331 generic/332 generic/333 generic/334 generic/335 generic/336 generic/33= 7 shared/001 shared/002 shared/003 shared/006 shared/032 shared/051 shared/= 272 shared/289 xfs/001 xfs/002 xfs/004 xfs/005 xfs/006 xfs/007 xfs/009 xfs/= 010 xfs/011 xfs/013 xfs/014 xfs/015 xfs/016 xfs/017 xfs/018 xfs/019 xfs/021= xfs/022 xfs/023 xfs/024 xfs/025 xfs/026 xfs/027 xfs/028 xfs/029 xfs/030 xf= s/031 xfs/032 xfs/033 xfs/034 xfs/035 xfs/036 xfs/037 xfs/038 xfs/039 xfs/0= 40 xfs/041 xfs/042 xfs/043 xfs/044 xfs/045 xfs/046 xfs/047 xfs/049 xfs/050 = xfs/051 xfs/052 xfs/053 xfs/054 xfs/055 xfs/056 xfs/057 xfs/058 xfs/059 xfs= /060 xfs/061 xfs/062 xfs/063 xfs/064 xfs/065 xfs/066 xfs/067 xfs/068 xfs/06= 9 xfs/070 xfs/071 xfs/072 xfs/073 xfs/075 xfs/076 xfs/077 xfs/079 xfs/081 x= fs/082 xfs/083 xfs/085 xfs/086 xfs/087 xfs/088 xfs/089 xfs/090 xfs/091 xfs/= 092 xfs/093 xfs/094 xfs/095 xfs/096 xfs/097 xfs/098 xfs/099 xfs/100 xfs/101= xfs/102 xfs/103 xfs/104 xfs/105 xfs/106 xfs/107 xfs/108 xfs/109 xfs/110 xf= s/111 xfs/112 xfs/113 xfs/114 xfs/115 xfs/116 xfs/117 xfs/118 xfs/119 xfs/1= 20 xfs/121 xfs/122 xfs/123 xfs/124 xfs/125 xfs/126 xfs/127 xfs/128 xfs/129 = xfs/130 xfs/131 xfs/132 xfs/133 xfs/134 xfs/135 xfs/136 xfs/137 xfs/138 xfs= /139 xfs/140 xfs/141 xfs/142 xfs/143 xfs/144 xfs/145 xfs/146 xfs/147 xfs/14= 8 xfs/149 xfs/150 xfs/151 xfs/152 xfs/153 xfs/154 xfs/155 xfs/156 xfs/157 x= fs/158 xfs/159 xfs/160 xfs/161 xfs/162 xfs/163 xfs/166 xfs/167 xfs/168 xfs/= 169 xfs/170 xfs/171 xfs/172 xfs/173 xfs/174 xfs/175 xfs/176 xfs/177 xfs/178= xfs/179 xfs/180 xfs/181 xfs/182 xfs/183 xfs/184 xfs/185 xfs/186 xfs/187 xf= s/188 xfs/189 xfs/190 xfs/191 xfs/192 xfs/193 xfs/194 xfs/195 xfs/196 xfs/1= 97 xfs/198 xfs/199 xfs/200 xfs/201 xfs/202 xfs/203 xfs/204 xfs/205 xfs/207 = xfs/208 xfs/209 xfs/210 xfs/211 xfs/212 xfs/213 xfs/214 xfs/215 xfs/216 xfs= /217 xfs/218 xfs/219 xfs/220 xfs/221 xfs/223 xfs/224 xfs/225 xfs/226 xfs/22= 7 xfs/228 xfs/230 xfs/231 xfs/232 xfs/233 xfs/234 xfs/235 xfs/236 xfs/237 x= fs/238 xfs/239 xfs/240 xfs/241 xfs/243 xfs/244 xfs/245 xfs/246 xfs/247 xfs/= 248 xfs/249 xfs/251 xfs/253 xfs/254 xfs/255 xfs/256 xfs/257 xfs/258 xfs/260= xfs/261 xfs/262 xfs/266 xfs/267 xfs/268 xfs/278 xfs/281 xfs/282 xfs/283 xf= s/287 xfs/291 xfs/295 xfs/296 xfs/297 xfs/298 xfs/299 xfs/300 xfs/301 xfs/3= 02 xfs/304 xfs/305 > Failures: generic/247 generic/263 xfs/020 xfs/074 xfs/250 xfs/292 xfs/293 > Failed 7 of 93 tests >=20 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Wed Mar 2 15:09:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 47CA27CB4 for ; Wed, 2 Mar 2016 15:09:45 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id AF575AC004 for ; Wed, 2 Mar 2016 13:09:41 -0800 (PST) X-ASG-Debug-ID: 1456952973-04cbb00b7215d1a0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 9utqgYJBDboGGGAp for ; Wed, 02 Mar 2016 13:09:34 -0800 (PST) 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: A2ADCgA3VddWPFEqLHleKAECgw+BP4Zln18BAQEGi3aFSIQIhgkEAgKBR00BAQEBAQEHAQEBAUFAhEIBAQQ6HCMQCAMOCgklDwUlAwcaE4ggu3gBAQgCHhiFMoUCiG8FlxKNWYFVjSuOTIRaKC6IYAEBAQ Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl2.internode.on.net with ESMTP; 03 Mar 2016 07:39:32 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1abE1T-00088I-QV; Thu, 03 Mar 2016 08:09:31 +1100 Date: Thu, 3 Mar 2016 08:09:31 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [ANNOUNCE] xfs; for-next branch updated to 31bb236 Message-ID: <20160302210931.GN30721@dastard> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfs; for-next branch updated to 31bb236 References: <20160301231511.GM30721@dastard> <20160302094559.GB18130@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160302094559.GB18130@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1456952974 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27516 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Mar 02, 2016 at 01:45:59AM -0800, Christoph Hellwig wrote: > > Mateusz Guzik (1): > > [2e83b79] xfs: fix two memory leaks in xfs_attr_list.c error paths > > This didn't seem to address the comment about using a goto for > error handling? I looked at it, and there isn't a case for a goto. The allocated memory is in a variable local to the if branch where the leak was found. Using a jump-based error handling stack means making all those variables global, and then having to make the freeing of it conditional. Simply didn't seem worth it to me. Cheers, Dave. -- Dave Chinner david@fromorbit.com From darrick.wong@oracle.com Wed Mar 2 15:21:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9C1687CB2 for ; Wed, 2 Mar 2016 15:21:36 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6C9288F8033 for ; Wed, 2 Mar 2016 13:21:33 -0800 (PST) X-ASG-Debug-ID: 1456953691-04cb6c583111dfc0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id RlRMG7xbEcNlEZwt (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 02 Mar 2016 13:21:31 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u22LL3FL000753 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 2 Mar 2016 21:21:04 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u22LL3Rs030749 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Wed, 2 Mar 2016 21:21:03 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u22LL3ur018420; Wed, 2 Mar 2016 21:21:03 GMT Received: from localhost (/10.145.179.157) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 02 Mar 2016 13:21:02 -0800 Date: Wed, 2 Mar 2016 13:21:01 -0800 From: "Darrick J. Wong" To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: block allocations for the refcount btree Message-ID: <20160302212101.GF27973@birch.djwong.org> X-ASG-Orig-Subj: Re: block allocations for the refcount btree References: <20160210095010.GC23904@birch.djwong.org> <20160210190738.GA13051@infradead.org> <20160210214058.GN14668@dastard> <20160212191046.GA28421@infradead.org> <20160301181809.GC27973@birch.djwong.org> <20160301204013.GA23128@infradead.org> <20160302052411.GB1902@birch.djwong.org> <20160302095932.GA9141@infradead.org> <20160302164102.GA20109@birch.djwong.org> <20160302165704.GA31438@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160302165704.GA31438@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1456953691 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27516 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Wed, Mar 02, 2016 at 08:57:04AM -0800, Christoph Hellwig wrote: > On Wed, Mar 02, 2016 at 08:41:02AM -0800, Darrick J. Wong wrote: > > Hmm, I'll give it a spin when I get in later. Can you send me xfs_info > > output so I can try to construct an equivalent reproducer setup? > > root@vm:~/xfstests# xfs_info /mnt/scratch/ > meta-data=/dev/vdc isize=512 agcount=320, agsize=8192 blks > = sectsz=512 attr=2, projid32bit=1 > = crc=1 finobt=1 spinodes=0 rmapbt=0 > = reflink=1 > data = bsize=4096 blocks=2621440, imaxpct=25 > = sunit=0 swidth=0 blks > naming =version 2 bsize=4096 ascii-ci=0 ftype=1 > log =internal bsize=4096 blocks=2560, version=2 > = sectsz=512 sunit=0 blks, lazy-count=1 > realtime =none extsz=4096 blocks=0, rtextents=0 Ok. I think the problem is that making changes to the refcount btree eats up our entire reservation in certain cases. Can you try the following bandaid? This should give us enough room to handle splitting the btree at both ends of a range that we're refcount-changing. Come to think of it, this might not be enough -- if we want to change the refcount of an n-block extent, can we end up changing n/i_refc_mnr[0] blocks? I suspect yes, but I'll think about that some more. diff --git a/fs/xfs/libxfs/xfs_trans_resv.c b/fs/xfs/libxfs/xfs_trans_resv.c index cfd8a3c..54c5c22 100644 --- a/fs/xfs/libxfs/xfs_trans_resv.c +++ b/fs/xfs/libxfs/xfs_trans_resv.c @@ -86,7 +86,7 @@ xfs_allocfree_log_count( if (xfs_sb_version_hasrmapbt(&mp->m_sb)) blocks += num_ops * (2 * mp->m_rmap_maxlevels - 1); if (xfs_sb_version_hasreflink(&mp->m_sb)) - blocks += num_ops * (2 * mp->m_refc_maxlevels - 1); + blocks += 2 * num_ops * (2 * mp->m_refc_maxlevels - 1); return blocks; } From darrick.wong@oracle.com Wed Mar 2 17:56:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 355797CB4 for ; Wed, 2 Mar 2016 17:56:47 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0889F304032 for ; Wed, 2 Mar 2016 15:56:43 -0800 (PST) X-ASG-Debug-ID: 1456963002-04cbb00b6f161c20001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id av42BZslGOa10zOn (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 02 Mar 2016 15:56:42 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u22Nuekh013488 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 2 Mar 2016 23:56:41 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u22NueCF022531 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 2 Mar 2016 23:56:40 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u22NueER001155; Wed, 2 Mar 2016 23:56:40 GMT Received: from localhost (/10.145.179.157) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 02 Mar 2016 15:56:40 -0800 Date: Wed, 2 Mar 2016 15:56:38 -0800 From: "Darrick J. Wong" To: david@fromorbit.com Cc: linux-fsdevel@vger.kernel.org, linux-api@vger.kernel.org, xfs@oss.sgi.com Subject: [PATCH] vfs: support FS_XFLAG_REFLINK and FS_XFLAG_COWEXTSIZE Message-ID: <20160302235638.GA27962@birch.djwong.org> X-ASG-Orig-Subj: [PATCH] vfs: support FS_XFLAG_REFLINK and FS_XFLAG_COWEXTSIZE MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1456963002 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27522 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Introduce XFLAGs for the new XFS reflink inode flag and the CoW extent size hint, and actually plumb the CoW extent size hint into the fsxattr structure. Signed-off-by: Darrick J. Wong --- include/uapi/linux/fs.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/include/uapi/linux/fs.h b/include/uapi/linux/fs.h index 41e0433..c5975ef 100644 --- a/include/uapi/linux/fs.h +++ b/include/uapi/linux/fs.h @@ -157,7 +157,8 @@ struct fsxattr { __u32 fsx_extsize; /* extsize field value (get/set)*/ __u32 fsx_nextents; /* nextents field value (get) */ __u32 fsx_projid; /* project identifier (get/set) */ - unsigned char fsx_pad[12]; + __u32 fsx_cowextsize; /* CoW extsize field value (get/set)*/ + unsigned char fsx_pad[8]; }; /* @@ -178,6 +179,8 @@ struct fsxattr { #define FS_XFLAG_NODEFRAG 0x00002000 /* do not defragment */ #define FS_XFLAG_FILESTREAM 0x00004000 /* use filestream allocator */ #define FS_XFLAG_DAX 0x00008000 /* use DAX for IO */ +#define FS_XFLAG_REFLINK 0x00010000 /* file is reflinked */ +#define FS_XFLAG_COWEXTSIZE 0x00020000 /* CoW extent size allocator hint */ #define FS_XFLAG_HASATTR 0x80000000 /* no DIFLAG for this */ /* the read-only stuff doesn't really belong here, but any other place is From eguan@redhat.com Wed Mar 2 22:38:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 694207CB7 for ; Wed, 2 Mar 2016 22:38:57 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3BFC48F8033 for ; Wed, 2 Mar 2016 20:38:57 -0800 (PST) X-ASG-Debug-ID: 1456979932-04cbb00b7216ecc0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id AkKkGbagiAyIvIU5 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 02 Mar 2016 20:38:53 -0800 (PST) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 798C76436E; Thu, 3 Mar 2016 04:38:52 +0000 (UTC) Received: from localhost (dhcp-13-211.nay.redhat.com [10.66.13.211]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u234cnsA008884; Wed, 2 Mar 2016 23:38:51 -0500 From: Eryu Guan To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com, Eryu Guan Subject: [PATCH] xfs/137: require scratch to be CRC enabled XFS Date: Thu, 3 Mar 2016 12:38:19 +0800 X-ASG-Orig-Subj: [PATCH] xfs/137: require scratch to be CRC enabled XFS Message-Id: <1456979899-7221-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 03 Mar 2016 04:38:52 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1456979933 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This test is only valid for CRC enabled XFS, and test fails with MKFS_OPTIONS="-m crc=0" being set (no mount failure detected). Fix it by adding _require_scratch_xfs_crc, which ensures scratch device has CRC support and enabled. Signed-off-by: Eryu Guan --- tests/xfs/137 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/xfs/137 b/tests/xfs/137 index f162264..dec9fc9 100755 --- a/tests/xfs/137 +++ b/tests/xfs/137 @@ -52,7 +52,7 @@ rm -f $seqres.full _supported_fs xfs _supported_os Linux _require_scratch -_require_xfs_crc +_require_scratch_xfs_crc _require_xfs_db_command "logformat" _scratch_mkfs >> $seqres.full 2>&1 || _fail "mkfs failed" -- 2.5.0 From BATV+bd850ac3cc5c68a1cbb8+4575+infradead.org+hch@bombadil.srs.infradead.org Thu Mar 3 01:38:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0A7587CB7 for ; Thu, 3 Mar 2016 01:38:00 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D093E304039 for ; Wed, 2 Mar 2016 23:37:59 -0800 (PST) X-ASG-Debug-ID: 1456990677-04cb6c5832143b00001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id DWxvcGqYDocyKDGS (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 02 Mar 2016 23:37:57 -0800 (PST) X-Barracuda-Envelope-From: BATV+bd850ac3cc5c68a1cbb8+4575+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 1abNpb-0005Dp-IK; Thu, 03 Mar 2016 07:37:55 +0000 Date: Wed, 2 Mar 2016 23:37:55 -0800 From: Christoph Hellwig To: Eryu Guan Cc: fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs/137: require scratch to be CRC enabled XFS Message-ID: <20160303073755.GA19477@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs/137: require scratch to be CRC enabled XFS References: <1456979899-7221-1-git-send-email-eguan@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1456979899-7221-1-git-send-email-eguan@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1456990677 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/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=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27531 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From alex@zadarastorage.com Thu Mar 3 03:18:47 2016 Return-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,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 2A4F67CB7 for ; Thu, 3 Mar 2016 03:18:47 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 80078AC004 for ; Thu, 3 Mar 2016 01:18:43 -0800 (PST) X-ASG-Debug-ID: 1456996719-04cb6c5833147d90001-NocioJ Received: from mail-wm0-f41.google.com (mail-wm0-f41.google.com [74.125.82.41]) by cuda.sgi.com with ESMTP id 3IhG59wwR52Lyqpe (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 03 Mar 2016 01:18:40 -0800 (PST) X-Barracuda-Envelope-From: alex@zadarastorage.com X-Barracuda-Apparent-Source-IP: 74.125.82.41 Received: by mail-wm0-f41.google.com with SMTP id p65so22892641wmp.0 for ; Thu, 03 Mar 2016 01:18:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zadarastorage-com.20150623.gappssmtp.com; s=20150623; h=message-id:from:to:cc:references:in-reply-to:subject:date :mime-version:content-transfer-encoding:importance; bh=YukpogveIXpHh5FfMOjVGBn1iuc9oypjFTdCGWrbO2E=; b=IvKjDe97xbpqfglZUm24tDNDwG4Q0F6vUXbniBVY8KcXDHs9pIe5gyNbCCYklwPxwY k82/Af/XSMCXvQ7fr7A8NvGwpVKDh6Oy+VQT5vVg06wlYATl3BrLYRtvJkYxm09YtzcD 2U82HEeIkTfmI/tQHJDh4eHfpz7N8QzM73CEFYAeumDInmuhr3e+PRjGXoOV3ac0zSu2 3uYvo53VCORzZNz9VTFmtJqiCsTDoFp5Rv1XscuLke/d5BnqRwaTZ74gvyqbIXMwTuzW /MmtlCWLbVn+r1OBFn1FURGujQjvIZds9mzHSzR4Sm2LAJzq+8rnxoAQ+gcTeJSYkE2Q GPCg== 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-transfer-encoding:importance; bh=YukpogveIXpHh5FfMOjVGBn1iuc9oypjFTdCGWrbO2E=; b=beoRhsGfx3Ij6xZPBSJmg4M5tZ+LOXV9amDQEPBM2nPFSQ+HccsDAS6aVYAVZ93wAz y3Jt6D4HT/QyFufWgadFKZBiooR/nf+RKIUBl+weCJEQDXisRcNl9c7wP2UUM9AcOeHj Hhknc8BqzMyWPESf7CRjbrYFbBJ31aygL3UORTmfS5ilurNIZMaruwESuH4HRL64UObM SDRuxy7ujTGAiqO0qojw1iZ3Vw2DnWBJ5FNaUcHZZn1EuDTXHbYWMr/1wGOG1oxHgkvW 5tD40m1KFKwXJIt8Mel8cnP1luWEA3F8fN5Pf2leLU6/rRGhuANToCTRdZTh+QCiDqA8 H0LA== X-Gm-Message-State: AD7BkJJO8EnjapfW8Bk8NJXYnKuRFGlftM+QW+nbtIDd+Vucph5evA1RHItJV0vPBz4YpA== X-Received: by 10.28.170.137 with SMTP id t131mr2347244wme.32.1456996718915; Thu, 03 Mar 2016 01:18:38 -0800 (PST) Received: from alyakaslap (bzq-169-168-31-234.red.bezeqint.net. [31.168.169.234]) by smtp.gmail.com with ESMTPSA id i1sm39528523wjs.45.2016.03.03.01.18.36 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 03 Mar 2016 01:18:38 -0800 (PST) Message-ID: From: "Alex Lyakas" To: "Dave Chinner" Cc: "Christoph Hellwig" , "Danny Shavit" , "Shyam Kaushik" , "Yair Hershko" , References: <3685DFAD20214109878873CF81232704@alyakaslap> <20160222212019.GI25832@dastard> <20160222235628.GK25832@dastard> <20160223225926.GN25832@dastard> <20160229211628.GK29057@dastard> <20160301072011.GF30721@dastard> In-Reply-To: <20160301072011.GF30721@dastard> Subject: Re: xfs resize: primary superblock is not updated immediately Date: Thu, 3 Mar 2016 11:18:43 +0200 X-ASG-Orig-Subj: Re: xfs resize: primary superblock is not updated immediately 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-wm0-f41.google.com[74.125.82.41] X-Barracuda-Start-Time: 1456996719 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, STOX_REPLY_TYPE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27533 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 -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hello Dave, Thanks for the patch! I confirm that it fixes the scenario. At [1] please find all the blknos that are being used during the log recovery (if that's of any interest). Thanks, Alex. [1] Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.068647] XFS (dm-0): Mounting V4 Filesystem Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.099664] XFS (dm-0): Starting recovery (logdev: internal) Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.102539] _xfs_buf_find: blkno=0 eofs=200704 >m_sb.sb_dblocks=25088 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.102549] _xfs_buf_find: blkno=0 eofs=200704 >m_sb.sb_dblocks=25088 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.102580] _xfs_buf_find: blkno=0 eofs=200704 >m_sb.sb_dblocks=25088 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.126231] _xfs_buf_find: blkno=1 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.126238] _xfs_buf_find: blkno=1 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.126753] _xfs_buf_find: blkno=2 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.126762] _xfs_buf_find: blkno=2 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.127234] _xfs_buf_find: blkno=50177 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.127244] _xfs_buf_find: blkno=50177 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.127751] _xfs_buf_find: blkno=50178 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.127760] _xfs_buf_find: blkno=50178 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.128224] _xfs_buf_find: blkno=100353 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.128234] _xfs_buf_find: blkno=100353 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.128638] _xfs_buf_find: blkno=100354 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.128646] _xfs_buf_find: blkno=100354 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.129054] _xfs_buf_find: blkno=150529 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.129062] _xfs_buf_find: blkno=150529 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.129449] _xfs_buf_find: blkno=150530 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.129459] _xfs_buf_find: blkno=150530 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.129739] _xfs_buf_find: blkno=200705 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.129746] _xfs_buf_find: blkno=200705 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.130051] _xfs_buf_find: blkno=200706 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.130061] _xfs_buf_find: blkno=200706 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.130317] _xfs_buf_find: blkno=64 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.130324] _xfs_buf_find: blkno=64 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.130548] _xfs_buf_find: blkno=64 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.130560] _xfs_buf_find: blkno=64 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.130571] _xfs_buf_find: blkno=2 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.130581] _xfs_buf_find: blkno=50178 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.130591] _xfs_buf_find: blkno=100354 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.130610] _xfs_buf_find: blkno=150530 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.130613] _xfs_buf_find: blkno=200706 eofs=204800 >m_sb.sb_dblocks=25600 Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.130618] XFS (dm-0): Ending recovery (logdev: internal) -----Original Message----- From: Dave Chinner Sent: 01 March, 2016 9:20 AM To: Alex Lyakas Cc: Christoph Hellwig ; Danny Shavit ; Shyam Kaushik ; Yair Hershko ; xfs@oss.sgi.com Subject: Re: xfs resize: primary superblock is not updated immediately On Tue, Mar 01, 2016 at 08:16:28AM +1100, Dave Chinner wrote: > On Mon, Feb 29, 2016 at 11:47:54AM +0200, Alex Lyakas wrote: > Which means it's through the first phase of log recovery and it's > not failing in log recovery. i.e. we are now running > xfs_initialize_perag_data() after log recovery. So, as I said a > couple of posts back up this thread: > > | If log recovery succeeds, then yes, I can see that there is a > | problem here because the per-ag tree is not reinitialised after > | the superblock is re-read. That's a pretty easy fix, though (3-4 > | lines of code in xlog_do_recover() to detect a change in > | filesystem block count and call xfs_initialize_perag() again.. Patch below. -- Dave Chinner david@fromorbit.com xfs: reinitialise per-AG structures if geometry changes during recovery From: Dave Chinner If a crash occurs immediately after a filesystem grow operation, the updated superblock geometry is found only in the log. After we recover the log, the superblock is reread and re-initialised and so has the new geometry in memory. If the new geometry has more AGs than prior to the grow operation, then the new AGs will not have in-memory xfs_perag structurea associated with them. This will result in an oops when the first metadata buffer from a new AG is looked up in the buffer cache, as the block lies within the new geometry but then fails to find a perag structure on lookup. This is easily fixed by simply re-initialising the perag structure after re-reading the superblock at the conclusion of the first pahse of log recovery. This, however, does not fix the case of log recovery requiring access to metadata in the newly grown space. Fortunately for us, because the in-core superblock has not been updated, this will result in detection of access beyond the end of the filesystem and so recovery will fail at that point. If this proves to be a problem, then we can address it separately to the current reported issue. Reported-by: Alex Lyakas Signed-off-by: Dave Chinner --- fs/xfs/xfs_log_recover.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 1dc0e14..520471b 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -4898,6 +4898,7 @@ xlog_do_recover( xfs_daddr_t head_blk, xfs_daddr_t tail_blk) { + struct xfs_mount *mp = log->l_mp; int error; xfs_buf_t *bp; xfs_sb_t *sbp; @@ -4912,7 +4913,7 @@ xlog_do_recover( /* * If IO errors happened during recovery, bail out. */ - if (XFS_FORCED_SHUTDOWN(log->l_mp)) { + if (XFS_FORCED_SHUTDOWN(mp)) { return -EIO; } @@ -4925,13 +4926,13 @@ xlog_do_recover( * or iunlinks they will have some entries in the AIL; so we look at * the AIL to determine how to set the tail_lsn. */ - xlog_assign_tail_lsn(log->l_mp); + xlog_assign_tail_lsn(mp); /* * Now that we've finished replaying all buffer and inode * updates, re-read in the superblock and reverify it. */ - bp = xfs_getsb(log->l_mp, 0); + bp = xfs_getsb(mp, 0); bp->b_flags &= ~(XBF_DONE | XBF_ASYNC); ASSERT(!(bp->b_flags & XBF_WRITE)); bp->b_flags |= XBF_READ; @@ -4939,7 +4940,7 @@ xlog_do_recover( error = xfs_buf_submit_wait(bp); if (error) { - if (!XFS_FORCED_SHUTDOWN(log->l_mp)) { + if (!XFS_FORCED_SHUTDOWN(mp)) { xfs_buf_ioerror_alert(bp, __func__); ASSERT(0); } @@ -4948,14 +4949,17 @@ xlog_do_recover( } /* Convert superblock from on-disk format */ - sbp = &log->l_mp->m_sb; + sbp = &mp->m_sb; xfs_sb_from_disk(sbp, XFS_BUF_TO_SBP(bp)); - ASSERT(sbp->sb_magicnum == XFS_SB_MAGIC); - ASSERT(xfs_sb_good_version(sbp)); - xfs_reinit_percpu_counters(log->l_mp); - xfs_buf_relse(bp); + /* re-initialise in-core superblock and geometry structures */ + xfs_reinit_percpu_counters(mp); + error = xfs_initialize_perag(mp, sbp->sb_agcount, &mp->m_maxagi); + if (error) { + xfs_warn(mp, "Failed post-recovery per-ag init: %d", error); + return error; + } xlog_recover_check_summary(log); From prvs=687039973d=noreply@imf.org Thu Mar 3 03:38:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.5 required=5.0 tests=ADVANCE_FEE_3_NEW,HK_LOTTO, MIME_QP_LONG_LINE 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 C93B67CB7 for ; Thu, 3 Mar 2016 03:38:45 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6D9C88F8035 for ; Thu, 3 Mar 2016 01:38:45 -0800 (PST) X-ASG-Debug-ID: 1456997922-04bdf002ee16a5b0001-NocioJ Received: from mail.atgtire.com (mail.atgtire.com [220.226.188.89]) by cuda.sgi.com with ESMTP id hjjJTiKLUzjywLN8 for ; Thu, 03 Mar 2016 01:38:42 -0800 (PST) X-Barracuda-Envelope-From: prvs=687039973d=noreply@imf.org X-Barracuda-Apparent-Source-IP: 220.226.188.89 X-AuditID: c0a8654c-f792c6d000004aac-55-56d80621fe49 Received: from atgrelay (Unknown_Domain [192.168.101.105]) by mail.atgtire.com (mail.atgtire.com) with SMTP id 64.0D.19116.12608D65; Thu, 3 Mar 2016 15:08:41 +0530 (IST) Received: from atgtire.com (atgtire.com [192.168.101.111]) by atgrelay (postfix-outgoing) with ESMTP id 67A013B0001 for ; Thu, 3 Mar 2016 15:08:41 +0530 (IST) Received: (qmail 21884 invoked by uid 65205); 3 Mar 2016 09:37:29 -0000 Received: from 193.189.117.37 by atgrelay (envelope-from , uid 0) with qmail-scanner-1.25 (clamscan: 0.60. Clear:RC:0(193.189.117.37):. Processed in 0.098789 secs); 03 Mar 2016 09:37:29 -0000 Received: from unknown (HELO [193.189.117.37]) (root@atgtire.com@[193.189.117.37])(envelope-sender )by 0 (qmail-ldap-1.03) with SMTPfor ; 3 Mar 2016 09:37:29 -0000 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 content-transfer-encoding: quoted-printable Content-Description: Mail message body Subject: Re: [The Fact About] To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [The Fact About] From: "IMF Agent" Date: Thu, 03 Mar 2016 01:37:25 -0800 Reply-To: "IMF Agent" X-Qmail-Scanner-Message-ID: <145699784968621806@atgrelay> Message-Id: <20160303093841.67A013B0001@atgrelay> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmpkleLIzCtJLcpLzFFi42I5sCI1U1eR7UaYwc//6haL+m4xOjB6rL6w lTGAMaqB0SYpsaQsODM9T9/OJjEvL78ksSRVISW1ONlWySWzODknMTM3tUhJITPFVslYSaEg JzE5NTc1r8RWKbGgIDUvRcmOSwED2ACVZeYppOYl56dk5qXbKnkG++taWJha6hoq2WlpaSmE Owb5efq5KwDZCftZMjpvb2Ur+CpYsefgTvYGxv98XYycHBICJhK9Z/rYIWwxiQv31rN1MXJx CAmsYZRY3vGECcLZwihx7NY9VpAqIQF3iZ/9r1ghEhcZJeZtuMMO4RxllDi77j5jFyMHB7OA psT6XfogDbwCghInZz5hAbGZBbQlli18zQxRoibxtasEJCwsICfReWMPWKeIgLDEjU5TkDCb gLLEno6VYMexCKhKHFwzlwXiBG2Jhj9bGSGOtpToe7eAHWKTocSGW/PYJjAKzUK4YRaSG2Yh uWEWwg0LGFlWMQoUFyTm6iWWpJdkFqXqJefnbmKERKvPDsY/tzQOMQpwMCrx8N5ouB4mxJpY VlyZe4hRgoNZSYR3M/ONMCHelMTKqtSi/Pii0pzU4kOMTkAnT2SWEk3OByaSvJJ4QxNTM2Mj Y1NTS0NzUylumLCxgYGSOC/H4bNhQgLpwESRnZpakFoEM4SJgxNkCZeUSDEwFaQWJZaWZMSD klJ8MTAtSTUwdgtePqv33sZQ4uXyllcvXZ5+nSOWf1LufopqY/5FRkOV7PW/JCI5NrqsXdbB Ooe9UvZ4k3d1QMLeU/cfhrHo8MycuEjkm8titwZ9vnlByZqeW96uE/b8YBwZHbhE+7lv/1yF X9lvk9NFHh+Izthqd2NDsoCk4LPCSMXFqjlfTbuvuF063jZJiaU4I9FQi7moOBEAnPqh4hQD AAA= X-Barracuda-Connect: mail.atgtire.com[220.226.188.89] X-Barracuda-Start-Time: 1456997922 X-Barracuda-URL: https://192.48.157.11:443/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.27533 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 Hello, I am IMF agent attach to the World Bank office . I am very much aware of yo= ur ordeal towards actualizing the release of your long delayed payment. Not very long after the World Bank completed the acquisition process of all= pending payments, I discovered that my boss connived with some top official= s of the World Bank to divert funds already approved to settle inheritances,= email lottery winners and international contractors. The World Bank has already given approval for the payment of your fund whil= e they deliberately delay your payment and continue to demand fees from diff= erent departments mostly from Africa, the UK , Europe and Asia all in an att= empt to enrich their private accounts. I wonder why you haven=E2=80=99t noti= ce all these while. I am Christian and my religion does not permit such. Your fund was authorized to be paid to you through the World Bank accredite= d affiliate with a Key Tested Reference/Claim Code Number, which was suppose= d to have been issued to you before now. Upon your response to this message, I shall guide you and provide you with= all you needed to contact the World Bank affiliate who will facilitate the= release of your payment. Truly Yours, Kelly David IMF/World Bank Agent =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D This e-mail and any attachments may contain information which is confidentia= l, privileged, proprietary or otherwise protected by law. The information is= solely intended for the named addressee (or a person responsible for delive= ring it to the addressee). If you are not the intended recipient of this me= ssage, you are not authorized to read, print, retain, copy or disseminate th= is message or any part of it. If you have received this e-mail in error, ple= ase notify the sender immediately by return e-mail and delete it from your c= omputer. =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D *** WARNING *** Recently there have been increasing incidents of fraudulent= emails, which appear to originate from familiar email addresses, requesting= payments to different bank accounts than the ones normally used or with unu= sual payment requests. Please be beware of such emails and always confirm wi= th your normal Alliance Tire Group contacts before acting on any such reques= ts. From ruthhamson1987@gmail.com Thu Mar 3 06:11:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.5 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,FREEMAIL_REPLYTO,FREEMAIL_REPLYTO_END_DIGIT,HTML_MESSAGE, LOTS_OF_MONEY 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 99ECB7CA0 for ; Thu, 3 Mar 2016 06:11:54 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 69B4930405F for ; Thu, 3 Mar 2016 04:11:51 -0800 (PST) X-ASG-Debug-ID: 1457007108-04cbb00b701818b0001-NocioJ Received: from nh603-vm0.bullet.mail.ssk.yahoo.co.jp (nh603-vm0.bullet.mail.ssk.yahoo.co.jp [182.22.90.41]) by cuda.sgi.com with ESMTP id btD9didulx5TOlBO for ; Thu, 03 Mar 2016 04:11:49 -0800 (PST) X-Barracuda-Envelope-From: ruthhamson1987@gmail.com X-Barracuda-Apparent-Source-IP: 182.22.90.41 Received: from [182.22.66.106] by nh603.bullet.mail.ssk.yahoo.co.jp with NNFMP; 03 Mar 2016 12:11:48 -0000 Received: from [182.22.91.130] by t604.bullet.mail.ssk.yahoo.co.jp with NNFMP; 03 Mar 2016 12:11:48 -0000 Received: from [127.0.0.1] by omp603.mail.ssk.yahoo.co.jp with NNFMP; 03 Mar 2016 12:11:48 -0000 X-Yahoo-Newman-Property: ymail-3 X-Yahoo-Newman-Id: 668511.68723.bm@omp603.mail.ssk.yahoo.co.jp Received: (qmail 27299 invoked by uid 60001); 3 Mar 2016 12:11:47 -0000 DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=yj20050223; d=yahoo.co.jp; h=Message-ID:X-YMail-OSG:Received:X-RocketYMMF:X-Mailer:X-YMail-JAS:Sender:Date:From:Reply-To:Subject:To:MIME-Version:Content-Type; b=IYUIlxunNLGQYEaRPnruDcRyYU5hlF0oFRFOVBBg4ubRjXwqmGpfAU3yl0ZifE9PjDS8OSjb3W5JMt2oFltDUJus07gdvvZftYYos43Lr0caiIaEh8FzVGf5Z9Asu+9T ; Message-ID: <821663.26205.qm@web101312.mail.kks.yahoo.co.jp> X-YMail-OSG: JxkZSisVM1m2ptbA_TKBGOAErevkYifCdy7HccmacDVqtWFbSsvVekLyYB7HYZTN7Y7jvsKezR7Ccgqolsq3wGInqszz78c4HbhA2LSQB6TcrbufDLkbi.EDWpmOqrBjlKFB1vE1EqQ57H_D0pcDm0OeYCQLTTYM1QWKGVxeUM.k0AQ0RlqZrr1rAL0Z2tVSwNWqVr05IabYrEIfcMUtEyZF3zC5.tvIIFY4KSprtmS3UPYXuU2.lXQZ6ARjhh2Tfpd0Uk6e6X5TZtiPn7vMyRQc8mIrg11OhsdpQzf1A3Cl0LYH7.sOl_xrJjG6F5QIp.p.Qjh2EEb6PqM0Kio25l.wVJMAN3Nf0JbVFwVD1OLWu_u5bAO_2Wa_8wiSyUttF7an1dAcNKEemMW_I81uMf65hh0LQcxgVN5.tNHEJL.V0BnN_MrTI0Lm0LMJBOu9qJ3mb3vL103Vg3N0znKFMmeg7b9B8auCjOCWjMfdpC8S_JlG.awGlN4bZmVnCKVeNRoyH4HwEK1u0k9EJBswIyPcA1TFklKJ7VS4PVBKOd46zOdCzvTmDH_OXFmIk2axubpUC4_tYis- Received: from [46.165.246.177] by web101312.mail.kks.yahoo.co.jp via HTTP; Thu, 03 Mar 2016 21:11:47 JST X-RocketYMMF: ruth_hamson1987 X-Mailer: YahooMailWebService/0.8.111_68 X-YMail-JAS: UPOWmVMVM1ktrXbxYqQO40wU5DcvAMKPj_C_pfvGAWIBwo91NxlPtq16P_fWwiWX9hp26_nG6NO_Ywjve6YwpwAgpi5mxBSpA9tjMzalj3E7mSeVCjlmRTdrEYDMb4l0Jkjz Sender: ruth_hamson1987@yahoo.co.jp Date: Thu, 3 Mar 2016 21:11:47 +0900 (JST) From: Mrs Ruth Hamson Reply-To: Mrs Ruth Hamson Subject: Greeting from mrs Ruth Hamson/i shall give you more details To: undisclosed recipients: ; X-ASG-Orig-Subj: Greeting from mrs Ruth Hamson/i shall give you more details MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="884511494-637436699-1457007107=:26205" X-Barracuda-Connect: nh603-vm0.bullet.mail.ssk.yahoo.co.jp[182.22.90.41] X-Barracuda-Start-Time: 1457007109 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27536 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --884511494-637436699-1457007107=:26205 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable i want to donate (USD 2.5M) =A0to less previlege through you=0A --884511494-637436699-1457007107=:26205 Content-Type: text/html; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable
i w= ant to donate (USD 2.5M)  to less previlege through you
--884511494-637436699-1457007107=:26205-- From bfoster@redhat.com Thu Mar 3 06:40:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3AB4C7CA3 for ; Thu, 3 Mar 2016 06:40:02 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id F0E53304032 for ; Thu, 3 Mar 2016 04:40:01 -0800 (PST) X-ASG-Debug-ID: 1457008799-04cbb00b72182990001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id rocw6xeeeB6mmt6i (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 03 Mar 2016 04:40:00 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id D8A3985541; Thu, 3 Mar 2016 12:39:59 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-186.bos.redhat.com [10.18.41.186]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u23CdxIU022246; Thu, 3 Mar 2016 07:39:59 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 97DFC125E61; Thu, 3 Mar 2016 07:39:58 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Cc: Jan Beulich Subject: [PATCH 1/4] xfs: separate log head record discovery from verification Date: Thu, 3 Mar 2016 07:39:55 -0500 X-ASG-Orig-Subj: [PATCH 1/4] xfs: separate log head record discovery from verification Message-Id: <1457008798-58734-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1457008798-58734-1-git-send-email-bfoster@redhat.com> References: <1457008798-58734-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: 1457008800 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The code that locates the log record at the head of the log is buried in the log head verification function. This is fine when torn write verification occurs unconditionally, but this behavior is problematic for filesystems that might be moved across systems with different architectures. In preparation for separating examination of the log head for unmount records from torn write detection, lift the record location logic out of the log verification function and into the caller. This patch does not change behavior. Signed-off-by: Brian Foster --- fs/xfs/xfs_log_recover.c | 42 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 1dc0e14..6813e28 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1108,27 +1108,10 @@ xlog_verify_head( bool tmp_wrapped; /* - * Search backwards through the log looking for the log record header - * block. This wraps all the way back around to the head so something is - * seriously wrong if we can't find it. - */ - found = xlog_rseek_logrec_hdr(log, *head_blk, *head_blk, 1, bp, rhead_blk, - rhead, wrapped); - if (found < 0) - return found; - if (!found) { - xfs_warn(log->l_mp, "%s: couldn't find sync record", __func__); - return -EIO; - } - - *tail_blk = BLOCK_LSN(be64_to_cpu((*rhead)->h_tail_lsn)); - - /* - * Now that we have a tail block, check the head of the log for torn - * writes. Search again until we hit the tail or the maximum number of - * log record I/Os that could have been in flight at one time. Use a - * temporary buffer so we don't trash the rhead/bp pointer from the - * call above. + * Check the head of the log for torn writes. Search backwards from the + * head until we hit the tail or the maximum number of log record I/Os + * that could have been in flight at one time. Use a temporary buffer so + * we don't trash the rhead/bp pointers from the caller. */ tmp_bp = xlog_get_bp(log, 1); if (!tmp_bp) @@ -1253,6 +1236,7 @@ xlog_find_tail( */ if ((error = xlog_find_head(log, head_blk))) return error; + ASSERT(*head_blk < INT_MAX); bp = xlog_get_bp(log, 1); if (!bp) @@ -1270,12 +1254,26 @@ xlog_find_tail( } /* + * Search backwards through the log looking for the log record header + * block. This wraps all the way back around to the head so something is + * seriously wrong if we can't find it. + */ + error = xlog_rseek_logrec_hdr(log, *head_blk, *head_blk, 1, bp, + &rhead_blk, &rhead, &wrapped); + if (error < 0) + return error; + if (!error) { + xfs_warn(log->l_mp, "%s: couldn't find sync record", __func__); + return -EIO; + } + *tail_blk = BLOCK_LSN(be64_to_cpu(rhead->h_tail_lsn)); + + /* * Trim the head block back to skip over torn records. We can have * multiple log I/Os in flight at any time, so we assume CRC failures * back through the previous several records are torn writes and skip * them. */ - ASSERT(*head_blk < INT_MAX); error = xlog_verify_head(log, head_blk, tail_blk, bp, &rhead_blk, &rhead, &wrapped); if (error) -- 2.4.3 From bfoster@redhat.com Thu Mar 3 06:40:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 375CF7CA4 for ; Thu, 3 Mar 2016 06:40:03 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8F32CAC003 for ; Thu, 3 Mar 2016 04:40:02 -0800 (PST) X-ASG-Debug-ID: 1457008800-04cbb00b71182990001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id nICBSMjGRbjI0mbs (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 03 Mar 2016 04:40:00 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id E2425486A3; Thu, 3 Mar 2016 12:39:59 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-186.bos.redhat.com [10.18.41.186]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u23Cdx2N026694; Thu, 3 Mar 2016 07:39:59 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 7B47B12262B; Thu, 3 Mar 2016 07:39:58 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Cc: Jan Beulich Subject: [PATCH 2/4] xfs: refactor unmount record detection into helper Date: Thu, 3 Mar 2016 07:39:56 -0500 X-ASG-Orig-Subj: [PATCH 2/4] xfs: refactor unmount record detection into helper Message-Id: <1457008798-58734-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1457008798-58734-1-git-send-email-bfoster@redhat.com> References: <1457008798-58734-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: 1457008800 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Once the mount sequence has identified the head and tail blocks of the physical log, the record at the head of the log is located and examined for an unmount record to determine if the log is clean. This currently occurs after torn write verification of the head region of the log. This must ultimately be separated from torn write verification and may need to be called again if the log head is walked back due to a torn write (to determine whether the new head record is an unmount record). Separate this logic into a new helper function. This patch does not change behavior. Signed-off-by: Brian Foster --- fs/xfs/xfs_log_recover.c | 153 ++++++++++++++++++++++++++++------------------- 1 file changed, 93 insertions(+), 60 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 6813e28..8a240d1 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1198,6 +1198,84 @@ xlog_verify_head( } /* + * Check whether the head of the log points to an unmount record. In other + * words, determine whether the log is clean. If so, update the in-core state + * appropriately. + */ +static int +xlog_check_unmount_rec( + struct xlog *log, + xfs_daddr_t *head_blk, + xfs_daddr_t *tail_blk, + struct xlog_rec_header *rhead, + xfs_daddr_t rhead_blk, + struct xfs_buf *bp, + bool *clean) +{ + struct xlog_op_header *op_head; + xfs_daddr_t umount_data_blk; + xfs_daddr_t after_umount_blk; + int hblks; + int error; + char *offset; + + *clean = false; + + /* + * Look for unmount record. If we find it, then we know there was a + * clean unmount. Since 'i' could be the last block in the physical + * log, we convert to a log block before comparing to the head_blk. + * + * Save the current tail lsn to use to pass to xlog_clear_stale_blocks() + * below. We won't want to clear the unmount record if there is one, so + * we pass the lsn of the unmount record rather than the block after it. + */ + if (xfs_sb_version_haslogv2(&log->l_mp->m_sb)) { + int h_size = be32_to_cpu(rhead->h_size); + int h_version = be32_to_cpu(rhead->h_version); + + if ((h_version & XLOG_VERSION_2) && + (h_size > XLOG_HEADER_CYCLE_SIZE)) { + hblks = h_size / XLOG_HEADER_CYCLE_SIZE; + if (h_size % XLOG_HEADER_CYCLE_SIZE) + hblks++; + } else { + hblks = 1; + } + } else { + hblks = 1; + } + after_umount_blk = rhead_blk + hblks + BTOBB(be32_to_cpu(rhead->h_len)); + after_umount_blk = do_mod(after_umount_blk, log->l_logBBsize); + if (*head_blk == after_umount_blk && + be32_to_cpu(rhead->h_num_logops) == 1) { + umount_data_blk = rhead_blk + hblks; + umount_data_blk = do_mod(umount_data_blk, log->l_logBBsize); + error = xlog_bread(log, umount_data_blk, 1, bp, &offset); + if (error) + return error; + + op_head = (struct xlog_op_header *)offset; + if (op_head->oh_flags & XLOG_UNMOUNT_TRANS) { + /* + * Set tail and last sync so that newly written log + * records will point recovery to after the current + * unmount record. + */ + xlog_assign_atomic_lsn(&log->l_tail_lsn, + log->l_curr_cycle, after_umount_blk); + xlog_assign_atomic_lsn(&log->l_last_sync_lsn, + log->l_curr_cycle, after_umount_blk); + *tail_blk = after_umount_blk; + + *clean = true; + } + } + + return 0; +} + +/* * Find the sync block number or the tail of the log. * * This will be the block number of the last record to have its @@ -1220,16 +1298,13 @@ xlog_find_tail( xfs_daddr_t *tail_blk) { xlog_rec_header_t *rhead; - xlog_op_header_t *op_head; char *offset = NULL; xfs_buf_t *bp; int error; - xfs_daddr_t umount_data_blk; - xfs_daddr_t after_umount_blk; xfs_daddr_t rhead_blk; xfs_lsn_t tail_lsn; - int hblks; bool wrapped = false; + bool clean = false; /* * Find previous log record @@ -1300,66 +1375,24 @@ xlog_find_tail( BBTOB(log->l_curr_block)); xlog_assign_grant_head(&log->l_write_head.grant, log->l_curr_cycle, BBTOB(log->l_curr_block)); + tail_lsn = atomic64_read(&log->l_tail_lsn); /* - * Look for unmount record. If we find it, then we know there - * was a clean unmount. Since 'i' could be the last block in - * the physical log, we convert to a log block before comparing - * to the head_blk. - * - * Save the current tail lsn to use to pass to - * xlog_clear_stale_blocks() below. We won't want to clear the - * unmount record if there is one, so we pass the lsn of the - * unmount record rather than the block after it. + * Look for an unmount record at the head of the log. This sets the log + * state to determine whether recovery is necessary. */ - if (xfs_sb_version_haslogv2(&log->l_mp->m_sb)) { - int h_size = be32_to_cpu(rhead->h_size); - int h_version = be32_to_cpu(rhead->h_version); - - if ((h_version & XLOG_VERSION_2) && - (h_size > XLOG_HEADER_CYCLE_SIZE)) { - hblks = h_size / XLOG_HEADER_CYCLE_SIZE; - if (h_size % XLOG_HEADER_CYCLE_SIZE) - hblks++; - } else { - hblks = 1; - } - } else { - hblks = 1; - } - after_umount_blk = rhead_blk + hblks + BTOBB(be32_to_cpu(rhead->h_len)); - after_umount_blk = do_mod(after_umount_blk, log->l_logBBsize); - tail_lsn = atomic64_read(&log->l_tail_lsn); - if (*head_blk == after_umount_blk && - be32_to_cpu(rhead->h_num_logops) == 1) { - umount_data_blk = rhead_blk + hblks; - umount_data_blk = do_mod(umount_data_blk, log->l_logBBsize); - error = xlog_bread(log, umount_data_blk, 1, bp, &offset); - if (error) - goto done; - - op_head = (xlog_op_header_t *)offset; - if (op_head->oh_flags & XLOG_UNMOUNT_TRANS) { - /* - * Set tail and last sync so that newly written - * log records will point recovery to after the - * current unmount record. - */ - xlog_assign_atomic_lsn(&log->l_tail_lsn, - log->l_curr_cycle, after_umount_blk); - xlog_assign_atomic_lsn(&log->l_last_sync_lsn, - log->l_curr_cycle, after_umount_blk); - *tail_blk = after_umount_blk; + error = xlog_check_unmount_rec(log, head_blk, tail_blk, rhead, + rhead_blk, bp, &clean); + if (error) + goto done; - /* - * Note that the unmount was clean. If the unmount - * was not clean, we need to know this to rebuild the - * superblock counters from the perag headers if we - * have a filesystem using non-persistent counters. - */ - log->l_mp->m_flags |= XFS_MOUNT_WAS_CLEAN; - } - } + /* + * Note that the unmount was clean. If the unmount was not clean, we + * need to know this to rebuild the superblock counters from the perag + * headers if we have a filesystem using non-persistent counters. + */ + if (clean) + log->l_mp->m_flags |= XFS_MOUNT_WAS_CLEAN; /* * Make sure that there are no blocks in front of the head -- 2.4.3 From bfoster@redhat.com Thu Mar 3 06:40:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9AEED7CAE for ; Thu, 3 Mar 2016 06:40:05 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 65D9A8F8040 for ; Thu, 3 Mar 2016 04:40:02 -0800 (PST) X-ASG-Debug-ID: 1457008800-04cbb00b70182990001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id kjKQJbbB8BTXh08v (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 03 Mar 2016 04:40:00 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id EC56532E89D; Thu, 3 Mar 2016 12:39:59 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-186.bos.redhat.com [10.18.41.186]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u23CdxCN026696; Thu, 3 Mar 2016 07:39:59 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id A7C84125041; Thu, 3 Mar 2016 07:39:58 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Cc: Jan Beulich Subject: [PATCH 3/4] xfs: refactor in-core log state update to helper Date: Thu, 3 Mar 2016 07:39:57 -0500 X-ASG-Orig-Subj: [PATCH 3/4] xfs: refactor in-core log state update to helper Message-Id: <1457008798-58734-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1457008798-58734-1-git-send-email-bfoster@redhat.com> References: <1457008798-58734-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: 1457008800 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Once the record at the head of the log is identified and verified, the in-core log state is updated based on the record. This includes information such as the current head block and cycle, the start block of the last record written to the log, the tail lsn, etc. Once torn write detection is conditional, this logic will need to be reused. Factor the code to update the in-core log data structures into a new helper function. This patch does not change behavior. Signed-off-by: Brian Foster --- fs/xfs/xfs_log_recover.c | 52 ++++++++++++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 8a240d1..0ebc2b2 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1275,6 +1275,37 @@ xlog_check_unmount_rec( return 0; } +static void +xlog_set_state( + struct xlog *log, + xfs_daddr_t head_blk, + struct xlog_rec_header *rhead, + xfs_daddr_t rhead_blk, + bool bump_cycle) +{ + /* + * Reset log values according to the state of the log when we + * crashed. In the case where head_blk == 0, we bump curr_cycle + * one because the next write starts a new cycle rather than + * continuing the cycle of the last good log record. At this + * point we have guaranteed that all partial log records have been + * accounted for. Therefore, we know that the last good log record + * written was complete and ended exactly on the end boundary + * of the physical log. + */ + log->l_prev_block = rhead_blk; + log->l_curr_block = (int)head_blk; + log->l_curr_cycle = be32_to_cpu(rhead->h_cycle); + if (bump_cycle) + log->l_curr_cycle++; + atomic64_set(&log->l_tail_lsn, be64_to_cpu(rhead->h_tail_lsn)); + atomic64_set(&log->l_last_sync_lsn, be64_to_cpu(rhead->h_lsn)); + xlog_assign_grant_head(&log->l_reserve_head.grant, log->l_curr_cycle, + BBTOB(log->l_curr_block)); + xlog_assign_grant_head(&log->l_write_head.grant, log->l_curr_cycle, + BBTOB(log->l_curr_block)); +} + /* * Find the sync block number or the tail of the log. * @@ -1355,26 +1386,9 @@ xlog_find_tail( goto done; /* - * Reset log values according to the state of the log when we - * crashed. In the case where head_blk == 0, we bump curr_cycle - * one because the next write starts a new cycle rather than - * continuing the cycle of the last good log record. At this - * point we have guaranteed that all partial log records have been - * accounted for. Therefore, we know that the last good log record - * written was complete and ended exactly on the end boundary - * of the physical log. + * Set the log state based on the current head record. */ - log->l_prev_block = rhead_blk; - log->l_curr_block = (int)*head_blk; - log->l_curr_cycle = be32_to_cpu(rhead->h_cycle); - if (wrapped) - log->l_curr_cycle++; - atomic64_set(&log->l_tail_lsn, be64_to_cpu(rhead->h_tail_lsn)); - atomic64_set(&log->l_last_sync_lsn, be64_to_cpu(rhead->h_lsn)); - xlog_assign_grant_head(&log->l_reserve_head.grant, log->l_curr_cycle, - BBTOB(log->l_curr_block)); - xlog_assign_grant_head(&log->l_write_head.grant, log->l_curr_cycle, - BBTOB(log->l_curr_block)); + xlog_set_state(log, *head_blk, rhead, rhead_blk, wrapped); tail_lsn = atomic64_read(&log->l_tail_lsn); /* -- 2.4.3 From bfoster@redhat.com Thu Mar 3 06:40:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9C7427CAF for ; Thu, 3 Mar 2016 06:40:05 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 036A4AC003 for ; Thu, 3 Mar 2016 04:40:01 -0800 (PST) X-ASG-Debug-ID: 1457008800-04cbb00b6f182990001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id nSdcUcuLIy511HkH (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 03 Mar 2016 04:40:00 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id EB87F486B3; Thu, 3 Mar 2016 12:39:59 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-186.bos.redhat.com [10.18.41.186]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u23Cdxao022248; Thu, 3 Mar 2016 07:39:59 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id B392D125E62; Thu, 3 Mar 2016 07:39:58 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Cc: Jan Beulich Subject: [PATCH 4/4] xfs: only run torn log write detection on dirty logs Date: Thu, 3 Mar 2016 07:39:58 -0500 X-ASG-Orig-Subj: [PATCH 4/4] xfs: only run torn log write detection on dirty logs Message-Id: <1457008798-58734-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1457008798-58734-1-git-send-email-bfoster@redhat.com> References: <1457008798-58734-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: 1457008800 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 XFS uses CRC verification over a sub-range of the head of the log to detect and handle torn writes. This torn log write detection currently runs unconditionally at mount time, regardless of whether the log is dirty or clean. This is problematic in cases where a filesystem might end up being moved across different, incompatible (i.e., opposite byte-endianness) architectures. The problem lies in the fact that log data is not necessarily written in an architecture independent format. For example, certain bits of data are written in native endian format. Further, the size of certain log data structures differs (i.e., struct xlog_rec_header) depending on the word size of the cpu. This leads to false positive crc verification errors and ultimately failed mounts when a cleanly unmounted filesystem is mounted on a system with an incompatible architecture from data that was written near the head of the log. Update the log head/tail discovery code to run torn write detection only when the log is not clean. This means something other than an unmount record resides at the head of the log and log recovery is imminent. It is a requirement to run log recovery on the same type of host that had written the content of the dirty log and therefore CRC failures are legitimate corruptions in that scenario. Reported-by: Jan Beulich Signed-off-by: Brian Foster --- fs/xfs/xfs_log_recover.c | 42 +++++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 0ebc2b2..9347bf1 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1375,17 +1375,6 @@ xlog_find_tail( *tail_blk = BLOCK_LSN(be64_to_cpu(rhead->h_tail_lsn)); /* - * Trim the head block back to skip over torn records. We can have - * multiple log I/Os in flight at any time, so we assume CRC failures - * back through the previous several records are torn writes and skip - * them. - */ - error = xlog_verify_head(log, head_blk, tail_blk, bp, &rhead_blk, - &rhead, &wrapped); - if (error) - goto done; - - /* * Set the log state based on the current head record. */ xlog_set_state(log, *head_blk, rhead, rhead_blk, wrapped); @@ -1401,6 +1390,37 @@ xlog_find_tail( goto done; /* + * Verify the log head if the log is not clean (e.g., we have anything + * but an unmount record at the head). This uses CRC verification to + * detect and trim torn writes. If discovered, CRC failures are + * considered torn writes and the log head is trimmed accordingly. + * + * Note that we can only run CRC verification when the log is dirty + * because there's no guarantee that the log data behind an unmount + * record is compatible with the current architecture. + */ + if (!clean) { + xfs_daddr_t orig_head = *head_blk; + + error = xlog_verify_head(log, head_blk, tail_blk, bp, + &rhead_blk, &rhead, &wrapped); + if (error) + goto done; + + /* update in-core state again if the head changed */ + if (*head_blk != orig_head) { + xlog_set_state(log, *head_blk, rhead, rhead_blk, + wrapped); + tail_lsn = atomic64_read(&log->l_tail_lsn); + error = xlog_check_unmount_rec(log, head_blk, tail_blk, + rhead, rhead_blk, bp, + &clean); + if (error) + goto done; + } + } + + /* * Note that the unmount was clean. If the unmount was not clean, we * need to know this to rebuild the superblock counters from the perag * headers if we have a filesystem using non-persistent counters. -- 2.4.3 From bfoster@redhat.com Thu Mar 3 06:40:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9D5EF7CB0 for ; Thu, 3 Mar 2016 06:40:05 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 11678AC004 for ; Thu, 3 Mar 2016 04:40:01 -0800 (PST) X-ASG-Debug-ID: 1457008800-04cb6c5832150570001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id x45AqlQVdrVZfwHC (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 03 Mar 2016 04:40:00 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id DAB0964D19; Thu, 3 Mar 2016 12:39:59 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-186.bos.redhat.com [10.18.41.186]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u23Cdx20026692; Thu, 3 Mar 2016 07:39:59 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 59569125E60; Thu, 3 Mar 2016 07:39:58 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Cc: Jan Beulich Subject: [PATCH 0/4] only run torn log write detection on dirty logs Date: Thu, 3 Mar 2016 07:39:54 -0500 X-ASG-Orig-Subj: [PATCH 0/4] only run torn log write detection on dirty logs Message-Id: <1457008798-58734-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 03 Mar 2016 12:39:59 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1457008800 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, This series addresses a problem reported by Jan Beulich here: http://oss.sgi.com/pipermail/xfs/2016-February/047302.html The problem in this particular x86 vs. x86-64 case is that the size of some of the log data structures change due to padding (e.g., struct xlog_rec_header). The more general problem is that torn log write detection unconditionally scans behind an unmount record on a cleanly mounted filesystem, and thus can trip over log data that might not have been written by the currently running system. The solution implemented here is to limit torn write detection to when the log is dirty. Patches 1-3 refactor the existing code into some new helpers such that torn write detection can be made conditional. Patch 4 reorders the head/tail discovery logic to check for an unmount record at the head of the log and run torn write detection only when one is not present. This survives xfstests on x86-64, x86 and ppc64 boxes. I've also run the log test group against a test volume that was preserved and passed back and forth across all three of the aforementioned arches without a problem. Thoughts, reviews, flames appreciated. Brian Brian Foster (4): xfs: separate log head record discovery from verification xfs: refactor unmount record detection into helper xfs: refactor in-core log state update to helper xfs: only run torn log write detection on dirty logs fs/xfs/xfs_log_recover.c | 271 +++++++++++++++++++++++++++++------------------ 1 file changed, 168 insertions(+), 103 deletions(-) -- 2.4.3 From BATV+bd850ac3cc5c68a1cbb8+4575+infradead.org+hch@bombadil.srs.infradead.org Thu Mar 3 08:06:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D4D987CA1 for ; Thu, 3 Mar 2016 08:06:02 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5FED0AC004 for ; Thu, 3 Mar 2016 06:05:59 -0800 (PST) X-ASG-Debug-ID: 1457013957-04bdf002eb175550001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id GPw3WS89wIdBG8cu (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 03 Mar 2016 06:05:57 -0800 (PST) X-Barracuda-Envelope-From: BATV+bd850ac3cc5c68a1cbb8+4575+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 1abTt6-0008OB-JW; Thu, 03 Mar 2016 14:05:56 +0000 Date: Thu, 3 Mar 2016 06:05:56 -0800 From: Christoph Hellwig To: "Darrick J. Wong" Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: block allocations for the refcount btree Message-ID: <20160303140556.GA26825@infradead.org> X-ASG-Orig-Subj: Re: block allocations for the refcount btree References: <20160210190738.GA13051@infradead.org> <20160210214058.GN14668@dastard> <20160212191046.GA28421@infradead.org> <20160301181809.GC27973@birch.djwong.org> <20160301204013.GA23128@infradead.org> <20160302052411.GB1902@birch.djwong.org> <20160302095932.GA9141@infradead.org> <20160302164102.GA20109@birch.djwong.org> <20160302165704.GA31438@infradead.org> <20160302212101.GF27973@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160302212101.GF27973@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457013957 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27538 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Mar 02, 2016 at 01:21:01PM -0800, Darrick J. Wong wrote: > Ok. I think the problem is that making changes to the refcount btree eats > up our entire reservation in certain cases. Can you try the following bandaid? > This should give us enough room to handle splitting the btree at both ends > of a range that we're refcount-changing. This seems to work in general. I ran into one log related hang when running -g auto on nfs, but it's not been reproducible so far. From bfoster@redhat.com Thu Mar 3 09:17:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BE56F7CA1 for ; Thu, 3 Mar 2016 09:17:18 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9254130404E for ; Thu, 3 Mar 2016 07:17:15 -0800 (PST) X-ASG-Debug-ID: 1457018232-04cbb00b70188520001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Ku1SLiOkhsglvSDJ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 03 Mar 2016 07:17:13 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id DBF1E64D0B; Thu, 3 Mar 2016 15:17:12 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-186.bos.redhat.com [10.18.41.186]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u23FHCla018823; Thu, 3 Mar 2016 10:17:12 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 590D4125041; Thu, 3 Mar 2016 10:17:11 -0500 (EST) Date: Thu, 3 Mar 2016 10:17:11 -0500 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com, Dave Chinner Subject: Re: [PATCH 1/3] xfs: build bios directly in xfs_add_to_ioend Message-ID: <20160303151710.GA57990@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/3] xfs: build bios directly in xfs_add_to_ioend References: <1456302011-18915-1-git-send-email-hch@lst.de> <1456302011-18915-2-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1456302011-18915-2-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 03 Mar 2016 15:17:12 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1457018233 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Feb 24, 2016 at 09:20:09AM +0100, Christoph Hellwig wrote: > From: Dave Chinner > > Currently adding a buffer to the ioend and then building a bio from > the buffer list are two separate operations. We don't build the bios > and submit them until the ioend is submitted, and this places a > fixed dependency on bufferhead chaining in the ioend. > > The first step to removing the bufferhead chaining in the ioend is > on the IO submission side. We can build the bio directly as we add > the buffers to the ioend chain, thereby removing the need for a > latter "buffer-to-bio" submission loop. This allows us to submit > bios on large ioends as soon as we cannot add more data to the bio. > > These bios then get captured by the active plug, and hence will be > dispatched as soon as either the plug overflows or we schedule away > from the writeback context. This will reduce submission latency for > large IOs, but will also allow more timely request queue based > writeback blocking when the device becomes congested. > > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > fs/xfs/xfs_aops.c | 117 ++++++++++++++++++++++++++---------------------------- > fs/xfs/xfs_aops.h | 1 + > 2 files changed, 57 insertions(+), 61 deletions(-) > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index 7a467b3..90e6e3a 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -274,6 +274,7 @@ xfs_alloc_ioend( > xfs_ioend_t *ioend; > > ioend = mempool_alloc(xfs_ioend_pool, GFP_NOFS); > + memset(ioend, 0, sizeof(*ioend)); > > /* > * Set the count to 1 initially, which will prevent an I/O > @@ -281,16 +282,9 @@ xfs_alloc_ioend( > * all the I/O from calling the completion routine too early. > */ > atomic_set(&ioend->io_remaining, 1); > - ioend->io_error = 0; > INIT_LIST_HEAD(&ioend->io_list); > ioend->io_type = type; > ioend->io_inode = inode; > - ioend->io_buffer_head = NULL; > - ioend->io_buffer_tail = NULL; > - ioend->io_offset = 0; > - ioend->io_size = 0; > - ioend->io_append_trans = NULL; > - > INIT_WORK(&ioend->io_work, xfs_end_io); > return ioend; > } > @@ -452,13 +446,18 @@ static inline int xfs_bio_add_buffer(struct bio *bio, struct buffer_head *bh) > } > > /* > - * Submit all of the bios for an ioend. We are only passed a single ioend at a > - * time; the caller is responsible for chaining prior to submission. > + * Submit the bio for an ioend. We are passed an ioend with a bio attached to > + * it, and we submit that bio. The ioend may be used for multiple bio > + * submissions, so we only want to allocate an append transaction for the ioend > + * once. In the case of multiple bio submission, each bio will take an IO > + * reference to the ioend to ensure that the ioend completion is only done once > + * all bios have been submitted and the ioend is really done. > * > * If @fail is non-zero, it means that we have a situation where some part of > * the submission process has failed after we have marked paged for writeback > - * and unlocked them. In this situation, we need to fail the ioend chain rather > - * than submit it to IO. This typically only happens on a filesystem shutdown. > + * and unlocked them. In this situation, we need to fail the bio and ioend > + * rather than submit it to IO. This typically only happens on a filesystem > + * shutdown. > */ > STATIC int > xfs_submit_ioend( > @@ -466,48 +465,34 @@ xfs_submit_ioend( > xfs_ioend_t *ioend, > int status) > { > - struct buffer_head *bh; > - struct bio *bio; > - sector_t lastblock = 0; > + if (!ioend->io_bio || status) > + goto error_finish; > > /* Reserve log space if we might write beyond the on-disk inode size. */ > - if (!status && > - ioend->io_type != XFS_IO_UNWRITTEN && xfs_ioend_is_append(ioend)) > + if (ioend->io_type != XFS_IO_UNWRITTEN && xfs_ioend_is_append(ioend) && > + !ioend->io_append_trans) { > status = xfs_setfilesize_trans_alloc(ioend); > - /* > - * If we are failing the IO now, just mark the ioend with an > - * error and finish it. This will run IO completion immediately > - * as there is only one reference to the ioend at this point in > - * time. > - */ > - if (status) { > - ioend->io_error = status; > - xfs_finish_ioend(ioend); > - return status; > + if (status) > + goto error_finish; > } > > - bio = NULL; > - for (bh = ioend->io_buffer_head; bh; bh = bh->b_private) { > - > - if (!bio) { > -retry: > - bio = xfs_alloc_ioend_bio(bh); > - } else if (bh->b_blocknr != lastblock + 1) { > - xfs_submit_ioend_bio(wbc, ioend, bio); > - goto retry; > - } > - > - if (xfs_bio_add_buffer(bio, bh) != bh->b_size) { > - xfs_submit_ioend_bio(wbc, ioend, bio); > - goto retry; > - } > - > - lastblock = bh->b_blocknr; > - } > - if (bio) > - xfs_submit_ioend_bio(wbc, ioend, bio); > + xfs_submit_ioend_bio(wbc, ioend, ioend->io_bio); > + ioend->io_bio = NULL; > xfs_finish_ioend(ioend); > return 0; > + > + /* > + * If we are failing the IO now, just mark the ioend with an error and > + * finish it, releasing the active bio if there is one. This will run > + * IO completion immediately as there is only one reference to the ioend > + * at this point in time. > + */ > +error_finish: > + if (ioend->io_bio) > + bio_put(ioend->io_bio); > + ioend->io_error = status; > + xfs_finish_ioend(ioend); > + return status; > } > > /* > @@ -523,27 +508,37 @@ xfs_add_to_ioend( > struct buffer_head *bh, > xfs_off_t offset, > struct xfs_writepage_ctx *wpc, > + struct writeback_control *wbc, > struct list_head *iolist) > { > - if (!wpc->ioend || wpc->io_type != wpc->ioend->io_type || > - bh->b_blocknr != wpc->last_block + 1) { > - struct xfs_ioend *new; > + struct xfs_ioend *ioend = wpc->ioend; > > - if (wpc->ioend) > - list_add(&wpc->ioend->io_list, iolist); > + if (!ioend || wpc->io_type != ioend->io_type || > + bh->b_blocknr != wpc->last_block + 1) { > + if (ioend) > + list_add(&ioend->io_list, iolist); > > - new = xfs_alloc_ioend(inode, wpc->io_type); > - new->io_offset = offset; > - new->io_buffer_head = bh; > - new->io_buffer_tail = bh; > - wpc->ioend = new; > + ioend = wpc->ioend = xfs_alloc_ioend(inode, wpc->io_type); > + ioend->io_offset = offset; > + ioend->io_buffer_head = bh; > + ioend->io_buffer_tail = bh; > } else { > - wpc->ioend->io_buffer_tail->b_private = bh; > - wpc->ioend->io_buffer_tail = bh; > + ioend->io_buffer_tail->b_private = bh; > + ioend->io_buffer_tail = bh; > } > - > bh->b_private = NULL; > - wpc->ioend->io_size += bh->b_size; > + > +retry: > + if (!ioend->io_bio) > + ioend->io_bio = xfs_alloc_ioend_bio(bh); > + > + if (xfs_bio_add_buffer(ioend->io_bio, bh) != bh->b_size) { > + xfs_submit_ioend_bio(wbc, ioend, ioend->io_bio); > + ioend->io_bio = NULL; > + goto retry; > + } > + > + ioend->io_size += bh->b_size; > wpc->last_block = bh->b_blocknr; > xfs_start_buffer_writeback(bh); > } > @@ -802,7 +797,7 @@ xfs_writepage_map( > lock_buffer(bh); > if (wpc->io_type != XFS_IO_OVERWRITE) > xfs_map_at_offset(inode, bh, &wpc->imap, offset); > - xfs_add_to_ioend(inode, bh, offset, wpc, &submit_list); > + xfs_add_to_ioend(inode, bh, offset, wpc, wbc, &submit_list); > count++; > } > > diff --git a/fs/xfs/xfs_aops.h b/fs/xfs/xfs_aops.h > index 4e01bd5..c89c3bd 100644 > --- a/fs/xfs/xfs_aops.h > +++ b/fs/xfs/xfs_aops.h > @@ -52,6 +52,7 @@ typedef struct xfs_ioend { > xfs_off_t io_offset; /* offset in the file */ > struct work_struct io_work; /* xfsdatad work queue */ > struct xfs_trans *io_append_trans;/* xact. for size update */ > + struct bio *io_bio; /* bio being built */ > } xfs_ioend_t; > > extern const struct address_space_operations xfs_address_space_operations; > -- > 2.1.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu Mar 3 09:17:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8BD337CA1 for ; Thu, 3 Mar 2016 09:17:29 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 431668F8039 for ; Thu, 3 Mar 2016 07:17:26 -0800 (PST) X-ASG-Debug-ID: 1457018244-04bdf002ed1784c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id KnsPWDCxLe48o0wa (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 03 Mar 2016 07:17:24 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 9FBE750F42; Thu, 3 Mar 2016 15:17:24 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-186.bos.redhat.com [10.18.41.186]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u23FHNRQ021708; Thu, 3 Mar 2016 10:17:24 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id E1C91125041; Thu, 3 Mar 2016 10:17:22 -0500 (EST) Date: Thu, 3 Mar 2016 10:17:22 -0500 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com, Dave Chinner Subject: Re: [PATCH 2/3] xfs: don't release bios on completion immediately Message-ID: <20160303151722.GB57990@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/3] xfs: don't release bios on completion immediately References: <1456302011-18915-1-git-send-email-hch@lst.de> <1456302011-18915-3-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1456302011-18915-3-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457018244 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Feb 24, 2016 at 09:20:10AM +0100, Christoph Hellwig wrote: > Completion of an ioend requires us to walk the bufferhead list to > end writback on all the bufferheads. This, in turn, is needed so > that we can end writeback on all the pages we just did IO on. > > To remove our dependency on bufferheads in writeback, we need to > turn this around the other way - we need to walk the pages we've > just completed IO on, and then walk the buffers attached to the > pages and complete their IO. In doing this, we remove the > requirement for the ioend to track bufferheads directly. > > To enable IO completion to walk all the pages we've submitted IO on, > we need to keep the bios that we used for IO around until the ioend > has been completed. We can do this simply by chaining the bios to > the ioend at completion time, and then walking their pages directly > just before destroying the ioend. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_aops.c | 90 +++++++++++++++++++++++++++++++++++++++++-------------- > fs/xfs/xfs_aops.h | 5 ++-- > 2 files changed, 71 insertions(+), 24 deletions(-) > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index 90e6e3a..fc4fed6 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -84,25 +84,71 @@ xfs_find_bdev_for_inode( > } > > /* > - * We're now finished for good with this ioend structure. > - * Update the page state via the associated buffer_heads, > - * release holds on the inode and bio, and finally free > - * up memory. Do not use the ioend after this. > + * We're now finished for good with this page. Update the page state via the > + * associated buffer_heads, paying attention to the start and end offsets that > + * we need to process on the page. > + */ > +static void > +xfs_finish_page_writeback( > + struct page *page, > + unsigned int start, > + unsigned int end, > + int error) > +{ > + struct buffer_head *head, *bh; > + unsigned int off = 0; > + > + bh = head = page_buffers(page); > + > + do { > + if (start > off) > + goto next_bh; Probably not an issue for current usage, which appears to be on buffer size granularity, but shouldn't this check whether start is beyond the end of the current buffer (e.g., start >= off + bh->b_size)? > + if (off > end) > + break; > + bh->b_end_io(bh, !error); > +next_bh: > + off += bh->b_size; > + } while ((bh = bh->b_this_page) != head); > +} > + > +/* > + * We're now finished for good with this ioend structure. Update the page > + * state, release holds on bios, and finally free up memory. Do not use the > + * ioend after this. > */ > STATIC void > xfs_destroy_ioend( > - xfs_ioend_t *ioend) > + struct xfs_ioend *ioend) > { > - struct buffer_head *bh, *next; > + struct bio *bio, *next; > + > + for (bio = ioend->io_bio_done; bio; bio = next) { > + struct bio_vec *bvec; > + int i; > > - for (bh = ioend->io_buffer_head; bh; bh = next) { > - next = bh->b_private; > - bh->b_end_io(bh, !ioend->io_error); > + next = bio->bi_private; > + bio->bi_private = NULL; > + > + /* walk each page on bio, ending page IO on them */ > + bio_for_each_segment_all(bvec, bio, i) { > + struct page *page = bvec->bv_page; > + unsigned int off = bvec->bv_offset; > + unsigned int end_off = off + bvec->bv_len - 1; > + > + ASSERT(off < PAGE_SIZE); > + ASSERT(end_off <= PAGE_SIZE); > + > + xfs_finish_page_writeback(page, off, end_off, > + ioend->io_error); > + > + } > + bio_put(bio); > } > > mempool_free(ioend, xfs_ioend_pool); > } > > + Unnecessary whitespace here. Brian > /* > * Fast and loose check if this write could update the on-disk inode size. > */ > @@ -286,6 +332,7 @@ xfs_alloc_ioend( > ioend->io_type = type; > ioend->io_inode = inode; > INIT_WORK(&ioend->io_work, xfs_end_io); > + spin_lock_init(&ioend->io_lock); > return ioend; > } > > @@ -365,15 +412,21 @@ STATIC void > xfs_end_bio( > struct bio *bio) > { > - xfs_ioend_t *ioend = bio->bi_private; > + struct xfs_ioend *ioend = bio->bi_private; > + unsigned long flags; > > - if (!ioend->io_error) > - ioend->io_error = bio->bi_error; > - > - /* Toss bio and pass work off to an xfsdatad thread */ > bio->bi_private = NULL; > bio->bi_end_io = NULL; > - bio_put(bio); > + > + spin_lock_irqsave(&ioend->io_lock, flags); > + if (!ioend->io_error) > + ioend->io_error = bio->bi_error; > + if (!ioend->io_bio_done) > + ioend->io_bio_done = bio; > + else > + ioend->io_bio_done_tail->bi_private = bio; > + ioend->io_bio_done_tail = bio; > + spin_unlock_irqrestore(&ioend->io_lock, flags); > > xfs_finish_ioend(ioend); > } > @@ -517,16 +570,9 @@ xfs_add_to_ioend( > bh->b_blocknr != wpc->last_block + 1) { > if (ioend) > list_add(&ioend->io_list, iolist); > - > ioend = wpc->ioend = xfs_alloc_ioend(inode, wpc->io_type); > ioend->io_offset = offset; > - ioend->io_buffer_head = bh; > - ioend->io_buffer_tail = bh; > - } else { > - ioend->io_buffer_tail->b_private = bh; > - ioend->io_buffer_tail = bh; > } > - bh->b_private = NULL; > > retry: > if (!ioend->io_bio) > diff --git a/fs/xfs/xfs_aops.h b/fs/xfs/xfs_aops.h > index c89c3bd..1c7b041 100644 > --- a/fs/xfs/xfs_aops.h > +++ b/fs/xfs/xfs_aops.h > @@ -46,13 +46,14 @@ typedef struct xfs_ioend { > int io_error; /* I/O error code */ > atomic_t io_remaining; /* hold count */ > struct inode *io_inode; /* file being written to */ > - struct buffer_head *io_buffer_head;/* buffer linked list head */ > - struct buffer_head *io_buffer_tail;/* buffer linked list tail */ > size_t io_size; /* size of the extent */ > xfs_off_t io_offset; /* offset in the file */ > struct work_struct io_work; /* xfsdatad work queue */ > struct xfs_trans *io_append_trans;/* xact. for size update */ > struct bio *io_bio; /* bio being built */ > + struct bio *io_bio_done; /* bios completed */ > + struct bio *io_bio_done_tail; /* bios completed */ > + spinlock_t io_lock; /* for bio completion list */ > } xfs_ioend_t; > > extern const struct address_space_operations xfs_address_space_operations; > -- > 2.1.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu Mar 3 09:17:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 061867CAF for ; Thu, 3 Mar 2016 09:17:34 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id BEFDC304043 for ; Thu, 3 Mar 2016 07:17:33 -0800 (PST) X-ASG-Debug-ID: 1457018252-04cb6c5831155420001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id wviuH7Q8KNFySAKX (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 03 Mar 2016 07:17:32 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id E578C64D2A; Thu, 3 Mar 2016 15:17:31 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-186.bos.redhat.com [10.18.41.186]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u23FHVGY019058; Thu, 3 Mar 2016 10:17:31 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 827FD125041; Thu, 3 Mar 2016 10:17:30 -0500 (EST) Date: Thu, 3 Mar 2016 10:17:30 -0500 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/3] xfs: optimize bio handling in the buffer writeback path Message-ID: <20160303151730.GC57990@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 3/3] xfs: optimize bio handling in the buffer writeback path References: <1456302011-18915-1-git-send-email-hch@lst.de> <1456302011-18915-4-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1456302011-18915-4-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 03 Mar 2016 15:17:31 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1457018252 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Feb 24, 2016 at 09:20:11AM +0100, Christoph Hellwig wrote: > This patch implements two closely related changes: First it embedds a > bio the ioend structure so that we don't have to allocate one separately. > Second it uses the block layer bio chaining mechanism to chain additional > bios off this first one if needed instead of manually accouting for > multiple bio completions in the ioend structure. Together this removes a > memory allocation per ioend and greatly simplifies the ioend setup and > I/O completion path. > > Signed-off-by: Christoph Hellwig > --- > fs/xfs/xfs_aops.c | 217 ++++++++++++++++++++--------------------------------- > fs/xfs/xfs_aops.h | 15 ++-- > fs/xfs/xfs_super.c | 26 ++----- > 3 files changed, 93 insertions(+), 165 deletions(-) > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index fc4fed6..1ea4167 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -118,17 +118,15 @@ next_bh: > */ > STATIC void > xfs_destroy_ioend( > - struct xfs_ioend *ioend) > + struct xfs_ioend *ioend, > + int error) > { > - struct bio *bio, *next; > + struct bio *bio, *next, *last = ioend->io_bio; > > - for (bio = ioend->io_bio_done; bio; bio = next) { > + for (bio = &ioend->io_inline_bio; bio; bio = next) { > struct bio_vec *bvec; > int i; > > - next = bio->bi_private; > - bio->bi_private = NULL; > - > /* walk each page on bio, ending page IO on them */ > bio_for_each_segment_all(bvec, bio, i) { > struct page *page = bvec->bv_page; > @@ -138,17 +136,21 @@ xfs_destroy_ioend( > ASSERT(off < PAGE_SIZE); > ASSERT(end_off <= PAGE_SIZE); > > - xfs_finish_page_writeback(page, off, end_off, > - ioend->io_error); > - > + xfs_finish_page_writeback(page, off, end_off, error); > } > + > + /* > + * For the last bio, bi_private points to the ioend, so we > + * need to explicitly end the iteration here. > + */ Do you mean the last bio is pointed to by the ioend? > + if (bio == last) > + next = NULL; > + else > + next = bio->bi_private; > bio_put(bio); > } > - > - mempool_free(ioend, xfs_ioend_pool); > } > > - > /* > * Fast and loose check if this write could update the on-disk inode size. > */ ... > @@ -515,10 +430,10 @@ static inline int xfs_bio_add_buffer(struct bio *bio, struct buffer_head *bh) > STATIC int > xfs_submit_ioend( > struct writeback_control *wbc, > - xfs_ioend_t *ioend, > + struct xfs_ioend *ioend, > int status) > { > - if (!ioend->io_bio || status) > + if (status) > goto error_finish; > > /* Reserve log space if we might write beyond the on-disk inode size. */ > @@ -529,9 +444,10 @@ xfs_submit_ioend( > goto error_finish; > } > > - xfs_submit_ioend_bio(wbc, ioend, ioend->io_bio); > - ioend->io_bio = NULL; > - xfs_finish_ioend(ioend); > + ioend->io_bio->bi_private = ioend; > + ioend->io_bio->bi_end_io = xfs_end_bio; > + submit_bio(wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE, > + ioend->io_bio); > return 0; > > /* > @@ -541,10 +457,8 @@ xfs_submit_ioend( > * at this point in time. > */ > error_finish: > - if (ioend->io_bio) > - bio_put(ioend->io_bio); > - ioend->io_error = status; > - xfs_finish_ioend(ioend); > + ioend->io_bio->bi_error = status; > + bio_endio(ioend->io_bio); > return status; bi_end_io is not set here, so what happens to the buffers added to the ioend in this case? > } > > @@ -565,22 +479,51 @@ xfs_add_to_ioend( > struct list_head *iolist) > { > struct xfs_ioend *ioend = wpc->ioend; > + struct bio *new; > > if (!ioend || wpc->io_type != ioend->io_type || > bh->b_blocknr != wpc->last_block + 1) { > + new = bio_alloc_bioset(GFP_NOFS, BIO_MAX_PAGES, > + xfs_ioend_bioset); > + new->bi_iter.bi_sector = bh->b_blocknr * (bh->b_size >> 9); > + new->bi_bdev = bh->b_bdev; > + Trailing whitespace on the above line. And FWIW, I'm not a huge fan of open coding both the bio and ioend allocations. It makes it easier to distinguish the higher level algorithm from all of the structure initialization noise. It looks to me that alloc_ioend() could remain mostly as is, using the new bioset allocation, and alloc_ioend_bio() could be inlined and renamed to something like init_bio_from_bh() or some such. > if (ioend) > list_add(&ioend->io_list, iolist); > - ioend = wpc->ioend = xfs_alloc_ioend(inode, wpc->io_type); > + > + ioend = container_of(new, struct xfs_ioend, io_inline_bio); > + INIT_LIST_HEAD(&ioend->io_list); > + ioend->io_type = wpc->io_type; > + ioend->io_inode = inode; > + ioend->io_size = 0; > ioend->io_offset = offset; > + INIT_WORK(&ioend->io_work, xfs_end_io); > + ioend->io_append_trans = NULL; > + ioend->io_bio = new; > + > + wpc->ioend = ioend; > } > > retry: > - if (!ioend->io_bio) > - ioend->io_bio = xfs_alloc_ioend_bio(bh); > - > if (xfs_bio_add_buffer(ioend->io_bio, bh) != bh->b_size) { > - xfs_submit_ioend_bio(wbc, ioend, ioend->io_bio); > - ioend->io_bio = NULL; > + /* > + * No space left in the bio. > + * > + * Allocate a new one, and chain the old bio to the new one. > + * Note that we have to do perform the chaining in this > + * unintuitive order so that the bi_private linkage is set up > + * in the right direction for the traversal in > + * xfs_destroy_ioend(). > + */ > + new = bio_alloc(GFP_NOFS, BIO_MAX_PAGES); > + new->bi_iter.bi_sector = bh->b_blocknr * (bh->b_size >> 9); > + new->bi_bdev = bh->b_bdev; > + > + bio_chain(ioend->io_bio, new); > + bio_get(ioend->io_bio); /* for xfs_destroy_ioend */ > + submit_bio(wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE, > + ioend->io_bio); > + ioend->io_bio = new; I'm trying to make sure I grok how this works without knowing much about the block layer. So we chain the current bio to the new one, the latter becoming the parent, and submit the old one. It looks to me that this could result in bio_endio() on the parent, which seems fishy... what am I missing? IOW, is it safe to submit bios like this before the entire chain is created? > goto retry; > } > ... > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index 59c9b7b..33aa638 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c ... > @@ -1755,10 +1749,8 @@ xfs_init_zones(void) > kmem_zone_destroy(xfs_bmap_free_item_zone); > out_destroy_log_ticket_zone: > kmem_zone_destroy(xfs_log_ticket_zone); > - out_destroy_ioend_pool: > - mempool_destroy(xfs_ioend_pool); > - out_destroy_ioend_zone: > - kmem_zone_destroy(xfs_ioend_zone); > + out_free_ioend_bioset: > + bioset_free(xfs_ioend_bioset); Space before tab ^. > out: > return -ENOMEM; > } > @@ -1784,9 +1776,7 @@ xfs_destroy_zones(void) > kmem_zone_destroy(xfs_btree_cur_zone); > kmem_zone_destroy(xfs_bmap_free_item_zone); > kmem_zone_destroy(xfs_log_ticket_zone); > - mempool_destroy(xfs_ioend_pool); > - kmem_zone_destroy(xfs_ioend_zone); > - > + bioset_free(xfs_ioend_bioset); Space before tab ^. Brian > } > > STATIC int __init > -- > 2.1.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Thu Mar 3 15:32:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A43167CA1 for ; Thu, 3 Mar 2016 15:32:52 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5665C8F8035 for ; Thu, 3 Mar 2016 13:32:49 -0800 (PST) X-ASG-Debug-ID: 1457040763-04bdf002ec185ff0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id aryGV49sPH6zFEHL for ; Thu, 03 Mar 2016 13:32:43 -0800 (PST) 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: A2BRDADTrNhWOVEqLHldKAECgw+BP4Zmn24DAQEBBot3iVOGCQQCAoExTQEBAQEBAQcBAQEBQAFAQRIBg24BAQQ6HCMQCAMYCSUPBSUDBxoTiCC7CAEBCAIeGIU4hQSIcgWHVocIiD6NWYFqhESIU45NhFooLocEgh4BAQE Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl2.internode.on.net with ESMTP; 04 Mar 2016 08:01:10 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1abapw-0002gu-PY; Fri, 04 Mar 2016 08:31:08 +1100 Date: Fri, 4 Mar 2016 08:31:08 +1100 From: Dave Chinner To: Alex Lyakas Cc: Christoph Hellwig , Danny Shavit , Shyam Kaushik , Yair Hershko , xfs@oss.sgi.com Subject: Re: xfs resize: primary superblock is not updated immediately Message-ID: <20160303213108.GQ30721@dastard> X-ASG-Orig-Subj: Re: xfs resize: primary superblock is not updated immediately References: <3685DFAD20214109878873CF81232704@alyakaslap> <20160222212019.GI25832@dastard> <20160222235628.GK25832@dastard> <20160223225926.GN25832@dastard> <20160229211628.GK29057@dastard> <20160301072011.GF30721@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: 1457040763 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27548 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Mar 03, 2016 at 11:18:43AM +0200, Alex Lyakas wrote: > Hello Dave, > Thanks for the patch! I confirm that it fixes the scenario. > > At [1] please find all the blknos that are being used during the log > recovery (if that's of any interest). .... > Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.129739] > _xfs_buf_find: blkno=200705 eofs=204800 >m_sb.sb_dblocks=25600 > Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.129746] > _xfs_buf_find: blkno=200705 eofs=204800 >m_sb.sb_dblocks=25600 Where is the warning that this block is out of range? And why didn't recovery fail at this point because the block requested is out of range and so the buffer lookup should have failed? Cheers, Dave. -- Dave Chinner david@fromorbit.com From darrick.wong@oracle.com Thu Mar 3 19:36:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 11EAC7CA1 for ; Thu, 3 Mar 2016 19:36:46 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D9184304039 for ; Thu, 3 Mar 2016 17:36:42 -0800 (PST) X-ASG-Debug-ID: 1457055401-04cb6c583316ad70001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id P2faBFUcn2uWrIgg (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 03 Mar 2016 17:36:41 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u241aFqq012547 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 4 Mar 2016 01:36:15 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u241aE2S032605 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Fri, 4 Mar 2016 01:36:15 GMT Received: from abhmp0009.oracle.com (abhmp0009.oracle.com [141.146.116.15]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u241aDnY032396; Fri, 4 Mar 2016 01:36:13 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 03 Mar 2016 17:36:13 -0800 Date: Thu, 3 Mar 2016 17:36:10 -0800 From: "Darrick J. Wong" To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: block allocations for the refcount btree Message-ID: <20160304013610.GA27792@birch.djwong.org> X-ASG-Orig-Subj: Re: block allocations for the refcount btree References: <20160210214058.GN14668@dastard> <20160212191046.GA28421@infradead.org> <20160301181809.GC27973@birch.djwong.org> <20160301204013.GA23128@infradead.org> <20160302052411.GB1902@birch.djwong.org> <20160302095932.GA9141@infradead.org> <20160302164102.GA20109@birch.djwong.org> <20160302165704.GA31438@infradead.org> <20160302212101.GF27973@birch.djwong.org> <20160303140556.GA26825@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160303140556.GA26825@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1457055401 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27557 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Thu, Mar 03, 2016 at 06:05:56AM -0800, Christoph Hellwig wrote: > On Wed, Mar 02, 2016 at 01:21:01PM -0800, Darrick J. Wong wrote: > > Ok. I think the problem is that making changes to the refcount btree eats > > up our entire reservation in certain cases. Can you try the following bandaid? > > This should give us enough room to handle splitting the btree at both ends > > of a range that we're refcount-changing. > > This seems to work in general. I ran into one log related hang when > running -g auto on nfs, but it's not been reproducible so far. It still breaks on 1k block filesystems, which confirms my suspicions that we really need to have enough space in the reservation to handle the worst case that every block in a n-block truncation has a separate refcountbt record. :( :( (Or break up our truncation activities, I suppose...) --D From eguan@redhat.com Fri Mar 4 05:24:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 18C797CA1 for ; Fri, 4 Mar 2016 05:24:04 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 66B0DAC002 for ; Fri, 4 Mar 2016 03:24:03 -0800 (PST) X-ASG-Debug-ID: 1457090638-04cb6c583017b9a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cGfJg23B46C1qkNz (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 03:23:58 -0800 (PST) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 02D5D2655 for ; Fri, 4 Mar 2016 11:23:57 +0000 (UTC) Received: from localhost (dhcp-13-211.nay.redhat.com [10.66.13.211]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u24BNsJR009353 for ; Fri, 4 Mar 2016 06:23:56 -0500 Date: Fri, 4 Mar 2016 19:23:54 +0800 From: Eryu Guan To: xfs@oss.sgi.com Subject: Some xfstests failures on non-crc xfs with latest xfsprogs (v4.5.0-rc1) Message-ID: <20160304112354.GX11419@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Some xfstests failures on non-crc xfs with latest xfsprogs (v4.5.0-rc1) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="MSd2ShuMixI0uVaZ" Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457090638 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 --MSd2ShuMixI0uVaZ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi, I noticed some xfstests failures while testing v4 XFS with latest v4.5.0-rc1 xfsprogs on v4.5-rc6 kernel, and all these failures are gone if I use v3.2.4 xfsprogs, or if test on v5 XFS. So either xfstests needs update or xfsprogs breaks something for non-crc XFS. But I'm not sure which is which, so I post them out for broader review. (All tests are checked with 'MKFS_OPTIONS="-m crc=0" ./check ') == 1. xfs/032 fsck failure (xfs_db check) on ppc64 host == xfs/032 fails in the same way as the following steps on ppc64 host: mkfs -t xfs -m crc=0 -s size=32768 -b size=65536 -d size=1g -f /dev/sda5 xfs_db -c check /dev/sda5 This prints bad magic number 0 for inode 1792 ... bad magic number 0 for inode 2047 root inode 1792 is not a directory block 0/7 type unknown not expected allocated inode 1792 has 0 link count allocated inode 1793 has 0 link count allocated inode 1794 has 0 link count == 2. xfs/033 fsck failure == xfs_repair detects more nlinks error. And this happens after commit "c2c5096 libxfs: update to 3.16 kernel code" # diff -u tests/xfs/033.out /root/xfstests/results//xfs_4k/xfs/033.out.bad --- tests/xfs/033.out 2015-07-16 17:28:15.996000000 +0800 +++ /root/xfstests/results//xfs_4k/xfs/033.out.bad 2016-03-04 18:54:39.461000000 +0800 @@ -66,6 +66,7 @@ - traversal finished ... - moving disconnected inodes to lost+found ... Phase 7 - verify and correct link counts... +resetting inode INO nlinks from 0 to 1 done Corrupting rt summary inode - setting bits to 0 Wrote X.XXKb (value 0x0) @@ -96,6 +97,7 @@ - traversal finished ... - moving disconnected inodes to lost+found ... Phase 7 - verify and correct link counts... +resetting inode INO nlinks from 0 to 1 done Corrupting root inode - setting bits to -1 Wrote X.XXKb (value 0xffffffff) @@ -160,6 +162,7 @@ - traversal finished ... - moving disconnected inodes to lost+found ... Phase 7 - verify and correct link counts... +resetting inode INO nlinks from 0 to 1 done Corrupting rt summary inode - setting bits to -1 Wrote X.XXKb (value 0xffffffff) @@ -191,4 +194,5 @@ - traversal finished ... - moving disconnected inodes to lost+found ... Phase 7 - verify and correct link counts... +resetting inode INO nlinks from 0 to 1 done == 3. xfs/108 xfs/196 xfs/261 xfs/244 fsck failure. == These tests fail in a similiar way, and they are all quota related. Note that xfs/244 only fails on ppc64, others fail on all arches. *** xfs_repair -n output *** 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 (but don't 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 = 0 - agno = 3 - agno = 1 - agno = 2 No modify flag set, skipping phase 5 Phase 6 - check inode connectivity... - traversing filesystem ... - traversal finished ... - moving disconnected inodes to lost+found ... disconnected inode 131, would move to lost+found Phase 7 - verify link counts... No modify flag set, skipping filesystem flush and exiting. *** end xfs_repair outpu == 4. xfs/186 xfs/187 attr test failure == xfs/186 is missing almost all the attr values. xfs/187 reports test needs update. Please see attachments for details. Thanks, Eryu --MSd2ShuMixI0uVaZ Content-Type: application/x-bzip2 Content-Disposition: attachment; filename="xfs-032-ppc64.full.bz2" Content-Transfer-Encoding: base64 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 --MSd2ShuMixI0uVaZ Content-Type: application/x-bzip2 Content-Disposition: attachment; filename="xfs-033.out.bad.bz2" Content-Transfer-Encoding: base64 QlpoOTFBWSZTWZQ5u4gABP9fgHYQQG9/hy+t9eA/79/wYAZ/fIEqRAUqqBQKI5gE0wCZDAAE wTAAADmATTAJkMAATBMAAAOYBNMAmQwABMEwAAA5gE0wCZDAAEwTAAABEoplPAoPUaNTIYga GhoBoPKAClRCBMFGmim1NPTSPUD1Gho9CHih6T+y3sRiqOh8mEe5YX3n0ZF818F/PbugaDaP eMAa8zscXc2NGMGjGMsITGznI2OHRC4XhUFflwbFUJX6j9B6R6xyHEvtXddl+tfK0XJfFYWl k+rxLawWLUwtWWSOyx23r/S0ovK8uK93yXzui3retFhcVoPYw5rlksXw/z/Lf70blxXK1jRc VldL2rnaroty7LRcFlaLnquy5r5rksrCwvZeS7L/C4XbS69WNbOe2c5yyy5o62yyWi5rksu6 3rZd1oX23m5reWq9w7BzIOY6gajoO8N44u0YMGMGDUe1871MfU0aNGrR9+I4A+scypCFRDmB 0NBgzoL+K7POw3L6/StV7O66HdlchuHcOWY6NgNg1GA0HrBvdHgHMeqjv8osN63LCMCwsCws IwWFiPs95RcDutVgvauqytF9iyWFlegtDaYDqf6DAjFXhYJBgnZB4oK+3u4O7AsOXLkkD/WV PT3jtuB2/Eerbu/Fg9tHpHsBvRTnG+6bUU8iKbRr+x31EpXduGjXUN5SCclhH7VoXxXq2sPg vWviqwta/BGPxj61/RbVfRe34FvlOAtqsF7Un9WyNfuX5Fu/6vJVkjjRqWEbljmjoWEfvX5F hai2RpSzVwWLcsScsLJY2XnxDesLsvMsLOJMI0LKysCyXD7uRJosKuBNV4ZR3N6xH8F9F0Sd 9ZT0rxWiZLRGF1sjQaxtbkwHWPIrorFoIQcxjBhQcVyvvWJNVhaJeojyLwWFguS6LJGBdVhb 1WV2LmXVdsEc12XTH5K8gwV+CtRExH+DRE1g2rcqhBzXqS6rw96TgtEdFhetbLCO6Pz6h8A8 QN7zsuVyQo6h48hsB1jUajVvYL0rCNy7rojiit6PSzYR4rOpUXYIYZDgDcpaNoOgrBuGtBqr vjI8lirBfoRuWxYLZeBWV5sK0k8V2XpWF2WyOV1WLCyvEtPQRirlyytC2WbQuKrksI0uW/et FupZWEbLmX0XFbpJuwsLCMLK2LRFetcVtqsrKxsRnmXRYWC81LkitlmWiyq4o9C86NVeQsx7 lxcAZC2jaDat8B0HEeEHMYOseioO8MIwWqyufcjRc0aFoXjuV4YXSPM2XBdbgsLgt5YWC2Rt ejktF6S3rcW9+a3VbiNZ4LRxLUvLz2VssLRdLzF1LVdFlZWywsLNYty5FvRxSd7etVhGFhar RbC1Xq19eW5HQar8SwtyWpeHRxcuCvFeS1b1uLTXj02m8MUNQ2g36xuGX7MB5lbQbmA6DAeS 0WxdUZdco8FquazXPTqRheC7rYjcXYsexcVpWK0LsjutI77eteCytS7lhGS0XDotF4fgq36j k6fUuAag0GDxjgjipkMH/i7kinChIShzdxA= --MSd2ShuMixI0uVaZ Content-Type: application/x-bzip2 Content-Disposition: attachment; filename="xfs-108.full.bz2" Content-Transfer-Encoding: base64 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 krjH/xdyRThQkInDx3c= --MSd2ShuMixI0uVaZ Content-Type: application/x-bzip2 Content-Disposition: attachment; filename="xfs-186.out.bad.bz2" Content-Transfer-Encoding: base64 QlpoOTFBWSZTWdTHWpQAAMB/gAAQAAJQEXfCIgA0Dj/v3zAwAULW0EkJNMjRT0QDJoeoAeUE iplGjCANGI9IAAEkVD1AP1TQwhpoyAGSSc4wWbwk6qUcGaAmzynmOY2TlCB3h3iFTQSiPuAX P8c2YIjzgYXoMQMx9Jx3UEGs8OtX175W8ZZHEuGu7hVBMuxfoC9QWokOOKRkYuQJoi7BqAmF iZB8xWqYqllipERQuAkITAEAWsK0xj3AqRPwEELQuhpYZhmNtp4hI+iwFOSDASKpM6DCKxjm OwT+lsua3JDhqnuVy/hUJzyBhI2DQMswx6sBBlM4bBSEFwJxOJj9A94SUBC1F5M8DCQw1VIM JhirHK/kSWDCRBeIILFFwMdARiFKknSRdM0mkjgKDNbvUW5bM/xdyRThQkNTHWpQ --MSd2ShuMixI0uVaZ Content-Type: application/x-bzip2 Content-Disposition: attachment; filename="xfs-187.out.bad.bz2" Content-Transfer-Encoding: base64 QlpoOTFBWSZTWTv+LQoAACjfgAAQQAx0wjev/Wo/Z99gIACEIqflT1PKeowjT1D1DTI9Q/JT Qepo0Iqf6k8hTeqaPUGjJo0AAA2UoYQNwvhR5RV/cpOze8imCt0Kax6cuK1P2xeFRhh4IbAs BaWhaKOKImcSAzekCyhvaSNjdjnnYVwlnmpm1VMKuUuXMt9sXkZXM3dI3Mbqkhk4EHSisPTU g57TRxyZRMGKkxB5qoI+oUI1ApziF+2kl/i7kinChIHf8WhQ --MSd2ShuMixI0uVaZ Content-Type: application/x-bzip2 Content-Disposition: attachment; filename="xfs-196.full.bz2" Content-Transfer-Encoding: base64 QlpoOTFBWSZTWfaAAXcAAfvfgAQQQP//0iCBYIC/7//wUAV69OzjsNUSGtCqENNTSNGp4hTe pHlP0UNBpoMnqAEUemqaepvUamAJhBkYCaMRgkQo1MqfhU2JhCAaNqAB6jGA0BoAANNBoBoA 0CSEEaAp6ABT0UMQZAep6QkGJlq9NSgpo8fRH6ICL846Pf4xawlDAvaEEARJIgDcvbXgeaAc WMISBQKQICmeG2emr+ZkgB7BkMMwyP6A+/Dj7ARPa92YFJNGznVg7frGrd0mgfXUL8oa7Bti 0mxTJ8q6lfFnIxytg+qM0iQt5ubYZ44tDTgezO2gaB1BA5gFU79xsm64HBrFBBAPkICBYyA0 8gI8koIzBGq5kyKOP8edT7rSbR0U8CjN1wdJTt0QB3KZtfxy27Ocp9Od1Go7tnPCCWESv0BZ HzCwdbBY9xi9iG7hD4v5nDXTzEHhCZj4h/hLtaML8caXsbQ2Jtiex7b5aCYxnI1joBtbTQMd 3Bz0SPCYBtJc7tzvf4tE3bZJNY90wkaSOQ5JtyUC7GdkwrEXVHfdFKKiGQhYrFcQAKrnUuz4 uUjfinLT1XhZTtrtTvk5wlVsD2I/cH1yUlW6jRMHnE/VSVpqc5eQh88NMJJmbv9Kgbr+PSOU vyHdKn8+AHaGoe5dxjuQeYRWweUlP5mZOR495ZoJOV9TEmG1/tl7t90pVWAJfb+AtuMJn2N0 /KSkfR2uumRgv77G/e8gBiCDFWBiRcI6iMEjjfS4vFWbGkoJL4tgRxcFaJvcbEr7og1Z2ZM8 ObO4+YIYnD9ZTRkkrYYwKGEDCMqpuiZlpbedt7Fru4jEU215RNqllpgR3RFZBqCVEfDIZ7Uw 3lF0AOoUSVOCdRmS73OsTVJXKEJXKojExHNT5EmoaFbferpi7JUhar0s7sdHKmqMA0Kg+5XA l1GFPkAbGB6HG5UFmiGq/hC537vrnAac8s55UF0NXuaLWwEs3coXeGMC9RO2SnRLYU24zYHa AGTz6hDEBBgU18T14o5mIIjkcT5AdEJa4Ryv8a7M1xvrmXo9AZHW95LuXjGRpNqMFq4tz10Y 0mUNy+v1cjkrFDKZfmdhBCS3jOCWIciI49UYnBYZ0TlEMFS3mayb1anR0YglplKBukcYRUqM GAQGlcWv0QAAy3zab4XKC4RKljNqVpB0rUtasmQgo1zDUXgCsklcIS8O9KYDjLw04ZYgW1Op NFUNLuVINgmAmMAqTJAHr5JW5uwcVcuL2LEwRosxXFSoVLSADTIJSGvuACnYqnXqAGpPhuws Id+52KKpLncnO2dOsqUt5H9BcQzVeAZMm2MKO+6AzYlRmJ0jeskJehCNVUcKt+e5LLVzugDO UqDFEkriMRZskOaaklNBRymJ4Ro7tPB2iosCsgGEtYcnoMIWaMANySefJ3fcnVh7p3xtcVMM puvQvewh9U6BGWzIQOLInymDDJrq9krlsjfUVTogmHJpyOckTbZVISOt1iYJbcNbsA1Dqaht Bma6JgsiRNSzvyRiFAAoEl8Lx7IYvBGJzGCV0oVEfDiJMhEvVPst+J3rEBjTRg1WgJUhxqkx 4G1cNUkpvKkG3CYA8A3lyOdnz8BhwY0gNwktC8w8xdyRThQkPaAAXcA= --MSd2ShuMixI0uVaZ Content-Type: application/x-bzip2 Content-Disposition: attachment; filename="xfs-244-ppc64.full.bz2" Content-Transfer-Encoding: base64 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 87PhX5lWSHJEc0jRvsf/i7kinChIPJfF6oA= --MSd2ShuMixI0uVaZ Content-Type: application/x-bzip2 Content-Disposition: attachment; filename="xfs-261.full.bz2" Content-Transfer-Encoding: base64 QlpoOTFBWSZTWdPyhkwAAfNfgAQQQP//0iCBQAC/7//wUAVeut24Z3XVFarQVWkJJAp6YJKf pR7RqaRoeoDanpBoNIyCZR6Rk0aA0aGQAAJCRBKeaU8gn6RlNNAaADIYAaaNBpiAAABkAJIQ SehojQAhRk9IZBjUOkFjLRr6EgkyPli/+Dg9M3+jcflWolJgKMiyBLCQfjv1bsg+rnMKrIew VNvDfpw6d6dmwgDxDcMbGj8gffr9wEtwyiFZOuEOTXd5y1adj5lJRM+tu9TS8GZ08UxKL6Xc W1nXKNtFZh+bYhNuPGCG0b074diQchFXCfDTZsNq3GhnGIH+ZtIVpCFEwSPZ5pGIP2qKQWbv q57aceB96/UqBKlwFZpNvIAPQlds+N9PBxrHnynJpOc2I1eQq+GWYK51CgbUDYf4ZmynzCpt nhenlfQQdEJs+QeYl2NGeGzZZeDaGxNsTyfHCmgqbK2m+eQHFtNAx37XXkkc2kHK/U7v9YSr zi6N88aiRpQ6DVNuiwLgzhUWJL2nfeWUtIyIyqViwC+/Hv38+TjUN1Zd9fQ7n6bGzFbJzhJk RBZQqAvwkhOe1RsAWw2bSQoMJjEsANcozxQlKVc0AUPqrPKloWsib41ACGofkw5R4IPWArYP VJe5clB5/MtEEnLexkTDTLyv2SfJUBLz/IZaFInmaeKSedSe6Y+q9NjhwdAAYggyWIMSMBHY RuSOdJLm1lVmGSTkGExzJ2uFtE31GSWF5E20/XUOMhNAQ1ylkZpK2OUIhhAwjKUmaRDwlw61 4sLTboMIk205Iy+EEa1WFg3glgj0aHM8NnEwWoByCiSpxTqLku7LI+iSqoQlVUEZGQ5qfwSa hoVtRkxXFThXWu5nOrlTeiwXKg/BYAl2GFPmAbzE1Oc1IKsh2UvwOdabfzm4X65Zx0kE41g6 sY45iW53UXcGyC5lcaLWKbCzbm5gcgAybP4CGICDEpr5nrzR1MgRHQ5noB2Qlvq/XLpv0Zpk rk0bwYNpuguhMYsYjJwa7rNy10Y0mUNl7+7kdFYoZzN1zwIISXEZwSyDpD9kVPaqXinGqGDc U7xV28mlzciwJZ3g8bm/i9FSowbxDeKZyt6IAa/68ZNrlpA1TNoZ9lRZV0zWdq0lINjHddAK EsRCXSS9/UQa6O9NbQMtT4JEQMl3U0GAmSQwwBKDRAHr1Sr2aoc1gub2LEwRorhgVqqlpABp mEpDbsAAp4Kp1+gAak+W2NhDv5PBRVJdcE54vTvKlLew+8XMLrkGbJuBjN32gLsSop0jiskJ byEaqo6Pnslw1c8oAvKVBiiSVSMRXZIcz0KLNBY1qV2y27m8I7YAsEAwjWue4YUtyNgNkk8+ ju+ydWHwnujhgVMc5ut5uewh9E0gRty2iBzFFfOoZ7WvN5Utcp12lrOxCo7O9jWQT4Ko6R3w sTBLhy1wxDUO5qHCC5romCyIEVDGV0WCQASCC9V4/FDGQItyGUJwepAwiGQiPZPvW2J4rEBj S7BorglSHGqTHgbRw0SSaKU38ZgDwDerkdLPfyGPJhkgNhJYJGX/F3JFOFCQ0/KGTA== --MSd2ShuMixI0uVaZ-- From JBeulich@suse.com Fri Mar 4 06:50:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BAD967CA1 for ; Fri, 4 Mar 2016 06:50:18 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 809E7304048 for ; Fri, 4 Mar 2016 04:50:18 -0800 (PST) X-ASG-Debug-ID: 1457095789-04bdf002ed1a13c0001-NocioJ Received: from prv-mh.provo.novell.com (prv-mh.provo.novell.com [137.65.248.74]) by cuda.sgi.com with ESMTP id 5qzUyU6BkIrM5kCE (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 04:49:50 -0800 (PST) X-Barracuda-Envelope-From: JBeulich@suse.com X-Barracuda-Apparent-Source-IP: 137.65.248.74 Received: from INET-PRV-MTA by prv-mh.provo.novell.com with Novell_GroupWise; Fri, 04 Mar 2016 05:49:49 -0700 Message-Id: <56D9927E02000078000D9696@prv-mh.provo.novell.com> X-Mailer: Novell GroupWise Internet Agent 14.2.0 Date: Fri, 04 Mar 2016 05:49:50 -0700 From: "Jan Beulich" To: "Brian Foster" Cc: Subject: Re: [PATCH 4/4] xfs: only run torn log write detection on dirty logs References: <1457008798-58734-1-git-send-email-bfoster@redhat.com> <1457008798-58734-5-git-send-email-bfoster@redhat.com> X-ASG-Orig-Subj: Re: [PATCH 4/4] xfs: only run torn log write detection on dirty logs In-Reply-To: <1457008798-58734-5-git-send-email-bfoster@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Content-Disposition: inline X-Barracuda-Connect: prv-mh.provo.novell.com[137.65.248.74] X-Barracuda-Start-Time: 1457095790 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27569 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header >>> On 03.03.16 at 13:39, wrote: > XFS uses CRC verification over a sub-range of the head of the log to > detect and handle torn writes. This torn log write detection currently > runs unconditionally at mount time, regardless of whether the log is > dirty or clean. This is problematic in cases where a filesystem might > end up being moved across different, incompatible (i.e., opposite > byte-endianness) architectures. >=20 > The problem lies in the fact that log data is not necessarily written in > an architecture independent format. For example, certain bits of data > are written in native endian format. Further, the size of certain log > data structures differs (i.e., struct xlog_rec_header) depending on the > word size of the cpu. This leads to false positive crc verification > errors and ultimately failed mounts when a cleanly unmounted filesystem > is mounted on a system with an incompatible architecture from data that > was written near the head of the log. >=20 > Update the log head/tail discovery code to run torn write detection only > when the log is not clean. This means something other than an unmount > record resides at the head of the log and log recovery is imminent. It > is a requirement to run log recovery on the same type of host that had > written the content of the dirty log and therefore CRC failures are > legitimate corruptions in that scenario. >=20 > Reported-by: Jan Beulich > Signed-off-by: Brian Foster Tested-by: Jan Beulich Thank you Brian. Jan From bfoster@redhat.com Fri Mar 4 07:39:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 313027CA1 for ; Fri, 4 Mar 2016 07:39:03 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8E50EAC004 for ; Fri, 4 Mar 2016 05:39:02 -0800 (PST) X-ASG-Debug-ID: 1457098737-04cb6c583217f3e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Oq0U4teTHCn4NmLi (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 05:38:58 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 4654A7AE85; Fri, 4 Mar 2016 13:38:57 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-186.bos.redhat.com [10.18.41.186]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u24DcuYr019143; Fri, 4 Mar 2016 08:38:56 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id C6B29125041; Fri, 4 Mar 2016 08:38:55 -0500 (EST) Date: Fri, 4 Mar 2016 08:38:55 -0500 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/3] xfs: optimize bio handling in the buffer writeback path Message-ID: <20160304133854.GB3758@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 3/3] xfs: optimize bio handling in the buffer writeback path References: <1456302011-18915-1-git-send-email-hch@lst.de> <1456302011-18915-4-git-send-email-hch@lst.de> <20160303151730.GC57990@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160303151730.GC57990@bfoster.bfoster> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457098737 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Mar 03, 2016 at 10:17:30AM -0500, Brian Foster wrote: > On Wed, Feb 24, 2016 at 09:20:11AM +0100, Christoph Hellwig wrote: > > This patch implements two closely related changes: First it embedds a > > bio the ioend structure so that we don't have to allocate one separately. > > Second it uses the block layer bio chaining mechanism to chain additional > > bios off this first one if needed instead of manually accouting for > > multiple bio completions in the ioend structure. Together this removes a > > memory allocation per ioend and greatly simplifies the ioend setup and > > I/O completion path. > > > > Signed-off-by: Christoph Hellwig > > --- > > fs/xfs/xfs_aops.c | 217 ++++++++++++++++++++--------------------------------- > > fs/xfs/xfs_aops.h | 15 ++-- > > fs/xfs/xfs_super.c | 26 ++----- > > 3 files changed, 93 insertions(+), 165 deletions(-) > > > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > > index fc4fed6..1ea4167 100644 > > --- a/fs/xfs/xfs_aops.c > > +++ b/fs/xfs/xfs_aops.c ... > > if (xfs_bio_add_buffer(ioend->io_bio, bh) != bh->b_size) { > > - xfs_submit_ioend_bio(wbc, ioend, ioend->io_bio); > > - ioend->io_bio = NULL; > > + /* > > + * No space left in the bio. > > + * > > + * Allocate a new one, and chain the old bio to the new one. > > + * Note that we have to do perform the chaining in this > > + * unintuitive order so that the bi_private linkage is set up > > + * in the right direction for the traversal in > > + * xfs_destroy_ioend(). > > + */ > > + new = bio_alloc(GFP_NOFS, BIO_MAX_PAGES); > > + new->bi_iter.bi_sector = bh->b_blocknr * (bh->b_size >> 9); > > + new->bi_bdev = bh->b_bdev; > > + > > + bio_chain(ioend->io_bio, new); > > + bio_get(ioend->io_bio); /* for xfs_destroy_ioend */ > > + submit_bio(wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE, > > + ioend->io_bio); > > + ioend->io_bio = new; > > I'm trying to make sure I grok how this works without knowing much about > the block layer. So we chain the current bio to the new one, the latter > becoming the parent, and submit the old one. It looks to me that this > could result in bio_endio() on the parent, which seems fishy... what am > I missing? IOW, is it safe to submit bios like this before the entire > chain is created? > Responding to my own question... Dave pointed out on irc yesterday that the bio chaining does some reference counting similar to the xfs_ioend to ensure that bi_end_io() of the parent is never called until the chain is complete. I took a closer look at the code and managed to convince myself that this should work fine. When the old bio is chained to the new, the new becomes the parent and the remaining I/O count is elevated. If the child bio happens to complete while the parent is still being built, bio_endio() on the child propagates an error to the parent and calls bio_remaining_done() on the parent, which drops the extra reference it held. The parent can still subsequently be chained itself to another bio or have the XFS bi_end_io() cb set. One thing I'm a bit suspicious about still is whether the error propagation is racy. For example, consider we've created two chained bios A and B, such that A is the parent and thus bio(io_remaining) for each is A(2) and B(1). Suppose bio A happens to complete first with an error. A->bi_error is set and bio_endio(A) is called, which IIUC basically just does A(2)->A(1). If bio B completes successfully, B->bi_error presumably remains set to 0 and bio_endio(B) is called. The latter checks that B->bi_end_io == bio_chain_endio, propagates B->bi_error to A->bi_error unconditionally and then walks up to the parent bio to drop its reference and finally call A->bi_end_io(). Doesn't this mean that we can potentially lose errors in the chain? I could easily still be missing something here... Brian > > goto retry; > > } > > > ... > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > > index 59c9b7b..33aa638 100644 > > --- a/fs/xfs/xfs_super.c > > +++ b/fs/xfs/xfs_super.c > ... > > @@ -1755,10 +1749,8 @@ xfs_init_zones(void) > > kmem_zone_destroy(xfs_bmap_free_item_zone); > > out_destroy_log_ticket_zone: > > kmem_zone_destroy(xfs_log_ticket_zone); > > - out_destroy_ioend_pool: > > - mempool_destroy(xfs_ioend_pool); > > - out_destroy_ioend_zone: > > - kmem_zone_destroy(xfs_ioend_zone); > > + out_free_ioend_bioset: > > + bioset_free(xfs_ioend_bioset); > > Space before tab ^. > > > out: > > return -ENOMEM; > > } > > @@ -1784,9 +1776,7 @@ xfs_destroy_zones(void) > > kmem_zone_destroy(xfs_btree_cur_zone); > > kmem_zone_destroy(xfs_bmap_free_item_zone); > > kmem_zone_destroy(xfs_log_ticket_zone); > > - mempool_destroy(xfs_ioend_pool); > > - kmem_zone_destroy(xfs_ioend_zone); > > - > > + bioset_free(xfs_ioend_bioset); > > Space before tab ^. > > Brian > > > } > > > > STATIC int __init > > -- > > 2.1.4 > > > > _______________________________________________ > > 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 Fri Mar 4 08:40:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E01EF7CA1 for ; Fri, 4 Mar 2016 08:40:37 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A26F68F8033 for ; Fri, 4 Mar 2016 06:40:37 -0800 (PST) X-ASG-Debug-ID: 1457102432-04cbb00b6f1b3f90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id FBKdydNiT036UBsm (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 06:40:33 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id CAC6329B37D for ; Fri, 4 Mar 2016 14:40:32 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-186.bos.redhat.com [10.18.41.186]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u24EeW8I031470 for ; Fri, 4 Mar 2016 09:40:32 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 8577C125E63; Fri, 4 Mar 2016 09:40:31 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 3/4] xfs: refactor delalloc indlen reservation split into helper Date: Fri, 4 Mar 2016 09:40:30 -0500 X-ASG-Orig-Subj: [PATCH 3/4] xfs: refactor delalloc indlen reservation split into helper Message-Id: <1457102431-5215-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1457102431-5215-1-git-send-email-bfoster@redhat.com> References: <1457102431-5215-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: 1457102433 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The delayed allocation indirect reservation splitting code is not sufficient in some cases where a delalloc extent is split in two. In preparation for enhancements to this code, refactor the current indlen distribution algorithm into a new helper function. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_bmap.c | 77 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 58 insertions(+), 19 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index f57a9e9..27e6689 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -4721,6 +4721,51 @@ error0: } /* + * When a delalloc extent is split (e.g., due to a hole punch), the original + * indlen reservation must be shared across the two new extents that are left + * behind. + * + * Given the original reservation and the worst case indlen for the two new + * extents (as calculated by xfs_bmap_worst_indlen()), split the original + * reservation fairly across the two new extents. + */ +static void +xfs_bmap_split_indlen( + xfs_filblks_t ores, /* original res. */ + xfs_filblks_t *indlen1, /* ext1 worst indlen */ + xfs_filblks_t *indlen2) /* ext2 worst indlen */ +{ + xfs_filblks_t nres; /* new total res. */ + xfs_filblks_t temp; + xfs_filblks_t temp2; + + temp = *indlen1; + temp2 = *indlen2; + nres = temp + temp2; + + /* + * The only blocks available are those reserved for the original extent. + * Therefore, we have to skim blocks off each of the new reservations so + * long as the new total reservation is greater than the original. + */ + while (nres > ores) { + if (temp) { + temp--; + nres--; + } + if (nres == ores) + break; + if (temp2) { + temp2--; + nres--; + } + } + + *indlen1 = temp; + *indlen2 = temp2; +} + +/* * Called by xfs_bmapi to update file extent records and the btree * after removing space (or undoing a delayed allocation). */ @@ -4985,27 +5030,21 @@ xfs_bmap_del_extent( XFS_IFORK_NEXTENTS(ip, whichfork) + 1); } else { ASSERT(whichfork == XFS_DATA_FORK); - temp = xfs_bmap_worst_indlen(ip, temp); + + /* + * Distribute the original indlen reservation across the + * two new extents. + */ + temp = xfs_bmap_worst_indlen(ip, got.br_blockcount); + temp2 = xfs_bmap_worst_indlen(ip, new.br_blockcount); + xfs_bmap_split_indlen(da_old, &temp, &temp2); + da_new = temp + temp2; + + /* + * Set the reservation for each extent. + */ xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); - temp2 = xfs_bmap_worst_indlen(ip, temp2); new.br_startblock = nullstartblock((int)temp2); - da_new = temp + temp2; - while (da_new > da_old) { - if (temp) { - temp--; - da_new--; - xfs_bmbt_set_startblock(ep, - nullstartblock((int)temp)); - } - if (da_new == da_old) - break; - if (temp2) { - temp2--; - da_new--; - new.br_startblock = - nullstartblock((int)temp2); - } - } } trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); xfs_iext_insert(ip, *idx + 1, 1, &new, state); -- 2.4.3 From bfoster@redhat.com Fri Mar 4 08:40:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3C8D47CA4 for ; Fri, 4 Mar 2016 08:40:38 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0EA89304032 for ; Fri, 4 Mar 2016 06:40:34 -0800 (PST) X-ASG-Debug-ID: 1457102432-04cb6c5830181780001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ruvKXhskHS8UCpHp (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 06:40:33 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id D4D357EBB4 for ; Fri, 4 Mar 2016 14:40:32 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-186.bos.redhat.com [10.18.41.186]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u24EeWKh031463 for ; Fri, 4 Mar 2016 09:40:32 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 6C77A125E61; Fri, 4 Mar 2016 09:40:31 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 1/4] xfs: debug mode forced buffered write failure Date: Fri, 4 Mar 2016 09:40:28 -0500 X-ASG-Orig-Subj: [PATCH 1/4] xfs: debug mode forced buffered write failure Message-Id: <1457102431-5215-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1457102431-5215-1-git-send-email-bfoster@redhat.com> References: <1457102431-5215-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: 1457102433 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add a DEBUG mode-only sysfs knob to enable forced buffered write failure. An additional side effect of this mode is brute force killing of delayed allocation blocks in the range of the write. The latter is the prime motiviation behind this patch, as userspace test infrastructure requires a reliable mechanism to create and split delalloc extents without causing extent conversion. Certain fallocate operations (i.e., zero range) were used for this in the past, but the implementations have changed such that delalloc extents are flushed and converted to real blocks, rendering the test useless. Signed-off-by: Brian Foster --- fs/xfs/xfs_aops.c | 9 ++++++- fs/xfs/xfs_mount.h | 25 +++++++++++++++++ fs/xfs/xfs_sysfs.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 101 insertions(+), 11 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 7a467b3..e1d80b4 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -1473,6 +1473,7 @@ xfs_vm_write_failed( loff_t from = pos & (PAGE_CACHE_SIZE - 1); loff_t to = from + len; struct buffer_head *bh, *head; + struct xfs_mount *mp = XFS_I(inode)->i_mount; /* * The request pos offset might be 32 or 64 bit, this is all fine @@ -1514,7 +1515,8 @@ xfs_vm_write_failed( if (!buffer_delay(bh) && !buffer_unwritten(bh)) continue; - if (!buffer_new(bh) && block_offset < i_size_read(inode)) + if (!xfs_mp_fail_writes(mp) && !buffer_new(bh) && + block_offset < i_size_read(inode)) continue; if (buffer_delay(bh)) @@ -1554,6 +1556,7 @@ xfs_vm_write_begin( pgoff_t index = pos >> PAGE_CACHE_SHIFT; struct page *page; int status; + struct xfs_mount *mp = XFS_I(mapping->host)->i_mount; ASSERT(len <= PAGE_CACHE_SIZE); @@ -1562,6 +1565,8 @@ xfs_vm_write_begin( return -ENOMEM; status = __block_write_begin(page, pos, len, xfs_get_blocks); + if (xfs_mp_fail_writes(mp)) + status = -EIO; if (unlikely(status)) { struct inode *inode = mapping->host; size_t isize = i_size_read(inode); @@ -1574,6 +1579,8 @@ xfs_vm_write_begin( * allocated in this write, not blocks that were previously * written successfully. */ + if (xfs_mp_fail_writes(mp)) + isize = 0; if (pos + len > isize) { ssize_t start = max_t(ssize_t, pos, isize); diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 1c8611f..bac6b34 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -147,6 +147,17 @@ typedef struct xfs_mount { * to various other kinds of pain inflicted on the pNFS server. */ __uint32_t m_generation; + +#ifdef DEBUG + /* + * DEBUG mode instrumentation to test and/or trigger delayed allocation + * block killing in the event of failed writes. When enabled, all + * buffered writes are forced to fail. All delalloc blocks in the range + * of the write (including pre-existing delalloc blocks!) are tossed as + * part of the write failure error handling sequence. + */ + bool m_fail_writes; +#endif } xfs_mount_t; /* @@ -263,6 +274,20 @@ xfs_daddr_to_agbno(struct xfs_mount *mp, xfs_daddr_t d) return (xfs_agblock_t) do_div(ld, mp->m_sb.sb_agblocks); } +#ifdef DEBUG +static inline bool +xfs_mp_fail_writes(struct xfs_mount *mp) +{ + return mp->m_fail_writes; +} +#else +static inline bool +xfs_mp_fail_writes(struct xfs_mount *mp) +{ + return 0; +} +#endif + /* * Per-ag incore structure, copies of information in agf and agi, to improve the * performance of allocation group selection. diff --git a/fs/xfs/xfs_sysfs.c b/fs/xfs/xfs_sysfs.c index 641d625..5f2d28d 100644 --- a/fs/xfs/xfs_sysfs.c +++ b/fs/xfs/xfs_sysfs.c @@ -22,6 +22,9 @@ #include "xfs_log.h" #include "xfs_log_priv.h" #include "xfs_stats.h" +#include "libxfs/xfs_trans_resv.h" +#include "libxfs/xfs_format.h" +#include "xfs_mount.h" struct xfs_sysfs_attr { struct attribute attr; @@ -45,16 +48,6 @@ to_attr(struct attribute *attr) #define ATTR_LIST(name) &xfs_sysfs_attr_##name.attr -/* - * xfs_mount kobject. This currently has no attributes and thus no need for show - * and store helpers. The mp kobject serves as the per-mount parent object that - * is identified by the fsname under sysfs. - */ - -struct kobj_type xfs_mp_ktype = { - .release = xfs_sysfs_release, -}; - STATIC ssize_t xfs_sysfs_object_show( struct kobject *kobject, @@ -83,6 +76,71 @@ static const struct sysfs_ops xfs_sysfs_ops = { .store = xfs_sysfs_object_store, }; +/* + * xfs_mount kobject. The mp kobject also serves as the per-mount parent object + * that is identified by the fsname under sysfs. + */ + +static inline struct xfs_mount * +to_mp(struct kobject *kobject) +{ + struct xfs_kobj *kobj = to_kobj(kobject); + + return container_of(kobj, struct xfs_mount, m_kobj); +} + +#ifdef DEBUG + +STATIC ssize_t +fail_writes_store( + struct kobject *kobject, + const char *buf, + size_t count) +{ + struct xfs_mount *mp = to_mp(kobject); + int ret; + int val; + + ret = kstrtoint(buf, 0, &val); + if (ret) + return ret; + + if (val == 1) + mp->m_fail_writes = true; + else if (val == 0) + mp->m_fail_writes = false; + else + return -EINVAL; + + return count; +} + +STATIC ssize_t +fail_writes_show( + struct kobject *kobject, + char *buf) +{ + struct xfs_mount *mp = to_mp(kobject); + + return snprintf(buf, PAGE_SIZE, "%d\n", mp->m_fail_writes ? 1 : 0); +} +XFS_SYSFS_ATTR_RW(fail_writes); + +#endif /* DEBUG */ + +static struct attribute *xfs_mp_attrs[] = { +#ifdef DEBUG + ATTR_LIST(fail_writes), +#endif + NULL, +}; + +struct kobj_type xfs_mp_ktype = { + .release = xfs_sysfs_release, + .sysfs_ops = &xfs_sysfs_ops, + .default_attrs = xfs_mp_attrs, +}; + #ifdef DEBUG /* debug */ -- 2.4.3 From bfoster@redhat.com Fri Mar 4 08:40:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 26BB37CA3 for ; Fri, 4 Mar 2016 08:40:38 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8FBF7AC003 for ; Fri, 4 Mar 2016 06:40:37 -0800 (PST) X-ASG-Debug-ID: 1457102432-04cbb00b721b3fa0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QhxCgtrCr3QgTOTU (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 06:40:33 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id E0FC22DC377 for ; Fri, 4 Mar 2016 14:40:32 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-186.bos.redhat.com [10.18.41.186]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u24EeWSB012669 for ; Fri, 4 Mar 2016 09:40:32 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 5FC4F12262B; Fri, 4 Mar 2016 09:40:31 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 2/4] xfs: update freeblocks counter after extent deletion Date: Fri, 4 Mar 2016 09:40:29 -0500 X-ASG-Orig-Subj: [PATCH 2/4] xfs: update freeblocks counter after extent deletion Message-Id: <1457102431-5215-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1457102431-5215-1-git-send-email-bfoster@redhat.com> References: <1457102431-5215-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: 1457102433 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_bunmapi() currently updates the fdblocks counter, unreserves quota, etc. before the extent is deleted by xfs_bmap_del_extent(). The function has problems dividing up the indirect reserved blocks for scenarios where a single delalloc extent is split in two. Particularly, there aren't always enough blocks reserved for multiple extents in a single extent reservation. The solution to this problem is to allow the extent removal code to steal from the deleted extent to meet indirect reservation requirements. Move the block of code in xfs_bmapi() that updates the fdblocks counter to after the call to xfs_bmap_del_extent() to allow the codepath to update the extent record before the free blocks are accounted. Also, reshuffle the code slightly so the delalloc accounting occurs near the xfs_bmap_del_extent() call to provide context for the comments. Signed-off-by: Brian Foster Reviewed-by: Christoph Hellwig --- fs/xfs/libxfs/xfs_bmap.c | 58 ++++++++++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index cb58d72..f57a9e9 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -5296,31 +5296,7 @@ xfs_bunmapi( goto nodelete; } } - if (wasdel) { - ASSERT(startblockval(del.br_startblock) > 0); - /* Update realtime/data freespace, unreserve quota */ - if (isrt) { - xfs_filblks_t rtexts; - rtexts = XFS_FSB_TO_B(mp, del.br_blockcount); - do_div(rtexts, mp->m_sb.sb_rextsize); - xfs_mod_frextents(mp, (int64_t)rtexts); - (void)xfs_trans_reserve_quota_nblks(NULL, - ip, -((long)del.br_blockcount), 0, - XFS_QMOPT_RES_RTBLKS); - } else { - xfs_mod_fdblocks(mp, (int64_t)del.br_blockcount, - false); - (void)xfs_trans_reserve_quota_nblks(NULL, - ip, -((long)del.br_blockcount), 0, - XFS_QMOPT_RES_REGBLKS); - } - ip->i_delayed_blks -= del.br_blockcount; - if (cur) - cur->bc_private.b.flags |= - XFS_BTCUR_BPRV_WASDEL; - } else if (cur) - cur->bc_private.b.flags &= ~XFS_BTCUR_BPRV_WASDEL; /* * If it's the case where the directory code is running * with no block reservation, and the deleted block is in @@ -5342,11 +5318,45 @@ xfs_bunmapi( error = -ENOSPC; goto error0; } + + /* + * Unreserve quota and update realtime free space, if + * appropriate. If delayed allocation, update the inode delalloc + * counter now and wait to update the sb counters as + * xfs_bmap_del_extent() might need to borrow some blocks. + */ + if (wasdel) { + ASSERT(startblockval(del.br_startblock) > 0); + if (isrt) { + xfs_filblks_t rtexts; + + rtexts = XFS_FSB_TO_B(mp, del.br_blockcount); + do_div(rtexts, mp->m_sb.sb_rextsize); + xfs_mod_frextents(mp, (int64_t)rtexts); + (void)xfs_trans_reserve_quota_nblks(NULL, + ip, -((long)del.br_blockcount), 0, + XFS_QMOPT_RES_RTBLKS); + } else { + (void)xfs_trans_reserve_quota_nblks(NULL, + ip, -((long)del.br_blockcount), 0, + XFS_QMOPT_RES_REGBLKS); + } + ip->i_delayed_blks -= del.br_blockcount; + if (cur) + cur->bc_private.b.flags |= + XFS_BTCUR_BPRV_WASDEL; + } else if (cur) + cur->bc_private.b.flags &= ~XFS_BTCUR_BPRV_WASDEL; + error = xfs_bmap_del_extent(ip, tp, &lastx, flist, cur, &del, &tmp_logflags, whichfork); logflags |= tmp_logflags; if (error) goto error0; + + if (!isrt && wasdel) + xfs_mod_fdblocks(mp, (int64_t)del.br_blockcount, false); + bno = del.br_startoff - 1; nodelete: /* -- 2.4.3 From bfoster@redhat.com Fri Mar 4 08:40:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 548FB7CA6 for ; Fri, 4 Mar 2016 08:40:38 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C0A22AC004 for ; Fri, 4 Mar 2016 06:40:34 -0800 (PST) X-ASG-Debug-ID: 1457102432-04cb6c5831181780001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id AJcFyxGMuHuwR1yC (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 06:40:33 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id A03C9D4E61 for ; Fri, 4 Mar 2016 14:40:32 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-186.bos.redhat.com [10.18.41.186]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u24EeWrx012667 for ; Fri, 4 Mar 2016 09:40:32 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4AF78125041; Fri, 4 Mar 2016 09:40:31 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 0/4] fix up indlen reservations on extent split Date: Fri, 4 Mar 2016 09:40:27 -0500 X-ASG-Orig-Subj: [PATCH v3 0/4] fix up indlen reservations on extent split Message-Id: <1457102431-5215-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Fri, 04 Mar 2016 14:40:32 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1457102433 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, Here's v3 of the delalloc indlen reservation fix. This version incorporates Christoph's review feedback from v2. The test instrumentation patch is updated to better compile out bits in !DEBUG mode and patch 3/3 from v2 is split into two patches. The first refactors the code and creates the new helper. The second updates the mechanism to implement block borrowing from the data extent. As a note, I investigated burying the DEBUG mode stuff down in xfs_get_blocks(). The hope was that we could artificially mark the buffers as new to maintain the aggressive block tossing behavior, but as it turns out, the buffer_new() state is not returned out of that context. __block_write_begin() zeroes and clears any new buffers in the event of an error. This does raise the question of how relevant the buffer_new() checks are in xfs_vm_write_failed(), but that's a separate issue. Thoughts, reviews, flames appreciated. Brian v3: - Drop RFC from test instrumentation patch. - Update test instrumentation patch to use inline helper and compile more out in !DEBUG mode. - Split block borrowing patch into 2 patches. v2: http://oss.sgi.com/pipermail/xfs/2016-February/047300.html - Rebase to latest for-next branch. - Include RFC test instrumentation patch. v1: http://oss.sgi.com/archives/xfs/2014-10/msg00294.html - xfs_bunmapi() code into independent patch. - Refactor fix into separate helper function. rfc: http://oss.sgi.com/archives/xfs/2014-09/msg00337.html Brian Foster (4): xfs: debug mode forced buffered write failure xfs: update freeblocks counter after extent deletion xfs: refactor delalloc indlen reservation split into helper xfs: borrow indirect blocks from freed extent when available fs/xfs/libxfs/xfs_bmap.c | 161 ++++++++++++++++++++++++++++++++++------------- fs/xfs/xfs_aops.c | 9 ++- fs/xfs/xfs_mount.h | 25 ++++++++ fs/xfs/xfs_sysfs.c | 78 ++++++++++++++++++++--- 4 files changed, 219 insertions(+), 54 deletions(-) -- 2.4.3 From bfoster@redhat.com Fri Mar 4 08:40:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E8A0F7CA2 for ; Fri, 4 Mar 2016 08:40:37 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B94AD8F8035 for ; Fri, 4 Mar 2016 06:40:34 -0800 (PST) X-ASG-Debug-ID: 1457102433-04cb6c5833181790001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Lvi6lDJeSOfuFqAE (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 06:40:33 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id E2FF032E890 for ; Fri, 4 Mar 2016 14:40:32 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-186.bos.redhat.com [10.18.41.186]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u24EeWvO012671 for ; Fri, 4 Mar 2016 09:40:32 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 7B0A6125E60; Fri, 4 Mar 2016 09:40:31 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 4/4] xfs: borrow indirect blocks from freed extent when available Date: Fri, 4 Mar 2016 09:40:31 -0500 X-ASG-Orig-Subj: [PATCH 4/4] xfs: borrow indirect blocks from freed extent when available Message-Id: <1457102431-5215-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1457102431-5215-1-git-send-email-bfoster@redhat.com> References: <1457102431-5215-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: 1457102433 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_bmap_del_extent() handles extent removal from the in-core and on-disk extent lists. When removing a delalloc range, it updates the indirect block reservation appropriately based on the removal. It currently enforces that the new indirect block reservation is less than or equal to the original. This is normally the case in all situations except for in certain cases when the removed range creates a hole in a single delalloc extent, thus splitting a single delalloc extent in two. It is possible with small enough extents to split an indlen==1 extent into two such slightly smaller extents. This leaves one extent with 0 indirect blocks and leads to assert failures in other areas (e.g., xfs_bunmapi() if the extent happens to be removed). Update the indlen distribution code to steal blocks from the deleted extent, if necessary, to satisfy the worst case total indirect reservation for the new extents. This is safe as the caller does not update the fdblocks counters until the extent is removed. Blocks stolen in this manner simply remain accounted as allocated, having ownership transferred from the data extent to an indirect reservation. As a precaution, fall back to the original reservation algorithm if the new indlen requirement is not met and warn if we end up with extents without any reservation at all to detect this more easily in the future. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_bmap.c | 46 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 27e6689..2c3080f 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -4727,26 +4727,43 @@ error0: * * Given the original reservation and the worst case indlen for the two new * extents (as calculated by xfs_bmap_worst_indlen()), split the original - * reservation fairly across the two new extents. + * reservation fairly across the two new extents. If necessary, steal available + * blocks from a deleted extent to make up a reservation deficiency (e.g., if + * ores == 1). The number of stolen blocks is returned. The availability and + * subsequent accounting of stolen blocks is the responsibility of the caller. */ -static void +static xfs_filblks_t xfs_bmap_split_indlen( xfs_filblks_t ores, /* original res. */ xfs_filblks_t *indlen1, /* ext1 worst indlen */ - xfs_filblks_t *indlen2) /* ext2 worst indlen */ + xfs_filblks_t *indlen2, /* ext2 worst indlen */ + xfs_filblks_t avail) /* stealable blocks */ { xfs_filblks_t nres; /* new total res. */ xfs_filblks_t temp; xfs_filblks_t temp2; + xfs_filblks_t stolen = 0; temp = *indlen1; temp2 = *indlen2; nres = temp + temp2; /* - * The only blocks available are those reserved for the original extent. - * Therefore, we have to skim blocks off each of the new reservations so - * long as the new total reservation is greater than the original. + * Steal as many blocks as we can to try and satisfy the worst case + * indlen for both new extents. + */ + while (nres > ores && avail) { + nres--; + avail--; + stolen++; + } + + /* + * The only blocks available are those reserved for the original + * extent and what we can steal from the extent being removed. + * If this still isn't enough to satisfy the combined + * requirements for the two new extents, skim blocks off of each + * of the new reservations until they match what is available. */ while (nres > ores) { if (temp) { @@ -4763,6 +4780,8 @@ xfs_bmap_split_indlen( *indlen1 = temp; *indlen2 = temp2; + + return stolen; } /* @@ -5029,20 +5048,27 @@ xfs_bmap_del_extent( XFS_IFORK_NEXT_SET(ip, whichfork, XFS_IFORK_NEXTENTS(ip, whichfork) + 1); } else { + xfs_filblks_t stolen; ASSERT(whichfork == XFS_DATA_FORK); /* * Distribute the original indlen reservation across the - * two new extents. + * two new extents. Steal blocks from the deleted extent + * if necessary. Stealing blocks simply fudges the + * fdblocks accounting in xfs_bunmapi(). */ temp = xfs_bmap_worst_indlen(ip, got.br_blockcount); temp2 = xfs_bmap_worst_indlen(ip, new.br_blockcount); - xfs_bmap_split_indlen(da_old, &temp, &temp2); - da_new = temp + temp2; + stolen = xfs_bmap_split_indlen(da_old, &temp, &temp2, + del->br_blockcount); + da_new = temp + temp2 - stolen; + del->br_blockcount -= stolen; /* - * Set the reservation for each extent. + * Set the reservation for each extent. Warn if either + * is zero as this can lead to delalloc problems. */ + WARN_ON_ONCE(!temp || !temp2); xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); new.br_startblock = nullstartblock((int)temp2); } -- 2.4.3 From JACKPOT@HOTLINE.COM Fri Mar 4 09:05:22 2016 Return-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_FORGED_REPLYTO, T_HK_SPAMMY_FILENAME 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 9D50A7CAF for ; Fri, 4 Mar 2016 09:05:21 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8DB7AAC003 for ; Fri, 4 Mar 2016 07:05:17 -0800 (PST) X-ASG-Debug-ID: 1457103910-04cb6c5830182310001-NocioJ Received: from mail.abc.com ([40.122.170.254]) by cuda.sgi.com with ESMTP id 9MeoQO7iV8kStDv8; Fri, 04 Mar 2016 07:05:10 -0800 (PST) X-Barracuda-Envelope-From: JACKPOT@HOTLINE.COM X-Barracuda-Apparent-Source-IP: 40.122.170.254 Received: from [40.122.170.254] (localhost [IPv6:::1]) by mail.abc.com (Postfix) with ESMTP id 02EB620CA2; Fri, 4 Mar 2016 15:05:10 +0000 (UTC) Received: from 210.195.177.241 (SquirrelMail authenticated user admin) by 40.122.170.254 with HTTP; Fri, 4 Mar 2016 15:05:10 -0000 Message-ID: <807d275a9df9135d38b51163f24c84f8.squirrel@40.122.170.254> Date: Fri, 4 Mar 2016 15:05:10 -0000 Subject: NOTICE From: "LOTERIAL NACIONA" X-ASG-Orig-Subj: NOTICE Reply-To: williams_christoph@yahoo.com User-Agent: SquirrelMail/1.4.22 MIME-Version: 1.0 Content-Type: multipart/mixed;boundary="----=_20160304150510_67401" X-Priority: 3 (Normal) Importance: Normal To: undisclosed-recipients:; X-Barracuda-Connect: UNKNOWN[40.122.170.254] X-Barracuda-Start-Time: 1457103910 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE, TVD_PH_SUBJ_META X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27571 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 TVD_PH_SUBJ_META TVD_PH_SUBJ_META 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS ------=_20160304150510_67401 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit FINAL AWARD WINNING PRIZE NOTIFICATION ------=_20160304150510_67401 Content-Type: application/pdf; name="AWARD NOTICE,.pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="AWARD NOTICE,.pdf" JVBERi0xLjMNCiXi48/TDQoxIDAgb2JqDQo8PC9UeXBlL1BhZ2UvUmVzb3VyY2VzPDwvWE9iamVj dDw8L0ltYWdlNSAyIDAgUi9JbWFnZTggNCAwIFIvTWV0YTExIDYgMCBSL0ltYWdlMzYgNyAwIFIv SW1hZ2UzOCA5IDAgUj4+L0V4dEdTdGF0ZTw8L0dTNyAxMSAwIFIvR1MxMCAxMiAwIFI+Pi9Gb250 PDwvRjEgMTMgMCBSL0YyIDE2IDAgUi9GMyAxOSAwIFIvRjQgMjMgMCBSL0Y1IDI3IDAgUi9GNiAz MSAwIFIvRjcgMzkgMCBSL0Y4IDQ3IDAgUi9GOSA1MCAwIFI+Pi9Qcm9jU2V0Wy9QREYvVGV4dC9J bWFnZUIvSW1hZ2VDL0ltYWdlSV0+Pi9NZWRpYUJveFswIDAgNTk1LjU2MCA4NDIuMDQwXS9Db250 ZW50cyA1MyAwIFIvR3JvdXA8PC9UeXBlL0dyb3VwL1MvVHJhbnNwYXJlbmN5L0NTL0RldmljZVJH Qj4+L1RhYnMvUy9TdHJ1Y3RQYXJlbnRzIDAvQXJ0Qm94WzAgMCA1OTUuNTYwIDg0Mi4wNDBdL0Ny b3BCb3hbMCAwIDU5NS41NjAgODQyLjA0MF0vUGFyZW50IDE3MSAwIFI+Pg0KZW5kb2JqDQoyIDAg b2JqDQo8PC9UeXBlL1hPYmplY3QvU3VidHlwZS9JbWFnZS9XaWR0aCAzMjEvSGVpZ2h0IDMzNi9D b2xvclNwYWNlL0RldmljZVJHQi9CaXRzUGVyQ29tcG9uZW50IDgvRmlsdGVyL0RDVERlY29kZS9J bnRlcnBvbGF0ZSB0cnVlL1NNYXNrIDMgMCBSL0xlbmd0aCAxNDI2Nj4+c3RyZWFtDQr/2P/gABBK RklGAAEBAQBgAGAAAP/hAFpFeGlmAABNTQAqAAAACAAFAwEABQAAAAEAAABKAwMAAQAAAAEAAAAA URAAAQAAAAEBAAAAUREABAAAAAEAAA7DURIABAAAAAEAAA7DAAAAAAABhqAAALGP/9sAQwAIBgYH BgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04Mjwu MzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjIy/8AAEQgBUAFBAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAAB AgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNC scEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0 dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY 2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//E ALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoW JDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWG h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp 6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A9+ooooAKKKKACiiigCm9/bpqUNg8hFzNFJNGmw/MiFAx z04Mifn7GpLgXDW8q28kcc5QiN5ELqrY4JUEEjPbIz6irFFAFOwlln0+2mlbfI8SszeQ0OSQCT5b ksn+6xyOh5FXKKKAK9vG0UEcck8k7KgVpJAoZyB947QBk9eAB6AUXEEVwgSaKOVA6uFdQwDKwZTg 9wwBB7EA1YooAKr3BuFt5Wt445JwhMaSOUVmxwCwBIGe+Dj0NK8yxPCjCQtK+xdsbMAdpb5iBhRh TycDOB1IBnoAKKKKACiiigAqndXDKZIIkcy+XuDKOmTirlUb5I0jkn8xo5Nm1SGxnHIoAPNa1ZxN 5jxkqFcgHk//AF6vVQCrNceXK7Z2o4Tdxn/Iq/QAUUUUAFFFFABRRRQAUUUUAFFQTzLAu9xIVLqg CRs5yzBRwoJxkjJ6AZJwATU9ABRRVW3u/Pnu4vImi+zzCLfKm1Zcor7kP8S/Ptz/AHlYdqALVFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUVXaeEXKW5lQTyIzpGWG5lUgMQOpALKCe24e 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 CNfypklnBJ1jAOMZHFADbS3it1cQyb1Jz1BxVqq9tapaq4QnDHJzVigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAqoJZLe0hN2/mTZSOR4IGwzsQuQgLFVyc8k7RyTgE1booAgWN xcSSGeQo6KoiIXapBOWHGcnIBySPlGAOcz0UUAFFU7q8S18hSC8k8qxRx7lVnJ5ONxGdqhnIHO1W wCRirlABRRRQAVAkKxPM6mQtK+9t0jMAdoX5QThRhRwMDOT1JJnooArxzwyyTpHNG7QvskVXBKNt DYYdjtZTg9iD3qxVe3git0KQxRxIXZyqKFBZmLMcDuWJJPckmrFABRRRQAUUUUAFQQO8iFnhkiId l2uVJIDEBvlJGCACO+CMgHIE9FABUCxuLiSQzyFHRVERC7VIJyw4zk5AOSR8owBzmeigAooooAKK KKACiiigD//ZDQplbmRzdHJlYW0NCmVuZG9iag0KMyAwIG9iag0KPDwvVHlwZS9YT2JqZWN0L1N1 YnR5cGUvSW1hZ2UvV2lkdGggMzIxL0hlaWdodCAzMzYvQ29sb3JTcGFjZS9EZXZpY2VHcmF5L01h dHRlWzAgMCAwXS9CaXRzUGVyQ29tcG9uZW50IDgvSW50ZXJwb2xhdGUgZmFsc2UvRmlsdGVyL0Zs YXRlRGVjb2RlL0xlbmd0aCAzNTU+PnN0cmVhbQ0KeJzt3cuSgjAQBdD+/5/G1cxo6VBIIOlOzllY uLHipfMgWLJtd4pbPx3eqbnvhMD6kjcXiH+OOUhoAMCVMq8t0rXtU4PSNRIAYIe1S5v4eDhYnpbQ lzMPAOuyDmglwWYiBKjGyA0AAEzOZQ/ACqLOgF+lnQAAAAAMYgPpjywAYBGx+xZuFSoOatOFAYDC PJClldQAAACKc2EHAFCWpRwAQ5mIAADqspaD7nQ7AAAAgDrs5QBspR5Dl5DoAABgR/y+wAiKr5E/ 77yQAElGSdKbmjshng8lyEDKj4SUZRv5AQAAAAAAAMzEXWDGUoEAAAAAAAAAAEzCT2EAAIBZuL4B AAAAFmIrBAAAAADOsrsGABxk2QD16ccAVGcue3YiDQECAAAAAAAAMA93wQEWZPBnGMVHb2oOAAB6 sfoGWJDB/0eWJLK045harYXLzdEF5vgWxTkJbeQHwCszA0NlLsAH1MZvkg0KZW5kc3RyZWFtDQpl bmRvYmoNCjQgMCBvYmoNCjw8L1R5cGUvWE9iamVjdC9TdWJ0eXBlL0ltYWdlL1dpZHRoIDM0Ni9I ZWlnaHQgMzQyL0NvbG9yU3BhY2UvRGV2aWNlUkdCL0JpdHNQZXJDb21wb25lbnQgOC9GaWx0ZXIv RENURGVjb2RlL0ludGVycG9sYXRlIHRydWUvU01hc2sgNSAwIFIvTGVuZ3RoIDE4NzI4Pj5zdHJl YW0NCv/Y/+AAEEpGSUYAAQEBANwA3AAA/+EAWkV4aWYAAE1NACoAAAAIAAUDAQAFAAAAAQAAAEoD AwABAAAAAQAAAABREAABAAAAAQEAAABREQAEAAAAAQAAIdVREgAEAAAAAQAAIdUAAAAAAAGGoAAA sY//2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAFWAVoDASIAAhEBAxEB/8QAHwAAAQUBAQEB AQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1Fh ByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZ WmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG x8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAEC AwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHB CSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0 dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX 2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD5/ooooAKKKKACiiigAooooAKKKVVZ 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 K5iubeQZSWFw6MPYjg1NiiwBS4pBS0wCiiigAooooAKjnnjtreW4mYJFEhd2J4AAyTUledfG3xAN C+Gt7EhYT6iws48ejZL59tgYfiKAPlnxJrMviLxLqWsSja15cPKFznaCeF/AYH4Vl0UUAFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FAGhpWuaroVyLjStRurOUH70EpXP1x1H1r07w9+0J4n0xUh1e3ttWiB5kYeVLj03L8v/AI7XkNFA H1l4f+Ovg3Whsu7ibSZ8gbLxPlb6OuRj/exXo1pe2t/brcWdzDcQsMrJDIHU/Qivger+k65quhXJ uNJ1G6spmGGa3lKbh6HHUexoA+8KK+XfD37QnifTWjj1i3ttWt1GGJHkyn/gSjb/AOO8+teq+Hvj t4O1oxxXc8ulXLnbtu1+TP8A10GQB7tigD02ioLS9tNQt1uLK6huYW6SQyB1P4jip6ACvmX9onxC L/xZZaJDITHp0G+VR0EsmD+ihfzNfS088Vrby3E8ixwxIXd2OAqgZJP4V8M+Jdal8ReJtS1eYktd 3DSAH+Fc/KPwGB+FAGVRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAXtM1rVNFn8/S9RurKTIJa3lZM49 cHn8a9P0H9oXxTpxCatb2urR+rL5Mn/fSjH/AI7RRQB2Pi74vWXiP4U6tLpdnd29xOEtZBOF2qHO GwQeflDDOB1r5xoooAKKKKACiiigAooooAKKKKACiiigD//ZDQplbmRzdHJlYW0NCmVuZG9iag0K NSAwIG9iag0KPDwvVHlwZS9YT2JqZWN0L1N1YnR5cGUvSW1hZ2UvV2lkdGggMzQ2L0hlaWdodCAz NDIvQ29sb3JTcGFjZS9EZXZpY2VHcmF5L01hdHRlWzAgMCAwXS9CaXRzUGVyQ29tcG9uZW50IDgv SW50ZXJwb2xhdGUgZmFsc2UvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAzNTAzPj5zdHJlYW0N Cnic7Z2Jd1XVFcZv5omQMINM4ogEEiASiASBolRrXVarVkWssyJiUUA0IDOCoBQRB6Q41FWtrZ2W 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 tlwnLNPa80jm7FF+5XLI/wIseCxSDQplbmRzdHJlYW0NCmVuZG9iag0KNyAwIG9iag0KPDwvVHlw ZS9YT2JqZWN0L1N1YnR5cGUvSW1hZ2UvV2lkdGggMjUwL0hlaWdodCAxMjgvQ29sb3JTcGFjZS9E ZXZpY2VSR0IvQml0c1BlckNvbXBvbmVudCA4L0ludGVycG9sYXRlIGZhbHNlL1NNYXNrIDggMCBS L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMjUxNT4+c3RyZWFtDQp4nO2dPa7dNhBGlTWkyQJS ZRHZhaHVeAneRTq7M14TIOkCJE2aB8Sd4TKVmxipQ4QxQ5Mzw49/Eq/0HajQ05WokXguNaT0dLeN lNlf7GeHYLF4eOSxWFynxcMjj8XiOi0eHnksFtdp8fDIYxHr5OafXr85fUpCOuOskGuyoFoLhkSu wYJqLRgSuQYLqrVgSOQaDFHr7S8f3n345OfdzMtX708PiZCcZrWc4fG8ZrubDx/NDokQm2a1YqVp O3kIjrTdzSDm03YyiSq14uylzXYkpaftZBJVaiUah3naTh4C2k7uA20n94G2k/twou1xn7c5JEJw imrFY4aa7a8//vD9H9+6md8//uRm3ORmwmq1Q/G0nUyiqJY26ujmneTbZ9W97WHefxTPb5LtYmJD 28kkbLWcn6LtouGbYrv/aKPt5GxstZzqou2xxqDtPsmh7eREbLWcjbHtISdpsD18FKf0YupO28kk cNu9rt7VHttDYkPbycHgthc13mg7WRvaTu4D3ksda7v7k7aTgxlre3J3ybY9GaIBQyKkmaJaTstY XXFo0W345zff/f32x79+/tXNuOnp9ZsNsD0M8lSFREgbRbWShjrY7lZ2k9PbiR0Md8L7eTe51WLz RdtDDl8VEiFt2Gr5zCR/DCAo7fQu2u4/CkkObSdnYasV5xtxQt5gu7sKuPJpOzmRKtt9fr412R4+ Ekdv8JAIacZWKxYyWL312e4/ou3keHDbRY3bbHfztJ0cD20n9wHJ2/0Q4ljb3RLaTg4GsT1Rd9Nt D3eXENt9jzU8AAyGREgzxfH2fBwmnk/uLoV50HZRZtpOJlFUK1d3+1Ljl6/ef/X1b+LkvymG7b60 2pAIacNWKyi6Zba7lTXJ88l9I+Ikh7aTU7DVEsfYjcbcnmg7ORdbrTx7qWrStdwmtt21+VUhEdJM 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 YW0NCmVuZG9iag0KOCAwIG9iag0KPDwvVHlwZS9YT2JqZWN0L1N1YnR5cGUvSW1hZ2UvV2lkdGgg MjUwL0hlaWdodCAxMjgvQ29sb3JTcGFjZS9EZXZpY2VHcmF5L01hdHRlWzAgMCAwXS9CaXRzUGVy Q29tcG9uZW50IDgvSW50ZXJwb2xhdGUgZmFsc2UvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAx MDEwPj5zdHJlYW0NCnic7ZjRlqQgDET5/5/OnplZbVKpANqICqmHHYGQ1DWofTalqyWndLmtAQry IA/yRcgv3fBUBfl1G54qB+RnjgPOTC4pIzeUQf56tZCrgFnJJQV5kAe5s+G9CvJtmDxy4RveqwxE kiL/WzAf9qnJf6n/yGUF8u1MS5BnF2lZ8v/TesPLpcnzNgd5kK9KLiuT44aXK/8lo6mXJJe1yLHf Ith82PByBXkD+cTv9iAn5BLkQf5+BXkDOW54uRSTIbctn5Gc9Xwpcl+44eU6QD77Gy7IGTkc/HeL YAV5kAd5CvI5yDPVySdVtefTogd5kAd5kAf5fAry5cAX/g0X5OuB19DvdneplgUvkd9t7WqtS+6i 3+1rgFbl/tGy4AnZ73YzVqtyT6N39q7HkesEPvj814o1eOlltxt5W5pO5EfNuU6C/PtM30bVk/R6 NPt96Ib1vJOeQJ5PwLLNCBMmvJVDOHlhv47MRpDFscRq7VPoxiyl/Z/fWfDOSbLYArno8XZBvehS bCOzZLzRbeAGlpQtZp6Q43yJXMg2nduG1i2htcI+d6kh/BA57Gbkjc7qcWhM/dGRJCX9k/QfViEZ cnxw0JAmh1liumSpSJ5y46yozU/bY3vrPOat5BR5r2TcU0uMPAcukyeoZM4zNNac02/ITRfQASbX lpw9+gItu+Q5FQWEmO967pVS2d24ZnJVjJM7dtgD7c9q4oPkeNpLlrQJDXyQHOyUz7X0JAd0vOKW tAkIOUNO7ziF9MEPk+tSSM4tgQkOnPQVnCh6pDQRIy+0vI08JSetuaCWTpCbZA45ZOpOvmU3pXzy PA4qmvvheKmTg9cW8myVk0MNyb0Yci+JQ25eS9mA8VmzLBMcTDtnCpaSgZfCq7VoSfzFfuQa3D0G B8iTGnlrRUsCi/g+5hkpOXYZMlXJ3duI08aYb7pgyZAbYyalP5tVcxAPkqdPIOaGLGR0xNIA6ebU 4kY4GqXlyRvjBhgaplaiSclb46Yin0q8OzhLPp8dqtyrLuTVGxLkT1KQl2dXJy8nCfL2Krfp103m KfPfQP45+fAcwDMBVbwHZqTwwTXuTSzdjImcrHBb7kQXz9NunwfbCbUIaf3haF4KYy3WyFX0OfLb 0JFRD5vI0/afJuQNoe6DN7xHZU9N5J8IGKUm8rvQWa8/cI3k5KugF1kVEz9YZ8hxvE/auzAtOf2S 4cKc5PrAY/eFoj6Z3KyqMVqFG6XO/QvJ1ayOFr0/AWcr+SPe7dZb0rM6em+ywK4y+TO/55pBPGtA 7v40o+8Lt8pNQhOXkLuBN4Lb228cOsGAoNb5RyKLfAD4RpfZQBKMZbAQoNNKpcp5/QOHkaHaDQpl bmRzdHJlYW0NCmVuZG9iag0KOSAwIG9iag0KPDwvVHlwZS9YT2JqZWN0L1N1YnR5cGUvSW1hZ2Uv V2lkdGggMTI1L0hlaWdodCAyNy9Db2xvclNwYWNlL0RldmljZVJHQi9CaXRzUGVyQ29tcG9uZW50 IDgvSW50ZXJwb2xhdGUgZmFsc2UvU01hc2sgMTAgMCBSL0ZpbHRlci9GbGF0ZURlY29kZS9MZW5n dGggOTgyPj5zdHJlYW0NCnic7ZqxjtQwEIZDT3NPQMm2Wxx07ANQ0PMISCCdrtlqGwpKSgoegHdA dLwYY//J7/F47Di5wOq4jKxTknXs8efx74l1w7CFnQ/Pv77esEiD73/ebeLa/2znw3A5bll27D12 Prz89m6rxt7++Lhj77JNsX/69eXZ3Ysd+7x1YBeYQlL+fv79fbbmjr3LmtgFoOiGVJCC7VLUWy5q YHfsveZhl6iWhwJcijBEAXldSrxPBDvIhI1stRXYhbkgZcssgC8XDfIl9rKdWaVCO+vGhbfk9dk6 D4qNmLDJSHvG4luOPTgclYTRXhYT8xqOE+3RQ1sux7bD0ru0E2ouH468yBGFXmJam03E5Sh1gmau tfBuHNdW2KVBucXuKX9ZsKXiAmrvfh+V2EcP4zyGjnSGXzfUXEEG3WXY40Rr7KbOCtsWOyIZcU5J L0sp8uRTxa485JO2FGxiLvaH2yx2imRVyhR2MGdg14pLHuPqwT7G/IQCbeInqUPJkmu+outgRGwf q4+3+i0kBlxruhdW46LWxMxtCbCNPSkkSx07AgMMIQi1kiJcKQYaaWAvn4yji2qMoQVvo/gYbZdr KPaYxMbdIbzOjYOSpbSdGa/dAeM1Vig6Cn1NpmU/dZf30sAuTzAKTCiqObnBhB0xjDQAhVHBgufl rkqdaWg7Wk7yzolQhznU81Qtr4NtRd/aac1jQEd7GruqY1RIPKf/GAt8CE9UqCzQdtWXwQ5/NMCe aEeDWcw3sZtkxkAwyYaDfXrFgMIpkIu9rOyjULfhby19Um73YNcR0sCu1aO9AQnVWrRjibnYOaF2 xXnL8F9iz7ImL31KAPuwj3OHLpZEezvgqyftfVuqtWtj158qEK7MeQ2wA/voTy6PLnY85NkLSi3g 8Q2rp4bXjxQ7nzgZlwFYYC8pYaZcBctsqoNtF/mDG8wmzpEAUOfhz6PHrj/iyi3AYJ+UU693/ETJ ncU+TDpTw24KmS/9XLoC9jxvL1H4IsycYYrJJEHuiUf0IYwda0Tlrm3s3CsN0lnmWifdM5nWqVF+ ipI4FNk4sWOhEXuWeBfDHJPAuJBHH2IdvXXCbeN58kFJEAXZLXgRco1bfM018nb2hYBvkC+FyPjv nkD6zCtnhuYE0hxd6p/wYWtqms9Mbli6jvlsd53UAHvONhdYsQSS1JxuDN4wF6cbMyM6jJ/IefsG 5ikPYh6QTWkwH3bs/RbjmaeLXEQ6n7z98ObV/clk73rV68PJYf/PgTkbz22ikjMh1BXK7yM8sfvj 1ILe+3ZrmDnUdfMNHoI1jpd1+csuX9n+AAKxBGsNCmVuZHN0cmVhbQ0KZW5kb2JqDQoxMCAwIG9i ag0KPDwvVHlwZS9YT2JqZWN0L1N1YnR5cGUvSW1hZ2UvV2lkdGggMTI1L0hlaWdodCAyNy9Db2xv clNwYWNlL0RldmljZUdyYXkvTWF0dGVbMCAwIDBdL0JpdHNQZXJDb21wb25lbnQgOC9JbnRlcnBv bGF0ZSBmYWxzZS9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDI2MD4+c3RyZWFtDQp4nOXUSxKE IAwE0Nz/0pmFGrqTRnFEZjFUqYjA4xMxk8nPkm4yL/0YPxnW3+C80kvxvNPrcBFoU3Hd2Vaownx7 1LgX/WBRj1HFKLDu/OkSp2aPcF+GC5vwXtuR/utHynZOuYpvGb7aDcfs+Akf1urtuLQBt8BbeV0k bOZqSPxbjeLYwRXe8gaXd86vm/jRkogacL7vUlCI15lTaFQcxnsTj85oz8dnzos1iPPYwYsfCfA0 8Wf4sZpct49PnbmMj6iPyy51+wrPzbCac2Yu3kKL8Gy2OnAMZdvwLnGDDB2G0S9TNUWHHfzVhH8j 2WvwWK204e/jPNP88jJOCkf2TPsDJLzuSg0KZW5kc3RyZWFtDQplbmRvYmoNCjExIDAgb2JqDQo8 PC9UeXBlL0V4dEdTdGF0ZS9CTS9Ob3JtYWwvY2EgMT4+DQplbmRvYmoNCjEyIDAgb2JqDQo8PC9U eXBlL0V4dEdTdGF0ZS9CTS9Ob3JtYWwvQ0EgMT4+DQplbmRvYmoNCjEzIDAgb2JqDQo8PC9UeXBl L0ZvbnQvU3VidHlwZS9UcnVlVHlwZS9OYW1lL0YxL0Jhc2VGb250L1RpbWVzIzIwTmV3IzIwUm9t YW4vRW5jb2RpbmcvV2luQW5zaUVuY29kaW5nL0ZvbnREZXNjcmlwdG9yIDE0IDAgUi9GaXJzdENo YXIgMzIvTGFzdENoYXIgMTIyL1dpZHRocyAxNSAwIFI+Pg0KZW5kb2JqDQoxNCAwIG9iag0KPDwv VHlwZS9Gb250RGVzY3JpcHRvci9Gb250TmFtZS9UaW1lcyMyME5ldyMyMFJvbWFuL0ZsYWdzIDMy L0l0YWxpY0FuZ2xlIDAvQXNjZW50IDg5MS9EZXNjZW50IC0yMTYvQ2FwSGVpZ2h0IDY5My9BdmdX aWR0aCA0MDEvTWF4V2lkdGggMjYxNC9Gb250V2VpZ2h0IDQwMC9YSGVpZ2h0IDI1MC9MZWFkaW5n IDQyL1N0ZW1WIDQwL0ZvbnRCQm94Wy01NjggLTIxNiAyMDQ2IDY5M10+Pg0KZW5kb2JqDQoxNSAw IG9iag0KWzI1MCAwIDAgMCAwIDAgMCAwIDMzMyAzMzMgMCAwIDI1MCAwIDI1MCAyNzggNTAwIDUw MCA1MDAgNTAwIDUwMCAwIDUwMCA1MDAgNTAwIDUwMCAyNzggMCAwIDAgMCAwIDkyMSA3MjIgNjY3 IDY2NyA3MjIgNjExIDU1NiA3MjIgNzIyIDMzMyAwIDAgNjExIDg4OSA3MjIgNzIyIDAgMCA2Njcg NTU2IDYxMSA3MjIgNzIyIDk0NCAwIDcyMiAwIDAgMCAwIDAgNTAwIDAgNDQ0IDUwMCA0NDQgNTAw IDQ0NCAzMzMgNTAwIDUwMCAyNzggMjc4IDUwMCAyNzggNzc4IDUwMCA1MDAgNTAwIDUwMCAzMzMg Mzg5IDI3OCA1MDAgNTAwIDcyMiA1MDAgNTAwIDQ0NF0NCmVuZG9iag0KMTYgMCBvYmoNCjw8L1R5 cGUvRm9udC9TdWJ0eXBlL1RydWVUeXBlL05hbWUvRjIvQmFzZUZvbnQvVGltZXMjMjBOZXcjMjBS b21hbixCb2xkL0VuY29kaW5nL1dpbkFuc2lFbmNvZGluZy9Gb250RGVzY3JpcHRvciAxNyAwIFIv Rmlyc3RDaGFyIDMyL0xhc3RDaGFyIDEyMS9XaWR0aHMgMTggMCBSPj4NCmVuZG9iag0KMTcgMCBv YmoNCjw8L1R5cGUvRm9udERlc2NyaXB0b3IvRm9udE5hbWUvVGltZXMjMjBOZXcjMjBSb21hbixC b2xkL0ZsYWdzIDMyL0l0YWxpY0FuZ2xlIDAvQXNjZW50IDg5MS9EZXNjZW50IC0yMTYvQ2FwSGVp Z2h0IDY3Ny9BdmdXaWR0aCA0MjcvTWF4V2lkdGggMjU1OC9Gb250V2VpZ2h0IDcwMC9YSGVpZ2h0 IDI1MC9MZWFkaW5nIDQyL1N0ZW1WIDQyL0ZvbnRCQm94Wy01NTggLTIxNiAyMDAwIDY3N10+Pg0K ZW5kb2JqDQoxOCAwIG9iag0KWzI1MCAwIDAgMCAwIDEwMDAgODMzIDAgMzMzIDMzMyAwIDU3MCAy NTAgMzMzIDI1MCAyNzggNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDMz MyAwIDAgMCAwIDAgMCA3MjIgNjY3IDcyMiA3MjIgNjY3IDYxMSA3NzggNzc4IDM4OSA1MDAgNzc4 IDY2NyA5NDQgNzIyIDc3OCA2MTEgNzc4IDcyMiA1NTYgNjY3IDcyMiA3MjIgMTAwMCA3MjIgNzIy IDAgMCAwIDAgMCAwIDAgNTAwIDU1NiA0NDQgNTU2IDQ0NCAzMzMgNTAwIDU1NiAyNzggMCA1NTYg Mjc4IDgzMyA1NTYgNTAwIDU1NiAwIDQ0NCAzODkgMzMzIDU1NiA1MDAgNzIyIDUwMCA1MDBdDQpl bmRvYmoNCjE5IDAgb2JqDQo8PC9UeXBlL0ZvbnQvU3VidHlwZS9UcnVlVHlwZS9OYW1lL0YzL0Jh c2VGb250L0FCQ0RFRStWZXJkYW5hL0VuY29kaW5nL1dpbkFuc2lFbmNvZGluZy9Gb250RGVzY3Jp cHRvciAyMCAwIFIvRmlyc3RDaGFyIDMyL0xhc3RDaGFyIDIwNS9XaWR0aHMgMjIgMCBSPj4NCmVu ZG9iag0KMjAgMCBvYmoNCjw8L1R5cGUvRm9udERlc2NyaXB0b3IvRm9udE5hbWUvQUJDREVFK1Zl cmRhbmEvRmxhZ3MgMzIvSXRhbGljQW5nbGUgMC9Bc2NlbnQgMTAwNS9EZXNjZW50IC0yMDcvQ2Fw SGVpZ2h0IDc2NS9BdmdXaWR0aCA1MDgvTWF4V2lkdGggMjA4My9Gb250V2VpZ2h0IDQwMC9YSGVp Z2h0IDI1MC9TdGVtViA1MC9Gb250QkJveFstNTYwIC0yMDcgMTUyMyA3NjVdL0ZvbnRGaWxlMiAy MSAwIFI+Pg0KZW5kb2JqDQoyMSAwIG9iag0KPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aDEg NjM1MDAvTGVuZ3RoIDI5MTk2Pj5zdHJlYW0NCnic7HwLXJRV3v/vPLe5MMMMMFwEdZ5hhMxBBrkp pfIoICqaF4QARRkuCsVlhBG1XLW20qjU2tZ12+7btrXbZQQ0MEs2zbV2rdzW7laalZaauWalMM/7 O2dmEMt///fz9n/fff+fD+fh+T6/c/ud3+U8v3MOzAAEACwIAii5hdPy77jukQ0Ah7YAxHryc/Om QKLoASjahK2G58+eVXjh4bs5zHsBWnLzC4smr3p3/FiAfWeRyWOzCp2pzYU3ngIg+7B9RXHuzBLP 16saAKKOAogfVzW43L/+pusbgKF7sM19Va0euXThIgvAyJEA3P2L3UsaYg2t3+NQFSjQB0tcLW64 Ei8oWkWlXFK/cvHmA8O+ABiF/aNG1Na4qg85jJgnM7A+sxYLTLuND2H+FsyPqG3wrPjdU5E7kDfy t+y4vqa5kYyG6QAFVL559U1Vrmm9s5BUjgHoP25wrXDrJoil2P8JLJQbXQ01B+bveh9gxlAA3UR3 U4tHnQUrUJ4FtN7dXONuXXDPQgD7eJT3BFBbirMW7Lvll2cXmcZ/A3FaoOlPq3OvpM+/7XHWX7it 71cGp7YWszrgwJ+wnzbENxfAcBLrlxqcjNOAJJyiJWITOLCPGW+KTigH4MtwXA5reSGMbAIRtOJ9 YhqyTPA/+YdhBfdHLXAhksCLgsAJj4CkKiDPR7ZmyntmoSwDFsB+abivFF7VhpBnZCAPsXHLxQNU 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 TwtooWu+hb37kx57/IDjw45LdvZ4dNrjJzx+itpppd+fC0YHp/JPiXeSb7WUeKNnl3+/sYk3NuGo G0clHJVwVMJRCUclHJVwVMJRCUclHJXqPiCWH6TPes213us6up7e+O8YNhnDTcZwkzHchLFujHVj rBtjpbrk/xJxl8fz03HtMa6bMLbJeG7CWDKemzCWjF8PvjbhKRmz9mD/ZNyCpx3HYagJQ021Z46v PWNUK+3YGMDGAC4GcDFQ5SI4XF+H9bVdX9v1tV1f2/W1XV/b9bVdX9v1tV1f2/V1mb4uw8wAZgYw M4CZAcwMYGYAMwOYGcDMAF4G8DKAlwG8DOBlAC8DeBnAy8Cb8nKt9lxH19Md2jWLZtOd7j2H7vL4 bq+d7/E9jgtc94DHD3m8xHGF4xPB4cE7eXhU6uGDvOICxzfz4M2eu4UydGtlOHibHBPLJcl3R7ZX sy89go9kL6bXmijZv+gVqV6R6hWpXpHqFalekeoVqV6R6hWp3p2uuCBdi/dqfa9WJ/NaMqf1qmQG g4zcFgYXVV4LrBuDT5t7k28xzvR4Fs2mOylLX6Gl9JjrI8edf9+Dm5+mZ71uld9Xy4VFj7fQb2nY tb+rvDbiyMrQiFMdJ9BNdDPd5tzdZC05YpHjWsd11F15bZ/D6HB6b2VoHzXFPh+gv6ATnTvJudOp oRKOvLcy9F9gJm7nhY7fMxOPCiaYrZrMVk3pv2x/LP0LLNV/qf692r9Wz1f/xbpRahK55F+ud4ha h6gdI2odotYhE00TtQ5Ru0/UWkVtpmh1iFaHaHWIVododYhWh2h1iFaHaHWI1jGi1SFaHaLVIVod otUhWh2i1SFaHbLTNNlpmuw0TXaaJlIdItUhUh0i1SFSHSLVIVIdItUhUh0i1SFSrSLVKlKtIpVU CjNFaqZIzRSpmSLVIVIdMtY00ZopQjNFqEOEZopOh2w1LThLFGIRiGv5tvvPlG837VFp/un59r7K +lr1Wc25LTLCnnn3Ub75B0qq0cjvcrD5c7s1Q785tKTGKQVjggMrDTuysN6ukjM263F/moeq+6CD tX3QVXq7Sm9X6e0qvV2lt6v0dpXertLbVXq7Sm+X6u1SeWSz3vbrbb/e9u+Zu/R2UG8H9XZQbwf3 2Atcpber0v2/+Y73OS6gha67P93fG9TTVXo6qKer9LRdT0tWUy/obb/eDqf7dZyutyW9HdbbQSug UjA+zZnJfNpuPWxO5fJCkkM5vI/D13P4cRzex+F9IvE8h/cZ/24R6a1WFpUXubyPy/u4vI/L+7i8 j8vXc/l6Ll/P5eu5/Dgu7+PyPi7v4/I+Lu/j8j4u7+PyPp7oEKXnRel5UXqey/u4vI/L+7i8j8v7 uLyPy/u4vI/L+7i8TzR7RbNXNHtFs1c0XxTNF0XzRdF8kcv7uLxP1J4XtRerVYfjQ8497LjC8QnP qTSCI9LsVx3vJPP1vGmmeuP49bhjjzv2uGMy+/cYm63u0uMOPcZjoDYOW5PaPxmD4JPclmSc1tRx SX28PM08rTJP6541QK1GbuXKVmPTbWy6uXPQ2HQbm25js4gzBzmzlTNbObOVM1s5s5UzWzmzlTNb ObOVM1s5cyFnLjR23cau29h1G7tuY9dt7LqNXbex6zZ23dw7aOy6jV23ses2dt3GrtvYdRu7bmPX bewWGbtFxm6RsVvEwYMcPMjBgxzcysGtHDxoLBJmW41Ht/FYJD/LzSL0gHMPOfeIx0s8fpSWqYlX OPeE654zPj+rrA/q07l8b+fxN5m75bMk7gel8Y7EebI4TxbnyeI82btvfn0d4hU71iHVOmuzu252 183uutldN7vrZnfd7K6b3XWzu24W21Viu2rv1ibu8YfWJkm1vXs9tVmvNtfqqZLebU7XEw84JmuH JY7WCsGZehru0tPjaz09vtbTLbv0tLRHT7fo6RY93aKnW/R0i55u0dMterpFT7fo6RY9Xaen6/ay p6U/2NPde7lFL7fs0ssttV5uqfVyS9rLj6b/BrD2b/n08lS9PFUvT9XLUzET1WqcTW+ocZKevr6O fLO6ZpMebNKDTXqw6U+ua3btVbU31frkWyLXIvckNUlSizwn/0w2ZlHt34mEtX9/U1s1p049tebU U9MV81Bl3eu9S936eu/SNV86luuM5Tpjuc5YrjOW64zlOmO5zliuM5brjKUVdSVnLHN7F4nUtX98 JD77ZmvF3cZ8nTFftzNK8z1OK7l0vfiCTNFbXS+mq+RN6ZrxkZTrddUIyhDHp354bBdPVHNntDNv 7siZh2jR3uS/P5T77vA+s2g23UVJjkvy27fMey1m4EXpv0VPclt/ks+CU7RkUEuS7D2oJYO1tfro uoN2rteTSntQywa1bFDLBrVsUMsGtWxQywa1LMnKg1o2qGWDWjaoZYNaNqhlg1o2uNsa/Wa6hTJ0 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 /YZCRYdBexJvlByMNCvM5LSETO6rwZUSZ3JyuEqKOePMvy34/+Z5nHSrKxaMEtS/9kP5X7/wALzi ly0icVvJozLB0kIwF1v2trD2+4MbGpy83ZE/peMaPG3O2r3+tTolZlNLf8fNEgeRf9s88pj9w/L5 hw8oHz184kViyZtSm3CyQmdq+936dmpiw10XXJTy1oy0evPafEXGlHb9LqX7nz1QdFW2Q1pO8Qkv +Q0Le4SrdpLtnqWrM7x6Q+KcnJuzNOv2KXV7r33Aub/5XsfaxCE2OaRnX7sHV4TDDdUZGqs6T+qp npB6rcP4UJXLcwZU5dYdSHm8bGS7y9375x5raus66Mgd4eSrqJTiXzLvWahEdnZM8Ovq83LAhIdz inaldfQL9fqQtrJ2tPOoyZMTVBKj8uK7ih2eH3haMttuZcmLH7v6rlJPq7TeM62pJmTZ+KhH9w+N tvzpOnFsr5ltKFx/WWHr3isqrmvMwlQ5gw/WbY+cO5NEyP8DRmskDA0KZW5kc3RyZWFtDQplbmRv YmoNCjIyIDAgb2JqDQpbMzUyIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA2ODQgMCA2OTggMCA2MzIgMCAwIDAgNDIxIDAgMCA1 NTcgMCA3NDggNzg3IDAgMCA2OTUgMCA2MTYgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgNDIxXQ0KZW5kb2JqDQoyMyAw IG9iag0KPDwvVHlwZS9Gb250L1N1YnR5cGUvVHJ1ZVR5cGUvTmFtZS9GNC9CYXNlRm9udC9BQkNE RUUrQm9vayMyMEFudGlxdWEsQm9sZC9FbmNvZGluZy9XaW5BbnNpRW5jb2RpbmcvRm9udERlc2Ny aXB0b3IgMjQgMCBSL0ZpcnN0Q2hhciAzMi9MYXN0Q2hhciAyNDEvV2lkdGhzIDI2IDAgUj4+DQpl bmRvYmoNCjI0IDAgb2JqDQo8PC9UeXBlL0ZvbnREZXNjcmlwdG9yL0ZvbnROYW1lL0FCQ0RFRStC b29rIzIwQW50aXF1YSxCb2xkL0ZsYWdzIDMyL0l0YWxpY0FuZ2xlIDAvQXNjZW50IDkyMy9EZXNj ZW50IC0yNjUvQ2FwSGVpZ2h0IDcyNi9BdmdXaWR0aCA0NTkvTWF4V2lkdGggMTMyNy9Gb250V2Vp Z2h0IDcwMC9YSGVpZ2h0IDI1MC9MZWFkaW5nIDE3L1N0ZW1WIDQ1L0ZvbnRCQm94Wy0xMzQgLTI2 NSAxMTkzIDcyNl0vRm9udEZpbGUyIDI1IDAgUj4+DQplbmRvYmoNCjI1IDAgb2JqDQo8PC9GaWx0 ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoMSA1NDU0MC9MZW5ndGggMjE4OTI+PnN0cmVhbQ0KeJzsfQl8 FFW2/neret+XpLuzdneaJJCdBJKAATpkEQj7ZoIsCbsLEg1iIhFxQTToGHdlHEEdHUVGOx2UgCAo 4q6o40aCoDPI6Aguoygq6XqnbneQzMP4f/8fmTczL+dS3711zqm7fnXr3urQDQbARqCAp3TK6LN3 rRp7BbDrEBDVf+zUKaPMDscWQPMVINw/YUp27p2+i9sB9ghdNX166bjKsT8smgTobwest89bUlN7 /Ddlq4GZOeTz9rzlyzyHPnz3a6B2FKB6eGHtoiVfFR0eCsxWUIFXLaqpq4ULWirvHcrPsujChoV1 N1+9F1hO5aVpFs9fUq9aseGPQEJ/YIRm8YKa+TtrPh1LeWeQf/5iUpgPqqvpfD6d91u8ZFn9Dof2 HKornaq+unDpvJqMtwpeAjYcB5RFS2rqazUzTbeQ//Xk4LmoZsmCuO+fvBZ4eBAQu6p2ad2y0Pe4 jOqzWbbXXrKgds7ZNxiBueRv3AW5r4SqdaN05clzzEXHEKeBLA+NWfOqHAeXbK8NfdE5TrtWk0G+ Wu4vC8XqeZ3PANp9oS9CR7VrT1q6pEPWCL/DXIiopOoLsCAKZ1GtL6RyBbIycZOwHUrSrFPm0RV/ DMfsKywUbEwhKNSCUlSKIvWssObUrMctvWgpPPAI+5V7Oz/G/ep5gtsDrD/4vmxVRaoidB1DsEIs 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 l91+hbYf8AdXJ93iyDIG+WxeNfBUacVSnqv5Vb7vpQ7CISV9Nk6uIwdGdxBXVj496eGnO+544un2 GZtPqBfv+XEYY+ag6BfPWUNqGw+QmWWDs6NTH3acd+198pQwaubkkICDp8bcyastO3e5Dy28sDH0 x36rY9dvK1sOhUvo3ReNWxC9lj1dIZj7yyvDLtXesiVeZbXPPjEEfbjlUfjInd79rPuTb48RbKvB rhZW2Og1KNc71jpDHMxG342q/klBz7r9b/9U+66H8zfhOxh2aYteXuurMjoCb0sLG3OmHkgwDAvE hFhoYEjq78BbOOxYNdxwfk74w4n3tg59NLU9qKxFfrumbBUdSdwVMG7X/OVVdzfEG07+XLxME5FY 535r7KEqh84H9gj3eXnGTNV7qYedbpirOHid/fFYdd66abvnr/FM3VZzZiNjtp+aVER5OXl//nBv iHuY6PhqUXloeoVpleqi1XEOCcff8G+sZ585uHveNaKz6/PqRtDImLYz8On+2fm5tH8DlZ1LZg0K ZW5kc3RyZWFtDQplbmRvYmoNCjI2IDAgb2JqDQpbMjUwIDAgMCA2MDYgMCAwIDAgMCAwIDAgMCAw IDI1MCAzMzMgMjUwIDI5NiA1MDAgNTAwIDUwMCAwIDUwMCAwIDUwMCAwIDUwMCA1MDAgMjUwIDAg MCAwIDAgMCAwIDc3OCAwIDcyMiA4MzMgNjExIDU1NiAwIDgzMyAzODkgMCAwIDAgMTAwMCAwIDAg MCAwIDAgNjExIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgNTAwIDAgNDQ0IDYxMSA1MDAgMzg5 IDAgNjExIDMzMyAwIDAgMzMzIDg4OSA2MTEgNTU2IDYxMSAwIDM4OSA0NDQgMzMzIDAgMCA4MzMg MCA1NTYgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDAgMCAwIDYxMV0NCmVuZG9iag0KMjcgMCBvYmoNCjw8L1R5cGUvRm9udC9TdWJ0 eXBlL1RydWVUeXBlL05hbWUvRjUvQmFzZUZvbnQvQUJDREVFK0Jvb2sjMjBBbnRpcXVhL0VuY29k aW5nL1dpbkFuc2lFbmNvZGluZy9Gb250RGVzY3JpcHRvciAyOCAwIFIvRmlyc3RDaGFyIDMyL0xh c3RDaGFyIDEyMi9XaWR0aHMgMzAgMCBSPj4NCmVuZG9iag0KMjggMCBvYmoNCjw8L1R5cGUvRm9u dERlc2NyaXB0b3IvRm9udE5hbWUvQUJDREVFK0Jvb2sjMjBBbnRpcXVhL0ZsYWdzIDMyL0l0YWxp Y0FuZ2xlIDAvQXNjZW50IDkyMy9EZXNjZW50IC0yODIvQ2FwSGVpZ2h0IDcyNy9BdmdXaWR0aCA0 NDUvTWF4V2lkdGggMTI5MC9Gb250V2VpZ2h0IDQwMC9YSGVpZ2h0IDI1MC9TdGVtViA0NC9Gb250 QkJveFstMTM2IC0yODIgMTE1NCA3MjddL0ZvbnRGaWxlMiAyOSAwIFI+Pg0KZW5kb2JqDQoyOSAw IG9iag0KPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aDEgNTQxNzIvTGVuZ3RoIDIxMDA0Pj5z dHJlYW0NCnic7H13fFRV2v9z7p1eMiXTUmeGIQmkQEgCoQQygSSU0EFIUCCB0KIUaWIsC4tSAkpU RBcb7qpY2GUyAQwIgr2tButaVqyoqLGtYCO57/ecGdi4L+76/rK//WM/89yc7znnPs+9p33vOc+5 k0yIEZEdoCJf6aSRw8fF9/cTHb6cyOEbPXnSCKPJsJNI+z2RdOe4Sb3zbpQW3U3E7sVVU6aUjqms e2HZXUSGW4nUt89eWLNkKEvA9TU4xx6dvXK576On3viCaPloIs3rc5fMW/jhE7e+QTR7Pgp8Zl7N siXkIT3Kuwj3s8676NK5a295sJbosu5EGTfPr124avShtcuhKiKaMH/+nJraw+bXcS+WDft+/IRl k2Yj8riGus9fuHzV7rH6E6grsurvL1o8u+bO7Q/cSPT7g8gXLaxZtUT7G9M9sN8AA9+imoVzzr91 SxvRTrTPPXnJ4mXLO76jS1Cf0Vy/ZOmcJdOdW39DNL+AyOQi3ldS1fb1o67/bKal6CQl6YjL3SPv 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 JYaJnlbGHi6gspss6Jxu5H0xDaqu+F3hiH9zN8bc8StXJaTikPUcWLbOAseLLJfDzXCXrMb2Km9E Hj5v46PjdN2ly3VrbL8XNtS8IT0bnzCxfd+7u1qlyIzNKl41tfmsmlw04nbbm6sX8W48y9fcVyAz 6xRCcUhN5MOTzGu1WOyT/KV1vLxHjW1Vw/p+NiFeMR1rvpAT2hbyU4loW79NQ2L3XvybftTndxLP nQh5NKF1+VDPrtqrEWWlo2d9du31hlJN/XVwD+clFvx0N7uh7uqfBaXkRU9NcHpz0/Kih5XUV3nr h4+eHlk+6UjzQ3RXcOal2jTx3Zexdl1j6+Xy1dtLzUN3Ze1ZNLtmY+zXVXp5bFBpfRD/3o0GCbLn gKbeKdwfujamMoM6LQtdmFlmWfF2W8uDV8OnHitGzE2HBlcfSZtS6eGfhBVeo29dJJiHfwh2/YkD HFzr//e97Iu25D1BOwsd3B2zUt8PZHwI2a43YiyA24ZgGBaFxWBxUdjsn0G2Mj566xmJ/ft511rW LQ+IC+oNqqLCSTsmRCpLJp6WlQfu3sC0zHJnbv946495Kw6FnzngvpgZMGT8oZLwPgn9/j77egvD XDoU0L41uDouYJJKHHZnk2bNJZ0izm/+46aPK0Q3peqzpdJ3cBNz63Le/kykljwvmzeldduyaaPm LVV/GFC+T10zMWubrfXKH1eSEfzZmZl9NasXwvj2LyT07C8NCmVuZHN0cmVhbQ0KZW5kb2JqDQoz MCAwIG9iag0KWzI1MCAwIDAgMCAwIDAgMCAwIDMzMyAzMzMgMCAwIDAgMCAyNTAgMCAwIDAgMCAw IDAgMCAwIDAgMCAwIDI1MCAwIDAgMCAwIDAgMCA3NzggMCA3MDkgNzc0IDYxMSA1NTYgNzYzIDAg MzM3IDAgMCA2MTEgMCA4MzEgNzg2IDYwNCAwIDY2OCAwIDYxMyAwIDcyMiAxMDAwIDAgMCA2Njcg MCAwIDAgMCAwIDAgNTAwIDAgNDQ0IDYxMSA0NzkgMCAwIDAgMjkxIDAgMCAyOTEgODgzIDU4MiA1 NDYgNjAxIDAgMzk1IDQyNCAzMjYgMCAwIDAgMCAwIDUwMF0NCmVuZG9iag0KMzEgMCBvYmoNCjw8 L1R5cGUvRm9udC9TdWJ0eXBlL1R5cGUwL0Jhc2VGb250L1RpbWVzIzIwTmV3IzIwUm9tYW4sQm9s ZC9FbmNvZGluZy9JZGVudGl0eS1IL0Rlc2NlbmRhbnRGb250cyAzMiAwIFIvVG9Vbmljb2RlIDM4 IDAgUj4+DQplbmRvYmoNCjMyIDAgb2JqDQpbMzMgMCBSXQ0KZW5kb2JqDQozMyAwIG9iag0KPDwv QmFzZUZvbnQvVGltZXMjMjBOZXcjMjBSb21hbixCb2xkL1N1YnR5cGUvQ0lERm9udFR5cGUyL1R5 cGUvRm9udC9DSURUb0dJRE1hcC9JZGVudGl0eS9EVyAxMDAwL0NJRFN5c3RlbUluZm8gMzQgMCBS L0ZvbnREZXNjcmlwdG9yIDM1IDAgUi9XIDM3IDAgUj4+DQplbmRvYmoNCjM0IDAgb2JqDQo8PC9P cmRlcmluZyAoSWRlbnRpdHkpL1JlZ2lzdHJ5IChBZG9iZSkvU3VwcGxlbWVudCAwPj4NCmVuZG9i ag0KMzUgMCBvYmoNCjw8L1R5cGUvRm9udERlc2NyaXB0b3IvRm9udE5hbWUvVGltZXMjMjBOZXcj MjBSb21hbixCb2xkL0ZsYWdzIDMyL0l0YWxpY0FuZ2xlIDAvQXNjZW50IDg5MS9EZXNjZW50IC0y MTYvQ2FwSGVpZ2h0IDY3Ny9BdmdXaWR0aCA0MjcvTWF4V2lkdGggMjU1OC9Gb250V2VpZ2h0IDcw MC9YSGVpZ2h0IDI1MC9MZWFkaW5nIDQyL1N0ZW1WIDQyL0ZvbnRCQm94Wy01NTggLTIxNiAyMDAw IDY3N10vRm9udEZpbGUyIDM2IDAgUj4+DQplbmRvYmoNCjM2IDAgb2JqDQo8PC9GaWx0ZXIvRmxh dGVEZWNvZGUvTGVuZ3RoMSAxNjkwODAvTGVuZ3RoIDgxOTkyPj5zdHJlYW0NCnic7H0JYFRF1u6p qttL9s4CCdm6Q4cQuhMSOgmEAEkn6YQlCQQImrAlYYlsYlhEQAcCyqhxY8YdF1BxGXGk043YgGgU x10BHQWRgSioqCCM48qS+75bHUDmMfN88///8/3z92nOd07VOXXq1HLr3tskQIyIYgEKNbvGDh/6 8qtpR4kvRWX84qGusnJlhL6RWF0zEe8YWj1qbM2pA78lNrGa6JP5Q8eOK5mny5lMvPBlokHxI8bW lF9um6knvqQDAZIra8YO+/HpZxcSDbmOKGLAqLFZju5Txz1CxH6EvaG6tLLmmtjrTiJ+Psr9L3FV 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 qZYQI7EEWWSLYHEk2u3GlMRgRygdyHVGh35sHcJmLK2rqO3tD5c2qaOPii+tPJ35Y8tOTE1xhakX f5mU75CmVfFJ1Xd2Tc9uOdDRl7uoNSxrXnHSYXRzM2SiQym/05frnFTaPHtqa1X67NaWjFk57N2c Ff43YXv6cpcCssybYbEQr6tax5XquAwdBkbZleXyugRsMN1Z4Vx4uDXDQd/oMy+Gi0lJdND9XIA5 0BKUmxiuY8sPenagOSQncwlTJ5f6JUg7SJB4A0a8nNFVf5K6ff5iNxV3HmwOmjJrUV5K5uRri+ff 2l0fe+XtjfmXvJZcvqwwY2llVkxJ4+ypDTMSuPcWPXDj4pD02fmx5mJrSGpl27SI+uv2L1n9eH/V jJue3Nz73dUF6Ssf3FBz4Pq5ns6Dqg/FftajMslar9tl5+zxzvilsfaw2Fi70xUry7GxMV6su+MS ZD2nt7ocLt6VagmFYzlLQqIdA1Im9nfhdEESK8Ov8dSx9MFEjurb3D+MPvs/teRpuhCj5370YQS2 sVvo5PBZX7Pepm0BQ9lHWajH1WeB8Dj2dfB4cp5soSMIn9R5sDWn75p351b7v+l/vyTXe0V+RPva 7MNpuZMCeW08uScu3WZ2JpavmLqoN94/1C44uYdmuzxVyUuaMIKi7wn16Hs+cpd3oS3KhRnS6vJ6 iafLw8ser+cOz0HP8x6dx0PK87Kxz/USOZejJ6XYCHjd3vCUTCsnWWPpCagtXG+LsPE2nTsxJScn I8UUnqiTpEAde8bMVqWja1O1YWjfNGcbkD/QxSm7WO2GiYbVU/LQSwvRfHUhTv8JPVaMpA9O1V6u fQGFNiraLfSzcxdvrCxZWp4TGm1LSgopqV1ZvGBBXt01na3JtrgQXc7y25eWLvZlh0fHSglJwdOu 6p5+9fzsec2rmudl84+VrZ6fERETkR7jP+JunpNeWZpWnOZKyU2Myc/LjZ7eU5cVFhUmy9y6md3z 0ud4sqZlJSRnlS+n3xzEWDDIngws806xX2FbaVtrE+bauBIbl2njbOFkC8d5OS6b42SOg73UNZVV /ei8nUQYaF8KHQyyOKyjK7zXntYWVm+wA/cgNdLW75/ej7AzGWdwnDCYJNryqvJmmuSijIvPJhU6 g+uyZuZMEpOEu/mHU2tKEi8mJRc4rWgYDjSe11OmzU3kUtSvMoyIPZA/Cbv8+PDwqERHkq48yJHl 8DoEhyOFvrmZj0oNlcJDSIIjka6/B2wB6PDD6rKbyzylDsAXT7H1DaRU50l1OxE8tsEIHrcGzI8T exLz460v/GzlwQ53yTzeWTG175vXr5ecnsncamEwKKFksr/h2Z9lXrWlnjs3Nd/pLJnhl679xq7b uf9InZoU4mRyvyPmQm4bWe8tNJmCQ0OX6gxhutBwnYG+wYUzGHQxMeGhoeUiHybyoaKos9l4Pgsj W7DZEMCT8BjHJBPVRqTD19OXnkZx0Ri41KdQ7BEUW7zlsGdQGNC2GIPYlzEph+qqfThDUxIbq7GP FcSJuXlL0vyPZfp3RJZk8wFur944fEyylBRzi4TB5c0X/ip0ulOczvhoS0SYP4oblHOD5Djeyb5j OaIPZM8Dtnmnx8dnZ0emJKXwKcmp+mhjjMEQk5OjK09NTo2JinQ4YoKCIgMCA2PCrPT3U1arKTUy JirFGC0GZDmCJRLvyLbKVE1DgKqm9jSVLXXoGS/6ojs6E706io5RwVgPUC7lYXFA1wTUGMyvWH5y TmHsUw2j6mIg/5z2YOgDQxMTXMH+R5Le8/81yb87KEfm/jsn2SwNbiuSomMTbdyF0qwA85FD5sDS bG46+lCwsyDlwgl+1cWdwg0pToxhYdHBGU7/dM53pyszBpuryAizS/aXcXvtOWGOWPbLTjNG8RRY qoj4vVv0ehOmKTmei49PzczlcnMzilI5a2F6KheVEWMzRWVMjo7KiHJL1kKLzWQtlK1ciJUTrFxm BmfNiMooL7SGFVrz+cKQwvhCobCQM0+ymWwkLZWTU7lME2c0cakmm2kplxrGpQpTOS4THZqzeSKj ouJshVNSnTY5I9eRF0+3DuaoSGsYJ5j0Dl34px91jjWzTLorVwfB01vUGWHJErqDCKKIPdhccmrs xhLr2C2r1arepXnRKkOodxIixl5OlUh/VjD6ODSnoIBTHSQJ1EGRBWPbCfpJYmG305d68eOCpOCw b90WHlo8zb9uVd+Q/zxWcXEhvCnMNSnIIm3vsYXn5XHXuOcnPrtrShHGoPAweOLMU7aEUFuc07n/ z9yu+NRIrNE53mCVTLaId/clFIQmRmMzMT3Xf0799oEYx57j9NMWrU9NT19qiw2zpXO22LhYm15f wXHpnMmSbuHKTZYwk8VoCtOe60QQWxB9HaAzVrZZIkwBnN5hiP/0Mx1mVDRX1a5LTtOhc3jLpSfI tAkHvX5qtO8Gc27WeT9liXFnQPmC1qHVRyWhQnRwwOSpXH3qcvdjFqcn8+KPsqfGmf/oKM3iPpET Q3VGy4CQYEsIprYQ6q7wv+l/Nm1KrAnLLy4oPs91jjtYUIzlgtlqNMWE+H9JzzPZzl/3AJ9o2YRm rCev/ncVicCGE2OsMRzTRfyPxHAsLtO4tHykjuXv42/W3UAMlgJuPj8ZnC7+B3wR4xRqHB84DYzj 1jjlyKVyijROKdI06TaDUzzGuY9foesBx6NxisFp120CZ6rGcSNXG+OUaJwyVvJ14JR+LpdX4ziU j/gt/PNM5jplAziroXMx4xRqnBngLGcct8aZiVwqp0jjeJGmmX+ByaxxkKaR/ymTWeV4wOngf8Fk VjlFyNXOOCUaZzoreZjJ/NlcXsohAsnEXNiOFZGXzCPLyP3eeYW5NUKxTljqylgYNi1OcAne0lIu o5SzljpK+dJik3lVJbeokqtc6FpYbDYXL3SJy+/0cbKP83ltlYWzwnSRpMTh9Rpzp0VelRhXk0JX zYGzIs0mkzE4mD4uxxBA/xtsuNTtZv8z5M6kzxTovow+wFsSwh5VoofTJwlBp+gyYDg40h3E/j8L hDrbGtSHeZGSQH83fulBHnvrqbqMCleX35GjTV5HBwj1MV+GMHayRQcNsSJrVunUeM8SV3h+hMOc UVKVVrqx0HfnoorOOUmZ81oKg0Kz53eWZM4rjosqWlYRnJnvnpSVmJ/AlV+MyXYmly2Y7MgKd1b4 igYcyeHGwIiESQ7nJD6t5KrmZI/bbg9OnONJLPAUFieXX10wtanWG5VemTy1pTLVnjM9IaWsMCtK nlM5O7Z0qey0OWdHz0hIW1FXYDEnNaxceShQTkoLjyjIlAsSMtu0788Z+3WVZD7p8BalpU3PTE4O 55ypmeExoZbUmEyEOQtq5s+Zbi12FPPFJb45M8rSIkKTHdPDUwOdMqc31FQWJ2IvgDHkVCndvozO jhic6XOt14bVx8JBF08HnQpiT3uC2WjLBWvngxHho+PGFO1fS7/gVZ5ss0MXbpFj3yQZ/7U5fVjS jLJpzsmVntTAcGNEksze9hkQkDYpec5k9rrPophgnSnYElJePSdqncnkYx+ly5kRbFq+bWp9RCJ9 EWiy2xlky/TE+Q74t08pjTeLLpdRjm7mvt1rj9VeCOpk72+KvEY4Gu0ItRgCzHrh7++3RsckJSTY k6ObxIii2p30K3aETNHCfxA/DXyEEIfQKTwuPC4Kok+8WtwiDuju1ev1Rwy1hh8b9waUBXwncI+p yLR+fDDPs8yUgqRfWU8E7Qk+GLI/NDT0m2FboCIf8VEUF3Vf9MmY5yYds023B9h/4UiUa+LKPx3i TzoHXA0JjYm5SQHJS1PuTJ2cOjltVdr7k9dkHMvcm7Uva192R66Ue2Pe5vy1Uz4o/I77/n/r8Pd/ HIrSil0svOU5/GXD1NCxUDQRJsJEmAhfItT9r4SOiTAR/g3D1qn3TX1sIkyEiTARJsJEmAgTYSJM hIkwESbCRJgIE2Ei/J+F8yXZJdeX/KU0s3Rb6ZveAO+N3l/9c2Fa5rS+aW9N+1NZXtn0sjllG8tu K9tfdqjs+2WPlj1R9rOy58p+WfZm2W/L/lj21+mP+3404xAN5ZnlD84MmLl05u8rllW8PGvRrAOz /jb7wdnn53TOOVM5pfKeqqiqe6o91fuqz89tnvv3ec/VXPF/Ejr+Pw5ra66v6a+5q2Zvzf0136s5 WvNEzYmaX9S8WvNOzQc1f6nx1xpqg2qja+NrP5l/aCL8+wf2fgTC7wNu564nek4iAnEptwMXKGeA 3QwXMexRBkkYCcNdFxEYLlBagN3+88BFih3Yo/iAr2T8RQwvBk5B+kFgK+6mkGCGXeBnsnIyUY4P 2M1wEcMehhfjbi5Lk8vy5rK8uSxvPnINAbsZLmLYw/Bi4ALkOgNsRcoCEoRcBchLaTvDLoZzWBof u1vOcAXDlYxfy+gFLOVCRtczvIhxqF5uVoubWGEBN2qhnGBG25HSTVyMzlHor6x8jFPBcCWs4Wbl u1n5blayG2X6SBErs4jpW4QyB4GDGW2HHYoguR3Yx+gKhitZ+lpGL2B0PcOLkdfDLO9hpXmYHTys NA+T0IPSKPahTA9Ko7iSpa9l9Hx2t57hK8GZhUDIAibhAlbmAibhAlbmAtiQ8isYnsNS1jL6CkYv YvgqhhcDX4kSbgcOBl7E6EWMXszoxYwmZL7wPqG/dKd/1zAssFYby64E9iYKIxei0QKpJb/WaJEk k7MarSNRXI5G60k6N1ujDWTNWDlGkkUe1ugAcjO3RqMt/B7uAu0n7C9f3KXRHLGKJzWaJ6LOodEC SdHpNVokYTqrRuuIWZep0XoSoSvWaAMpHivHSKLEP2h0AJmuq9FoC1el20FfZyUKqEsycBotkgz9 W4zW0d+MGzI1WiSpBiuj9eDrDVdqtEgSDW5GG6jdDBs1GrYyXM1oI/hmw3c0WiTphi2MDtDsr9Kq /VVatb9Kq/ZXadX+Kq3aX6VV+6u0an+VVu2v0qr9VVq1P6UDme4vajR0N/wno03ghxg5jRZJjkG1 iZnKZszVaMhjDGW0RN+XYWzSaJFkGWcwOoiVk6vRKEdLH0ptaNyp0bChsY/RYVQe4481GvIY9zI6 nP62wfieRoskz/gsoyNo+gC7RtP0FxkdTdMHzNFopA9IY/Qk6tOAjRoNnwaoPrIzn27UaOpTle9g 6R/UaJq+n9Eu6tOAFzUaPg1Q7ZZK7ROgaDTsE/AmoyfTcgKTNBrlBBoobRxnf+M4+xvH6WUcp5d5 XHrzuPTmcX4xj/rlQSKTHLSAbGCZ1JEW0oS4inSSDkAvWUe6GGc6rrpBU9wAfitLkUHftEXaEGS0 wFayEvl7SQ+7akLchNRrgBuRsg732xlXJtWI17JUneA1oCQZd+mdBkAvq6MRaei9brIKvE7S/LXk +2zKosvKUQa6DbXL6EdVSLsCJXYiNZWgFzPoQqZVj1aDTKaglkLY71K5aqmXypxH5pPJY+VWIeXn 5a8bo3xMg7UorQP2lMlc1NvM5KB36ZcY5iMfLbcNnHWaNbqZ/Wip6eAsZOl7GV8mlcyK1J4d4MmQ 1Y3ZPAdzQCfpwzWVkpbTxzxG7d+ieaOZldjL/EKvu5ju7bjbi9DErLSc5e3VPDMDs0wl2oSat3vc nS5mx0bUsoKV2Mqst5bVtQL4i+tVr2naFdC3j2nRyNJ2Ajey+124o2pArdKo1dWqlbBCK0vVnrZY +XOadzJrrmM+b4WPZdb2lo/V9UVydXyu7C9vpUulN475uZu1nV4m+YqxFvzF2qu1f16u4nE2oJqo uvSy+kb7Bi1f1bURnLVM807W375YU9XSDZ+yahPzbKeGVa1Uug9XXQzLTNo1Yy1XLYembEOKf+ij B+WcrOwcua6lSa7q7OjsXdfVJE/v7O7q7G7obe3syJCntbXJta0rW3p75NqmnqbuNU2NGXWt7U09 cnXTWrm2s72hQ27tkRvk3u6Gxqb2hu5Vcmfz/1zeKLPos2WUdbY1yslVrSu6O3s6m3tTFjZ19yCD PCWjMJulRVKWct78yTRtVd1Y+XUU+bob1rZ2rJTnNje3rmiSJ8vzexs62prWQYzu1p7OjnR5YeuK 3s5uubKhu7Gpo1fOdufmXNnZJ7c3rJP7eprk3hao0dyJOw09cldTd3trb29To7x8He40yTMWVE7D 3W520dXd2di3oldu7ZDXtrSuaBmXF3Frx4q2vkZk7e2UG1t7utpQQUNHI3K1IsEKpEL1GbI8Wnln R9s6Obk1RW5qX05zXSqrYzT1F4rEkjdSnbubenq7oR3sNa56ZB8rq5hJkNyKWnqb2qk3ultRa2Pn 2o62zobxlULoBlXUpm4Z+naiKuC+3q6+XrmxaQ01LtK0NLV1fUajyw73lLeSdT46qF4udS/p4yyg 3rtsymbWVS+XqpzV23u5dMJW4b+Ep4UngH/wpTVq/VIaVeJ+C+g14NEcfZfNMZMNIz1ssuhl3fry Wr6HTr+KfIxa3kPuy6VfyEq+XKoKxG0osflLpZ4HmlqlDwOvOrRe3jbjLXlZLUWHWCIWi9PFKWKh 6BWninNE92VrqPvS7WkO1ZbLBn35lLQ1d8Hel5WZCyZvC05cXb6VdLKpqmF0T0iUOPIU+eI/gdDd jIVwClvjElLFv1vOE+E7hJTpdJW4ltWBtqxRZn+Kwt576K+rqi7LyhLIzeo+j9DfuPEST9e5C0Dd Qjj+Vv4eIvB7+D2g9/JY9/P76HMU/l5+P+gD/J9Af8SfB/03IZhwQoiAPZIQKpSDnilgrS9UCteB 3ihsJLxwvXAO9F+EC6Avij1Yd/eKvUQQ+8R1oNeL60F/Q7wT9F3idtA7xB2gd4rYk4i7dOmE003W YX+ly9Xlgs7D3lLQefQ+wuln6FGXvlJfBbpafwXoen096Cv1V4FerO8F3afHfka/Rr8W9LX6mwiv v1m/BfRWfT/obYb7CWd4wPAAEQyHDD8EfdQ4jfDGMuM+IhjvNX6IVf8fjedA/yUAJQdcGbCWCAHX mrBLNAWaLEQwSaZk0CkmrPhNeabvgD5segT0D0w/Af1T09Ogj5uwBzadMg0T3nTa9DvQ75k+AP8P prOg/2z6C+iPTR+D/qvpr6DPm/4G+hMTPGsm5p9iJ/GU+RnQPzN/BPqs+c+EN5+zYO9tCbJEEcES bVkAeqFlCeil0jLCSQ1SA5y6XIKFpfXSN4koXSc9CnpIehL8n0jHiSA9I70OzhvSG6DftOagLYha i+BJHPOR6h3VL5pHYJla2KTOCGsb642wiXGRcSnoBuMK4GZjF/Aa4zrg9cYNuLvReAPwJuMmcDYb N4O+0Xgz6C3GftDbjN8CfQesTe18VrMqD3umgU43Yc9vyjJlMYu9D/r3pt8zazwNfNwMLczPwDLU DuHAEZYIWCDSEgk6ilqGaRNITvAfEl1Dd8NyIq9Y191G6lZ2N60izS1Ny7vJtW0NvR3kRoL9cfm0 WpnYFtT66LqOsH6lQw+L0Gg9kbS3jwrY21tJFLMXvRbZ040gEj2Ow2GfH0xixjj0N4qoo7KuQiax dbVzZOwh1JT0fXih2ntJRZRtImHaW0lFBDMJJ3YSu6Krp4scZfhJhn/O8EsMv7GqqbuD/I5ijjAc xXAWw1MY9jBcxnAFXaxx1QzXM7yc4TaGuxm+meEjDD/O8Avtq9pXce8y/CHDHzPsp5jXMywxHMFw LBul4omTuL4CFUgSSCJJggdSSCpJg5UmYz/x1fkcIf8A05bBa0/VPk9x8C/1KP1UuRE1mOAFCzxO 4MEQ+CoMPolAW4iCx2PgORv1EHFgCI/7H/J9WR4Pj+u+MA5Ca7pcvJI8T35Ffk3eJ2fJJxzPBXIh XAwXz6VyOVwRV8bN5mq5Rdxy7hqum1vPbeK2cXdxB7mHuce4n3MvcK9yb3PneRvv4tP5PN7DV/KL +TZ+A38LRv8j/BD/DP8S/xr/G/4D/hx/QRAFsxAm2ASXkC7kCR7BhzG/TlgsNAptQq+wQbhRuEXY IewT7hceEgaFx7CwOiW8JLwm/Eb4QDgnXBBF0SyGiTbRJaaLeaJH9ImVYp24WGwU2zD2bBBvFG+h T1IwczzNehOXXE2vCJ/7Up4Em4CT10vos0iu4A41dp9QR7Ci+9V4bqoWX1DjmkVqXFuoxsvS1bgh TIvPq3HrQiLyNP410aO5cGsfI3r6taf1LlWSb7zBJOE2DKjXG97Q4vNq/M0ONd64kKUTb+i4YdMN u244ol5titqUvsm7qU67+ummlze9v8mvXm1+cvNLm3+3+YKa/8bH1fimI2p8840slXHL0i3dW7Zu 2b9lcMvPt/x6y8eMa906sPWZra9u/bCf74/oT+0v6a/tb+5f339b/339R/t/rkq8zcXaP7dtthp/ 6zU1vpW2RkJ0d71w17ntEdsLty9Sr7e3bb9j++D2X22/oF7vCNqRt6N+x4YdB7XrwR2v7iQ7E3dW qtc7l+/cuvPhnS/t/ES93hW0a8quxbs27TrMrsVdj+96927p7inq1d3z7r727oN3n9Cu3t4duDtn t1qzuLt3977dT+/+gEpNuHv0WixpcYRqkXtitViz/N4MNd53n5puf4QWx6It0Xihqu/+Fi3u1eJN WnyHFu/X4oe0+KgWP6nFP9fil7T4DS1+X4vPq/EBvRaHaXG8FqdrcZEWV2ixJt+BRi3u0OINWrxN i3dr8SEtHtBiTb4Dp7VY8+8BTa4D57TYr8YHjVocosU2LU7U4iwt1uQ86NPiai2u1+LlWtylxddp MVaT8WbWq97iTvE8b+S7+UewXpwnHBGv1RXpTumn6D365Sy0IQww/KT+Gf1LBt7As6uXKDakI3Qj DBmGjCXGLuN9xhPGE4wPnvE0TWU8TYP+pYDkgO6A3fqBQH1gXeCmwFPGLhOPtUSO6TVzt3mD+ZD5 MUuR5XrLw5YnjScs79NyjCekKClRWizdhrAD4bR0QbrNmmo9GKQP6g3WB7uCi4J30LvB74fMC7lG ui1kK+Dt0K7QV8NawjPCe8MP0bvhj4QfAz4f0RwxJN0WKUW6Imsjt0YeiRyMPB35QVRIlDeqOmpD 1J6oJ6M+ji6Mro6+Pvrm6DuiH45+KfrtGBJTG3ML4I1J8qTHbY22AXDGwtjVLQhv0IBULCClGgZo iMFUZM8BzLN3MLzBvsf+q9jY2EJ6FVsYW45wR+wLsRdiLzhudhx0fCznyc2xd0i3OW6WmwH75Jdj X4i71nEw7lDcKaoTTQnuvrhXMUfR81N6ekrPTunJqUcZ5D5Sbuf+Bvi7cjvPAQKUM3ygMshblUFp GdJw7Fw1hp110lNVeqZKT1TpOSg9TaVnjvTE8ajSYrkVcLv/vOUOxW65S/FZBgG/AW8E8C7gt4AP ce+PgD8BPgKcRZo/A84pPtTXgnmUngvSEzx6cudCjvXKFMtewD7AvYD9gAOAg4AfAo4CHgWcV6Zg Tlfl9LEzW3piS+Wkp7VHUcetgNsBdwAuyeeDfD7I54N8Psjng3w+yOeDfL7PyOdj8t3+teWLYGfD 9GSYngvTU+HFyhDkGoJcQ5BrCHINQa4hyDUEuYYg1xDkGoJcQ5BrCHINQa4hyDUEuYYg1xDkGmKn 0WfYqXIQk62FnSfH0pNuAD1Ppue89CyZnvTSk1l6ykvPeOkJMj1J1TwJfVosG5QzlusBWwHbADsB e8HfB7gXsB9wAHAQ8G3c+y7gIcD3AA8Dvg/4Ie7RVvEoYAjXPwIcA/wY8BTgacBxwDOAVwCvAs4A zkOOLFUbtDV6dk1PrumpcCy1OGh6bu0b02RwTJN65mufZT3a4AblAWjwADR4ABo8AA0esOwFfx/g XsB+wAHAQcC3ce+7gIcA3wM8DPg+4Ie4dxTwKGAI1z8CHAP8GPAU4GnAccAzgFcArwLOAM6z/ztQ /eFj59C0rdBT8lj63wnoPfSUnJ6Rq364nZ2O07Pxxcog7G+H9Icg/SHY3A6b22FzO2xuh83tsLkd Eh+Cfe2wrx32tUO6Q5DuEKQ7BOkOQbpDkO4QpDsE6Q7BpnbWhwc1iXyaRJpNAfSknZ6zq/a0sxP2 OsT1rJ/bIZUP0vggjQ/S+CCND9L4II0PkvgstH89Cjiv0FnmKFmNHdRnLUBP4SuYxmdQ9hmkSsDM Ts/U6Yl68L9k/BAkSRmRogGTlBFI8kPKgyS0nQ/SUYqYvpIugfxkJZefAqgE1Pg38nVKrmQHJAI8 gGn+jZJPyWXy//PjS/C/ZDSI+7foxWatxRnhXyN3nnyL+5v/LGYaM8/5z/IxyjHL3/1nLX7/WUkH CPWfJWbMRdcgxTHMRddgHjqJeeikBdcWv3JM0gEk5aQUijga8STlJAlAjmqkHEHKEaSsRspqpKxG qupL7YB3Kb8lEf9rfSuEzgpcutLPTYbcOqUf86ibD/R/wlsBEcpGHiMxZHhE4pV+KQBgUVZBl9mS VdknReI6WkmHpOkk4EtpPYnLUBxcJiAbkAs4T9ph3Q9huxBY90M+SHHwIcphPhRzeRTiGMAkgB1y ybiXojhg/Q9h/Q8h01F44EPIdRTyrJFClEfhjQ8h11EpSnkUe2aBzaAt/xINTZqtTqKU51DKamhc AI0LkPMkcp5E6pNIXYDUBSQEKQ+jzsXQ+BVo/Ao0fgUav4Lch6HlK3wkIBrgAMiAREAKIE15BSUe RomHUeJhYqHSf1byy0obqM335WjD5bDwi7BwJiz8Iqz3Iqz3Iiz3Iqz1IuG4HGU/SR03D5ePn4dR +xnocQZ6lEOPxVwW4mxALuA8WYt27EbZ7Wj5bkh5hrcAUAaPemHfFnhxF7x4Bh7cxWwtg+9UtsPm LXwCeMmAFPBSlV1oO+1oO+3Q7gzaTzs0PAOvnkEbaod2Z+DVMxh7qVaqlOWQshxSlkPKo5Dy8GXb l045CglPfqqdRaBlqG1t8Gu3NZ75D74jgZChHzL0Q4Z+yNCPuvqZp2XEiYAUQJrST3Sj/f9TY7/j n9Lln+0zwaj1GGo9hlqPoWX0oeZjqOEYajgOS/WjhuPQ5hhqeQ61PAef9qOWY9DsGGo6Bs2OERNK OY5SjqOU4yjhOEqgud5ByuN8PCARkAJIU44TkQ/DHScgGZCqvMNseBj5DyP/YeSnPeYwJHiR9Zoo xDKuU9A7vrgmh/LUF9YkSC5YOQOQD0tbsFIbwSpthDyobCRHlGEyoAxLDmUvUrmkVP8ZpHQhpUsq BK8YMEupJWbMoiNI8TZm0hEpGZCq7EHKt5HybcysI9JUQCnGgmkozUdHcakEWMJItAd5d6OG30su Eov8u5H3sJQBOh9QCH4xwAP+NPRnH+JZkNqEXK8j1zByvI4a30HKYaQcRsrXUds7KL8FOUaQ43Wk duDKhZkp1b9OykCcrdwl5SMuBL8YUIIxYiZ4s5RCbNyOKpU8JOUrlD38LMRzEFeCVwWoxvhY43+W vwL8RWirVym7+atBtyBehbgNadsBHcoAZLwONe+BjNdBxkrUOowa96DGPZDzOshZCfmuQ83DJJov QmklygDvRSkzWO1nUfNZ1DyCmodQ81v8XPBrUHod0l2pPMYvxXUT7rejZLvyvOaD51Hb0Dj7P4+a hlDT82QSatk4rpYBrfRF40rejpL3sJLbca8TsJqVPt7Dp1npWazVjHr4NDw8DJsPUA/DkkNYOVuV aIxJ0eNbEySIgwSwMMnlZ/hP8uWooYJZeQQ1N8OqlfxiSLYU9NVKI78cdJMSzTcjXglowf1roEU7 6D7EawDXQuJ1SvNlW6qB1VoFa1ejtitAXw26geSy9qjD3WhYZeRTfSJCawtUwmHY63XY6x3Y6QNI Ogz/74GUuyFVMyRq/ErtMhx22AxPjKDOQyiVeoD6dWDUr1/L6tFjslYpv4SeLSiV6hrN2uvVKL0B cQvkVtsr9fMwv5bV9uVl1zMLXsVKPIvSWCnMigZ252pWxwhrQ6tR51oSze5GwP97oPcerQXu4edA sirlVr4a8VxlGaQd1lrgCL8MuVxYLSUrT6jjAugs5QPofwwSPSGVkEBI9Hvo/QhxorURtDaCHlxJ YgFH4N8irA5KlATUNqR61z+MFvcKbHSO1VzJah+GzK+j9tG2P6DJD7ugjHUYueyQxKG8DGkapETQ ycpbkKYBkjTATi/DTi9LHvCngu+j5xFjes5gnhhB6SeZbnXUbqiVtrxVgDa1/8JKI8xKX3UspXrT /1rPRS/bg152Uqt5I7Ou2rtGoN+LrGXRNruYtdkB9KxhvpG1tD3oXXQMu59vBf8awCoAHcc6AT2s p+0Z19MGYIsHIeVGSLYRkm2EDR6EDR4k2ZhBBjCDDGAdMoB1yACkgifQ/1nf96+DZNnoUWjz2DnQ EZa20CtY369EexqAdPX8EsBSpRhSOvllqLUB18sBK3C/EbE6HtRjPKiH1E5IXQ+p6yG1ExLX812A bkAP4FrAOqX4K80Bwdo4WQkbNvMVtJ0wLzbCgxtZG4HNJAdrnXRsPwE7XAc7XCcVglfM2sEJYtZG jt3ojQPQczXTs0X5CR27IM+ANiMMoP4BNgvw1Fesn/B8u9ZjrJiPaJ03fa2ZchLLXYS1QQnWdF7Q GCug1cNoGQ+PG9Wa0T7bod0kzRfbv1ZtYailjvVsdSTdyGxXjb33XFjhSkgwOrJ92V4dDtkHUGoz Sl39/5j7GrCorjvvc68wfM6EEmoMoYRYYgyhSgwhhLCWNb7WutRa1li9GQy1FIYZpAw1lBqXWBmG +WbmzgcsL1hLjaUWcRhGa1nW11pLrSW+xlhBa1hrjXVZH5elLOsaV/d3zr0zDOSj3efd93nf5z6/ e/7n3HPP+Z//1/nAOzKLDmnjy1ghf0WOlYgT/6VWo/lvkGRYzfvwvl9DG+3wvj6SwNqinl/GuHwb NjYqR7EA7CrAItkOlH8HulKy6Md6x1qKzsIViCEaREPJq2lEHMQ6YDrirfdJbGhOxJsdrK9voPcK Odp8h9nA1/A+4g5iLI2BtDUaH2qQfhP8YDZGjH1VjrG0Ln1Th/0EnqCf97Hz3IpcGUCfVmC20oCL 7Q9+A26mUGsUtbAqgmf+GvHgd2jrbbaG+Zocs3WM99+jNo1Kfjo3kAWoOcWeIkZBUmo824pxl8kr kArE1OqwpOh7v6Y1MaJL4HarzKkk09/JNdnKAtwKeBKKiJiL2ZOa8NpjlPWIlemDCsitgtWW54Zw m5QvrRxPtzMen2PSTgrHRkRVRKP32ZwgyDPXVtjna/DGMqaFt8Na0KGsRtZGtGyxb8sx+les3US5 jUCE3GjM/IWs9wBd/6F2ByQdYPLjKK/QbTUrL2cy8aFnO9r+LXq+zSzlm5D2d2QNWiOsEO3LM0Wo FmyKLAiP7iDajkHueeSex1jfxljfliNvgEZekkKisXuNB4L/PWf8WL2Hzs5/TE9qUfvjTqQiT57o aRLlZTV4WQ1eVsvn+fUR52314KUevNSDl3rwUg9e6j/ivK0evNSDl3qS9H961kaeknf69Wyn/2Og H3QA7f//cP72tHyC3iGfoF+Dfq+RH4PuR1ngQYd8Uj4KLkfB5Si4HAWXo59wUj4KLkfB5Si4HAWX o+BydN5J+Si4HAWXo+ByFFyOgstRcDkKLkfB5Si4HAWXo+yk/OF5p+Rj4HKMWge4DIJL6UT8407r Ik/q6ElcqLXVH9HaarS2+r90+ps43/7DZ1TKB3qV6sEL2Ps3zjmvigmdd6LPWOUHD1Yq7z9YqYoG Hn6wksTMO9X7iXyq9xO8+xPsqiPPq2JCp05oaQ3eW473luO95XhnOeZ3yfIa5DMmWbfMAhswzoaP PAOSz3/Ip+Sznwb57CckpTURb+fi7VzpnAMpPedIZqeQufIZx6+JArV2o9Zu1NiNJ7sxkh9hJD9i p/C/DJ/EJM87aYrsbQ16o6MrQDsFcm8F8qlKj9xjQbjHJHbSkITIJJ02nIU1v49W2B6R/D32NXQn QldXWQ+emF1dyTuSL2IuiP+zVsp0hbwYun8Tun8Tun+TrodY20886FMtBmgLTyJ9GngGyAY+B9CW liPNedCvWoE0F6At5yF9AaC8vIi0AKA8FSH9S+wGViF9GcAaS4U1lmot8MUHP1CtwwpDwXqO3FtJ +6pj5NNs3SzJg66dz0Gy51gE/zHys3IpZicKmQ+exTr2V+DxWawh6X7w2fDJAvYcWEvSvWAxbCsa 93ggCBzF25+RW1iC9MNnEsXymUQxW43Scx26Tp2SpRyYc66Qj/KXgEKUS+cLAaKcp5O3oZM35V3r 2xF6idyxdhAV3qK6plxR6djxVgBvdeCtH+AtyhmVlB1ruEex9xHxJrWBTrJ0ds/3YBwSG8dM+GnY IyHHyaflPds0NH0Jmr6EHr4KTV+S929vQ+OXVPRsORv4HLAMz5cjXQHkAs8jn4f0BSAf7byItAB4 CbS016NavwSNX4LGL9F9H7R+CVq/BK1fgsYvYZUVuTv7MdK/pzsHJqUONkY6vnzkX6LzviyJU7Ik fKhxCjVOyRLw0ZHDJx/HejsfeOlBOyIbnfeZ5Xxo7r+NHp+PtB5yHGU80dG/pBFCv7UmHMkk9Ou9 p+k31GQ5riisPZ8j0eR5XAryAqGx8EVSgLVrIa549o1uAnkFVyLZQgSszdT0i1qyjXwdfv09XMmk lxxCBD9CjkIfg7geIT8np8giMowrlZzG9Rj5R1xpHM/x5DNcFBdF0jklpySPcw9xD5EM7lHuUfIE 9xj3GFnMPc49Tj7LPcE9QTK5Z7jPkSe55dxyspR7jnuOPM35OB/J4n7K/ZQ8w/2c+znJ5n7J/ZJ8 jnuHe4cs497l3iXLuYvcRZLDvce9R57l/oH7B7KC+x33O/Ic93vu9ySX+xfuX8jz3L9y/0byuH/n /p28yH3AfUAKeMJz5CU+mo8mf8HH8Eqykn+If4j8D/4R/hGyhn+MTyNf4B/nM8gX+Uw+k/wVv4Rf Qor5p/mnyZf4Z/hssp5fxi8nG/hn+RWkhM/lnycb+RewEtzEl/Pl5Lt8BV9B9vAarO6aeC1fSwx8 Pd9ArLyRNxIHb+JNpFW5U7mTOJVvKt8kLmWzspmISrPSTNxKq9JKPEq70k68ylalk/iUolIk7cr/ qdxH/lYZVP6EfE/5jvI8+YHyinKcvKW8rvwD6VHeVk6TXuUd5R0yoPxA+QEJKv9DeZ8cUfEqnvxE FaWKJsdUcao4MqhKUCWQv1MpVQ+RIVWy6mHyv1SPqB4lP1M9pnqMnFKlY/f7C1Wm6knyS9VTqqXk V6os7A5/rcpRPUvOqXJVueS8Kh+74XdVBaoickH1Mrzjt6o1qrXkPdU61TpylXDxIwnsq1FuIVlF SO9BwE+4wF6kR4Eh0PuRngROy+lZ4IJMU1wGrgI3gFuoT9uYAu7IuC+lh6Ik2OoJ8fkkUPpQPN7x z+YBbtc2KQ2Ah0NJwEIgDVgMLEX5ENJlQK703qECoAhYg2fg6VCxnC9hPM0H5ZHxeQRjOoLx7FqC 9ALhjkAiRy7z2/v3BDv6TcF9vX0BBcNEYBXFoRUB4VB+oOyQMdDIcD8wTnG4emD34TpgcIA/fAI4 D4wN8P47wTX++8GS3vX9x3s39p/qFZCW9Z/y7w0WUfRW9J/pre4/57+FelPB4t7rgSyGCtSrRv2+ /psME4EcCv/qYJJ/XXBhb7D/NsMk6lIM9k8zzIAGIvisYJjNVzOsRH418jbQFP5AJ8NRGVcxLoob EvoWB+4xLB3ggdhwfhnyy5DfDJpi60AqQyhfDpqidiD7E7FrYEXfnoH8vuNo7xRgQt6B/BnQ5yBL xcA6hsRA1uHkgQ2H1w/sYFiEfDryFQM7Gaj8Ke4NnKXw8wMbGGIHLjOkDNxiyBi4Q9F7D/IC/BuC af5NwYV+dbPTvy242L8f+qGQ9Yd0c39UcGtID9DJbaRZhzOBLPS/cWBHbx101gCdNSI1IK3ovwgd Xum1IO+Ezg+iPQq/hP744Jr+JNjGCbQFHOKhN6B3GHkKWZfo6y7DRCCPIRggDJOBQoYR1KXoRl2K 86CBQ7FoL5a+H0hkmAispTi0DrrfAN2L0DvFJuTVyLeDppi1lTqG2XwDwzbkNcjvRd29c+obGIYC 3Qz+QI+MPoahQJDhZGCQwR84wXAa9kZxNjDMcCEwwnALtkcxJeNq4LqMCRmTMqT8HdQB+qJkhGw0 d0DFMGvDKQyzNpzCMGvDGQyhvBb2S1EPO6XwwDY7YJsXYZtXImyTInNgE+xh06y9gs6JyOfBXgph L7P11ai/LZxfhedr8VyAbVOUyZgcOMkwM3CaITLeDAMNsH2KEdAUjaCBN3IHeAr4hpFhcGAvgxPv +gA5Th3uBN0NjIOmcA7Y8NyG5/vxvAZ5EXkR+YPI+8P1r6Pu9Vl/g0w2UPwZ+QsU8E01Q8bAfQr4 Yg6Ffwn8kyJbRkYwigLPCin8K1AGRMSxRgr/juBS/0748e7gMr8RsAEhXw7hqIwhGSdlnJZxVsYF Cf0Lg+X9aUFt/2L469JgySFVIIfCfxnPgf5lwdr+3GA90l0sLQk6+jcHPf1bkZYHPRF2pmKYjY1L GGZj3UrEutWIU1f9YjDX3x4sOGyAjC0Du/sdwQOHLsNHgL542Dbg1yBW1SBWySl8PJkhFKMGA4sY ZkBTzJvLEEMUDJOgKcYC6QyyDlA3k2EisJ5hHHEFOJSCuEJRA9nvgOz3IwbsnxMHpLlxKHCewR8Y Y7gamKEIy6MA/lOAuWMfxn8A47+G/E2gF/kA8rdBTwPU344hfxd2RiL8LXNAA9+pichvQ159uAcy 6wNCviDL8HAeaIrqgXb4Tjv84Ch8Z8ivwrxAkYp5gSJ24AZDysAUQ0YwniJsm/mwPeBQKmQA+Fci DxzKQB6YP/f0JUFfFAtlhMZfhLEVDcRGyM3CMJt3UoTrr0F9ijS0ARzaiXq7Ue8gZA/0+jDPdGLe 6Uba03+tvwD2WgR7XQJ7BfrXIF+MfDbyAOx1D+Y2E3S7kcJ/FfZMcUNCvxb2Wws7rke6K+iJ4MtH EearGDxRhPIloIHDQcQgignQE3QtdCTLf/8ItadCirCe5OeSXo7kHB48koc11N4jJLjmiCJYcqQw kMOQiHwy5stJ6AE4sgj5dOS7kQfob5CwLzEJ+wYzln19GRedG51LVNH50S+Rh9g3kg8r1iv+mqQq Nim+SjLY15GL2VeKT7JvDJexLwdz2VeBhex7wL9Eu5/i/5mfRLuPL1hM+AVPLcghigXPLcgjSQu+ u2CapEQvjc4mpuhCxUvErlipeJmzK9SKSs6tqFJUcd9T6BTV3D5FneJbXHdCXEIctz+hP+EY91Yi l1jDHaLfIvKP0e8P+VfYV1f064Nc+dus5eg7WuVReQlRtav+lvCq86p3SZTqomqUKFSXVb+VvmSh X4HKb2rlN5k0FjwPHskC8wILuP7nBVMkKnpt9BdJrGKF4nkSrygAvyrw+3mSxPpIZn2kqDpVXWQh OPolWcT6S2X9pbH+0uX+OL4dEgnvG/bVAQ2EO1CBtBEwgK5GagGccop1+r5OmaboBnqAPiCI+rSN QeCEjGE5HZGweyUhlq0SKL3vPN5pmM0DXG2WlB6gPIwB48B1YAKYRLkB6QxwT3rv+zwQC6jwDDx9 P0XOpzKe5oPyyPj8Ecb0I4znm7eRdhLuRz1AN6SzkhSTTaQMethBGomJiKSTHCB+7L1PkbNkjFwj t8gMRBjPpXBLuHxuFVfMCVw5V8M1kAV1FXVCXXVdWV2d3kF4/V79Qf1+vR+URz+t79DfBtWnn9EH 9ZC8vl1/R+/XT4Hq0F+kNUAZ9Nf1FvbUqD+r360/DapWf05frz8Dqk4/+MMxfRCUWj/0w7P6o6C2 4u3NP6RP1+p79Ot/OMyeivrVehuozWi3gPGyUd+oz9E3gNqAdpfod4Iq1mv1afpy9m61PllfAUql 36mP1e8gfO0dfX3tfX0JiQK/3fpBtO4D9521x1DSpy9DaQVKq/UntgdQ+6I+vfacfhGoE/qM2mF9 KlmA3ou7pvQl+vLa3YTvmuia7Jrpugfqau1U162uO6Cmu650Xeu6CWqkdrxrrOv6/8UYEMu+4Cbs 22369fQbJE7RqGgmSvYt86fZl8iPsG+NH1UdU/0dSSUct5Gj30YlkhsEfti1HtgICEAZAF/pqpZT 2FRXg0xTwH67YKtdsMku2FoXbK2rU0a3nPZI+BvYakuBBEp39c3SIXTBfrvgW13wpy74VRf8qes8 MCbV7YKfQHqkC37SNSnTM3Lf80D9mvpA9RmkDSSvZm3N+pqNNetrr9QItddqymoqaqqBupoGPGmo aawx4LLUOGt8NZ013TU9uPqQC9YM1pyoGWZPDTUjNedrDNUpNSdev/H6LVxT1arO1M6MziWd2Z0r OvPf8r919K2ht05CDw9Dv1OE8NP8vxKe/zfoOorpWsF0HcN0nQhdv0iU0S+FNZ4EjX+FPKL4a+j9 Mab3NIWgEEg69N5LHk/og/Yzof175KmE+7CBLNjAqyQbNnCKrPh/1CtHNpO9zH5W0t8liIhVLE5p h6U49f0MYIlcDuxfDeANbdH2ou1rthdvL9m+WbtnR1nHgY7e/Tn78zCaBP6P/B8xmhl+BtG8ILqA 8IoSRQlZAF/YQqIUr8IjohMOJRwiioT/SPgPEqNUwyNiVb+AR8Qzj0j4b2qFS55+eDNmr0TuOIFd NcFzm+4TYogC4gn/BuYzQxKwkJA3ignZuVsCzRvSgMXAUmCZXIaZ01Ag54vC4GzQYdU1CW/UAvUo X4N012x5JCLL39gjp6aPqb9HKnc75jyX+Chg/Ui8UV6KUcdDSNWu2bpIpTGVsHqsH/b+ZgBzlKEc oHKolfP1Mo33DHsAE+CQ6oRkg/YZvgNfNnhYOf9GhzSWNyR+iaFjtn/DPqkuIPWNNnYu+Uiw57S9 qmv8+J5pi9F1bc9di811s4lYRNftJoWl3TXdlGjZ67rblGxpFwnK96OcWA6KiqZFFr+YiPpHxeSm dJQsasq0DInpTVmWk2Im6pxGnRzLWTEL717Au6B3TKD+ZTGnKc9yVcxrKrTcEAvx7i3UWWURxVVN ay1TdadB3wG9CuU5Test98W1TRutUeL6JsEaL25sKrMmiUJThXWhWAY6DXS1dbFY0VRnXSpWNzVY l4l1TY3WXLGhyWAtEBvxVpFoQMkalFisxaKlyWktQZ0662a06bNuFZ1NndZy0dfUbdWKnU091lqx u/KatV7sQfkusQ919ojBpj6rSRysvGh1iCdQ7kH9oLVDHG4atO5zXWs6we6Q2+srmoatByCxE9Ze lIxYAxjdeesxMcuQar0mrp9zz7DeDN9T6Z2NbsywxHpbFObcs3EfN6ywTosNhnzrXfG6TK9k99U2 ItYZ1tkUaCfyviHivsmWKPYZ1Owu0dtsyeKEQWNbJE42jVmPiyNNOZRbQ40tXZxpqqNvNV+xL3Gf bhq3ngqPkY3IYLQVulOa+mzp7lTDDlumeM9gsx5zZzRdZ3UkCUj0BKMnrQfE800z1jNiony/J9Pn xEQDb72INiPvsdYruKsi7qJtFTQo2RjTpqHdtlbMM+y1rRe7DfttG103DQdtgnuJZLeGnbYsN29I wbs5GG+m6DPstuW4YzHePLfK4LeVubMNR20VYrVhyFbtXkFt0p1Pta8hhlhbnXul4SR0MR6ibQ3i uGx1bFySBqnXfLuH2qd7teG0rRH+UgFPKZv1Hfc6aqXuDeDQAA5PMj2epaMwXLBZ6IhsTjoim292 dLZOjO6ytVdUGK5SzaJH2JJEQz5U/pJ+b9i6Mbpbth6x0zDF6DuMliRzn0qGepl7E7Vnt7o5ytYn FjbH24JiT3MSk+om2EAfpH0sRDcvtG0U1zan2QRxuHkx6MLmpYxeZht0b2vOtZ1wa5oLbMPumuYi JocMKofmNZBSqmEJpCQ0F9vqXLebSxi92Tbi3gH6PPx02DbiuivZc9MEjSrNJcy2JV2so7po3go6 FRZL6XLLfvfOZq1tDDq6bBsXFc21tutiXXO9baI6pXmXbbI6u3kPtaJmk3XavbvZwWgPpSW7au6w 3nUbaaRy25r3WXPdIrQwIyY3H7DdQ2RA1Hp9A40PO8aae+18dTaVf308ta7KuzSCwZcRK9ztlEbc o/Te5gCTv+RTki5SKU0jW30UjSHu/ZGW2XzMHus+2HzcrnL74UGQc/MpJueiWRr6DcufxkP3URp5 3PnNZ+wp7qHmc/ZUcZVsybeorzVftGe4T5qi7CneHlM8fWpKsqfUnTYtBD1oSkN5n2kxK19qveIN Nqe1zngHm3Ls2YhFdfYViDPp9vugOx1RYh+1Ye8JWGmUewM4ORWybdMyy17vsGS90J0BukuFvtY3 TVA9yjplcobE7sJ6mZxp7PXcpNEeo0CM9Y7Aki+6bksWS0fnPY8ouss7Zrgxa4E02nvHpbhKeaYj bZ0BnQvJ5JgKqP9KvJkV1mu+o+ZEput90LVRjhhMC0xKIUu+Zs93nzX2OYo9tc037SvFyebb9tXu C83T9nXuyyjZgJJp+yZG06d37Wr3VSOxb3PfMCrsGvctY6K9xjVtTLbv2FGGmjtZzd3ipHGR3eie MqZTzRoz7Tb3HcNuu/itcmOWvd1935hj3+uJMubZ9yOKNtoPig3GQrvfE29cZT9anWLQ2Ieqs41r 7Sc9Scb19tPiCeNG+1nPQvR1wZNmFOyX3SrUvOpZbCyz3/AsNVbYb3mWGavtU55cvHsHsQtxzFMg z6FstjLWOeI9RcYGR5JnjbHRrvIUG9MdC8GbwZHm9lPaU2K0OBaLWUanY6lns9HnWObZaux05HrK m9Y7CjDDsrnM2O0o8miNPY41Hq052Wn0DZkXOW2+k+Z0p+g7bc50tvvOmrOce30XzDnO/b7L5jzn Qd9Vc6HT77thXuU86rtlXusc8k2Z1ztP+u6YNzpP++5Lc7RZcJ5tizKXOS+4r8qrCDZfy75/kvq7 ucI23hZvrnamtCVF2g/1OPdR6nHeEXMd1gNORNEOb16TgXqxucF5uW2hudF5tS3NbHDe8F2OjCdm i/NW22Kz0znVttQwxSLqOhpFzT4au5rTqJ1HxvOmSWrb5k4WoyLjFey8bRm187bcSJuHDSMCIFrO RgMpMu+n0djcbetpKzD3RERmFfP0k9Q+zRWMVtNZODJKm/ucd9qKzEHn/bY1Bt427ss37ULcM5gH XVFtxeYTrvi2EvOwK8mzi+qubTPVXdtWxJZToWg8O++IY5ivL4bilekmekxHzIE3GYOOEjdvHHRs 9tTjvtVTT60Lts38Bfdy6jUOLazxhKM2XD7sqPfsMo44dnn24L4H9/MOk8dkHHM4PA7juMMD27vu 6MBKjOnXOOHY5/EYJx0HPB3GGUevZ19zryMAG9bQdRq9o/17jmOepBbetspzoCXWcdxtbFE5Tnl6 jWtxT2L3QEuK44znWEuq45znOLufoms53FlMlu4tGY6LnjPSuFqWOK54zrVkO655LhoTHTc9V1pW OG57alvyHdO4r3Dc9Vwz9rUSz012v92yslUhXm9Z3ZromW5Z15rsuYv7Is9d6l/fKm/Z0JruJS2b WjO9ihZ1a5Y3sWVba443uUXTmuddJM+tva2F4mRLTesqb3rLjta13kxjsHW9N6tlZ+vG6ljDzlYB 9O7WMm8O1Resl94LI+i8FmNrRfVK3Ktxt7XWgU+xtcG7SlpFt7S3NnrXSnJu2dtq8K5v2d9qEYMt B1ud3o3o3edWtfhbO71Cy9HWbtDG1p5wa0Otfd6ylpOtQW9Fy+nWQW91y9nWE966lgutw96Glsut I97Glqut572GlhutY15Ly63Wca+zZar1utfXcqd1wtvJ5ohhus7xXjcVtd7zTjQJTl7cSPcLmDuw MvdOYr6weWdMa0DfMxXbGn28tF4ylVjafbGmzdaF3hHUaffO0HKfiq6RfCmUdu+V6rDyVJTvRbk0 78CSfRkSbdqKNpeYyp2xYoVJ61TBx7NtFb5srDewNjCxtQHdm/hW0F0ArGKE+U59uHwlLfetpvTr Up32yDkLK71xcZFplzNFNJj2WA56z6NOEXgzoX4qXSf41oHPIfCJFYLnZvNmZyrG5bBZPDdZ+QZa 7ttEVxE+tVTH5HFmiJmmDucS0WLax+gDlKa7pLAND1p73RnwSuLbBjmf9mkke2Z0DaV9qsjypkln tkhMvc4VotNU5Mz2TpgCzhXfzjMdY3Emm8YZuhoB/1iN+HZQ2reT0btNx535dGXiXImVIWYQ7yS1 cJ/R0O5cLeaZTjnXYS0dQdP63kla32fEmu2G667pjHMDdkYR8YrSPhulNVlzyjHX+0Q61/va2bw/ zvZTvkjalOvchFXKOacaOyzsAVGO3ZZ3TF7DXLSn+vaarlimfPvp/gsjGnRuc2eYrjk11ZtMN53b sDa47azxHURko2uGDVgzVGMlHF7B0v0j7BP+BX5A+/yUrrzNLEFlmnbuEHtMd507fXsRtzPxLpsF zMS525PUNt12t51YVrr2eZIs+a4OsbH5pmsh4tVaV5onYBRci90q84hraVt5y/3WSW+3dDefdy1r 05rHXLlttXumXQVt9eZxV1HbLvN115q2PfIKv9BV3GaSYovk++YJV0n1JnmHK+0ypF1t5I5V2quy Xap50rV53l6VzeDmGdfWNof5nqvcu8jCu7TuKUusq7bNY1G56j29lhTXLqzTWDuWVNeetg5Lhsvk TZf8V/JE2m/bPnk3DZtHObPkOfE2zEnbgcgIyXbKTrpH9o7JkY1GjBFpfy3FJcmX6QzS1ktnkLZe 2dOZD1qWWJPaApZsl6PtmGQhlhUuT9txy2rXgbZT8ukEOzGwrLMY285IpxOWDa7etj3yWQTb9Vs2 uQJt5yxq1zG3Sj5zkHb30qkCW2dadroutt2O3FHKNDuvkDzIss11vO2iReM61XbFUuM603bNssN1 ru0mtYruVPr7dOwXJUnEL0ry7Bclo2JXxW4m0exXJNPYr0g+wX5FMjO2PnYXWR77ZqyV5LFfiHyZ /ULkhoSnE3LIxoR/TPgnoma/i/ka+xXMr6OP50gm+QtCyGpSSlLJNvJdkkvMuDYSJ3GRV8g+8n3y VXIA1xbSS/xEID8lg+Q1Mkx+Q75GrpL3iZ78gdwi3yYz5AH5G47nskgLZ+FsxM/5uN+QAe497jr5 Y5Q2ajv5IGp/1A/Jg6ihqJ9xC6JGot7l4qJuRv0T96momegF3KejM6Of5D6rsCiGuCcVJxQ/4zYr fq74OScoTive4V5VjMYouG/ExMU8wnljPhOTzu2PeSLmTe5A3JtxRj46zhwn8sq4trgO/pG4rrhe /rG4w3Fn+Gfi3o27zH8h7r24Gf7LcR/Ep/BV9G9rfFOCKuEh3pCQnPAIb0wYT/gDb0v8ZmIX70uc VnL8L5SpylT+XWWacjF/Qfm08mn+t8psZTZ/5SHVQyr+PcJBOlp24kp/S40IScBCIA1YTFKFhUKa sFhYKiwTcoUCoUhYIxQLJcJmYatQLmiFWqEe1C5hj2ASHIJH6BD2CeX0VxSZhknsy7EvEz52XSz9 PzF4ksxn89mE8Pl8PuH4Ar6A8Pzn+c+TBfwq/mUSxa/l1xIF/yX+SySGf4V/hcTyX+UFEse/xr9G lPw2/utExf7NYhK/nd9OPsW/zr+ONr/N7yQPs3+5+AiknkkWKd5RvEMexZjGyDgbGft1M3Uj2aZu VBvUFrVT7VN3qruFWEGl7lH3qYPqQfUJ9bB6RH1+y6R6TD2O3An1dfWEekKoUU+qZ9T3SvnS2FJV aUppamlG6ZLS7NIVpfmlK0tXl64r3VC6qVRduq1UU1pTuqN0Z+nuUiPeCV94T7oy5Gt1+NLIl61U BHaXtgN7S/eXHiz1lx7FNVR6svR06dnSC6WXUeNq6Y3SW6VT9K+RMW9BmgvnWDv9lfdcUgvbLSDf geWvYtb+V7ByP/kS7PynZD2s/Dfky2QC1wYmo6/EfDbmSVIS81TMU+SVmGdiniGbYj4Xs4x8NSYn JodsicmLySNCTEFMAXk1pjCmkKhjvhCzlpTGvBqjJq/FbI3ZCq/h2F/7qJQX01+q3OIHjsoYYmnh lt4tgS3HthzH/dSWM1vObbm45cqWa1tubrm9ZXrLXYEICiFRSN4SEBYJ6UKmkCXkCHlCobBKWCus FzYKglAmVAjVQp3QIDQKBsEiOAWf0Cl0Cz1CH3JBYVA4IQwLI8J5YUwYF64LE8KkMCPco7/5F6uP fZ39Pmb8HGl9B1cu+d+4nie/x5UH33+fvEBu4sqP2RCzgbwY80rMK6QgpjymnLxEuMQ7Svo/qySS LPrboBUYXcUQ4apoehI4TbiScuD2gucq/FV7K45W7WdpiB6qOlhxssrPcLrqaMXZqiFG02cXqk6y ejQfqkfzl6tOz2nnatXZOW3SNmidG1UXwumtqsvh8qmqqywfou9U3WB06HnoHcpPqB59RtunKQV9 fh/5+xH9gq6MAo/3I+rNB31vPigPkQj1Nx8h3iJBxx6SS6iezBfjJSSbEP+0PF7mFSlDUtXROcB7 IYTHSEF5o+NEWrkQfUM+rC06hlAfobFTfYE/1gbNU1lelt5hdUPyC+kokke5ncq0qlth2aJeqC+W yrxULq6aYunSqjusPdqWnIb7vj+3vxDvrF3ol8lgWdX9D70fP6/fXG1UZYE2vrJImzRnvJFj+She aSrzEubp5Gye8UPzIfnQsckp1Udknr1LbTJUP+QL9JnsG5VrtAtZ+cm5fYXkPn/84XH7544/nA/Z UEi36EsTlMrmp+E66LOyWJtWuU9bW3lAW/8h+/iEVDP45z2PrPchef8ZqeZERH6+nE/O1dcnpZSP yDwb98ekIbnMl7VmWJLTn0r/lBxD45hj+9QmSrSLQ75WuVm7tHKrdhmj5TQcP2VfrizX5obraLUF zMdqtUWRcbiyXrumcpe2mMksZI+07z3akkqTdnN4jHTMDu3WSo+2vLJDq2VlcnxgMaRXu6syoN3D bDFkk7S/Y1pT5XGto/KU1sPGEvKtM9oOCs11XaNmQmeg9TWTOotmRufU3NP5qL1W8bpOZrfopypW 112l0vVUpej66PthW/0IHYd9MaK8KhV9rdel036qMmb7CD9fogtWZesG58SPs59gm0lzfftDsWF+ TJkXl8JxC3ZUtUJ3IsR3Vb5uuGqlbqRqte58SFZhXo7OjUORc1TlOe0+ivC8F4rJcr7yovZA5RVt L8M1baDypvYY6/+29jjDtPYUa+eu9sycuYnGCaI9p1FoL0bOb5pE7RU254Yg19cka6/RdjSLtDc1 6drbYXucB02mdpoizDdsSJOlvcvsIEdHNHk6BbMhee7WFOoSQ22H/EezSpfM2lqrW0R1y/Qb2cdG XSa1A42gy6LjpWPUlOlywm1W6PIi5aWp1hVq6nSrNA26tZpG3XqNQbdRY9EJGqeuTOPTVWg6v3Zb 062r1vTo6kI8MHsI6TMyna93/yen8+0rrPt5c5FmpOqg5jz0FmlvoXlCni/nzEXz5iRqr5oxyV4/ sl5obUBj69jsWiGUasaxnoO+Qylb39H0T4zzk2It0+WIFEtCaVh+89cZ8+e/UPxBnq17ItLw2mZe TJqTfpxeIvyVtRXytZDtheLP/Hn1Y+LGfH2ytkP9yz5M5f3dG9+99aG1LdKqdboxTZ+ugYKtYYBw vA/FBgoqE7RftUE3HvZh2laEj4b8L7w2pvzIaxI6T1Rt0l2n/k79nvWt1k1Q/4tsr2qbbvJDa++I NXeVRjczZ70sx6hwPJJjUXjtTHmu0d1jNgA/rtpRzYf2B1U7q2PDcpP5rNpdrQrrK2LtWiVWZ8yx WTpHhWRE3zNWp1TZqlPpc7qTj7XHthKS8Cz7H07+k72vAY+qutbe+/zMTxJiREwRQ4g0JDHGGNOI /AwQMzSQcc6ZmQgUKUaMSDGmNCJGRETKw8fHx0VKqVKkFFNKETGl3HzITTFGpJFSRORDTBGRInAx pRQppoiIyV3rPWeSyWQQ2q8/93lu2c96z5q111577b3X3mefH3JOxZ8S/NXNzH/snRZdFe24o3Iv 7qjc59jm+JV8BvdSVuBeyhrcS9mHeykf4l7KMfdTcb2UItwhOYA7JO/hDsn7uEPyIe6Q/IHvkKh9 +A6JmsV3SNQb+Q6Jmsd3SNRb+Q6Jyu+krRUbOu8jlCwXo0uWl6wqWVOyvmRjyeaSrSXbSnaU7C7Z V3Kg5HDJ8ZKTJWdKzpVc9Ck+ly/R18vXx5dGKcOX48v3DfIN9430+XxB3zjfRF+5b6pvmm+Gb5Zv rm+Bb7FvmW+Fb7VvrW+Db5Nvi6/Bt53knNb61pJVSr5EJPrlm8vEPBPfE3Ddze+nRV3lzqJxeVI8 Rde3GykNxhXvEPH/xD66pt1PaZj8jdwlhmt7tXdEId+/EiPxDl5ZZ3u9RaL/qMRRvUb1GZU2KmNU Dh3zicsfNWjUcJKOHOWjFBw1btREULl30qipo6aNmkG/xhHOGDWLtHqNGgcf+d7QV/D/foXIEPxX 5rMoKXRVnS1UkSP4iwy54hah41uZTro6HyTc5NNI0UMUU0oUoyldJXyUkoSf0tXCFAHyNCRKRS+K vPEiGR/M6iOqKV0v5lBKEXMp9RW7KaVS298R/WSiTBQ34K3WORFtnafm+2v86/y1/jp/vTfO3+hv 8u8q2uPf62/2H/If9bcUHfGf9rf6LxjCcPirjQSjp9HbSPVO9tYZ6aB1RraR5/UbAw0PYZGRR1qj DdNb5k0yxhh5RUeKG71VxgRvBdVTY2T769mq4SALHcmYYqRbyesnG5XGdLYSTkaenWYak6jkHH+1 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 4FMffGrApwXBpwng00Lg08Lg0yLg06Lg02Lg0+Lg0yvApyXApyXBp6XAp6XBpGXApGXBpOXApOXB khXAkhXBkolgyUpgySSwZGWwZBWw5JVgyapgyWpgyWSwZHWwZA2wZE3wVwr4qxb4qzb46yrwVx3w V13wVz3wV33w19Xgr1TwV0PwVyPwV2PwVxPw1zXgr6bgr2bgr+bgrxbgr5bgr1bgrzTwV2vwVxvw 17Xgr3Tw13Xgrwzw1/Xgr7bgrxvAX+3AX+3BXzfyqKA83QQm6gD26QjG6QTGuRmMkwl+uQX80hn8 0gX80hX8civ4pRv4pTv4JQv80gP80hNs0gts0hts0gds0hds0g9skg02uQ1s0h9sMgBsMhBsMghs MhhscjvYZAjY5A4wyFAwyJ1gkBwwyDBwx3DwxV3gixHgi7+BI0aa55kd7gY73AN2GA12uBfsMAbs MBbsMA7sMB7sMAHscB+zQ2GapCqqaqqWqqt+VA+pR9UT6in1tHpWPa/WqvXqNfUW9+j31Fb1sdqp PlN71VfqsPpG+iizw4/MDsnMDm31jbqT7qy76Z66r+6vB+uhergeqUfrhXqxXqpX6jXcizboZP2G 3qjf0x/qbWonx7v1F/pLfVB/rb/V3+vT+if9i77oWq52C7i++ka3dYsxK5R2B7kNdCeWstzebrY+ GP+Sp7yIF+8V9Ip4V3ilvfJeJa+md5VX32voXeO18Fp713k3eDd5N3tdvO5eL6+fd7sZZyaayWaa mWXmmPnApWalWWNeNh+Yj8wnZpf53Oxjhrj//zPE/0MMIVcpHcETncATN4MnMsETt+DKpDPYogvY oivY4lawRTewRXewRRbYogfYoifYohfYojfYog/Yoi/Yoh/YIhtscRvYoj/YYgDYYiDYYhDYYjDY 4nawxRCwxR1gi6FgizvBFjlgi2Fgi+Fgi7vAFiPAFn8DW4wEW9wNthiFK4p7cEUxGpxxLzhjDDhj LDhjHDhjPDhjAjjjPnDGRHDG/TKPjjwqR0NpE31EuXSAjtNZyrOiVmGrDMVhhWpZnzqF6lEjak5t qK36iX1ogvqZcaL6hXGy+pVxmjuZbH2NO5KxmTuKsYU7mrGV2cBjrUfNq4yP/ZMczyHH88jxAnL8 DTk+iBzvRo73IMd7keMryPE15GiR446R1JDGxqRxMWl8TJoQk+6LSRNj0v2/S96ZmPQjJJvZ4Sv5 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 d2cIl3rtoj6OXNt0psd0v1DPruID/ZHy260FvAgPG9yxugHv9U+udNI9eqFz+aLugGd1paXToUYv Ic7Ct4QXCBY/VKeWaUD0K/1qTtjW8FvvyP7LnpSN3cO/GhpJk9dRfA56Fjn1QAlnCcPbEyfkrm8Y C7Jd3+M8IRtzyi1313qLugp5kqI9V7SCjHDPxa20hI/m6mPebnTr3zRb9wirDnSpr95oOPpMVVdH VW3IjmtHRdHpwOfLk90mEjBm7TGepJptv+qLm2vZPUigfTCJzLB6ZtQ7brYVGnfbLHi0s1BFNSU3 Nx4jhcZjFv8xR2ykeAwPiOJgSWXiP6YF/GljboEobkQXLZRE7j/+6AGDNudT8CRe5iYaiYTqAPN0 BUnb5V8E8UsxLVnny/6xsOGUXejrkbCWkamG72iaKSKpcUj9rf3Ie581a8hmrdny249E1T/K5dln kuivdG91iUC3OTKir+SvPPbkjuhrCl/Hgd5FQeuqjiSHvRurf4dJuxuzWMXnVKChxjJnuw/XM84q 61a4J8i55y/9csqOHz/6y8i5kgNulyoOeK03kLYwMUZk+7UYeQ2uYjz6KlgBi6Fr8prXzAW7PAZt bq9bnxlGpj4ljy3PTAuPxB1zLx2eyOeOju1sdCyRG7dLL6zY6YF32U8xmOIZXepB5X34YSmU/z7s tWjYSnbS6su6O0cIEu9n1qpMyihsPZsWeVJTru6BM2w8mLfa3aNiBu9fMq24uXRadLE5LBn0CGnz WZVCiz7aqw1B/wXGRVG8DQplbmRzdHJlYW0NCmVuZG9iag0KMzcgMCBvYmoNClswWzc3OF0gM1sy NTBdIDhbMTAwMCA4MzNdIDExWzMzMyAzMzNdIDE0WzU3MCAyNTAgMzMzIDI1MCAyNzggNTAwIDUw MCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDMzM10gMzZbNzIyIDY2NyA3MjIgNzIy IDY2NyA2MTEgNzc4IDc3OCAzODkgNTAwIDc3OCA2NjcgOTQ0IDcyMiA3NzggNjExIDc3OCA3MjIg NTU2IDY2NyA3MjIgNzIyIDEwMDAgNzIyIDcyMl0gNjhbNTAwIDU1NiA0NDQgNTU2IDQ0NCAzMzMg NTAwIDU1NiAyNzhdIDc4WzU1NiAyNzggODMzIDU1NiA1MDAgNTU2XSA4NVs0NDQgMzg5IDMzMyA1 NTYgNTAwIDcyMiA1MDAgNTAwXSAxODhbNTAwXV0NCmVuZG9iag0KMzggMCBvYmoNCjw8L0ZpbHRl ci9GbGF0ZURlY29kZS9MZW5ndGggMzMxPj5zdHJlYW0NCnicZVLLboMwELzzFT6mhwhs8pQQEiGJ xKEPlfYDiL2kSMVYxjnw9zW7JE1TS2DN7Mx6YB3mxb7QjWPhm+1kCY7VjVYW+u5iJbATnBsd8AVT jXQTwrdsKxOE3lwOvYO20HUXJAkL332xd3Zgs0x1J3gKwlerwDb6zGafeelxeTHmG1rQjkVBmjIF tW/0XJmXqgUWom1eKF9v3DD3nl/Fx2CACcScwshOQW8qCbbSZwiSyK+UJUe/0gC0eqjH5DrV8quy qI69OopElCI6EsoRcU7ogJ0mD792uB3IVyjjG9zieFJTnT8eyDOSre+brv43zanpntRbDCQWFGiL 24ITubtmRnJD5OEaBskdkvGSSAq6FEROeci+XP9JLx7TZ+NhIhIr9O5yRFl+/y3jTx/vxm2i8mKt HyZeIJziOL9Gw+2Omc6MrvH5AaFCvWINCmVuZHN0cmVhbQ0KZW5kb2JqDQozOSAwIG9iag0KPDwv VHlwZS9Gb250L1N1YnR5cGUvVHlwZTAvQmFzZUZvbnQvQXJpYWwsQm9sZC9FbmNvZGluZy9JZGVu dGl0eS1IL0Rlc2NlbmRhbnRGb250cyA0MCAwIFIvVG9Vbmljb2RlIDQ2IDAgUj4+DQplbmRvYmoN CjQwIDAgb2JqDQpbNDEgMCBSXQ0KZW5kb2JqDQo0MSAwIG9iag0KPDwvQmFzZUZvbnQvQXJpYWws Qm9sZC9TdWJ0eXBlL0NJREZvbnRUeXBlMi9UeXBlL0ZvbnQvQ0lEVG9HSURNYXAvSWRlbnRpdHkv RFcgMTAwMC9DSURTeXN0ZW1JbmZvIDQyIDAgUi9Gb250RGVzY3JpcHRvciA0MyAwIFIvVyA0NSAw IFI+Pg0KZW5kb2JqDQo0MiAwIG9iag0KPDwvT3JkZXJpbmcgKElkZW50aXR5KS9SZWdpc3RyeSAo QWRvYmUpL1N1cHBsZW1lbnQgMD4+DQplbmRvYmoNCjQzIDAgb2JqDQo8PC9UeXBlL0ZvbnREZXNj cmlwdG9yL0ZvbnROYW1lL0FyaWFsLEJvbGQvRmxhZ3MgMzIvSXRhbGljQW5nbGUgMC9Bc2NlbnQg OTA1L0Rlc2NlbnQgLTIxMC9DYXBIZWlnaHQgNzI4L0F2Z1dpZHRoIDQ3OS9NYXhXaWR0aCAyNjI4 L0ZvbnRXZWlnaHQgNzAwL1hIZWlnaHQgMjUwL0xlYWRpbmcgMzMvU3RlbVYgNDcvRm9udEJCb3hb LTYyOCAtMjEwIDIwMDAgNzI4XS9Gb250RmlsZTIgNDQgMCBSPj4NCmVuZG9iag0KNDQgMCBvYmoN Cjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGgxIDEzNzE4MC9MZW5ndGggNTcwOTk+PnN0cmVh bQ0KeJzsfQl4FFXW9rm3qnrL1tk3QldospAmEEIgASLphCQoEQgEMEGiCRAFFwyyKSrEBdGAiiMi jo5EFHRYpNJBTVgkruOG4OCC2xgVdxhQkfFD0vW99yYgfOPMfM488/vM//Vpzntu3Xveu9eput08 QIyIYgEq1RdXnDNyyKiz3iTWOZ0o4aqRxSWlzrzwH4neOUDEfxhZPrbi6NoHKonef5/o4/SRFROL Hh78YQaxXSrRcO+oigmll2fMtIBfjFp7njuh4my+zOInyn+RKGz12Ir+2eFTFr1DxH5AeU35iHMn uHYVjkT9m3A9eFLx6MpJWv1ionNriMJXTru8tn72pyVeouqjaL/XtPlzdfPZzfC/qpzIWnNR/cWX b0sLX4+q4ogswy+unVNP4WRHffejPufFl1190fKnzXuJFhtEmWNm1NVO/+j5tw6i/WtFezOQEbEo uhPXW3Hde8blc69KeT/qI7SFMQ6ddWndlbPMG/37iF7ti/K1l10xrXbjojV3Em3GpSvj8tqr6mPz IxaAvx8Z+qzay+tmZUVjfK/uJQreVH/FnLlmBr2N/oj29Por6+qVsYMfI7oI9Yd/T2LuLXum3JiT MuzCsPzvbfE2ErL2k/wkYV99/HrL8eMnOp1kuxK+dukvBNY63D+GRjjp+PHjQU46VdItIQ+JnLCV VEwKBSPNyUn9aRJ4+bJdRoryBt9BGtm032oDUUFil1Vep4t4hE3jQVaVC1E7KMNsp6tGoFq7qHvC 6BE64aOnavv849hA63Dm8xIzTRObKFXbJkZKUZbuLvEh3bqBWpVXqJ5+gYB31y/y30Av/a0y7Q9S V0FroSu1SXS3+gnd0122Cm0tP93fsoHuRP5qyxCqOq2OVeCNAq8v0rJv1tvIijzSJpmd/9t+gj/h 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 HvYIe4U3hsMrPltxccUlKT8VpnJS6VTlVNVU9VSt1HmpOql6qQtSBamLU01SzVMtU21S7VNXpn6W ujrVLVWc6pHqleqXKklvS+9K70l/ld6fPpQ+kv42fTxdlvEzQSbMJDM5mXSmcqZqpl6mIFOYKco0 y7SUXnnVJvXzwdIbtWS2qGvrGl96pYH024X2QhPYi+3FxtkmtokJ7V32LpOw99h7TFJ6615Twd5v 7zc59vf296ai/YP9g8yVj9hHTK59THo8Lb34uMlIT/7JVLJP2CfMafZJ+6SpbP9i/2KqSM8+ZU6X 3n3anCE9PN9UlV5eaM6Unn7GVJPeft6cJT2+1FSXXn/ZnC09/7qpIb3/pqlp37XvmnPs+/Z9U0sy Ya3Jk2xYb86VjPjU5EtWbDbnSWZsl5n5c/u5Od9+ab80dew+u8/UlUz52tSzB+wBU99+Y78xF0jW 1DMNJHMKTIFr6VqaC10r18o0dG1cG3ORa+vamkLJpnbmYsmoDqaR6+g6msaSWZ1MkWRXF9NEMqyr aSpZ1t1cIpl2nWkm2dbTNJeM62NauP6uv7nUDXaDTUs3xA0xP3HD3DDTyo1wI0xrN8qNMm0kG+80 l0lGjjFtJSvvNpdLZo417SQ77zPtJUMfMB0kS0vNFZKpD5mOkq0PmyslY8eZTpK1481PJXMnmM6S vRPNzySDJ5kuksWTzVWSyVPM1ZLNU801ktHTTVfJ6lnm55LZc0w3ye555lrJ8EWmu2T5YvMLt8Qt McWa7eaXku+vmusl598wPSTv3zY3SO6vMj0l/z8wv5IxsNb0ch+5j0xv97H72PSR8fCZ6StjYqvp J+Nip7nRfeG+MP3dPrfPDHAH3AEz0B12h80g9w/3DzNYxst35iaXdVlTIuPGmptl7CTMEBk/Fc0t MoYyZqiMo9PMrTKWqphhMp7ONMPDs8KzzG1hzbCmuV3GVr4ZISOrthklo6uOuUNGWD0zWkbZBea3 ob7tc6eMtobmdzLiCs2YsFHYyNwVFoVF5m4Zfc3MPWGLsIUZG7YKW5l7Q/0E031h27CtuV9GZA/z gIzKXub3Yb+wnykNh4XDzIMVn6n4jHmo4nMVnzN/qPh8xefNwzJaffOIjNjQjJNRm2MelZGbNuNl 9FY2j8kIrmomyCiubh5PnZM6x0xM5afyzR9lRNcxk2RU1zN/kpF9gZkso7vA/DlVmCo0U1JFqSLz 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 NjcgNjExIDcyMl0gNThbOTQ0IDY2NyA2NjddXQ0KZW5kb2JqDQo0NiAwIG9iag0KPDwvRmlsdGVy L0ZsYXRlRGVjb2RlL0xlbmd0aCAyOTg+PnN0cmVhbQ0KeJxdUU1vwyAMvfMrOHaHKkCarZOiSFm7 STnsQ8v2AxJwMqSFIEIP+fcD3HVTkcB6z362sbNDc2yM9jR7c7NswdNBG+VgmU9OAu1h1IZwQZWW /ozSK6fOkiyI23XxMDVmmElZ0uw9OBfvVrqp1dzDDclenQKnzUg3n4c24PZk7TdMYDxlpKqogiEk eu7sSzcBzZJs26jg137dBs1fxMdqgYqEOTYjZwWL7SS4zoxAShZORcuncCoCRl35c1T1g/zqXIrO QzRjglURcY7oEdExobxOmc6a4jfDpaDYoeg+mR1PWvGA5AHJfSJzhgkFkkckCyT3yRQCyRpJlBd3 5w6wJr/+RB2LCSZu/zcaPx93dJmsPDkXhpoWmaYZ56gNXHZtZxtV8f4AeEudsw0KZW5kc3RyZWFt DQplbmRvYmoNCjQ3IDAgb2JqDQo8PC9UeXBlL0ZvbnQvU3VidHlwZS9UcnVlVHlwZS9OYW1lL0Y4 L0Jhc2VGb250L0FyaWFsLEJvbGQvRW5jb2RpbmcvV2luQW5zaUVuY29kaW5nL0ZvbnREZXNjcmlw dG9yIDQ4IDAgUi9GaXJzdENoYXIgMzIvTGFzdENoYXIgODUvV2lkdGhzIDQ5IDAgUj4+DQplbmRv YmoNCjQ4IDAgb2JqDQo8PC9UeXBlL0ZvbnREZXNjcmlwdG9yL0ZvbnROYW1lL0FyaWFsLEJvbGQv RmxhZ3MgMzIvSXRhbGljQW5nbGUgMC9Bc2NlbnQgOTA1L0Rlc2NlbnQgLTIxMC9DYXBIZWlnaHQg NzI4L0F2Z1dpZHRoIDQ3OS9NYXhXaWR0aCAyNjI4L0ZvbnRXZWlnaHQgNzAwL1hIZWlnaHQgMjUw L0xlYWRpbmcgMzMvU3RlbVYgNDcvRm9udEJCb3hbLTYyOCAtMjEwIDIwMDAgNzI4XT4+DQplbmRv YmoNCjQ5IDAgb2JqDQpbMjc4IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMjc4IDAgMCAwIDAg MCAwIDAgMCAwIDAgMCAzMzMgMCAwIDAgMCAwIDAgNzIyIDcyMiA3MjIgNzIyIDY2NyA2MTEgMCA3 MjIgMCAwIDAgMCA4MzMgNzIyIDc3OCAwIDAgNzIyIDY2NyA2MTEgNzIyXQ0KZW5kb2JqDQo1MCAw IG9iag0KPDwvVHlwZS9Gb250L1N1YnR5cGUvVHJ1ZVR5cGUvTmFtZS9GOS9CYXNlRm9udC9Bcmlh bC9FbmNvZGluZy9XaW5BbnNpRW5jb2RpbmcvRm9udERlc2NyaXB0b3IgNTEgMCBSL0ZpcnN0Q2hh ciAzMi9MYXN0Q2hhciAzMi9XaWR0aHMgNTIgMCBSPj4NCmVuZG9iag0KNTEgMCBvYmoNCjw8L1R5 cGUvRm9udERlc2NyaXB0b3IvRm9udE5hbWUvQXJpYWwvRmxhZ3MgMzIvSXRhbGljQW5nbGUgMC9B c2NlbnQgOTA1L0Rlc2NlbnQgLTIxMC9DYXBIZWlnaHQgNzI4L0F2Z1dpZHRoIDQ0MS9NYXhXaWR0 aCAyNzEwL0ZvbnRXZWlnaHQgNDAwL1hIZWlnaHQgMjUwL0xlYWRpbmcgMzMvU3RlbVYgNDQvRm9u dEJCb3hbLTY2NSAtMjEwIDIwNDYgNzI4XT4+DQplbmRvYmoNCjUyIDAgb2JqDQpbMjc4XQ0KZW5k b2JqDQo1MyAwIG9iag0KPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCA4NjI5Pj5zdHJlYW0N Cnic3T3tctxGcv9VpXdAVSqp3YsIYb4Bl0sViqJk3kmUjqTPcXSp1IpciTxLuzSXtM73jnmYvEH6 YwaYATAgdOe6c2KXuAvsTE9PT39jplE8flN8/fXjVwdHz4rqyZPi6bOD4vGLU1d82D188OPDB0a7 Uuuigv+dkqXUhXClrAsp8Pv5p4cPHh99Wn1Ym+LZtvj9wwfF4auDooiACg8UYAmhSmEJlhCirHVh RKnrQrnS1hGsOgdLelgV9voMzV+cioowrYoX0F4UfyoeqAoxc0JjI4BpnMRR/Y2PDx+cjkBWHrLv bZ0plY16+xuZ3rrrTeM4iV3hArsJmetmQjccREc9+Xq6s40whnlZp8vaz1fxFOhGprcbzld4pOna mLI2uc51b2hjy0rHQ/ONTO+mm7VCmnZjhxuTg4uqZQIhJfyVtSSGsMUJ8MADgfPWhQYSNgRVOIdk 9TdyUAObEiM9ULqUBbI7U9TW7WWuf8eaMBaw5gOtNUmLUsjcAMXfaNwUGqoFA00ZjC2dJTDGMhi6 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 W8hD1ryDuC5rGtXW8bB1POz/Ark6fJwNCmVuZHN0cmVhbQ0KZW5kb2JqDQo1NCAwIG9iag0KPDwv VHlwZS9TdHJ1Y3RUcmVlUm9vdC9Sb2xlTWFwIDU1IDAgUi9QYXJlbnRUcmVlIDU2IDAgUi9LWzU5 IDAgUl0vUGFyZW50VHJlZU5leHRLZXkgMT4+DQplbmRvYmoNCjU1IDAgb2JqDQo8PC9Gb290bm90 ZS9Ob3RlL0VuZG5vdGUvTm90ZS9UZXh0Ym94L1NlY3QvSGVhZGVyL1NlY3QvRm9vdGVyL1NlY3Qv SW5saW5lU2hhcGUvU2VjdC9Bbm5vdGF0aW9uL1NlY3QvQXJ0aWZhY3QvU2VjdC9Xb3JrYm9vay9E b2N1bWVudC9Xb3Jrc2hlZXQvUGFydC9NYWNyb3NoZWV0L1BhcnQvQ2hhcnRzaGVldC9QYXJ0L0Rp YWxvZ3NoZWV0L1BhcnQvU2xpZGUvUGFydC9DaGFydC9TZWN0L0RpYWdyYW0vRmlndXJlPj4NCmVu ZG9iag0KNTYgMCBvYmoNCjw8L051bXNbMCA1NyAwIFJdPj4NCmVuZG9iag0KNTcgMCBvYmoNCls1 OCAwIFIgNjUgMCBSIDY2IDAgUiA2NyAwIFIgNjggMCBSIDY5IDAgUiA3MCAwIFIgNzEgMCBSIDcy IDAgUiA3MyAwIFIgNzQgMCBSIDc1IDAgUiA3NiAwIFIgNzcgMCBSIDc4IDAgUiA3OSAwIFIgODAg MCBSIDgxIDAgUiA4MiAwIFIgODMgMCBSIDg0IDAgUiA4NSAwIFIgODYgMCBSIDg3IDAgUiA4OCAw IFIgODkgMCBSIDkwIDAgUiA5MSAwIFIgOTIgMCBSIDkzIDAgUiA5NCAwIFIgOTUgMCBSIDk2IDAg UiA5NyAwIFIgOTggMCBSIDk5IDAgUiAxMDAgMCBSIDEwMSAwIFIgMTAyIDAgUiAxMDMgMCBSIDEw NCAwIFIgMTA1IDAgUiAxMDYgMCBSIDEwNyAwIFIgMTA4IDAgUiAxMDkgMCBSIDExMCAwIFIgMTEx IDAgUiAxMTIgMCBSIDExMyAwIFIgMTE0IDAgUiAxMTUgMCBSIDExNiAwIFIgMTE3IDAgUiAxMTgg MCBSIDExOSAwIFIgMTIwIDAgUiAxMjEgMCBSIDEyMiAwIFIgMTIzIDAgUiAxMjQgMCBSIDEyNSAw IFIgMTI2IDAgUiAxMjcgMCBSIDEyOCAwIFIgMTI5IDAgUiAxMzAgMCBSIDE1NiAwIFIgNjAgMCBS IDYxIDAgUiA2NCAwIFIgMTMxIDAgUiAxMzIgMCBSIDEzMiAwIFIgMTMyIDAgUiAxMzIgMCBSIDEz MiAwIFIgMTMyIDAgUiAxMzIgMCBSIDEzMiAwIFIgMTMzIDAgUiAxMzQgMCBSIDEzNSAwIFIgMTM2 IDAgUiAxMzcgMCBSIDEzOCAwIFIgMTM5IDAgUiAxNDAgMCBSIDE0MSAwIFIgMTQyIDAgUiAxNDMg MCBSIDE0NCAwIFIgMTQ1IDAgUiAxNDYgMCBSIDE0NyAwIFIgMTQ4IDAgUiAxNDkgMCBSIDE1MCAw IFIgMTUxIDAgUiAxNTIgMCBSIDE1MyAwIFIgMTU0IDAgUiAxNTUgMCBSIDE1NyAwIFIgMTU4IDAg UiAxNTkgMCBSIDE2MCAwIFIgMTYxIDAgUiAxNjIgMCBSIDE2MyAwIFIgMTY0IDAgUiAxNjUgMCBS IDYyIDAgUiA2MyAwIFJdDQplbmRvYmoNCjU4IDAgb2JqDQo8PC9QIDU5IDAgUi9TL0ZpZ3VyZS9U eXBlL1N0cnVjdEVsZW0vS1swXS9QZyAxIDAgUj4+DQplbmRvYmoNCjU5IDAgb2JqDQo8PC9QIDU0 IDAgUi9TL1BhcnQvVHlwZS9TdHJ1Y3RFbGVtL0tbNjAgMCBSIDYxIDAgUiA2MiAwIFIgNjMgMCBS IDY0IDAgUiA1OCAwIFIgNjUgMCBSIDY2IDAgUiA2NyAwIFIgNjggMCBSIDY5IDAgUiA3MCAwIFIg NzEgMCBSIDcyIDAgUiA3MyAwIFIgNzQgMCBSIDc1IDAgUiA3NiAwIFIgNzcgMCBSIDc4IDAgUiA3 OSAwIFIgODAgMCBSIDgxIDAgUiA4MiAwIFIgODMgMCBSIDg0IDAgUiA4NSAwIFIgODYgMCBSIDg3 IDAgUiA4OCAwIFIgODkgMCBSIDkwIDAgUiA5MSAwIFIgOTIgMCBSIDkzIDAgUiA5NCAwIFIgOTUg MCBSIDk2IDAgUiA5NyAwIFIgOTggMCBSIDk5IDAgUiAxMDAgMCBSIDEwMSAwIFIgMTAyIDAgUiAx MDMgMCBSIDEwNCAwIFIgMTA1IDAgUiAxMDYgMCBSIDEwNyAwIFIgMTA4IDAgUiAxMDkgMCBSIDEx MCAwIFIgMTExIDAgUiAxMTIgMCBSIDExMyAwIFIgMTE0IDAgUiAxMTUgMCBSIDExNiAwIFIgMTE3 IDAgUiAxMTggMCBSIDExOSAwIFIgMTIwIDAgUiAxMjEgMCBSIDEyMiAwIFIgMTIzIDAgUiAxMjQg MCBSIDEyNSAwIFIgMTI2IDAgUiAxMjcgMCBSIDEyOCAwIFIgMTI5IDAgUiAxMzAgMCBSIDEzMSAw IFIgMTMyIDAgUiAxMzMgMCBSIDEzNCAwIFIgMTM1IDAgUiAxMzYgMCBSIDEzNyAwIFIgMTM4IDAg UiAxMzkgMCBSIDE0MCAwIFIgMTQxIDAgUiAxNDIgMCBSIDE0MyAwIFIgMTQ0IDAgUiAxNDUgMCBS IDE0NiAwIFIgMTQ3IDAgUiAxNDggMCBSIDE0OSAwIFIgMTUwIDAgUiAxNTEgMCBSIDE1MiAwIFIg MTUzIDAgUiAxNTQgMCBSIDE1NSAwIFIgMTU2IDAgUiAxNTcgMCBSIDE1OCAwIFIgMTU5IDAgUiAx NjAgMCBSIDE2MSAwIFIgMTYyIDAgUiAxNjMgMCBSIDE2NCAwIFIgMTY1IDAgUl0+Pg0KZW5kb2Jq DQo2MCAwIG9iag0KPDwvUCA1OSAwIFIvUy9QL1R5cGUvU3RydWN0RWxlbS9LWzY4XS9QZyAxIDAg Uj4+DQplbmRvYmoNCjYxIDAgb2JqDQo8PC9QIDU5IDAgUi9TL1AvVHlwZS9TdHJ1Y3RFbGVtL0tb NjldL1BnIDEgMCBSPj4NCmVuZG9iag0KNjIgMCBvYmoNCjw8L1AgNTkgMCBSL1MvRmlndXJlL1R5 cGUvU3RydWN0RWxlbS9LWzExMl0vUGcgMSAwIFI+Pg0KZW5kb2JqDQo2MyAwIG9iag0KPDwvUCA1 OSAwIFIvUy9GaWd1cmUvVHlwZS9TdHJ1Y3RFbGVtL0tbMTEzXS9QZyAxIDAgUj4+DQplbmRvYmoN CjY0IDAgb2JqDQo8PC9QIDU5IDAgUi9TL1AvVHlwZS9TdHJ1Y3RFbGVtL0tbNzBdL1BnIDEgMCBS Pj4NCmVuZG9iag0KNjUgMCBvYmoNCjw8L1AgNTkgMCBSL1MvRmlndXJlL1R5cGUvU3RydWN0RWxl bS9LWzFdL1BnIDEgMCBSPj4NCmVuZG9iag0KNjYgMCBvYmoNCjw8L1AgNTkgMCBSL1MvRmlndXJl L1R5cGUvU3RydWN0RWxlbS9LWzJdL1BnIDEgMCBSPj4NCmVuZG9iag0KNjcgMCBvYmoNCjw8L1Ag NTkgMCBSL1MvRmlndXJlL1R5cGUvU3RydWN0RWxlbS9LWzNdL1BnIDEgMCBSPj4NCmVuZG9iag0K NjggMCBvYmoNCjw8L1AgNTkgMCBSL1MvRmlndXJlL1R5cGUvU3RydWN0RWxlbS9LWzRdL1BnIDEg MCBSPj4NCmVuZG9iag0KNjkgMCBvYmoNCjw8L1AgNTkgMCBSL1MvRmlndXJlL1R5cGUvU3RydWN0 RWxlbS9LWzVdL1BnIDEgMCBSPj4NCmVuZG9iag0KNzAgMCBvYmoNCjw8L1AgNTkgMCBSL1MvRmln dXJlL1R5cGUvU3RydWN0RWxlbS9LWzZdL1BnIDEgMCBSPj4NCmVuZG9iag0KNzEgMCBvYmoNCjw8 L1AgNTkgMCBSL1MvRmlndXJlL1R5cGUvU3RydWN0RWxlbS9LWzddL1BnIDEgMCBSPj4NCmVuZG9i ag0KNzIgMCBvYmoNCjw8L1AgNTkgMCBSL1MvRmlndXJlL1R5cGUvU3RydWN0RWxlbS9LWzhdL1Bn IDEgMCBSPj4NCmVuZG9iag0KNzMgMCBvYmoNCjw8L1AgNTkgMCBSL1MvRmlndXJlL1R5cGUvU3Ry dWN0RWxlbS9LWzldL1BnIDEgMCBSPj4NCmVuZG9iag0KNzQgMCBvYmoNCjw8L1AgNTkgMCBSL1Mv RmlndXJlL1R5cGUvU3RydWN0RWxlbS9LWzEwXS9QZyAxIDAgUj4+DQplbmRvYmoNCjc1IDAgb2Jq DQo8PC9QIDU5IDAgUi9TL0ZpZ3VyZS9UeXBlL1N0cnVjdEVsZW0vS1sxMV0vUGcgMSAwIFI+Pg0K ZW5kb2JqDQo3NiAwIG9iag0KPDwvUCA1OSAwIFIvUy9GaWd1cmUvVHlwZS9TdHJ1Y3RFbGVtL0tb MTJdL1BnIDEgMCBSPj4NCmVuZG9iag0KNzcgMCBvYmoNCjw8L1AgNTkgMCBSL1MvRmlndXJlL1R5 cGUvU3RydWN0RWxlbS9LWzEzXS9QZyAxIDAgUj4+DQplbmRvYmoNCjc4IDAgb2JqDQo8PC9QIDU5 IDAgUi9TL0ZpZ3VyZS9UeXBlL1N0cnVjdEVsZW0vS1sxNF0vUGcgMSAwIFI+Pg0KZW5kb2JqDQo3 OSAwIG9iag0KPDwvUCA1OSAwIFIvUy9GaWd1cmUvVHlwZS9TdHJ1Y3RFbGVtL0tbMTVdL1BnIDEg MCBSPj4NCmVuZG9iag0KODAgMCBvYmoNCjw8L1AgNTkgMCBSL1MvRmlndXJlL1R5cGUvU3RydWN0 RWxlbS9LWzE2XS9QZyAxIDAgUj4+DQplbmRvYmoNCjgxIDAgb2JqDQo8PC9QIDU5IDAgUi9TL0Zp Z3VyZS9UeXBlL1N0cnVjdEVsZW0vS1sxN10vUGcgMSAwIFI+Pg0KZW5kb2JqDQo4MiAwIG9iag0K PDwvUCA1OSAwIFIvUy9GaWd1cmUvVHlwZS9TdHJ1Y3RFbGVtL0tbMThdL1BnIDEgMCBSPj4NCmVu ZG9iag0KODMgMCBvYmoNCjw8L1AgNTkgMCBSL1MvRmlndXJlL1R5cGUvU3RydWN0RWxlbS9LWzE5 XS9QZyAxIDAgUj4+DQplbmRvYmoNCjg0IDAgb2JqDQo8PC9QIDU5IDAgUi9TL0ZpZ3VyZS9UeXBl L1N0cnVjdEVsZW0vS1syMF0vUGcgMSAwIFI+Pg0KZW5kb2JqDQo4NSAwIG9iag0KPDwvUCA1OSAw IFIvUy9GaWd1cmUvVHlwZS9TdHJ1Y3RFbGVtL0tbMjFdL1BnIDEgMCBSPj4NCmVuZG9iag0KODYg MCBvYmoNCjw8L1AgNTkgMCBSL1MvRmlndXJlL1R5cGUvU3RydWN0RWxlbS9LWzIyXS9QZyAxIDAg Uj4+DQplbmRvYmoNCjg3IDAgb2JqDQo8PC9QIDU5IDAgUi9TL0ZpZ3VyZS9UeXBlL1N0cnVjdEVs ZW0vS1syM10vUGcgMSAwIFI+Pg0KZW5kb2JqDQo4OCAwIG9iag0KPDwvUCA1OSAwIFIvUy9GaWd1 cmUvVHlwZS9TdHJ1Y3RFbGVtL0tbMjRdL1BnIDEgMCBSPj4NCmVuZG9iag0KODkgMCBvYmoNCjw8 L1AgNTkgMCBSL1MvRmlndXJlL1R5cGUvU3RydWN0RWxlbS9LWzI1XS9QZyAxIDAgUj4+DQplbmRv YmoNCjkwIDAgb2JqDQo8PC9QIDU5IDAgUi9TL0ZpZ3VyZS9UeXBlL1N0cnVjdEVsZW0vS1syNl0v UGcgMSAwIFI+Pg0KZW5kb2JqDQo5MSAwIG9iag0KPDwvUCA1OSAwIFIvUy9GaWd1cmUvVHlwZS9T dHJ1Y3RFbGVtL0tbMjddL1BnIDEgMCBSPj4NCmVuZG9iag0KOTIgMCBvYmoNCjw8L1AgNTkgMCBS L1MvRmlndXJlL1R5cGUvU3RydWN0RWxlbS9LWzI4XS9QZyAxIDAgUj4+DQplbmRvYmoNCjkzIDAg b2JqDQo8PC9QIDU5IDAgUi9TL0ZpZ3VyZS9UeXBlL1N0cnVjdEVsZW0vS1syOV0vUGcgMSAwIFI+ Pg0KZW5kb2JqDQo5NCAwIG9iag0KPDwvUCA1OSAwIFIvUy9GaWd1cmUvVHlwZS9TdHJ1Y3RFbGVt L0tbMzBdL1BnIDEgMCBSPj4NCmVuZG9iag0KOTUgMCBvYmoNCjw8L1AgNTkgMCBSL1MvRmlndXJl L1R5cGUvU3RydWN0RWxlbS9LWzMxXS9QZyAxIDAgUj4+DQplbmRvYmoNCjk2IDAgb2JqDQo8PC9Q IDU5IDAgUi9TL0ZpZ3VyZS9UeXBlL1N0cnVjdEVsZW0vS1szMl0vUGcgMSAwIFI+Pg0KZW5kb2Jq DQo5NyAwIG9iag0KPDwvUCA1OSAwIFIvUy9GaWd1cmUvVHlwZS9TdHJ1Y3RFbGVtL0tbMzNdL1Bn IDEgMCBSPj4NCmVuZG9iag0KOTggMCBvYmoNCjw8L1AgNTkgMCBSL1MvRmlndXJlL1R5cGUvU3Ry dWN0RWxlbS9LWzM0XS9QZyAxIDAgUj4+DQplbmRvYmoNCjk5IDAgb2JqDQo8PC9QIDU5IDAgUi9T L0ZpZ3VyZS9UeXBlL1N0cnVjdEVsZW0vS1szNV0vUGcgMSAwIFI+Pg0KZW5kb2JqDQoxMDAgMCBv YmoNCjw8L1AgNTkgMCBSL1MvRmlndXJlL1R5cGUvU3RydWN0RWxlbS9LWzM2XS9QZyAxIDAgUj4+ DQplbmRvYmoNCjEwMSAwIG9iag0KPDwvUCA1OSAwIFIvUy9GaWd1cmUvVHlwZS9TdHJ1Y3RFbGVt L0tbMzddL1BnIDEgMCBSPj4NCmVuZG9iag0KMTAyIDAgb2JqDQo8PC9QIDU5IDAgUi9TL0ZpZ3Vy ZS9UeXBlL1N0cnVjdEVsZW0vS1szOF0vUGcgMSAwIFI+Pg0KZW5kb2JqDQoxMDMgMCBvYmoNCjw8 L1AgNTkgMCBSL1MvRmlndXJlL1R5cGUvU3RydWN0RWxlbS9LWzM5XS9QZyAxIDAgUj4+DQplbmRv YmoNCjEwNCAwIG9iag0KPDwvUCA1OSAwIFIvUy9GaWd1cmUvVHlwZS9TdHJ1Y3RFbGVtL0tbNDBd L1BnIDEgMCBSPj4NCmVuZG9iag0KMTA1IDAgb2JqDQo8PC9QIDU5IDAgUi9TL0ZpZ3VyZS9UeXBl L1N0cnVjdEVsZW0vS1s0MV0vUGcgMSAwIFI+Pg0KZW5kb2JqDQoxMDYgMCBvYmoNCjw8L1AgNTkg MCBSL1MvRmlndXJlL1R5cGUvU3RydWN0RWxlbS9LWzQyXS9QZyAxIDAgUj4+DQplbmRvYmoNCjEw NyAwIG9iag0KPDwvUCA1OSAwIFIvUy9GaWd1cmUvVHlwZS9TdHJ1Y3RFbGVtL0tbNDNdL1BnIDEg MCBSPj4NCmVuZG9iag0KMTA4IDAgb2JqDQo8PC9QIDU5IDAgUi9TL0ZpZ3VyZS9UeXBlL1N0cnVj dEVsZW0vS1s0NF0vUGcgMSAwIFI+Pg0KZW5kb2JqDQoxMDkgMCBvYmoNCjw8L1AgNTkgMCBSL1Mv RmlndXJlL1R5cGUvU3RydWN0RWxlbS9LWzQ1XS9QZyAxIDAgUj4+DQplbmRvYmoNCjExMCAwIG9i ag0KPDwvUCA1OSAwIFIvUy9GaWd1cmUvVHlwZS9TdHJ1Y3RFbGVtL0tbNDZdL1BnIDEgMCBSPj4N CmVuZG9iag0KMTExIDAgb2JqDQo8PC9QIDU5IDAgUi9TL0ZpZ3VyZS9UeXBlL1N0cnVjdEVsZW0v S1s0N10vUGcgMSAwIFI+Pg0KZW5kb2JqDQoxMTIgMCBvYmoNCjw8L1AgNTkgMCBSL1MvRmlndXJl L1R5cGUvU3RydWN0RWxlbS9LWzQ4XS9QZyAxIDAgUj4+DQplbmRvYmoNCjExMyAwIG9iag0KPDwv UCA1OSAwIFIvUy9GaWd1cmUvVHlwZS9TdHJ1Y3RFbGVtL0tbNDldL1BnIDEgMCBSPj4NCmVuZG9i ag0KMTE0IDAgb2JqDQo8PC9QIDU5IDAgUi9TL0ZpZ3VyZS9UeXBlL1N0cnVjdEVsZW0vS1s1MF0v UGcgMSAwIFI+Pg0KZW5kb2JqDQoxMTUgMCBvYmoNCjw8L1AgNTkgMCBSL1MvRmlndXJlL1R5cGUv U3RydWN0RWxlbS9LWzUxXS9QZyAxIDAgUj4+DQplbmRvYmoNCjExNiAwIG9iag0KPDwvUCA1OSAw IFIvUy9GaWd1cmUvVHlwZS9TdHJ1Y3RFbGVtL0tbNTJdL1BnIDEgMCBSPj4NCmVuZG9iag0KMTE3 IDAgb2JqDQo8PC9QIDU5IDAgUi9TL0ZpZ3VyZS9UeXBlL1N0cnVjdEVsZW0vS1s1M10vUGcgMSAw IFI+Pg0KZW5kb2JqDQoxMTggMCBvYmoNCjw8L1AgNTkgMCBSL1MvRmlndXJlL1R5cGUvU3RydWN0 RWxlbS9LWzU0XS9QZyAxIDAgUj4+DQplbmRvYmoNCjExOSAwIG9iag0KPDwvUCA1OSAwIFIvUy9G aWd1cmUvVHlwZS9TdHJ1Y3RFbGVtL0tbNTVdL1BnIDEgMCBSPj4NCmVuZG9iag0KMTIwIDAgb2Jq DQo8PC9QIDU5IDAgUi9TL0ZpZ3VyZS9UeXBlL1N0cnVjdEVsZW0vS1s1Nl0vUGcgMSAwIFI+Pg0K ZW5kb2JqDQoxMjEgMCBvYmoNCjw8L1AgNTkgMCBSL1MvRmlndXJlL1R5cGUvU3RydWN0RWxlbS9L WzU3XS9QZyAxIDAgUj4+DQplbmRvYmoNCjEyMiAwIG9iag0KPDwvUCA1OSAwIFIvUy9GaWd1cmUv VHlwZS9TdHJ1Y3RFbGVtL0tbNThdL1BnIDEgMCBSPj4NCmVuZG9iag0KMTIzIDAgb2JqDQo8PC9Q IDU5IDAgUi9TL0ZpZ3VyZS9UeXBlL1N0cnVjdEVsZW0vS1s1OV0vUGcgMSAwIFI+Pg0KZW5kb2Jq DQoxMjQgMCBvYmoNCjw8L1AgNTkgMCBSL1MvRmlndXJlL1R5cGUvU3RydWN0RWxlbS9LWzYwXS9Q ZyAxIDAgUj4+DQplbmRvYmoNCjEyNSAwIG9iag0KPDwvUCA1OSAwIFIvUy9GaWd1cmUvVHlwZS9T dHJ1Y3RFbGVtL0tbNjFdL1BnIDEgMCBSPj4NCmVuZG9iag0KMTI2IDAgb2JqDQo8PC9QIDU5IDAg Ui9TL0ZpZ3VyZS9UeXBlL1N0cnVjdEVsZW0vS1s2Ml0vUGcgMSAwIFI+Pg0KZW5kb2JqDQoxMjcg MCBvYmoNCjw8L1AgNTkgMCBSL1MvRmlndXJlL1R5cGUvU3RydWN0RWxlbS9LWzYzXS9QZyAxIDAg Uj4+DQplbmRvYmoNCjEyOCAwIG9iag0KPDwvUCA1OSAwIFIvUy9GaWd1cmUvVHlwZS9TdHJ1Y3RF bGVtL0tbNjRdL1BnIDEgMCBSPj4NCmVuZG9iag0KMTI5IDAgb2JqDQo8PC9QIDU5IDAgUi9TL0Zp Z3VyZS9UeXBlL1N0cnVjdEVsZW0vS1s2NV0vUGcgMSAwIFI+Pg0KZW5kb2JqDQoxMzAgMCBvYmoN Cjw8L1AgNTkgMCBSL1MvRmlndXJlL1R5cGUvU3RydWN0RWxlbS9LWzY2XS9QZyAxIDAgUj4+DQpl bmRvYmoNCjEzMSAwIG9iag0KPDwvUCA1OSAwIFIvUy9QL1R5cGUvU3RydWN0RWxlbS9LWzcxXS9Q ZyAxIDAgUj4+DQplbmRvYmoNCjEzMiAwIG9iag0KPDwvUCA1OSAwIFIvUy9QL1R5cGUvU3RydWN0 RWxlbS9LWzcyIDczIDc0IDc1IDc2IDc3IDc4IDc5XS9QZyAxIDAgUj4+DQplbmRvYmoNCjEzMyAw IG9iag0KPDwvUCA1OSAwIFIvUy9QL1R5cGUvU3RydWN0RWxlbS9LWzgwXS9QZyAxIDAgUj4+DQpl bmRvYmoNCjEzNCAwIG9iag0KPDwvUCA1OSAwIFIvUy9QL1R5cGUvU3RydWN0RWxlbS9LWzgxXS9Q ZyAxIDAgUj4+DQplbmRvYmoNCjEzNSAwIG9iag0KPDwvUCA1OSAwIFIvUy9QL1R5cGUvU3RydWN0 RWxlbS9LWzgyXS9QZyAxIDAgUj4+DQplbmRvYmoNCjEzNiAwIG9iag0KPDwvUCA1OSAwIFIvUy9Q L1R5cGUvU3RydWN0RWxlbS9LWzgzXS9QZyAxIDAgUj4+DQplbmRvYmoNCjEzNyAwIG9iag0KPDwv UCA1OSAwIFIvUy9IMS9UeXBlL1N0cnVjdEVsZW0vS1s4NF0vUGcgMSAwIFI+Pg0KZW5kb2JqDQox MzggMCBvYmoNCjw8L1AgNTkgMCBSL1MvUC9UeXBlL1N0cnVjdEVsZW0vS1s4NV0vUGcgMSAwIFI+ Pg0KZW5kb2JqDQoxMzkgMCBvYmoNCjw8L1AgNTkgMCBSL1MvUC9UeXBlL1N0cnVjdEVsZW0vS1s4 Nl0vUGcgMSAwIFI+Pg0KZW5kb2JqDQoxNDAgMCBvYmoNCjw8L1AgNTkgMCBSL1MvUC9UeXBlL1N0 cnVjdEVsZW0vS1s4N10vUGcgMSAwIFI+Pg0KZW5kb2JqDQoxNDEgMCBvYmoNCjw8L1AgNTkgMCBS L1MvUC9UeXBlL1N0cnVjdEVsZW0vS1s4OF0vUGcgMSAwIFI+Pg0KZW5kb2JqDQoxNDIgMCBvYmoN Cjw8L1AgNTkgMCBSL1MvUC9UeXBlL1N0cnVjdEVsZW0vS1s4OV0vUGcgMSAwIFI+Pg0KZW5kb2Jq DQoxNDMgMCBvYmoNCjw8L1AgNTkgMCBSL1MvUC9UeXBlL1N0cnVjdEVsZW0vS1s5MF0vUGcgMSAw IFI+Pg0KZW5kb2JqDQoxNDQgMCBvYmoNCjw8L1AgNTkgMCBSL1MvUC9UeXBlL1N0cnVjdEVsZW0v S1s5MV0vUGcgMSAwIFI+Pg0KZW5kb2JqDQoxNDUgMCBvYmoNCjw8L1AgNTkgMCBSL1MvUC9UeXBl L1N0cnVjdEVsZW0vS1s5Ml0vUGcgMSAwIFI+Pg0KZW5kb2JqDQoxNDYgMCBvYmoNCjw8L1AgNTkg MCBSL1MvUC9UeXBlL1N0cnVjdEVsZW0vS1s5M10vUGcgMSAwIFI+Pg0KZW5kb2JqDQoxNDcgMCBv YmoNCjw8L1AgNTkgMCBSL1MvUC9UeXBlL1N0cnVjdEVsZW0vS1s5NF0vUGcgMSAwIFI+Pg0KZW5k b2JqDQoxNDggMCBvYmoNCjw8L1AgNTkgMCBSL1MvUC9UeXBlL1N0cnVjdEVsZW0vS1s5NV0vUGcg MSAwIFI+Pg0KZW5kb2JqDQoxNDkgMCBvYmoNCjw8L1AgNTkgMCBSL1MvUC9UeXBlL1N0cnVjdEVs ZW0vS1s5Nl0vUGcgMSAwIFI+Pg0KZW5kb2JqDQoxNTAgMCBvYmoNCjw8L1AgNTkgMCBSL1MvUC9U eXBlL1N0cnVjdEVsZW0vS1s5N10vUGcgMSAwIFI+Pg0KZW5kb2JqDQoxNTEgMCBvYmoNCjw8L1Ag NTkgMCBSL1MvUC9UeXBlL1N0cnVjdEVsZW0vS1s5OF0vUGcgMSAwIFI+Pg0KZW5kb2JqDQoxNTIg MCBvYmoNCjw8L1AgNTkgMCBSL1MvUC9UeXBlL1N0cnVjdEVsZW0vS1s5OV0vUGcgMSAwIFI+Pg0K ZW5kb2JqDQoxNTMgMCBvYmoNCjw8L1AgNTkgMCBSL1MvUC9UeXBlL1N0cnVjdEVsZW0vS1sxMDBd L1BnIDEgMCBSPj4NCmVuZG9iag0KMTU0IDAgb2JqDQo8PC9QIDU5IDAgUi9TL1AvVHlwZS9TdHJ1 Y3RFbGVtL0tbMTAxXS9QZyAxIDAgUj4+DQplbmRvYmoNCjE1NSAwIG9iag0KPDwvUCA1OSAwIFIv Uy9QL1R5cGUvU3RydWN0RWxlbS9LWzEwMl0vUGcgMSAwIFI+Pg0KZW5kb2JqDQoxNTYgMCBvYmoN Cjw8L1AgNTkgMCBSL1MvRmlndXJlL0FsdCAoKS9UeXBlL1N0cnVjdEVsZW0vS1s2N10vUGcgMSAw IFI+Pg0KZW5kb2JqDQoxNTcgMCBvYmoNCjw8L1AgNTkgMCBSL1MvUC9UeXBlL1N0cnVjdEVsZW0v S1sxMDNdL1BnIDEgMCBSPj4NCmVuZG9iag0KMTU4IDAgb2JqDQo8PC9QIDU5IDAgUi9TL1AvVHlw ZS9TdHJ1Y3RFbGVtL0tbMTA0XS9QZyAxIDAgUj4+DQplbmRvYmoNCjE1OSAwIG9iag0KPDwvUCA1 OSAwIFIvUy9QL1R5cGUvU3RydWN0RWxlbS9LWzEwNV0vUGcgMSAwIFI+Pg0KZW5kb2JqDQoxNjAg MCBvYmoNCjw8L1AgNTkgMCBSL1MvUC9UeXBlL1N0cnVjdEVsZW0vS1sxMDZdL1BnIDEgMCBSPj4N CmVuZG9iag0KMTYxIDAgb2JqDQo8PC9QIDU5IDAgUi9TL1AvVHlwZS9TdHJ1Y3RFbGVtL0tbMTA3 XS9QZyAxIDAgUj4+DQplbmRvYmoNCjE2MiAwIG9iag0KPDwvUCA1OSAwIFIvUy9QL1R5cGUvU3Ry dWN0RWxlbS9LWzEwOF0vUGcgMSAwIFI+Pg0KZW5kb2JqDQoxNjMgMCBvYmoNCjw8L1AgNTkgMCBS L1MvUC9UeXBlL1N0cnVjdEVsZW0vS1sxMDldL1BnIDEgMCBSPj4NCmVuZG9iag0KMTY0IDAgb2Jq DQo8PC9QIDU5IDAgUi9TL1AvVHlwZS9TdHJ1Y3RFbGVtL0tbMTEwXS9QZyAxIDAgUj4+DQplbmRv YmoNCjE2NSAwIG9iag0KPDwvUCA1OSAwIFIvUy9IMS9UeXBlL1N0cnVjdEVsZW0vS1sxMTFdL1Bn IDEgMCBSPj4NCmVuZG9iag0KMTY2IDAgb2JqDQo8PC9GaXJzdCAxNjcgMCBSL0xhc3QgMTY4IDAg Ui9Db3VudCAyPj4NCmVuZG9iag0KMTY3IDAgb2JqDQo8PC9UaXRsZSAoRklOQUwgQVdBUkQgV0lO TklORyBQUklaRSBOT1RJRklDQVRJT04pL0Rlc3RbMSAwIFIvWFlaIDI2IDY1NiAwXS9OZXh0IDE2 OCAwIFIvUGFyZW50IDE2NiAwIFI+Pg0KZW5kb2JqDQoxNjggMCBvYmoNCjw8L1RpdGxlIChEci4g TGlzYSBBbnRvbmlvIEYuIENhc3RpbGxvIFwoVmljZSBQcmVzaWRlbnQgSW50ZXJuYXRpb25hbCBQ cml6ZSBEZXBhcnRtZW50XCkpL0Rlc3RbMSAwIFIvWFlaIDI2IDYzIDBdL1ByZXYgMTY3IDAgUi9Q YXJlbnQgMTY2IDAgUj4+DQplbmRvYmoNCjE2OSAwIG9iag0KPDwvQ3JlYXRvciAoaHR0cDovL3d3 dy5jb252ZXJ0YXBpLmNvbSAgICAgICAgICAgICAgICAgKS9BdXRob3IgKFVzdWFyaW8pL1Byb2R1 Y2VyIChodHRwOi8vd3d3LmNvbnZlcnRhcGkuY29tICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICkvQ3JlYXRpb25EYXRlIChEOjIwMTYwMzA0MDEwMjM1LTA2JzAwJykvTW9kRGF0ZSAoRDoy MDE2MDMwNDAxMDIzNS0wNicwMCcpPj4NCmVuZG9iag0KMTcwIDAgb2JqDQo8PC9Db3VudCAxL1R5 cGUvUGFnZXMvS2lkc1sxNzEgMCBSXT4+DQplbmRvYmoNCjE3MSAwIG9iag0KPDwvVHlwZS9QYWdl cy9QYXJlbnQgMTcwIDAgUi9LaWRzWzEgMCBSXS9Db3VudCAxPj4NCmVuZG9iag0KMTcyIDAgb2Jq DQo8PC9TdHJ1Y3RUcmVlUm9vdCA1NCAwIFIvTWFya0luZm88PC9NYXJrZWQgdHJ1ZT4+L0xhbmcg KGVuLVVTKS9PdXRsaW5lcyAxNjYgMCBSL1R5cGUvQ2F0YWxvZy9QYWdlcyAxNzAgMCBSL01ldGFk YXRhIDE3MyAwIFI+Pg0KZW5kb2JqDQoxNzMgMCBvYmoNCjw8L0xlbmd0aCAxNjg2L1R5cGUvTWV0 YWRhdGEvU3VidHlwZS9YTUw+PnN0cmVhbQ0KPD94cGFja2V0IGJlZ2luPSfvu78nIGlkPSdXNU0w TXBDZWhpSHpyZVN6TlRjemtjOWQnPz4KPD9hZG9iZS14YXAtZmlsdGVycyBlc2M9IkNSTEYiPz4K PHg6eG1wbWV0YSB4bWxuczp4PSdhZG9iZTpuczptZXRhLycgeDp4bXB0az0nMy4xLTcwMic+Cjxy ZGY6UkRGIHhtbG5zOnJkZj0naHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4 LW5zIyc+CjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSc2MjZDNzBENC01QzA4LUQwQ0EtQTYy OS0wNzUwMEYwOUI5QzYnIHhtbG5zOnBkZj0naHR0cDovL25zLmFkb2JlLmNvbS9wZGYvMS4zLyc+ PHBkZjpLZXl3b3Jkcz48L3BkZjpLZXl3b3Jkcz48cGRmOlByb2R1Y2VyPmh0dHA6Ly93d3cuY29u dmVydGFwaS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGRmOlByb2R1Y2VyPjwv cmRmOkRlc2NyaXB0aW9uPgo8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0nNjI2QzcwRDQtNUMw OC1EMENBLUE2MjktMDc1MDBGMDlCOUM2JyB4bWxuczp4bXA9J2h0dHA6Ly9ucy5hZG9iZS5jb20v eGFwLzEuMC8nPjx4bXA6TW9kaWZ5RGF0ZT4yMDE2LTAzLTA0VDAxOjAyOjM1LTA2OjAwPC94bXA6 TW9kaWZ5RGF0ZT48eG1wOkNyZWF0ZURhdGU+MjAxNi0wMy0wNFQwMTowMjozNS0wNjowMDwveG1w OkNyZWF0ZURhdGU+PHhtcDpNZXRhZGF0YURhdGU+MjAxNi0wMy0wNFQwMTowMjozNS0wNjowMDwv eG1wOk1ldGFkYXRhRGF0ZT48eG1wOkNyZWF0b3JUb29sPk1pY3Jvc29mdMKuIFdvcmQgMjAxMzwv eG1wOkNyZWF0b3JUb29sPjwvcmRmOkRlc2NyaXB0aW9uPgo8cmRmOkRlc2NyaXB0aW9uIHJkZjph Ym91dD0nNjI2QzcwRDQtNUMwOC1EMENBLUE2MjktMDc1MDBGMDlCOUM2JyB4bWxuczpkYz0naHR0 cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8nPjxkYzpmb3JtYXQ+YXBwbGljYXRpb24vcGRm PC9kYzpmb3JtYXQ+PGRjOmRlc2NyaXB0aW9uPjxyZGY6QWx0PjxyZGY6bGkgeG1sOmxhbmc9J3gt ZGVmYXVsdCc+PC9yZGY6bGk+PC9yZGY6QWx0PjwvZGM6ZGVzY3JpcHRpb24+PGRjOmNyZWF0b3I+ PHJkZjpTZXE+PHJkZjpsaT5Vc3VhcmlvPC9yZGY6bGk+PC9yZGY6U2VxPjwvZGM6Y3JlYXRvcj48 ZGM6dGl0bGU+PHJkZjpBbHQ+PHJkZjpsaSB4bWw6bGFuZz0neC1kZWZhdWx0Jz48L3JkZjpsaT48 L3JkZjpBbHQ+PC9kYzp0aXRsZT48L3JkZjpEZXNjcmlwdGlvbj4KPHJkZjpEZXNjcmlwdGlvbiBy ZGY6YWJvdXQ9JzYyNkM3MEQ0LTVDMDgtRDBDQS1BNjI5LTA3NTAwRjA5QjlDNicgeG1sbnM6eG1w TU09J2h0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8nPjx4bXBNTTpEb2N1bWVudElEPnV1 aWQ6MkZCRjE1QUUtRDdEMS1COTQwLUU1RDgtODZGRjI5NkM1RDhCPC94bXBNTTpEb2N1bWVudElE Pjx4bXBNTTpJbnN0YW5jZUlEPnV1aWQ6NjI2QzcwRDQtNUMwOC1EMENBLUE2MjktMDc1MDBGMDlC OUM2PC94bXBNTTpJbnN0YW5jZUlEPjwvcmRmOkRlc2NyaXB0aW9uPgoKPC9yZGY6UkRGPgo8L3g6 eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSd3 Jz8+DQplbmRzdHJlYW0NCmVuZG9iag0KeHJlZg0KMCAxNzQNCjAwMDAwMDAwMDAgNjU1MzUgZg0K MDAwMDAwMDAxNyAwMDAwMCBuDQowMDAwMDAwNTA5IDAwMDAwIG4NCjAwMDAwMTQ5NjQgMDAwMDAg bg0KMDAwMDAxNTUxMSAwMDAwMCBuDQowMDAwMDM0NDI4IDAwMDAwIG4NCjAwMDAwMzgxMjQgMDAw MDAgbg0KMDAwMDA0ODM3OCAwMDAwMCBuDQowMDAwMDUxMDg0IDAwMDAwIG4NCjAwMDAwNTIyODcg MDAwMDAgbg0KMDAwMDA1MzQ1OSAwMDAwMCBuDQowMDAwMDUzOTExIDAwMDAwIG4NCjAwMDAwNTM5 NjUgMDAwMDAgbg0KMDAwMDA1NDAxOSAwMDAwMCBuDQowMDAwMDU0MTk0IDAwMDAwIG4NCjAwMDAw NTQ0MzEgMDAwMDAgbg0KMDAwMDA1NDc2MiAwMDAwMCBuDQowMDAwMDU0OTQyIDAwMDAwIG4NCjAw MDAwNTUxODQgMDAwMDAgbg0KMDAwMDA1NTUyNSAwMDAwMCBuDQowMDAwMDU1Njk1IDAwMDAwIG4N CjAwMDAwNTU5MzQgMDAwMDAgbg0KMDAwMDA4NTIxOSAwMDAwMCBuDQowMDAwMDg1NjEwIDAwMDAw IG4NCjAwMDAwODU3OTIgMDAwMDAgbg0KMDAwMDA4NjA1MyAwMDAwMCBuDQowMDAwMTA4MDM0IDAw MDAwIG4NCjAwMDAxMDg1NTggMDAwMDAgbg0KMDAwMDEwODczNSAwMDAwMCBuDQowMDAwMTA4OTgw IDAwMDAwIG4NCjAwMDAxMzAwNzMgMDAwMDAgbg0KMDAwMDEzMDM0NyAwMDAwMCBuDQowMDAwMTMw NDg5IDAwMDAwIG4NCjAwMDAxMzA1MTcgMDAwMDAgbg0KMDAwMDEzMDY4NyAwMDAwMCBuDQowMDAw MTMwNzYxIDAwMDAwIG4NCjAwMDAxMzEwMjAgMDAwMDAgbg0KMDAwMDIxMzEwMiAwMDAwMCBuDQow MDAwMjEzNDQ3IDAwMDAwIG4NCjAwMDAyMTM4NTEgMDAwMDAgbg0KMDAwMDIxMzk3OSAwMDAwMCBu DQowMDAwMjE0MDA3IDAwMDAwIG4NCjAwMDAyMTQxNjMgMDAwMDAgbg0KMDAwMDIxNDIzNyAwMDAw MCBuDQowMDAwMjE0NDgyIDAwMDAwIG4NCjAwMDAyNzE2NzEgMDAwMDAgbg0KMDAwMDI3MTgxNCAw MDAwMCBuDQowMDAwMjcyMTg1IDAwMDAwIG4NCjAwMDAyNzIzNTAgMDAwMDAgbg0KMDAwMDI3MjU3 OCAwMDAwMCBuDQowMDAwMjcyNzQxIDAwMDAwIG4NCjAwMDAyNzI5MDEgMDAwMDAgbg0KMDAwMDI3 MzEyNCAwMDAwMCBuDQowMDAwMjczMTQ5IDAwMDAwIG4NCjAwMDAyODE4NTIgMDAwMDAgbg0KMDAw MDI4MTk1OSAwMDAwMCBuDQowMDAwMjgyMjEzIDAwMDAwIG4NCjAwMDAyODIyNTIgMDAwMDAgbg0K MDAwMDI4MzE0NCAwMDAwMCBuDQowMDAwMjgzMjE2IDAwMDAwIG4NCjAwMDAyODQwOTAgMDAwMDAg bg0KMDAwMDI4NDE1OCAwMDAwMCBuDQowMDAwMjg0MjI2IDAwMDAwIG4NCjAwMDAyODQzMDAgMDAw MDAgbg0KMDAwMDI4NDM3NCAwMDAwMCBuDQowMDAwMjg0NDQyIDAwMDAwIG4NCjAwMDAyODQ1MTQg MDAwMDAgbg0KMDAwMDI4NDU4NiAwMDAwMCBuDQowMDAwMjg0NjU4IDAwMDAwIG4NCjAwMDAyODQ3 MzAgMDAwMDAgbg0KMDAwMDI4NDgwMiAwMDAwMCBuDQowMDAwMjg0ODc0IDAwMDAwIG4NCjAwMDAy ODQ5NDYgMDAwMDAgbg0KMDAwMDI4NTAxOCAwMDAwMCBuDQowMDAwMjg1MDkwIDAwMDAwIG4NCjAw MDAyODUxNjMgMDAwMDAgbg0KMDAwMDI4NTIzNiAwMDAwMCBuDQowMDAwMjg1MzA5IDAwMDAwIG4N CjAwMDAyODUzODIgMDAwMDAgbg0KMDAwMDI4NTQ1NSAwMDAwMCBuDQowMDAwMjg1NTI4IDAwMDAw IG4NCjAwMDAyODU2MDEgMDAwMDAgbg0KMDAwMDI4NTY3NCAwMDAwMCBuDQowMDAwMjg1NzQ3IDAw MDAwIG4NCjAwMDAyODU4MjAgMDAwMDAgbg0KMDAwMDI4NTg5MyAwMDAwMCBuDQowMDAwMjg1OTY2 IDAwMDAwIG4NCjAwMDAyODYwMzkgMDAwMDAgbg0KMDAwMDI4NjExMiAwMDAwMCBuDQowMDAwMjg2 MTg1IDAwMDAwIG4NCjAwMDAyODYyNTggMDAwMDAgbg0KMDAwMDI4NjMzMSAwMDAwMCBuDQowMDAw Mjg2NDA0IDAwMDAwIG4NCjAwMDAyODY0NzcgMDAwMDAgbg0KMDAwMDI4NjU1MCAwMDAwMCBuDQow MDAwMjg2NjIzIDAwMDAwIG4NCjAwMDAyODY2OTYgMDAwMDAgbg0KMDAwMDI4Njc2OSAwMDAwMCBu DQowMDAwMjg2ODQyIDAwMDAwIG4NCjAwMDAyODY5MTUgMDAwMDAgbg0KMDAwMDI4Njk4OCAwMDAw MCBuDQowMDAwMjg3MDYyIDAwMDAwIG4NCjAwMDAyODcxMzYgMDAwMDAgbg0KMDAwMDI4NzIxMCAw MDAwMCBuDQowMDAwMjg3Mjg0IDAwMDAwIG4NCjAwMDAyODczNTggMDAwMDAgbg0KMDAwMDI4NzQz MiAwMDAwMCBuDQowMDAwMjg3NTA2IDAwMDAwIG4NCjAwMDAyODc1ODAgMDAwMDAgbg0KMDAwMDI4 NzY1NCAwMDAwMCBuDQowMDAwMjg3NzI4IDAwMDAwIG4NCjAwMDAyODc4MDIgMDAwMDAgbg0KMDAw MDI4Nzg3NiAwMDAwMCBuDQowMDAwMjg3OTUwIDAwMDAwIG4NCjAwMDAyODgwMjQgMDAwMDAgbg0K MDAwMDI4ODA5OCAwMDAwMCBuDQowMDAwMjg4MTcyIDAwMDAwIG4NCjAwMDAyODgyNDYgMDAwMDAg bg0KMDAwMDI4ODMyMCAwMDAwMCBuDQowMDAwMjg4Mzk0IDAwMDAwIG4NCjAwMDAyODg0NjggMDAw MDAgbg0KMDAwMDI4ODU0MiAwMDAwMCBuDQowMDAwMjg4NjE2IDAwMDAwIG4NCjAwMDAyODg2OTAg MDAwMDAgbg0KMDAwMDI4ODc2NCAwMDAwMCBuDQowMDAwMjg4ODM4IDAwMDAwIG4NCjAwMDAyODg5 MTIgMDAwMDAgbg0KMDAwMDI4ODk4NiAwMDAwMCBuDQowMDAwMjg5MDYwIDAwMDAwIG4NCjAwMDAy ODkxMzQgMDAwMDAgbg0KMDAwMDI4OTIwOCAwMDAwMCBuDQowMDAwMjg5MjgyIDAwMDAwIG4NCjAw MDAyODkzNTEgMDAwMDAgbg0KMDAwMDI4OTQ0MSAwMDAwMCBuDQowMDAwMjg5NTEwIDAwMDAwIG4N CjAwMDAyODk1NzkgMDAwMDAgbg0KMDAwMDI4OTY0OCAwMDAwMCBuDQowMDAwMjg5NzE3IDAwMDAw IG4NCjAwMDAyODk3ODcgMDAwMDAgbg0KMDAwMDI4OTg1NiAwMDAwMCBuDQowMDAwMjg5OTI1IDAw MDAwIG4NCjAwMDAyODk5OTQgMDAwMDAgbg0KMDAwMDI5MDA2MyAwMDAwMCBuDQowMDAwMjkwMTMy IDAwMDAwIG4NCjAwMDAyOTAyMDEgMDAwMDAgbg0KMDAwMDI5MDI3MCAwMDAwMCBuDQowMDAwMjkw MzM5IDAwMDAwIG4NCjAwMDAyOTA0MDggMDAwMDAgbg0KMDAwMDI5MDQ3NyAwMDAwMCBuDQowMDAw MjkwNTQ2IDAwMDAwIG4NCjAwMDAyOTA2MTUgMDAwMDAgbg0KMDAwMDI5MDY4NCAwMDAwMCBuDQow MDAwMjkwNzUzIDAwMDAwIG4NCjAwMDAyOTA4MjIgMDAwMDAgbg0KMDAwMDI5MDg5MiAwMDAwMCBu DQowMDAwMjkwOTYyIDAwMDAwIG4NCjAwMDAyOTEwMzIgMDAwMDAgbg0KMDAwMDI5MTExMyAwMDAw MCBuDQowMDAwMjkxMTgzIDAwMDAwIG4NCjAwMDAyOTEyNTMgMDAwMDAgbg0KMDAwMDI5MTMyMyAw MDAwMCBuDQowMDAwMjkxMzkzIDAwMDAwIG4NCjAwMDAyOTE0NjMgMDAwMDAgbg0KMDAwMDI5MTUz MyAwMDAwMCBuDQowMDAwMjkxNjAzIDAwMDAwIG4NCjAwMDAyOTE2NzMgMDAwMDAgbg0KMDAwMDI5 MTc0NCAwMDAwMCBuDQowMDAwMjkxODA0IDAwMDAwIG4NCjAwMDAyOTE5MjkgMDAwMDAgbg0KMDAw MDI5MjA5MyAwMDAwMCBuDQowMDAwMjkyMzI5IDAwMDAwIG4NCjAwMDAyOTIzODcgMDAwMDAgbg0K MDAwMDI5MjQ1OCAwMDAwMCBuDQowMDAwMjkyNjA0IDAwMDAwIG4NCnRyYWlsZXINCjw8DQovU2l6 ZSAxNzQNCi9Sb290IDE3MiAwIFINCi9JbmZvIDE2OSAwIFINCi9JRCBbPEI1QzQ4QjQ1MjMxMzg2 N0Q1MEU5QkYzQTkwQ0U5NzVBPjxERkJFNzdEMzFGMEE1QzA4RDc2ODY4QjMwOUVDMDlFRD5dDQo+ Pg0Kc3RhcnR4cmVmDQoyOTQzNzINCiUlRU9GDQo= ------=_20160304150510_67401-- From s.priebe@profihost.ag Fri Mar 4 12:46:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6B6B17CB2 for ; Fri, 4 Mar 2016 12:46:53 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 392CC8F8033 for ; Fri, 4 Mar 2016 10:46:50 -0800 (PST) X-ASG-Debug-ID: 1457117205-04cbb00b711bb820001-NocioJ Received: from mail-ph.de-nserver.de (mail-ph.de-nserver.de [85.158.179.214]) by cuda.sgi.com with ESMTP id mHWJp2f17QS5wyHz (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 10:46:46 -0800 (PST) X-Barracuda-Envelope-From: s.priebe@profihost.ag X-Barracuda-Apparent-Source-IP: 85.158.179.214 Received: (qmail 1431 invoked from network); 4 Mar 2016 19:46:44 +0100 X-Fcrdns: No Received: from phoffice.de-nserver.de (HELO [10.242.2.22]) (185.39.223.5) (smtp-auth username s.priebe@profihost.ag, mechanism plain) by mail-ph.de-nserver.de (qpsmtpd/0.92) with (ECDHE-RSA-AES256-SHA encrypted) ESMTPSA; Fri, 04 Mar 2016 19:46:44 +0100 Subject: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage To: Brian Foster X-ASG-Orig-Subj: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage References: <56C81D94.7090603@profihost.ag> <20160220144533.GA36182@bfoster.bfoster> Cc: "xfs@oss.sgi.com" , linux-fsdevel@vger.kernel.org, "xfs-masters@oss.sgi.com" From: Stefan Priebe Message-ID: <56D9D834.2000303@profihost.ag> Date: Fri, 4 Mar 2016 19:47:16 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-User-Auth: Auth by s.priebe@profihost.ag through 185.39.223.5 X-Barracuda-Connect: mail-ph.de-nserver.de[85.158.179.214] X-Barracuda-Start-Time: 1457117206 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27575 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Am 20.02.2016 um 19:02 schrieb Stefan Priebe - Profihost AG: > >> Am 20.02.2016 um 15:45 schrieb Brian Foster : >> >>> On Sat, Feb 20, 2016 at 09:02:28AM +0100, Stefan Priebe wrote: >>> Hi, >>> >>> got this one today. Not sure if this is a bug. >> >> That looks like the releasepage() delayed allocation block warning. I'm >> not sure we've had any fixes for (or reports of) that issue since the >> v4.2 timeframe. >> >> What is the xfs_info of the associated filesystem? Also, do you have any >> insight as to the possible reproducer application or workload? Is this >> reproducible at all? Note that this is a WARN_ON_ONCE(), so the warning >> won't fire again regardless until after a reboot. Toda i got this one running 4.3.3. [154152.949610] ------------[ cut here ]------------ [154152.950704] WARNING: CPU: 0 PID: 79 at fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage+0xc3/0xf0() [154152.952596] Modules linked in: netconsole mpt3sas raid_class nf_conntrack_ipv4 nf_defrag_ipv4 xt_state nf_conntrack xt_tcpudp ipt_REJECT nf_reject_ipv4 xt_owner xt_multiport iptable_filter ip_tables x_tables 8021q garp coretemp k8temp ehci_pci ehci_hcd sb_edac ipmi_si usbcore edac_core ipmi_msghandler i2c_i801 usb_common button btrfs xor raid6_pq sg igb sd_mod i2c_algo_bit isci i2c_core libsas ahci ptp libahci scsi_transport_sas megaraid_sas pps_core [154152.963240] CPU: 0 PID: 79 Comm: kswapd0 Not tainted 4.4.3+3-ph #1 [154152.964625] Hardware name: Supermicro X9SRE/X9SRE-3F/X9SRi/X9SRi-3F/X9SRE/X9SRE-3F/X9SRi/X9SRi-3F, BIOS 1.0a 03/06/2012 [154152.967029] 0000000000000000 ffff88103dd67a98 ffffffffa73c3b5f 0000000000000000 [154152.968836] ffffffffa7a5063b ffff88103dd67ad8 ffffffffa7083757 0000000000000000 [154152.970641] 0000000000000001 ffffea0001e7bfc0 ffff88071ef72dd0 ffffea0001e7bfe0 [154152.972447] Call Trace: [154152.973011] [] dump_stack+0x63/0x84 [154152.974167] [] warn_slowpath_common+0x97/0xe0 [154152.975515] [] warn_slowpath_null+0x1a/0x20 [154152.976826] [] xfs_vm_releasepage+0xc3/0xf0 [154152.978137] [] try_to_release_page+0x32/0x50 [154152.979467] [] shrink_active_list+0x3ce/0x3e0 [154152.980816] [] shrink_lruvec+0x687/0x7d0 [154152.982068] [] shrink_zone+0xdc/0x2c0 [154152.983262] [] kswapd+0x4f9/0x970 [154152.984380] [] ? mem_cgroup_shrink_node_zone+0x1a0/0x1a0 [154152.985942] [] kthread+0xc9/0xe0 [154152.987040] [] ? kthread_stop+0x100/0x100 [154152.988313] [] ret_from_fork+0x3f/0x70 [154152.989527] [] ? kthread_stop+0x100/0x100 [154152.990818] ---[ end trace 3fac2515e92c7cb1 ]--- This time with an xfs info: # xfs_info / meta-data=/dev/disk/by-uuid/9befe321-e9cc-4e31-82df-efabb3211bac isize=256 agcount=4, agsize=58224256 blks = sectsz=512 attr=2, projid32bit=0 = crc=0 finobt=0 data = bsize=4096 blocks=232897024, imaxpct=25 = sunit=64 swidth=384 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=0 log =internal bsize=4096 blocks=113728, version=2 = sectsz=512 sunit=64 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 > >> >> Brian >> >>> [67674.907736] ------------[ cut here ]------------ >>> [67674.955858] WARNING: CPU: 5 PID: 197 at fs/xfs/xfs_aops.c:1232 >>> xfs_vm_releasepage+0xa9/0xe0() >>> [67675.005345] Modules linked in: dm_mod netconsole ipt_REJECT >>> nf_reject_ipv4 mpt3sas raid_class xt_multiport iptable_filter ip_tabl >>> es x_tables 8021q garp bonding coretemp loop usbhid ehci_pci ehci_hcd >>> sb_edac ipmi_si usbcore i2c_i801 edac_core usb_common ipmi_msg >>> handler button btrfs xor raid6_pq raid1 md_mod sg igb sd_mod i2c_algo_bit >>> ixgbe ahci i2c_core mdio isci libahci libsas ptp megaraid_ >>> sas scsi_transport_sas pps_core >>> [67675.221939] CPU: 5 PID: 197 Comm: kswapd0 Not tainted 4.4.2+1-ph #1 >>> [67675.277120] Hardware name: Supermicro >>> X9DRi-LN4+/X9DR3-LN4+/X9DRi-LN4+/X9DR3-LN4+, BIOS 3.2 03/04/2015 >>> [67675.335176] ffffffffa3a5065d ffff88007950fa98 ffffffffa33bd4e1 >>> 0000000000000001 >>> [67675.392983] 0000000000000000 ffff88007950fad8 ffffffffa3083587 >>> ffff88007950fae8 >>> [67675.449743] 0000000000000001 ffffea0020883480 ffff880cf4b9cdd0 >>> ffffea00208834a0 >>> [67675.506112] Call Trace: >>> [67675.561285] [] dump_stack+0x45/0x64 >>> [67675.619364] [] warn_slowpath_common+0x97/0xe0 >>> [67675.675719] [] warn_slowpath_null+0x1a/0x20 >>> [67675.731113] [] xfs_vm_releasepage+0xa9/0xe0 >>> [67675.786116] [] ? page_mkclean_one+0xd0/0xd0 >>> [67675.844216] [] ? anon_vma_prepare+0x150/0x150 >>> [67675.903862] [] try_to_release_page+0x32/0x50 >>> [67675.957625] [] shrink_active_list+0x3ce/0x3e0 >>> [67676.011497] [] shrink_lruvec+0x687/0x7d0 >>> [67676.064980] [] shrink_zone+0xdc/0x2c0 >>> [67676.118828] [] kswapd+0x4f9/0x930 >>> [67676.172075] [] ? >>> mem_cgroup_shrink_node_zone+0x150/0x150 >>> [67676.225139] [] kthread+0xc9/0xe0 >>> [67676.277539] [] ? kthread_stop+0xe0/0xe0 >>> [67676.330124] [] ret_from_fork+0x3f/0x70 >>> [67676.381816] [] ? kthread_stop+0xe0/0xe0 >>> [67676.433499] ---[ end trace cb1827fe308f7f6b ]--- >>> >>> Greets Stefan >>> >>> _______________________________________________ >>> xfs mailing list >>> xfs@oss.sgi.com >>> http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Mar 4 13:13:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C562B7CB3 for ; Fri, 4 Mar 2016 13:13:36 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6C8A0304039 for ; Fri, 4 Mar 2016 11:13:33 -0800 (PST) X-ASG-Debug-ID: 1457118811-04bdf002ec1b1050001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id hFkWPpLKNNQAUPJJ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Fri, 04 Mar 2016 11:13:32 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id ABA0FC00DE0B; Fri, 4 Mar 2016 19:13:31 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-186.bos.redhat.com [10.18.41.186]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u24JDVMq014142; Fri, 4 Mar 2016 14:13:31 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id EEB38125041; Fri, 4 Mar 2016 14:13:29 -0500 (EST) Date: Fri, 4 Mar 2016 14:13:29 -0500 From: Brian Foster To: Stefan Priebe Cc: linux-fsdevel@vger.kernel.org, "xfs-masters@oss.sgi.com" , "xfs@oss.sgi.com" Subject: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage Message-ID: <20160304191329.GC3758@bfoster.bfoster> X-ASG-Orig-Subj: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage References: <56C81D94.7090603@profihost.ag> <20160220144533.GA36182@bfoster.bfoster> <56D9D834.2000303@profihost.ag> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56D9D834.2000303@profihost.ag> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457118812 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Mar 04, 2016 at 07:47:16PM +0100, Stefan Priebe wrote: > Am 20.02.2016 um 19:02 schrieb Stefan Priebe - Profihost AG: > > > >>Am 20.02.2016 um 15:45 schrieb Brian Foster : > >> > >>>On Sat, Feb 20, 2016 at 09:02:28AM +0100, Stefan Priebe wrote: > >>>Hi, > >>> > >>>got this one today. Not sure if this is a bug. > >> > >>That looks like the releasepage() delayed allocation block warning. I'm > >>not sure we've had any fixes for (or reports of) that issue since the > >>v4.2 timeframe. > >> > >>What is the xfs_info of the associated filesystem? Also, do you have any > >>insight as to the possible reproducer application or workload? Is this > >>reproducible at all? Note that this is a WARN_ON_ONCE(), so the warning > >>won't fire again regardless until after a reboot. > > Toda i got this one running 4.3.3. > > [154152.949610] ------------[ cut here ]------------ > [154152.950704] WARNING: CPU: 0 PID: 79 at fs/xfs/xfs_aops.c:1232 > xfs_vm_releasepage+0xc3/0xf0() > [154152.952596] Modules linked in: netconsole mpt3sas raid_class > nf_conntrack_ipv4 nf_defrag_ipv4 xt_state nf_conntrack xt_tcpudp ipt_REJECT > nf_reject_ipv4 xt_owner xt_multiport iptable_filter ip_tables x_tables 8021q > garp coretemp k8temp ehci_pci ehci_hcd sb_edac ipmi_si usbcore edac_core > ipmi_msghandler i2c_i801 usb_common button btrfs xor raid6_pq sg igb sd_mod > i2c_algo_bit isci i2c_core libsas ahci ptp libahci scsi_transport_sas > megaraid_sas pps_core > [154152.963240] CPU: 0 PID: 79 Comm: kswapd0 Not tainted 4.4.3+3-ph #1 > [154152.964625] Hardware name: Supermicro > X9SRE/X9SRE-3F/X9SRi/X9SRi-3F/X9SRE/X9SRE-3F/X9SRi/X9SRi-3F, BIOS 1.0a > 03/06/2012 > [154152.967029] 0000000000000000 ffff88103dd67a98 ffffffffa73c3b5f > 0000000000000000 > [154152.968836] ffffffffa7a5063b ffff88103dd67ad8 ffffffffa7083757 > 0000000000000000 > [154152.970641] 0000000000000001 ffffea0001e7bfc0 ffff88071ef72dd0 > ffffea0001e7bfe0 > [154152.972447] Call Trace: > [154152.973011] [] dump_stack+0x63/0x84 > [154152.974167] [] warn_slowpath_common+0x97/0xe0 > [154152.975515] [] warn_slowpath_null+0x1a/0x20 > [154152.976826] [] xfs_vm_releasepage+0xc3/0xf0 > [154152.978137] [] try_to_release_page+0x32/0x50 > [154152.979467] [] shrink_active_list+0x3ce/0x3e0 > [154152.980816] [] shrink_lruvec+0x687/0x7d0 > [154152.982068] [] shrink_zone+0xdc/0x2c0 > [154152.983262] [] kswapd+0x4f9/0x970 > [154152.984380] [] ? > mem_cgroup_shrink_node_zone+0x1a0/0x1a0 > [154152.985942] [] kthread+0xc9/0xe0 > [154152.987040] [] ? kthread_stop+0x100/0x100 > [154152.988313] [] ret_from_fork+0x3f/0x70 > [154152.989527] [] ? kthread_stop+0x100/0x100 > [154152.990818] ---[ end trace 3fac2515e92c7cb1 ]--- > > This time with an xfs info: > # xfs_info / > meta-data=/dev/disk/by-uuid/9befe321-e9cc-4e31-82df-efabb3211bac isize=256 > agcount=4, agsize=58224256 blks > = sectsz=512 attr=2, projid32bit=0 > = crc=0 finobt=0 > data = bsize=4096 blocks=232897024, imaxpct=25 > = sunit=64 swidth=384 blks > naming =version 2 bsize=4096 ascii-ci=0 ftype=0 > log =internal bsize=4096 blocks=113728, version=2 > = sectsz=512 sunit=64 blks, lazy-count=1 > realtime =none extsz=4096 blocks=0, rtextents=0 > Can you describe the workload to the filesystem? Brian > > > >> > >>Brian > >> > >>>[67674.907736] ------------[ cut here ]------------ > >>>[67674.955858] WARNING: CPU: 5 PID: 197 at fs/xfs/xfs_aops.c:1232 > >>>xfs_vm_releasepage+0xa9/0xe0() > >>>[67675.005345] Modules linked in: dm_mod netconsole ipt_REJECT > >>>nf_reject_ipv4 mpt3sas raid_class xt_multiport iptable_filter ip_tabl > >>>es x_tables 8021q garp bonding coretemp loop usbhid ehci_pci ehci_hcd > >>>sb_edac ipmi_si usbcore i2c_i801 edac_core usb_common ipmi_msg > >>>handler button btrfs xor raid6_pq raid1 md_mod sg igb sd_mod i2c_algo_bit > >>>ixgbe ahci i2c_core mdio isci libahci libsas ptp megaraid_ > >>>sas scsi_transport_sas pps_core > >>>[67675.221939] CPU: 5 PID: 197 Comm: kswapd0 Not tainted 4.4.2+1-ph #1 > >>>[67675.277120] Hardware name: Supermicro > >>>X9DRi-LN4+/X9DR3-LN4+/X9DRi-LN4+/X9DR3-LN4+, BIOS 3.2 03/04/2015 > >>>[67675.335176] ffffffffa3a5065d ffff88007950fa98 ffffffffa33bd4e1 > >>>0000000000000001 > >>>[67675.392983] 0000000000000000 ffff88007950fad8 ffffffffa3083587 > >>>ffff88007950fae8 > >>>[67675.449743] 0000000000000001 ffffea0020883480 ffff880cf4b9cdd0 > >>>ffffea00208834a0 > >>>[67675.506112] Call Trace: > >>>[67675.561285] [] dump_stack+0x45/0x64 > >>>[67675.619364] [] warn_slowpath_common+0x97/0xe0 > >>>[67675.675719] [] warn_slowpath_null+0x1a/0x20 > >>>[67675.731113] [] xfs_vm_releasepage+0xa9/0xe0 > >>>[67675.786116] [] ? page_mkclean_one+0xd0/0xd0 > >>>[67675.844216] [] ? anon_vma_prepare+0x150/0x150 > >>>[67675.903862] [] try_to_release_page+0x32/0x50 > >>>[67675.957625] [] shrink_active_list+0x3ce/0x3e0 > >>>[67676.011497] [] shrink_lruvec+0x687/0x7d0 > >>>[67676.064980] [] shrink_zone+0xdc/0x2c0 > >>>[67676.118828] [] kswapd+0x4f9/0x930 > >>>[67676.172075] [] ? > >>>mem_cgroup_shrink_node_zone+0x150/0x150 > >>>[67676.225139] [] kthread+0xc9/0xe0 > >>>[67676.277539] [] ? kthread_stop+0xe0/0xe0 > >>>[67676.330124] [] ret_from_fork+0x3f/0x70 > >>>[67676.381816] [] ? kthread_stop+0xe0/0xe0 > >>>[67676.433499] ---[ end trace cb1827fe308f7f6b ]--- > >>> > >>>Greets Stefan > >>> > >>>_______________________________________________ > >>>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 s.priebe@profihost.ag Fri Mar 4 14:01:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=unavailable version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0C6937CB9 for ; Fri, 4 Mar 2016 14:01:43 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7BD02AC002 for ; Fri, 4 Mar 2016 12:01:42 -0800 (PST) X-ASG-Debug-ID: 1457121694-04bdf002ee1b29b0001-NocioJ Received: from mail-ph.de-nserver.de (mail-ph.de-nserver.de [85.158.179.214]) by cuda.sgi.com with ESMTP id PtOQHCCi5w1ZFimN (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 12:01:36 -0800 (PST) X-Barracuda-Envelope-From: s.priebe@profihost.ag X-Barracuda-Apparent-Source-IP: 85.158.179.214 Received: (qmail 9775 invoked from network); 4 Mar 2016 21:01:34 +0100 X-Fcrdns: No Received: from phoffice.de-nserver.de (HELO [10.242.2.18]) (185.39.223.5) (smtp-auth username s.priebe@profihost.ag, mechanism plain) by mail-ph.de-nserver.de (qpsmtpd/0.92) with (ECDHE-RSA-AES256-SHA encrypted) ESMTPSA; Fri, 04 Mar 2016 21:01:34 +0100 Subject: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage To: Brian Foster X-ASG-Orig-Subj: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage References: <56C81D94.7090603@profihost.ag> <20160220144533.GA36182@bfoster.bfoster> <56D9D834.2000303@profihost.ag> <20160304191329.GC3758@bfoster.bfoster> Cc: linux-fsdevel@vger.kernel.org, "xfs-masters@oss.sgi.com" , "xfs@oss.sgi.com" From: Stefan Priebe Message-ID: <56D9E9BE.40101@profihost.ag> Date: Fri, 4 Mar 2016 21:02:06 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <20160304191329.GC3758@bfoster.bfoster> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-User-Auth: Auth by s.priebe@profihost.ag through 185.39.223.5 X-Barracuda-Connect: mail-ph.de-nserver.de[85.158.179.214] X-Barracuda-Start-Time: 1457121695 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27578 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Am 04.03.2016 um 20:13 schrieb Brian Foster: > On Fri, Mar 04, 2016 at 07:47:16PM +0100, Stefan Priebe wrote: >> Am 20.02.2016 um 19:02 schrieb Stefan Priebe - Profihost AG: >>> >>>> Am 20.02.2016 um 15:45 schrieb Brian Foster : >>>> >>>>> On Sat, Feb 20, 2016 at 09:02:28AM +0100, Stefan Priebe wrote: >>>>> Hi, >>>>> >>>>> got this one today. Not sure if this is a bug. >>>> >>>> That looks like the releasepage() delayed allocation block warning. I'm >>>> not sure we've had any fixes for (or reports of) that issue since the >>>> v4.2 timeframe. >>>> >>>> What is the xfs_info of the associated filesystem? Also, do you have any >>>> insight as to the possible reproducer application or workload? Is this >>>> reproducible at all? Note that this is a WARN_ON_ONCE(), so the warning >>>> won't fire again regardless until after a reboot. >> >> Toda i got this one running 4.3.3. >> >> [154152.949610] ------------[ cut here ]------------ >> [154152.950704] WARNING: CPU: 0 PID: 79 at fs/xfs/xfs_aops.c:1232 >> xfs_vm_releasepage+0xc3/0xf0() >> [154152.952596] Modules linked in: netconsole mpt3sas raid_class >> nf_conntrack_ipv4 nf_defrag_ipv4 xt_state nf_conntrack xt_tcpudp ipt_REJECT >> nf_reject_ipv4 xt_owner xt_multiport iptable_filter ip_tables x_tables 8021q >> garp coretemp k8temp ehci_pci ehci_hcd sb_edac ipmi_si usbcore edac_core >> ipmi_msghandler i2c_i801 usb_common button btrfs xor raid6_pq sg igb sd_mod >> i2c_algo_bit isci i2c_core libsas ahci ptp libahci scsi_transport_sas >> megaraid_sas pps_core >> [154152.963240] CPU: 0 PID: 79 Comm: kswapd0 Not tainted 4.4.3+3-ph #1 >> [154152.964625] Hardware name: Supermicro >> X9SRE/X9SRE-3F/X9SRi/X9SRi-3F/X9SRE/X9SRE-3F/X9SRi/X9SRi-3F, BIOS 1.0a >> 03/06/2012 >> [154152.967029] 0000000000000000 ffff88103dd67a98 ffffffffa73c3b5f >> 0000000000000000 >> [154152.968836] ffffffffa7a5063b ffff88103dd67ad8 ffffffffa7083757 >> 0000000000000000 >> [154152.970641] 0000000000000001 ffffea0001e7bfc0 ffff88071ef72dd0 >> ffffea0001e7bfe0 >> [154152.972447] Call Trace: >> [154152.973011] [] dump_stack+0x63/0x84 >> [154152.974167] [] warn_slowpath_common+0x97/0xe0 >> [154152.975515] [] warn_slowpath_null+0x1a/0x20 >> [154152.976826] [] xfs_vm_releasepage+0xc3/0xf0 >> [154152.978137] [] try_to_release_page+0x32/0x50 >> [154152.979467] [] shrink_active_list+0x3ce/0x3e0 >> [154152.980816] [] shrink_lruvec+0x687/0x7d0 >> [154152.982068] [] shrink_zone+0xdc/0x2c0 >> [154152.983262] [] kswapd+0x4f9/0x970 >> [154152.984380] [] ? >> mem_cgroup_shrink_node_zone+0x1a0/0x1a0 >> [154152.985942] [] kthread+0xc9/0xe0 >> [154152.987040] [] ? kthread_stop+0x100/0x100 >> [154152.988313] [] ret_from_fork+0x3f/0x70 >> [154152.989527] [] ? kthread_stop+0x100/0x100 >> [154152.990818] ---[ end trace 3fac2515e92c7cb1 ]--- >> >> This time with an xfs info: >> # xfs_info / >> meta-data=/dev/disk/by-uuid/9befe321-e9cc-4e31-82df-efabb3211bac isize=256 >> agcount=4, agsize=58224256 blks >> = sectsz=512 attr=2, projid32bit=0 >> = crc=0 finobt=0 >> data = bsize=4096 blocks=232897024, imaxpct=25 >> = sunit=64 swidth=384 blks >> naming =version 2 bsize=4096 ascii-ci=0 ftype=0 >> log =internal bsize=4096 blocks=113728, version=2 >> = sectsz=512 sunit=64 blks, lazy-count=1 >> realtime =none extsz=4096 blocks=0, rtextents=0 >> > > Can you describe the workload to the filesystem? At the time of this trace the rsync backup of the fs has started. So the workload was going from nearly idle to 4000 iop/s read at 60 MB/s peak. Stefan > Brian > >>> >>>> >>>> Brian >>>> >>>>> [67674.907736] ------------[ cut here ]------------ >>>>> [67674.955858] WARNING: CPU: 5 PID: 197 at fs/xfs/xfs_aops.c:1232 >>>>> xfs_vm_releasepage+0xa9/0xe0() >>>>> [67675.005345] Modules linked in: dm_mod netconsole ipt_REJECT >>>>> nf_reject_ipv4 mpt3sas raid_class xt_multiport iptable_filter ip_tabl >>>>> es x_tables 8021q garp bonding coretemp loop usbhid ehci_pci ehci_hcd >>>>> sb_edac ipmi_si usbcore i2c_i801 edac_core usb_common ipmi_msg >>>>> handler button btrfs xor raid6_pq raid1 md_mod sg igb sd_mod i2c_algo_bit >>>>> ixgbe ahci i2c_core mdio isci libahci libsas ptp megaraid_ >>>>> sas scsi_transport_sas pps_core >>>>> [67675.221939] CPU: 5 PID: 197 Comm: kswapd0 Not tainted 4.4.2+1-ph #1 >>>>> [67675.277120] Hardware name: Supermicro >>>>> X9DRi-LN4+/X9DR3-LN4+/X9DRi-LN4+/X9DR3-LN4+, BIOS 3.2 03/04/2015 >>>>> [67675.335176] ffffffffa3a5065d ffff88007950fa98 ffffffffa33bd4e1 >>>>> 0000000000000001 >>>>> [67675.392983] 0000000000000000 ffff88007950fad8 ffffffffa3083587 >>>>> ffff88007950fae8 >>>>> [67675.449743] 0000000000000001 ffffea0020883480 ffff880cf4b9cdd0 >>>>> ffffea00208834a0 >>>>> [67675.506112] Call Trace: >>>>> [67675.561285] [] dump_stack+0x45/0x64 >>>>> [67675.619364] [] warn_slowpath_common+0x97/0xe0 >>>>> [67675.675719] [] warn_slowpath_null+0x1a/0x20 >>>>> [67675.731113] [] xfs_vm_releasepage+0xa9/0xe0 >>>>> [67675.786116] [] ? page_mkclean_one+0xd0/0xd0 >>>>> [67675.844216] [] ? anon_vma_prepare+0x150/0x150 >>>>> [67675.903862] [] try_to_release_page+0x32/0x50 >>>>> [67675.957625] [] shrink_active_list+0x3ce/0x3e0 >>>>> [67676.011497] [] shrink_lruvec+0x687/0x7d0 >>>>> [67676.064980] [] shrink_zone+0xdc/0x2c0 >>>>> [67676.118828] [] kswapd+0x4f9/0x930 >>>>> [67676.172075] [] ? >>>>> mem_cgroup_shrink_node_zone+0x150/0x150 >>>>> [67676.225139] [] kthread+0xc9/0xe0 >>>>> [67676.277539] [] ? kthread_stop+0xe0/0xe0 >>>>> [67676.330124] [] ret_from_fork+0x3f/0x70 >>>>> [67676.381816] [] ? kthread_stop+0xe0/0xe0 >>>>> [67676.433499] ---[ end trace cb1827fe308f7f6b ]--- >>>>> >>>>> Greets Stefan >>>>> >>>>> _______________________________________________ >>>>> 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 Fri Mar 4 15:03:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 72B037CBB for ; Fri, 4 Mar 2016 15:03:49 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2C17C8F8035 for ; Fri, 4 Mar 2016 13:03:46 -0800 (PST) X-ASG-Debug-ID: 1457125424-04bdf002ed1b45e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 759AhA6uZoFQ9Mgi (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Fri, 04 Mar 2016 13:03:44 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 23619C0006E4; Fri, 4 Mar 2016 21:03:44 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-186.bos.redhat.com [10.18.41.186]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u24L3htI025237; Fri, 4 Mar 2016 16:03:43 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 34D1A125041; Fri, 4 Mar 2016 16:03:42 -0500 (EST) Date: Fri, 4 Mar 2016 16:03:42 -0500 From: Brian Foster To: Stefan Priebe Cc: linux-fsdevel@vger.kernel.org, "xfs-masters@oss.sgi.com" , "xfs@oss.sgi.com" Subject: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage Message-ID: <20160304210341.GA8035@bfoster.bfoster> X-ASG-Orig-Subj: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage References: <56C81D94.7090603@profihost.ag> <20160220144533.GA36182@bfoster.bfoster> <56D9D834.2000303@profihost.ag> <20160304191329.GC3758@bfoster.bfoster> <56D9E9BE.40101@profihost.ag> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56D9E9BE.40101@profihost.ag> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457125424 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Mar 04, 2016 at 09:02:06PM +0100, Stefan Priebe wrote: > > Am 04.03.2016 um 20:13 schrieb Brian Foster: > >On Fri, Mar 04, 2016 at 07:47:16PM +0100, Stefan Priebe wrote: > >>Am 20.02.2016 um 19:02 schrieb Stefan Priebe - Profihost AG: > >>> > >>>>Am 20.02.2016 um 15:45 schrieb Brian Foster : > >>>> > >>>>>On Sat, Feb 20, 2016 at 09:02:28AM +0100, Stefan Priebe wrote: > >>>>>Hi, > >>>>> > >>>>>got this one today. Not sure if this is a bug. > >>>> > >>>>That looks like the releasepage() delayed allocation block warning. I'm > >>>>not sure we've had any fixes for (or reports of) that issue since the > >>>>v4.2 timeframe. > >>>> > >>>>What is the xfs_info of the associated filesystem? Also, do you have any > >>>>insight as to the possible reproducer application or workload? Is this > >>>>reproducible at all? Note that this is a WARN_ON_ONCE(), so the warning > >>>>won't fire again regardless until after a reboot. > >> > >>Toda i got this one running 4.3.3. > >> > >>[154152.949610] ------------[ cut here ]------------ > >>[154152.950704] WARNING: CPU: 0 PID: 79 at fs/xfs/xfs_aops.c:1232 > >>xfs_vm_releasepage+0xc3/0xf0() > >>[154152.952596] Modules linked in: netconsole mpt3sas raid_class > >>nf_conntrack_ipv4 nf_defrag_ipv4 xt_state nf_conntrack xt_tcpudp ipt_REJECT > >>nf_reject_ipv4 xt_owner xt_multiport iptable_filter ip_tables x_tables 8021q > >>garp coretemp k8temp ehci_pci ehci_hcd sb_edac ipmi_si usbcore edac_core > >>ipmi_msghandler i2c_i801 usb_common button btrfs xor raid6_pq sg igb sd_mod > >>i2c_algo_bit isci i2c_core libsas ahci ptp libahci scsi_transport_sas > >>megaraid_sas pps_core > >>[154152.963240] CPU: 0 PID: 79 Comm: kswapd0 Not tainted 4.4.3+3-ph #1 > >>[154152.964625] Hardware name: Supermicro > >>X9SRE/X9SRE-3F/X9SRi/X9SRi-3F/X9SRE/X9SRE-3F/X9SRi/X9SRi-3F, BIOS 1.0a > >>03/06/2012 > >>[154152.967029] 0000000000000000 ffff88103dd67a98 ffffffffa73c3b5f > >>0000000000000000 > >>[154152.968836] ffffffffa7a5063b ffff88103dd67ad8 ffffffffa7083757 > >>0000000000000000 > >>[154152.970641] 0000000000000001 ffffea0001e7bfc0 ffff88071ef72dd0 > >>ffffea0001e7bfe0 > >>[154152.972447] Call Trace: > >>[154152.973011] [] dump_stack+0x63/0x84 > >>[154152.974167] [] warn_slowpath_common+0x97/0xe0 > >>[154152.975515] [] warn_slowpath_null+0x1a/0x20 > >>[154152.976826] [] xfs_vm_releasepage+0xc3/0xf0 > >>[154152.978137] [] try_to_release_page+0x32/0x50 > >>[154152.979467] [] shrink_active_list+0x3ce/0x3e0 > >>[154152.980816] [] shrink_lruvec+0x687/0x7d0 > >>[154152.982068] [] shrink_zone+0xdc/0x2c0 > >>[154152.983262] [] kswapd+0x4f9/0x970 > >>[154152.984380] [] ? > >>mem_cgroup_shrink_node_zone+0x1a0/0x1a0 > >>[154152.985942] [] kthread+0xc9/0xe0 > >>[154152.987040] [] ? kthread_stop+0x100/0x100 > >>[154152.988313] [] ret_from_fork+0x3f/0x70 > >>[154152.989527] [] ? kthread_stop+0x100/0x100 > >>[154152.990818] ---[ end trace 3fac2515e92c7cb1 ]--- > >> > >>This time with an xfs info: > >># xfs_info / > >>meta-data=/dev/disk/by-uuid/9befe321-e9cc-4e31-82df-efabb3211bac isize=256 > >>agcount=4, agsize=58224256 blks > >> = sectsz=512 attr=2, projid32bit=0 > >> = crc=0 finobt=0 > >>data = bsize=4096 blocks=232897024, imaxpct=25 > >> = sunit=64 swidth=384 blks > >>naming =version 2 bsize=4096 ascii-ci=0 ftype=0 > >>log =internal bsize=4096 blocks=113728, version=2 > >> = sectsz=512 sunit=64 blks, lazy-count=1 > >>realtime =none extsz=4096 blocks=0, rtextents=0 > >> > > > >Can you describe the workload to the filesystem? > > At the time of this trace the rsync backup of the fs has started. So the > workload was going from nearly idle to 4000 iop/s read at 60 MB/s peak. > Interesting. The warning is associated with releasing a page that has a delayed allocation when it shouldn't. That means something had written to a file to cause the delalloc in the first place. Any idea what could have been writing at the time or shortly before the rsync read workload had kicked in? Brian > Stefan > > >Brian > > > >>> > >>>> > >>>>Brian > >>>> > >>>>>[67674.907736] ------------[ cut here ]------------ > >>>>>[67674.955858] WARNING: CPU: 5 PID: 197 at fs/xfs/xfs_aops.c:1232 > >>>>>xfs_vm_releasepage+0xa9/0xe0() > >>>>>[67675.005345] Modules linked in: dm_mod netconsole ipt_REJECT > >>>>>nf_reject_ipv4 mpt3sas raid_class xt_multiport iptable_filter ip_tabl > >>>>>es x_tables 8021q garp bonding coretemp loop usbhid ehci_pci ehci_hcd > >>>>>sb_edac ipmi_si usbcore i2c_i801 edac_core usb_common ipmi_msg > >>>>>handler button btrfs xor raid6_pq raid1 md_mod sg igb sd_mod i2c_algo_bit > >>>>>ixgbe ahci i2c_core mdio isci libahci libsas ptp megaraid_ > >>>>>sas scsi_transport_sas pps_core > >>>>>[67675.221939] CPU: 5 PID: 197 Comm: kswapd0 Not tainted 4.4.2+1-ph #1 > >>>>>[67675.277120] Hardware name: Supermicro > >>>>>X9DRi-LN4+/X9DR3-LN4+/X9DRi-LN4+/X9DR3-LN4+, BIOS 3.2 03/04/2015 > >>>>>[67675.335176] ffffffffa3a5065d ffff88007950fa98 ffffffffa33bd4e1 > >>>>>0000000000000001 > >>>>>[67675.392983] 0000000000000000 ffff88007950fad8 ffffffffa3083587 > >>>>>ffff88007950fae8 > >>>>>[67675.449743] 0000000000000001 ffffea0020883480 ffff880cf4b9cdd0 > >>>>>ffffea00208834a0 > >>>>>[67675.506112] Call Trace: > >>>>>[67675.561285] [] dump_stack+0x45/0x64 > >>>>>[67675.619364] [] warn_slowpath_common+0x97/0xe0 > >>>>>[67675.675719] [] warn_slowpath_null+0x1a/0x20 > >>>>>[67675.731113] [] xfs_vm_releasepage+0xa9/0xe0 > >>>>>[67675.786116] [] ? page_mkclean_one+0xd0/0xd0 > >>>>>[67675.844216] [] ? anon_vma_prepare+0x150/0x150 > >>>>>[67675.903862] [] try_to_release_page+0x32/0x50 > >>>>>[67675.957625] [] shrink_active_list+0x3ce/0x3e0 > >>>>>[67676.011497] [] shrink_lruvec+0x687/0x7d0 > >>>>>[67676.064980] [] shrink_zone+0xdc/0x2c0 > >>>>>[67676.118828] [] kswapd+0x4f9/0x930 > >>>>>[67676.172075] [] ? > >>>>>mem_cgroup_shrink_node_zone+0x150/0x150 > >>>>>[67676.225139] [] kthread+0xc9/0xe0 > >>>>>[67676.277539] [] ? kthread_stop+0xe0/0xe0 > >>>>>[67676.330124] [] ret_from_fork+0x3f/0x70 > >>>>>[67676.381816] [] ? kthread_stop+0xe0/0xe0 > >>>>>[67676.433499] ---[ end trace cb1827fe308f7f6b ]--- > >>>>> > >>>>>Greets Stefan > >>>>> > >>>>>_______________________________________________ > >>>>>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 s.priebe@profihost.ag Fri Mar 4 15:15:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 547E87CBD for ; Fri, 4 Mar 2016 15:15:13 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 256168F804B for ; Fri, 4 Mar 2016 13:15:12 -0800 (PST) X-ASG-Debug-ID: 1457126108-04cb6c583018d910001-NocioJ Received: from mail-ph.de-nserver.de (mail-ph.de-nserver.de [85.158.179.214]) by cuda.sgi.com with ESMTP id 6ojwxYhr309svOW5 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 13:15:09 -0800 (PST) X-Barracuda-Envelope-From: s.priebe@profihost.ag X-Barracuda-Apparent-Source-IP: 85.158.179.214 Received: (qmail 28466 invoked from network); 4 Mar 2016 22:15:07 +0100 X-Fcrdns: No Received: from phoffice.de-nserver.de (HELO [10.242.2.18]) (185.39.223.5) (smtp-auth username s.priebe@profihost.ag, mechanism plain) by mail-ph.de-nserver.de (qpsmtpd/0.92) with (ECDHE-RSA-AES256-SHA encrypted) ESMTPSA; Fri, 04 Mar 2016 22:15:07 +0100 Subject: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage To: Brian Foster X-ASG-Orig-Subj: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage References: <56C81D94.7090603@profihost.ag> <20160220144533.GA36182@bfoster.bfoster> <56D9D834.2000303@profihost.ag> <20160304191329.GC3758@bfoster.bfoster> <56D9E9BE.40101@profihost.ag> <20160304210341.GA8035@bfoster.bfoster> Cc: linux-fsdevel@vger.kernel.org, "xfs-masters@oss.sgi.com" , "xfs@oss.sgi.com" From: Stefan Priebe Message-ID: <56D9FAFC.6010404@profihost.ag> Date: Fri, 4 Mar 2016 22:15:40 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <20160304210341.GA8035@bfoster.bfoster> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-User-Auth: Auth by s.priebe@profihost.ag through 185.39.223.5 X-Barracuda-Connect: mail-ph.de-nserver.de[85.158.179.214] X-Barracuda-Start-Time: 1457126109 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27580 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Am 04.03.2016 um 22:03 schrieb Brian Foster: > On Fri, Mar 04, 2016 at 09:02:06PM +0100, Stefan Priebe wrote: >> >> Am 04.03.2016 um 20:13 schrieb Brian Foster: >>> On Fri, Mar 04, 2016 at 07:47:16PM +0100, Stefan Priebe wrote: >>>> Am 20.02.2016 um 19:02 schrieb Stefan Priebe - Profihost AG: >>>>> >>>>>> Am 20.02.2016 um 15:45 schrieb Brian Foster : >>>>>> >>>>>>> On Sat, Feb 20, 2016 at 09:02:28AM +0100, Stefan Priebe wrote: >>>>>>> Hi, >>>>>>> >>>>>>> got this one today. Not sure if this is a bug. >>>>>> >>>>>> That looks like the releasepage() delayed allocation block warning. I'm >>>>>> not sure we've had any fixes for (or reports of) that issue since the >>>>>> v4.2 timeframe. >>>>>> >>>>>> What is the xfs_info of the associated filesystem? Also, do you have any >>>>>> insight as to the possible reproducer application or workload? Is this >>>>>> reproducible at all? Note that this is a WARN_ON_ONCE(), so the warning >>>>>> won't fire again regardless until after a reboot. >>>> >>>> Toda i got this one running 4.3.3. >>>> >>>> [154152.949610] ------------[ cut here ]------------ >>>> [154152.950704] WARNING: CPU: 0 PID: 79 at fs/xfs/xfs_aops.c:1232 >>>> xfs_vm_releasepage+0xc3/0xf0() >>>> [154152.952596] Modules linked in: netconsole mpt3sas raid_class >>>> nf_conntrack_ipv4 nf_defrag_ipv4 xt_state nf_conntrack xt_tcpudp ipt_REJECT >>>> nf_reject_ipv4 xt_owner xt_multiport iptable_filter ip_tables x_tables 8021q >>>> garp coretemp k8temp ehci_pci ehci_hcd sb_edac ipmi_si usbcore edac_core >>>> ipmi_msghandler i2c_i801 usb_common button btrfs xor raid6_pq sg igb sd_mod >>>> i2c_algo_bit isci i2c_core libsas ahci ptp libahci scsi_transport_sas >>>> megaraid_sas pps_core >>>> [154152.963240] CPU: 0 PID: 79 Comm: kswapd0 Not tainted 4.4.3+3-ph #1 >>>> [154152.964625] Hardware name: Supermicro >>>> X9SRE/X9SRE-3F/X9SRi/X9SRi-3F/X9SRE/X9SRE-3F/X9SRi/X9SRi-3F, BIOS 1.0a >>>> 03/06/2012 >>>> [154152.967029] 0000000000000000 ffff88103dd67a98 ffffffffa73c3b5f >>>> 0000000000000000 >>>> [154152.968836] ffffffffa7a5063b ffff88103dd67ad8 ffffffffa7083757 >>>> 0000000000000000 >>>> [154152.970641] 0000000000000001 ffffea0001e7bfc0 ffff88071ef72dd0 >>>> ffffea0001e7bfe0 >>>> [154152.972447] Call Trace: >>>> [154152.973011] [] dump_stack+0x63/0x84 >>>> [154152.974167] [] warn_slowpath_common+0x97/0xe0 >>>> [154152.975515] [] warn_slowpath_null+0x1a/0x20 >>>> [154152.976826] [] xfs_vm_releasepage+0xc3/0xf0 >>>> [154152.978137] [] try_to_release_page+0x32/0x50 >>>> [154152.979467] [] shrink_active_list+0x3ce/0x3e0 >>>> [154152.980816] [] shrink_lruvec+0x687/0x7d0 >>>> [154152.982068] [] shrink_zone+0xdc/0x2c0 >>>> [154152.983262] [] kswapd+0x4f9/0x970 >>>> [154152.984380] [] ? >>>> mem_cgroup_shrink_node_zone+0x1a0/0x1a0 >>>> [154152.985942] [] kthread+0xc9/0xe0 >>>> [154152.987040] [] ? kthread_stop+0x100/0x100 >>>> [154152.988313] [] ret_from_fork+0x3f/0x70 >>>> [154152.989527] [] ? kthread_stop+0x100/0x100 >>>> [154152.990818] ---[ end trace 3fac2515e92c7cb1 ]--- >>>> >>>> This time with an xfs info: >>>> # xfs_info / >>>> meta-data=/dev/disk/by-uuid/9befe321-e9cc-4e31-82df-efabb3211bac isize=256 >>>> agcount=4, agsize=58224256 blks >>>> = sectsz=512 attr=2, projid32bit=0 >>>> = crc=0 finobt=0 >>>> data = bsize=4096 blocks=232897024, imaxpct=25 >>>> = sunit=64 swidth=384 blks >>>> naming =version 2 bsize=4096 ascii-ci=0 ftype=0 >>>> log =internal bsize=4096 blocks=113728, version=2 >>>> = sectsz=512 sunit=64 blks, lazy-count=1 >>>> realtime =none extsz=4096 blocks=0, rtextents=0 >>>> >>> >>> Can you describe the workload to the filesystem? >> >> At the time of this trace the rsync backup of the fs has started. So the >> workload was going from nearly idle to 4000 iop/s read at 60 MB/s peak. >> > > Interesting. The warning is associated with releasing a page that has a > delayed allocation when it shouldn't. That means something had written > to a file to cause the delalloc in the first place. Any idea what could > have been writing at the time or shortly before the rsync read workload > had kicked in? The systen itself is a lamp system so PHP and MySQL are running and may write data to files but at the time the trace happens the system was nearly idle but not completely. It was 3am. Stefan > > Brian > >> Stefan >> >>> Brian >>> >>>>> >>>>>> >>>>>> Brian >>>>>> >>>>>>> [67674.907736] ------------[ cut here ]------------ >>>>>>> [67674.955858] WARNING: CPU: 5 PID: 197 at fs/xfs/xfs_aops.c:1232 >>>>>>> xfs_vm_releasepage+0xa9/0xe0() >>>>>>> [67675.005345] Modules linked in: dm_mod netconsole ipt_REJECT >>>>>>> nf_reject_ipv4 mpt3sas raid_class xt_multiport iptable_filter ip_tabl >>>>>>> es x_tables 8021q garp bonding coretemp loop usbhid ehci_pci ehci_hcd >>>>>>> sb_edac ipmi_si usbcore i2c_i801 edac_core usb_common ipmi_msg >>>>>>> handler button btrfs xor raid6_pq raid1 md_mod sg igb sd_mod i2c_algo_bit >>>>>>> ixgbe ahci i2c_core mdio isci libahci libsas ptp megaraid_ >>>>>>> sas scsi_transport_sas pps_core >>>>>>> [67675.221939] CPU: 5 PID: 197 Comm: kswapd0 Not tainted 4.4.2+1-ph #1 >>>>>>> [67675.277120] Hardware name: Supermicro >>>>>>> X9DRi-LN4+/X9DR3-LN4+/X9DRi-LN4+/X9DR3-LN4+, BIOS 3.2 03/04/2015 >>>>>>> [67675.335176] ffffffffa3a5065d ffff88007950fa98 ffffffffa33bd4e1 >>>>>>> 0000000000000001 >>>>>>> [67675.392983] 0000000000000000 ffff88007950fad8 ffffffffa3083587 >>>>>>> ffff88007950fae8 >>>>>>> [67675.449743] 0000000000000001 ffffea0020883480 ffff880cf4b9cdd0 >>>>>>> ffffea00208834a0 >>>>>>> [67675.506112] Call Trace: >>>>>>> [67675.561285] [] dump_stack+0x45/0x64 >>>>>>> [67675.619364] [] warn_slowpath_common+0x97/0xe0 >>>>>>> [67675.675719] [] warn_slowpath_null+0x1a/0x20 >>>>>>> [67675.731113] [] xfs_vm_releasepage+0xa9/0xe0 >>>>>>> [67675.786116] [] ? page_mkclean_one+0xd0/0xd0 >>>>>>> [67675.844216] [] ? anon_vma_prepare+0x150/0x150 >>>>>>> [67675.903862] [] try_to_release_page+0x32/0x50 >>>>>>> [67675.957625] [] shrink_active_list+0x3ce/0x3e0 >>>>>>> [67676.011497] [] shrink_lruvec+0x687/0x7d0 >>>>>>> [67676.064980] [] shrink_zone+0xdc/0x2c0 >>>>>>> [67676.118828] [] kswapd+0x4f9/0x930 >>>>>>> [67676.172075] [] ? >>>>>>> mem_cgroup_shrink_node_zone+0x150/0x150 >>>>>>> [67676.225139] [] kthread+0xc9/0xe0 >>>>>>> [67676.277539] [] ? kthread_stop+0xe0/0xe0 >>>>>>> [67676.330124] [] ret_from_fork+0x3f/0x70 >>>>>>> [67676.381816] [] ? kthread_stop+0xe0/0xe0 >>>>>>> [67676.433499] ---[ end trace cb1827fe308f7f6b ]--- >>>>>>> >>>>>>> Greets Stefan >>>>>>> >>>>>>> _______________________________________________ >>>>>>> xfs mailing list >>>>>>> xfs@oss.sgi.com >>>>>>> http://oss.sgi.com/mailman/listinfo/xfs >>>> >>>> _______________________________________________ >>>> xfs mailing list >>>> xfs@oss.sgi.com >>>> http://oss.sgi.com/mailman/listinfo/xfs From darrick.wong@oracle.com Fri Mar 4 18:35:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A495A7CA1 for ; Fri, 4 Mar 2016 18:35:39 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 692DA8F8035 for ; Fri, 4 Mar 2016 16:35:39 -0800 (PST) X-ASG-Debug-ID: 1457138137-04cbb00b711c6680001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 4d4kjPPqT4FPdTkd (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 16:35:37 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u250Z8PG009937 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 5 Mar 2016 00:35:09 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u250Z8aT028627 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 5 Mar 2016 00:35:08 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u250Z6GS025161; Sat, 5 Mar 2016 00:35:07 GMT Received: from localhost (/10.159.166.81) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 04 Mar 2016 16:35:06 -0800 Subject: [PATCH v5 0/6] xfs-docs: reorganize chapters, refcountbt and rmapbt chapters update From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH v5 0/6] xfs-docs: reorganize chapters, refcountbt and rmapbt chapters update To: hch@infradead.org, david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Fri, 04 Mar 2016 16:35:05 -0800 Message-ID: <20160305003505.28327.95288.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1457138137 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27587 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Hi all, This is part of the fifth revision of a patchset for adding support to XFS for tracking reverse-mappings of physical blocks to file and metadata; and support for mapping multiple file logical blocks to the same physical block, more commonly known as reflinking. This patch set does the following: * Adds a chapter discussing the importance of thoroughly testing new disk format changes with xfstests, and how to find the source code. * Adds in all the disk format changes for Linux 4.5. * Separates the btree sections into a separate chapter about the generic btree structure, and adds a section about the new support for overlapped interval records. * Adds chapters discussing reflink, the reference count btree, and * the reserve-mapping btree. The patch set is based on the current master branch of xfs-docs[1]. Comments and questions are, as always, welcome. --D [1] https://github.com/djwong/xfs-documentation/tree/reflink-devel From darrick.wong@oracle.com Fri Mar 4 18:35:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7EA2A7CA6 for ; Fri, 4 Mar 2016 18:35:45 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E8942AC001 for ; Fri, 4 Mar 2016 16:35:44 -0800 (PST) X-ASG-Debug-ID: 1457138141-04cb6c5833192c30001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 2eyXujAkOFZ6Ve5j (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 16:35:42 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u250ZE4N017137 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 5 Mar 2016 00:35:14 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u250ZDZd008909 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 5 Mar 2016 00:35:14 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u250ZDwZ005045; Sat, 5 Mar 2016 00:35:13 GMT Received: from localhost (/10.159.166.81) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 04 Mar 2016 16:35:12 -0800 Subject: [PATCH 1/6] xfsdocs: document known testing procedures From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 1/6] xfsdocs: document known testing procedures To: hch@infradead.org, david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Fri, 04 Mar 2016 16:35:11 -0800 Message-ID: <20160305003511.28327.61259.stgit@birch.djwong.org> In-Reply-To: <20160305003505.28327.95288.stgit@birch.djwong.org> References: <20160305003505.28327.95288.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1457138141 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27587 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Signed-off-by: Darrick J. Wong --- design/XFS_Filesystem_Structure/docinfo.xml | 14 ++++++++++++ design/XFS_Filesystem_Structure/testing.asciidoc | 23 ++++++++++++++++++++ .../xfs_filesystem_structure.asciidoc | 2 ++ 3 files changed, 39 insertions(+) create mode 100644 design/XFS_Filesystem_Structure/testing.asciidoc diff --git a/design/XFS_Filesystem_Structure/docinfo.xml b/design/XFS_Filesystem_Structure/docinfo.xml index ba97809..cc5596d 100644 --- a/design/XFS_Filesystem_Structure/docinfo.xml +++ b/design/XFS_Filesystem_Structure/docinfo.xml @@ -108,4 +108,18 @@ + + 3.14 + January 2016 + + Darrick + Wong + + + + + Document disk format change testing. + + + diff --git a/design/XFS_Filesystem_Structure/testing.asciidoc b/design/XFS_Filesystem_Structure/testing.asciidoc new file mode 100644 index 0000000..f1c90bc --- /dev/null +++ b/design/XFS_Filesystem_Structure/testing.asciidoc @@ -0,0 +1,23 @@ +[[Testing]] += Testing Filesystem Changes + +People put a lot of trust in filesystems to preserve their data in a reliable +fashion. To that end, it is very important that users and developers have +access to a suite of regression tests that can be used to prove correct +operation of any given filesystem code, or to analyze failures to fix problems +found in the code. The XFS regression test suite, +xfstests+, is hosted at ++git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git+. Most tests apply to +filesystems in general, but the suite also contains tests for features specific +to each filesystem. + +When fixing bugs, it is important to provide a testcase exposing the bug so +that the developers can avoid a future re-occurrence of the regression. +Furthermore, if you're developing a new user-visible feature for XFS, please +help the rest of the development community to sustain and maintain the whole +codebase by providing generous test coverage to check its behavior. + +When altering, adding, or removing an on-disk data structure, please remember +to update both the in-kernel structure size checks in +xfs_ondisk.h+ and to +ensure that your changes are reflected in xfstest xfs/122. These regression +tests enable us to detect compiler bugs, alignment problems, and anything +else that might result in the creation of incompatible filesystem images. diff --git a/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc b/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc index 53262bf..f580aab 100644 --- a/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc +++ b/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc @@ -52,6 +52,8 @@ include::common_types.asciidoc[] include::magic.asciidoc[] +include::testing.asciidoc[] + // return titles to normal :leveloffset: 0 From darrick.wong@oracle.com Fri Mar 4 18:35:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0DFE47CA7 for ; Fri, 4 Mar 2016 18:35:46 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8543EAC002 for ; Fri, 4 Mar 2016 16:35:45 -0800 (PST) X-ASG-Debug-ID: 1457138142-04bdf002ed1baa80001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id gZgwdQUQnAHc28dd (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 16:35:42 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u250ZJ9o009975 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Sat, 5 Mar 2016 00:35:20 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u250ZJHx019561 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Sat, 5 Mar 2016 00:35:19 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u250ZJW7025253; Sat, 5 Mar 2016 00:35:19 GMT Received: from localhost (/10.159.166.81) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 04 Mar 2016 16:35:19 -0800 Subject: [PATCH 2/6] xfsdocs: update the on-disk format with changes for Linux 4.5 From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 2/6] xfsdocs: update the on-disk format with changes for Linux 4.5 To: hch@infradead.org, david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Fri, 04 Mar 2016 16:35:18 -0800 Message-ID: <20160305003518.28327.15601.stgit@birch.djwong.org> In-Reply-To: <20160305003505.28327.95288.stgit@birch.djwong.org> References: <20160305003505.28327.95288.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1457138142 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27587 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Signed-off-by: Darrick J. Wong --- .../XFS_Filesystem_Structure/ondisk_inode.asciidoc | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/design/XFS_Filesystem_Structure/ondisk_inode.asciidoc b/design/XFS_Filesystem_Structure/ondisk_inode.asciidoc index 4aabc55..f1b0421 100644 --- a/design/XFS_Filesystem_Structure/ondisk_inode.asciidoc +++ b/design/XFS_Filesystem_Structure/ondisk_inode.asciidoc @@ -66,7 +66,7 @@ of the literal area and +di_forkoff+. The attribute fork is located between [[Inode_Core]] == Inode Core -The inode's core is 96 bytes in size and contains information about the file +The inode's core is 176 bytes in size and contains information about the file itself including most stat data information about data and attribute forks after the core within the inode. It uses the following structure: @@ -313,8 +313,16 @@ Counts the number of changes made to the attributes in this inode. Log sequence number of the last inode write. *di_flags2*:: -Specifies extended flags associated with a v3 inode. There are no flags defined -currently. +Specifies extended flags associated with a v3 inode. + +.Version 3 Inode flags +[options="header"] +|===== +| Flag | Description +| +XFS_DIFLAG2_DAX+ | +For a file, enable DAX to increase performance on persistent-memory storage. +If set on a directory, files created in the directory will inherit this flag. +|===== *di_pad2*:: Padding for future expansion of the inode. From darrick.wong@oracle.com Fri Mar 4 18:36:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 500217CA1 for ; Fri, 4 Mar 2016 18:36:03 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1586B8F8035 for ; Fri, 4 Mar 2016 16:36:03 -0800 (PST) X-ASG-Debug-ID: 1457138158-04cb6c5833192c50001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id u6ve5KBaYrpvcJeF (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 16:35:58 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u250ZXRp017245 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Sat, 5 Mar 2016 00:35:34 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u250ZWTT019772 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 5 Mar 2016 00:35:33 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u250ZPf1006343; Sat, 5 Mar 2016 00:35:31 GMT Received: from localhost (/10.159.166.81) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 04 Mar 2016 16:35:25 -0800 Subject: [PATCH 3/6] xfsdocs: move the discussions of short and long format btrees to a separate chapter From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 3/6] xfsdocs: move the discussions of short and long format btrees to a separate chapter To: hch@infradead.org, david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Fri, 04 Mar 2016 16:35:24 -0800 Message-ID: <20160305003524.28327.95523.stgit@birch.djwong.org> In-Reply-To: <20160305003505.28327.95288.stgit@birch.djwong.org> References: <20160305003505.28327.95288.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1457138158 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27587 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Move the discussion of short and long format btrees into a separate chapter. Signed-off-by: Darrick J. Wong --- .../allocation_groups.asciidoc | 59 ------ design/XFS_Filesystem_Structure/btrees.asciidoc | 200 ++++++++++++++++++++ .../XFS_Filesystem_Structure/data_extents.asciidoc | 71 ------- .../xfs_filesystem_structure.asciidoc | 2 4 files changed, 206 insertions(+), 126 deletions(-) create mode 100644 design/XFS_Filesystem_Structure/btrees.asciidoc diff --git a/design/XFS_Filesystem_Structure/allocation_groups.asciidoc b/design/XFS_Filesystem_Structure/allocation_groups.asciidoc index 7dd67ce..8656636 100644 --- a/design/XFS_Filesystem_Structure/allocation_groups.asciidoc +++ b/design/XFS_Filesystem_Structure/allocation_groups.asciidoc @@ -612,65 +612,6 @@ Checksum of the AGF sector. *agf_spare2*:: Empty space in the unlogged part of the AGF sector. -[[Short_Format_Btrees]] -=== Short Format B+trees - -Each allocation group uses a ``short format'' B+tree to index various -information about the allocation group. The structure is called short format -because all block pointers are AG block numbers. The trees use the following -header: - -[source, c] ----- -struct xfs_btree_sblock { - __be32 bb_magic; - __be16 bb_level; - __be16 bb_numrecs; - __be32 bb_leftsib; - __be32 bb_rightsib; - - /* version 5 filesystem fields start here */ - __be64 bb_blkno; - __be64 bb_lsn; - uuid_t bb_uuid; - __be32 bb_owner; - __le32 bb_crc; -}; ----- - -*bb_magic*:: -Specifies the magic number for the per-AG B+tree block. - -*bb_level*:: -The level of the tree in which this block is found. If this value is 0, this -is a leaf block and contains records; otherwise, it is a node block and -contains keys and pointers. - -*bb_numrecs*:: -Number of records in this block. - -*bb_leftsib*:: -AG block number of the left sibling of this B+tree node. - -*bb_rightsib*:: -AG block number of the right sibling of this B+tree node. - -*bb_blkno*:: -FS block number of this B+tree block. - -*bb_lsn*:: -Log sequence number of the last write to this block. - -*bb_uuid*:: -The UUID of this block, which must match either +sb_uuid+ or +sb_meta_uuid+ -depending on which features are set. - -*bb_owner*:: -The AG number that this B+tree block ought to be in. - -*bb_crc*:: -Checksum of the B+tree block. - [[AG_Free_Space_Btrees]] === AG Free Space B+trees diff --git a/design/XFS_Filesystem_Structure/btrees.asciidoc b/design/XFS_Filesystem_Structure/btrees.asciidoc new file mode 100644 index 0000000..c67669c --- /dev/null +++ b/design/XFS_Filesystem_Structure/btrees.asciidoc @@ -0,0 +1,200 @@ += B+trees + +XFS uses b+trees to index all metadata records. This well known data structure +is used to provide efficient random and sequential access to metadata records +while minimizing seek times. There are two btree formats: a short format +for records pertaining to a single allocation group, since all block pointers +in an AG are 32-bits in size; and a long format for records pertaining to a +file, since file data can have 64-bit block offsets. Each b+tree block is +either a leaf node containing records, or an internal node containing keys and +pointers to other b+tree blocks. The tree consists of a root block which may +point to some number of other blocks; blocks in the bottom level of the b+tree +contains only records. + +Leaf blocks of both types of b+trees have the same general format: a header +describing the data in the block, and an array of records. The specific header +formats are given in the next two sections, and the record format is provided +by the b+tree client itself. The generic b+tree code does not have any +specific knowledge of the record format. + +---- ++--------+------------+------------+ +| header | record | records... | ++--------+------------+------------+ +---- + +Internal node blocks of both types of b+trees also have the same general +format: a header describing the data in the block, an array of keys, and an +array of pointers. Each pointer may be associated with one or two keys. The +first key uniquely identifies the first record accessible via the leftmost path +down the branch of the tree. + +If the records in a b+tree are indexed by an interval, then a range of keys can +uniquely identify a single record. For example, if a record covers blocks +12-16, then any one of the keys 12, 13, 14, 15, or 16 return the same record. +In this case, the key for the record describing "12-16" is 12. If none of the +records overlap, we only need to store one key. + +This is the format of a standard b+tree node: + +---- ++--------+---------+---------+---------+---------+ +| header | key | keys... | ptr | ptrs... | ++--------+---------+---------+---------+---------+ +---- + +If the b+tree records do not overlap, performing a b+tree lookup is simple. +Start with the root. If it is a leaf block, perform a binary search of the +records until we find the record with a lower key than our search key. If the +block is a node block, perform a binary search of the keys until we find a +key lower than our search key, then follow the pointer to the next block. +Repeat until we find a record. + +However, if b+tree records contain intervals and are allowed to overlap, the +internal nodes of the b+tree become larger: + +---- ++--------+---------+----------+---------+-------------+---------+---------+ +| header | low key | high key | low key | high key... | ptr | ptrs... | ++--------+---------+----------+---------+-------------+---------+---------+ +---- + +The low keys are exactly the same as the keys in the non-overlapping b+tree. +High keys, however, are a little different. Recall that a record with a key +consisting of an interval can be referenced by a number of keys. Since the low +key of a record indexes the low end of that key range, the high key indexes the +high end of the key range. Returning to the example above, the high key for +the record describing "12-16" is 16. The high key recorded in a b+tree node +is the largest of the high keys of all records accessible under the subtree +rooted by the pointer. For a level 1 node, this is the largest high key in +the pointed-to leaf node; for any other node, this is the largest of the high +keys in the pointed-to node. + +Nodes and leaves use the same magic numbers. + +[[Short_Format_Btrees]] +== Short Format B+trees + +Each allocation group uses a ``short format'' B+tree to index various +information about the allocation group. The structure is called short format +because all block pointers are AG block numbers. The trees use the following +header: + +[source, c] +---- +struct xfs_btree_sblock { + __be32 bb_magic; + __be16 bb_level; + __be16 bb_numrecs; + __be32 bb_leftsib; + __be32 bb_rightsib; + + /* version 5 filesystem fields start here */ + __be64 bb_blkno; + __be64 bb_lsn; + uuid_t bb_uuid; + __be32 bb_owner; + __le32 bb_crc; +}; +---- + +*bb_magic*:: +Specifies the magic number for the per-AG B+tree block. + +*bb_level*:: +The level of the tree in which this block is found. If this value is 0, this +is a leaf block and contains records; otherwise, it is a node block and +contains keys and pointers. + +*bb_numrecs*:: +Number of records in this block. + +*bb_leftsib*:: +AG block number of the left sibling of this B+tree node. + +*bb_rightsib*:: +AG block number of the right sibling of this B+tree node. + +*bb_blkno*:: +FS block number of this B+tree block. + +*bb_lsn*:: +Log sequence number of the last write to this block. + +*bb_uuid*:: +The UUID of this block, which must match either +sb_uuid+ or +sb_meta_uuid+ +depending on which features are set. + +*bb_owner*:: +The AG number that this B+tree block ought to be in. + +*bb_crc*:: +Checksum of the B+tree block. + +[[Long_Format_Btrees]] +== Long Format B+trees + +If an inode's block map requires more records than fit into the inode's fork +area, it will use a b+tree to index the records. The nodes and leaves of this +B+tree use the +xfs_btree_lblock+ declaration: + +[source, c] +---- +struct xfs_btree_lblock { + __be32 bb_magic; + __be16 bb_level; + __be16 bb_numrecs; + __be64 bb_leftsib; + __be64 bb_rightsib; + + /* version 5 filesystem fields start here */ + __be64 bb_blkno; + __be64 bb_lsn; + uuid_t bb_uuid; + __be64 bb_owner; + __le32 bb_crc; + __be32 bb_pad; +}; +---- + +*bb_magic*:: +Specifies the magic number for the BMBT block: ``BMAP'' (0x424d4150). +On a v5 filesystem, this is ``BMA3'' (0x424d4133). + +*bb_level*:: +The level of the tree in which this block is found. If this value is 0, this +is a leaf block and contains records; otherwise, it is a node block and +contains keys and pointers. + +*bb_numrecs*:: +Number of records in this block. + +*bb_leftsib*:: +FS block number of the left sibling of this B+tree node. + +*bb_rightsib*:: +FS block number of the right sibling of this B+tree node. + +*bb_blkno*:: +FS block number of this B+tree block. + +*bb_lsn*:: +Log sequence number of the last write to this block. + +*bb_uuid*:: +The UUID of this block, which must match either +sb_uuid+ or +sb_meta_uuid+ +depending on which features are set. + +*bb_owner*:: +The AG number that this B+tree block ought to be in. + +*bb_crc*:: +Checksum of the B+tree block. + +*bb_pad*:: +Pads the structure to 64 bytes. + +// force-split the lists + +* Long format b+trees are rooted in an inode, not a separate block. + diff --git a/design/XFS_Filesystem_Structure/data_extents.asciidoc b/design/XFS_Filesystem_Structure/data_extents.asciidoc index a39045d..530406d 100644 --- a/design/XFS_Filesystem_Structure/data_extents.asciidoc +++ b/design/XFS_Filesystem_Structure/data_extents.asciidoc @@ -203,9 +203,10 @@ u.bmx[0-1] = [startoff,startblock,blockcount,extentflag] [[Btree_Extent_List]] == B+tree Extent List -To manage extent maps that cannot fit in the inode fork area, XFS uses long -format B+trees. The root node of the B+tree is stored in the inode's data -fork. All block pointers for extent B+trees are 64-bit absolute block numbers. +To manage extent maps that cannot fit in the inode fork area, XFS uses +xref:Long_Format_Btrees[long format B+trees]. The root node of the B+tree is +stored in the inode's data fork. All block pointers for extent B+trees are +64-bit absolute block numbers. For a single level B+tree, the root node points to the B+tree's leaves. Each leaf occupies one filesystem block and contains a header and an array of extents @@ -242,70 +243,6 @@ standard 256 byte inode before a new level of nodes is added between the root and the leaves. This will be less if +di_forkoff+ is not zero (i.e. attributes are in use on the inode). -[[Long_Format_Btrees]] -=== Long Format B+trees - -The subsequent nodes and leaves of the B+tree use the +xfs_btree_lblock+ -declaration: - -[source, c] ----- -struct xfs_btree_lblock { - __be32 bb_magic; - __be16 bb_level; - __be16 bb_numrecs; - __be64 bb_leftsib; - __be64 bb_rightsib; - - /* version 5 filesystem fields start here */ - __be64 bb_blkno; - __be64 bb_lsn; - uuid_t bb_uuid; - __be64 bb_owner; - __le32 bb_crc; - __be32 bb_pad; -}; ----- - -*bb_magic*:: -Specifies the magic number for the BMBT block: ``BMAP'' (0x424d4150). -On a v5 filesystem, this is ``BMA3'' (0x424d4133). - -*bb_level*:: -The level of the tree in which this block is found. If this value is 0, this -is a leaf block and contains records; otherwise, it is a node block and -contains keys and pointers. - -*bb_numrecs*:: -Number of records in this block. - -*bb_leftsib*:: -FS block number of the left sibling of this B+tree node. - -*bb_rightsib*:: -FS block number of the right sibling of this B+tree node. - -*bb_blkno*:: -FS block number of this B+tree block. - -*bb_lsn*:: -Log sequence number of the last write to this block. - -*bb_uuid*:: -The UUID of this block, which must match either +sb_uuid+ or +sb_meta_uuid+ -depending on which features are set. - -*bb_owner*:: -The AG number that this B+tree block ought to be in. - -*bb_crc*:: -Checksum of the B+tree block. - -*bb_pad*:: -Pads the structure to 64 bytes. - -// force-split the lists - * For intermediate nodes, the data following +xfs_btree_lblock+ is the same as the root node: array of +xfs_bmbt_key+ value followed by an array of +xfs_bmbt_ptr_t+ values that starts halfway through the block (offset 0x808 for diff --git a/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc b/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc index f580aab..62502b3 100644 --- a/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc +++ b/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc @@ -62,6 +62,8 @@ Global Structures :leveloffset: 1 +include::btrees.asciidoc[] + include::allocation_groups.asciidoc[] include::journaling_log.asciidoc[] From darrick.wong@oracle.com Fri Mar 4 18:36:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 255617CBB for ; Fri, 4 Mar 2016 18:36:07 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7F0B5AC001 for ; Fri, 4 Mar 2016 16:36:06 -0800 (PST) X-ASG-Debug-ID: 1457138163-04cbb00b701c66b0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id N5So2OuwVLPApfja (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 16:36:03 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u250ZYqC010046 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 5 Mar 2016 00:35:36 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u250ZYaG009279 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 5 Mar 2016 00:35:34 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u250ZXK1025282; Sat, 5 Mar 2016 00:35:34 GMT Received: from localhost (/10.159.166.81) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 04 Mar 2016 16:35:33 -0800 Subject: [PATCH 4/6] xfsdocs: reverse-mapping btree documentation From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 4/6] xfsdocs: reverse-mapping btree documentation To: hch@infradead.org, david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Fri, 04 Mar 2016 16:35:30 -0800 Message-ID: <20160305003530.28327.97522.stgit@birch.djwong.org> In-Reply-To: <20160305003505.28327.95288.stgit@birch.djwong.org> References: <20160305003505.28327.95288.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1457138163 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC5_SA210e, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27587 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.00 BSF_SC5_SA210e Custom Rule SA210e Add chapters on the operation of the reverse mapping btree and future things we could do with rmap data. v2: Add magic number to the table. Signed-off-by: Darrick J. Wong --- .../allocation_groups.asciidoc | 24 +- design/XFS_Filesystem_Structure/docinfo.xml | 14 + design/XFS_Filesystem_Structure/magic.asciidoc | 1 .../reconstruction.asciidoc | 53 +++++ design/XFS_Filesystem_Structure/rmapbt.asciidoc | 223 ++++++++++++++++++++ .../xfs_filesystem_structure.asciidoc | 4 6 files changed, 311 insertions(+), 8 deletions(-) create mode 100644 design/XFS_Filesystem_Structure/reconstruction.asciidoc create mode 100644 design/XFS_Filesystem_Structure/rmapbt.asciidoc diff --git a/design/XFS_Filesystem_Structure/allocation_groups.asciidoc b/design/XFS_Filesystem_Structure/allocation_groups.asciidoc index 8656636..bd2db5c 100644 --- a/design/XFS_Filesystem_Structure/allocation_groups.asciidoc +++ b/design/XFS_Filesystem_Structure/allocation_groups.asciidoc @@ -12,6 +12,7 @@ Each AG has the following characteristics: * A super block describing overall filesystem info * Free space management * Inode allocation and tracking + * Reverse block-mapping index (optional) Having multiple AGs allows XFS to handle most operations in parallel without degrading performance as the number of concurrent accesses increases. @@ -379,6 +380,12 @@ it doesn't understand the flag. Free inode B+tree. Each allocation group contains a B+tree to track inode chunks containing free inodes. This is a performance optimization to reduce the time required to allocate inodes. + +| +XFS_SB_FEAT_RO_COMPAT_RMAPBT+ | +Reverse mapping B+tree. Each allocation group contains a B+tree containing +records mapping AG blocks to their owners. See the section about +xref:Reconstruction[reconstruction] for more details. + |===== *sb_features_incompat*:: @@ -529,9 +536,7 @@ struct xfs_agf { __be32 agf_seqno; __be32 agf_length; __be32 agf_roots[XFS_BTNUM_AGF]; - __be32 agf_spare0; __be32 agf_levels[XFS_BTNUM_AGF]; - __be32 agf_spare1; __be32 agf_flfirst; __be32 agf_fllast; __be32 agf_flcount; @@ -550,9 +555,10 @@ struct xfs_agf { }; ---- -The rest of the bytes in the sector are zeroed. +XFS_BTNUM_AGF+ is set to 2: -index 0 for the free space B+tree indexed by block number; and index 1 for the -free space B+tree indexed by extent size. +The rest of the bytes in the sector are zeroed. +XFS_BTNUM_AGF+ is set to 3: +index 0 for the free space B+tree indexed by block number; index 1 for the free +space B+tree indexed by extent size; and index 2 for the reverse-mapping +B+tree. *agf_magicnum*:: Specifies the magic number for the AGF sector: ``XAGF'' (0x58414746). @@ -570,11 +576,13 @@ this could be less than the +sb_agblocks+ value. It is this value that should be used to determine the size of the AG. *agf_roots*:: -Specifies the block number for the root of the two free space B+trees. +Specifies the block number for the root of the two free space B+trees and the +reverse-mapping B+tree, if enabled. *agf_levels*:: -Specifies the level or depth of the two free space B+trees. For a fresh AG, this -will be one, and the ``roots'' will point to a single leaf of level 0. +Specifies the level or depth of the two free space B+trees and the +reverse-mapping B+tree, if enabled. For a fresh AG, this value will be one, +and the ``roots'' will point to a single leaf of level 0. *agf_flfirst*:: Specifies the index of the first ``free list'' block. Free lists are covered in diff --git a/design/XFS_Filesystem_Structure/docinfo.xml b/design/XFS_Filesystem_Structure/docinfo.xml index cc5596d..ff3818a 100644 --- a/design/XFS_Filesystem_Structure/docinfo.xml +++ b/design/XFS_Filesystem_Structure/docinfo.xml @@ -122,4 +122,18 @@ + + 3.141 + January 2016 + + Darrick + Wong + + + + + Document the reverse-mapping btree. + + + diff --git a/design/XFS_Filesystem_Structure/magic.asciidoc b/design/XFS_Filesystem_Structure/magic.asciidoc index 301cfa0..c3d0341 100644 --- a/design/XFS_Filesystem_Structure/magic.asciidoc +++ b/design/XFS_Filesystem_Structure/magic.asciidoc @@ -44,6 +44,7 @@ relevant chapters. Magic numbers tend to have consistent locations: | +XFS_ATTR_LEAF_MAGIC+ | 0xfbee | | xref:Leaf_Attributes[Leaf Attribute] | +XFS_ATTR3_LEAF_MAGIC+ | 0x3bee | | xref:Leaf_Attributes[Leaf Attribute], v5 only | +XFS_ATTR3_RMT_MAGIC+ | 0x5841524d | XARM | xref:Remote_Values[Remote Attribute Value], v5 only +| +XFS_RMAP_CRC_MAGIC+ | 0x524d4233 | RMB3 | xref:Reverse_Mapping_Btree[Reverse Mapping B+tree], v5 only |===== The magic numbers for log items are at offset zero in each log item, but items diff --git a/design/XFS_Filesystem_Structure/reconstruction.asciidoc b/design/XFS_Filesystem_Structure/reconstruction.asciidoc new file mode 100644 index 0000000..f172e0f --- /dev/null +++ b/design/XFS_Filesystem_Structure/reconstruction.asciidoc @@ -0,0 +1,53 @@ +[[Reconstruction]] += Metadata Reconstruction + +[NOTE] +This is a theoretical discussion of how reconstruction could work; none of this +is implemented as of 2015. + +A simple UNIX filesystem can be thought of in terms of a directed acyclic graph. +To a first approximation, there exists a root directory node, which points to +other nodes. Those other nodes can themselves be directories or they can be +files. Each file, in turn, points to data blocks. + +XFS adds a few more details to this picture: + +* The real root(s) of an XFS filesystem are the allocation group headers +(superblock, AGF, AGI, AGFL). +* Each allocation group’s headers point to various per-AG B+trees (free space, +inode, free inodes, free list, etc.) +* The free space B+trees point to unused extents; +* The inode B+trees point to blocks containing inode chunks; +* All superblocks point to the root directory and the log; +* Hardlinks mean that multiple directories can point to a single file node; +* File data block pointers are indexed by file offset; +* Files and directories can have a second collection of pointers to data blocks +which contain extended attributes; +* Large directories require multiple data blocks to store all the subpointers; +* Still larger directories use high-offset data blocks to store a B+tree of +hashes to directory entries; +* Large extended attribute forks similarly use high-offset data blocks to store +a B+tree of hashes to attribute keys; and +* Symbolic links can point to data blocks. + +The beauty of this massive graph structure is that under normal circumstances, +everything known to the filesystem is discoverable (access controls +notwithstanding) from the root. The major weakness of this structure of course +is that breaking a edge in the graph can render entire subtrees inaccessible. ++xfs_repair+ “recovers†from broken directories by scanning for unlinked inodes +and connecting them to +/lost+found+, but this isn’t sufficiently general to +recover from breaks in other parts of the graph structure. Wouldn’t it be +useful to have back pointers as a secondary data structure? The current repair +strategy is to reconstruct whatever can be rebuilt, but to scrap anything that +doesn't check out. + +The xref:Reverse_Mapping_Btree[reverse-mapping B+tree] fills in part of the +puzzle. Since it contains copies of every entry in each inode’s data and +attribute forks, we can fix a corrupted block map with these records. +Furthermore, if the inode B+trees become corrupt, it is possible to visit all +inode chunks using the reverse-mapping data. Should XFS ever gain the ability +to store parent directory information in each inode, it also becomes possible +to resurrect damaged directory trees, which should reduce the complaints about +inodes ending up in +/lost+found+. Everything else in the per-AG primary +metadata can already be reconstructed via +xfs_repair+. Hopefully, +reconstruction will not turn out to be a fool's errand. diff --git a/design/XFS_Filesystem_Structure/rmapbt.asciidoc b/design/XFS_Filesystem_Structure/rmapbt.asciidoc new file mode 100644 index 0000000..f05f2df --- /dev/null +++ b/design/XFS_Filesystem_Structure/rmapbt.asciidoc @@ -0,0 +1,223 @@ +[[Reverse_Mapping_Btree]] +== Reverse-Mapping B+tree + +[NOTE] +This data structure is under construction! Details may change. + +If the feature is enabled, each allocation group has its own reverse +block-mapping B+tree, which grows in the free space like the free space +B+trees. As mentioned in the chapter about +xref:Reconstruction[reconstruction], this data structure is another piece of +the puzzle necessary to reconstruct the data or attribute fork of a file from +reverse-mapping records; we can also use it to double-check allocations to +ensure that we are not accidentally cross-linking blocks, which can cause +severe damage to the filesystem. + +This B+tree is only present if the +XFS_SB_FEAT_RO_COMPAT_RMAPBT+ +feature is enabled. The feature requires a version 5 filesystem. + +Each record in the reverse-mapping B+tree has the following structure: + +[source, c] +---- +struct xfs_rmap_rec { + __be32 rm_startblock; + __be32 rm_unwritten:1; + __be32 rm_blockcount:31; + __be64 rm_owner; + __be64 rm_fork:1; + __be64 rm_bmbt:1; + __be64 rm_offset:62; +}; +---- + +*rm_startblock*:: +AG block number of this record. + +*rm_unwritten*:: +A flag indicating that the extent is unwritten. This corresponds to the flag in +the xref:Data_Extents[extent record] format which means +XFS_EXT_UNWRITTEN+. + +*rm_blockcount*:: +The length of this extent. + +*rm_owner*:: +A 64-bit number describing the owner of this extent. This is typically the +absolute inode number, but can also correspond to one of the following: + +.Special owner values +[options="header"] +|===== +| Value | Description +| +XFS_RMAP_OWN_NULL+ | No owner. This should never appear on disk. +| +XFS_RMAP_OWN_UNKNOWN+ | Unknown owner; for EFI recovery. This should never appear on disk. +| +XFS_RMAP_OWN_FS+ | Allocation group headers +| +XFS_RMAP_OWN_LOG+ | XFS log blocks +| +XFS_RMAP_OWN_AG+ | Per-allocation group B+tree blocks. This means free space B+tree blocks, blocks on the freelist, and reverse-mapping B+tree blocks. +| +XFS_RMAP_OWN_INOBT+ | Per-allocation group inode B+tree blocks. This includes free inode B+tree blocks. +| +XFS_RMAP_OWN_INODES+ | Inode chunks +| +XFS_RMAP_OWN_REFC+ | Per-allocation group refcount B+tree blocks. This will be used for reflink support. +|===== + +*rm_fork*:: +If +rm_owner+ describes an inode, this can be 1 if this record is for an +attribute fork. + +*rm_bmbt*:: +If +rm_owner+ describes an inode, this can be 1 to signify that this record is +for a block map B+tree block. In this case, +rm_offset+ has no meaning. + +*rm_offset*:: +The 62-bit logical file block offset, if +rm_owner+ describes an inode. +Meaningless otherwise. + +[NOTE] +The single-bit flag values +rm_unwritten+, +rm_fork+, and +rm_bmbt+ are packed +into the larger fields in the C structure definition. + +[NOTE] +For the moment, there is a requirement that all records in the data or +attribute forks must match exactly with the corresponding entry in the +reverse-mapping B+tree. This may be lifted in future versions of the patchset. + +For the reverse-mapping B+tree, the key definition is larger than the usual AG +block number. On a classic XFS filesystem, each block has only one owner, which +means that +rm_startblock+ is sufficient to uniquely identify each record. +However, shared block support (reflink) on XFS breaks that assumption; now +filesystem blocks can be linked to any logical block offset of any file inode. +Therefore, the key must include the owner and offset information to preserve the +1 to 1 relation between key and record. The key has the following structure: + +[source, c] +---- +struct xfs_rmap_key { + __be32 rm_startblock; + __be64 rm_owner; + __be64 rm_fork:1; + __be64 rm_bmbt:1; + __be64 rm_offset:62; +}; +---- + +* As the reference counting is AG relative, all the block numbers are only +32-bits. +* The +bb_magic+ value is "RMB3" (0x524d4233). +* The +xfs_btree_sblock_t+ header is used for intermediate B+tree node as well +as the leaves. + +=== xfs_db rmapbt Example + +This example shows a reverse-mapping B+tree from a freshly formatted root +filesystem: + +---- +xfs_db> agi 0 +xfs_db> addr rmaproot +xfs_db> p +magic = 0x524d4233 +level = 1 +numrecs = 43 +leftsib = null +rightsib = null +bno = 56 +lsn = 0x3000004c8 +uuid = 1977221d-8345-464e-b1f4-aa2ea36895f4 +owner = 0 +crc = 0x7cf8be6f (correct) +keys[1-43] = [startblock,owner,offset] + 1:[0,-3,0] 2:[417,285,0] 3:[829,499,0] 4:[1292,710,0] 5:[32215,-5,0] + 6:[34083,1161,0] 7:[34896,256191,0] + ... + 41:[50998,326734,0] 42:[51431,327010,0] 43:[51611,327112,0] +ptrs[1-43] = 1:5 2:6 3:8 4:9 5:10 6:11 7:418 ... 41:46377 42:48784 43:49522 +xfs_db> addr ptrs[17] +xfs_db> p +magic = 0x524d4233 +level = 0 +numrecs = 168 +leftsib = 36284 +rightsib = 37617 +bno = 294760 +lsn = 0x200002761 +uuid = 1977221d-8345-464e-b1f4-aa2ea36895f4 +owner = 0 +crc = 0x2dad3fbe (correct) +recs[1-168] = [startblock,blockcount,owner,offset,extentflag,attrfork,bmbtblock] + 1:[40326,1,259615,0,0,0,0] 2:[40327,1,-5,0,0,0,0] + 3:[40328,2,259618,0,0,0,0] 4:[40330,1,259619,0,0,0,0] + ... + 127:[40540,1,324266,0,0,0,0] 128:[40541,1,324266,8388608,0,0,0] + 129:[40542,2,324266,1,0,0,0] 130:[40544,32,-7,0,0,0,0] +---- + +Several interesting things pop out here. The first record shows that inode +259,615 has mapped AG block 40,326 at offset 0. We confirm this by looking at +the block map for that inode: + +---- +xfs_db> inode 259615 +xfs_db> bmap +data offset 0 startblock 40326 (0/40326) count 1 flag 0 +---- + +Next, notice records 127 and 128, which describe neighboring AG blocks that are +mapped to non-contiguous logical blocks in inode 324,266. Given the logical +offset of 8,388,608 we surmise that this is a leaf directory, but let us +confirm: + +---- +xfs_db> inode 324266 +xfs_db> p core.mode +core.mode = 040755 +xfs_db> bmap +data offset 0 startblock 40540 (0/40540) count 1 flag 0 +data offset 1 startblock 40542 (0/40542) count 2 flag 0 +data offset 3 startblock 40576 (0/40576) count 1 flag 0 +data offset 8388608 startblock 40541 (0/40541) count 1 flag 0 +xfs_db> p core.mode +core.mode = 0100644 +xfs_db> dblock 0 +xfs_db> p dhdr.hdr.magic +dhdr.hdr.magic = 0x58444433 +xfs_db> dblock 8388608 +xfs_db> p lhdr.info.hdr.magic +lhdr.info.hdr.magic = 0x3df1 +---- + +Indeed, this inode 324,266 appears to be a leaf directory, as it has regular +directory data blocks at low offsets, and a single leaf block. + +Notice further the two reverse-mapping records with negative owners. An owner +of -7 corresponds to +XFS_RMAP_OWN_INODES+, which is an inode chunk, and an +owner code of -5 corresponds to +XFS_RMAP_OWN_AG+, which covers free space +B+trees and free space. Let's see if block 40,544 is part of an inode chunk: + +---- +xfs_db> blockget +xfs_db> fsblock 40544 +xfs_db> blockuse +block 40544 (0/40544) type inode +xfs_db> stack +1: + byte offset 166068224, length 4096 + buffer block 324352 (fsbno 40544), 8 bbs + inode 324266, dir inode 324266, type data +xfs_db> type inode +xfs_db> p +core.magic = 0x494e +---- + +Our suspicions are confirmed. Let's also see if 40,327 is part of a free space +tree: + +---- +xfs_db> fsblock 40327 +xfs_db> blockuse +block 40327 (0/40327) type btrmap +xfs_db> type rmapbt +xfs_db> p +magic = 0x524d4233 +---- + +As you can see, the reverse block-mapping B+tree is an important secondary +metadata structure, which can be used to reconstruct damaged primary metadata. diff --git a/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc b/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc index 62502b3..1b8658d 100644 --- a/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc +++ b/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc @@ -48,6 +48,8 @@ include::overview.asciidoc[] include::metadata_integrity.asciidoc[] +include::reconstruction.asciidoc[] + include::common_types.asciidoc[] include::magic.asciidoc[] @@ -66,6 +68,8 @@ include::btrees.asciidoc[] include::allocation_groups.asciidoc[] +include::rmapbt.asciidoc[] + include::journaling_log.asciidoc[] include::internal_inodes.asciidoc[] From darrick.wong@oracle.com Fri Mar 4 18:36:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7E8EF7CB7 for ; Fri, 4 Mar 2016 18:36:11 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 26FA88F8033 for ; Fri, 4 Mar 2016 16:36:11 -0800 (PST) X-ASG-Debug-ID: 1457138167-04bdf002ee1baac0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id kMLRjUGW0CBBsZA1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 16:36:08 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u250ZfCJ017319 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 5 Mar 2016 00:35:41 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u250Zess029619 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 5 Mar 2016 00:35:41 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u250ZenM025292; Sat, 5 Mar 2016 00:35:40 GMT Received: from localhost (/10.159.166.81) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 04 Mar 2016 16:35:39 -0800 Subject: [PATCH 5/6] xfsdocs: document refcount btree and reflink From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 5/6] xfsdocs: document refcount btree and reflink To: hch@infradead.org, david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Fri, 04 Mar 2016 16:35:38 -0800 Message-ID: <20160305003538.28327.18120.stgit@birch.djwong.org> In-Reply-To: <20160305003505.28327.95288.stgit@birch.djwong.org> References: <20160305003505.28327.95288.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1457138168 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/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=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27587 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Document the reference count btree and talk a little bit about how the reflink feature uses it. Signed-off-by: Darrick J. Wong --- .../allocation_groups.asciidoc | 20 ++- .../XFS_Filesystem_Structure/directories.asciidoc | 1 design/XFS_Filesystem_Structure/docinfo.xml | 2 design/XFS_Filesystem_Structure/magic.asciidoc | 1 .../XFS_Filesystem_Structure/ondisk_inode.asciidoc | 25 +++ .../XFS_Filesystem_Structure/refcountbt.asciidoc | 145 ++++++++++++++++++++ design/XFS_Filesystem_Structure/reflink.asciidoc | 40 ++++++ design/XFS_Filesystem_Structure/rmapbt.asciidoc | 1 .../xfs_filesystem_structure.asciidoc | 4 + 9 files changed, 234 insertions(+), 5 deletions(-) create mode 100644 design/XFS_Filesystem_Structure/refcountbt.asciidoc create mode 100644 design/XFS_Filesystem_Structure/reflink.asciidoc diff --git a/design/XFS_Filesystem_Structure/allocation_groups.asciidoc b/design/XFS_Filesystem_Structure/allocation_groups.asciidoc index bd2db5c..a6ce76a 100644 --- a/design/XFS_Filesystem_Structure/allocation_groups.asciidoc +++ b/design/XFS_Filesystem_Structure/allocation_groups.asciidoc @@ -13,6 +13,7 @@ Each AG has the following characteristics: * Free space management * Inode allocation and tracking * Reverse block-mapping index (optional) + * Data block reference count index (optional) Having multiple AGs allows XFS to handle most operations in parallel without degrading performance as the number of concurrent accesses increases. @@ -386,6 +387,12 @@ Reverse mapping B+tree. Each allocation group contains a B+tree containing records mapping AG blocks to their owners. See the section about xref:Reconstruction[reconstruction] for more details. +| +XFS_SB_FEAT_RO_COMPAT_REFLINK+ | +Reference count B+tree. Each allocation group contains a B+tree to track the +reference counts of AG blocks. This enables files to share data blocks safely. +See the section about xref:Reflink_Deduplication[reflink and deduplication] for +more details. + |===== *sb_features_incompat*:: @@ -546,7 +553,9 @@ struct xfs_agf { /* version 5 filesystem fields start here */ uuid_t agf_uuid; - __be64 agf_spare64[16]; + __be32 agf_refcount_root; + __be32 agf_refcount_level; + __be64 agf_spare64[15]; /* unlogged fields, written during buffer writeback. */ __be64 agf_lsn; @@ -608,6 +617,12 @@ used if the +XFS_SB_VERSION2_LAZYSBCOUNTBIT+ bit is set in +sb_features2+. The UUID of this block, which must match either +sb_uuid+ or +sb_meta_uuid+ depending on which features are set. +*agf_refcount_root*:: +Block number for the root of the reference count B+tree, if enabled. + +*agf_refcount_root*:: +Depth of the reference count B+tree, if enabled. + *agf_spare64*:: Empty space in the logged part of the AGF sector, for use for future features. @@ -1241,4 +1256,5 @@ By placing the real time device (and the journal) on separate high-performance storage devices, it is possible to reduce most of the unpredictability in I/O response times that come from metadata operations. -None of the XFS per-AG B+trees are involved with real time files. +None of the XFS per-AG B+trees are involved with real time files. It is not +possible for real time files to share data blocks. diff --git a/design/XFS_Filesystem_Structure/directories.asciidoc b/design/XFS_Filesystem_Structure/directories.asciidoc index bccf912..1758c4e 100644 --- a/design/XFS_Filesystem_Structure/directories.asciidoc +++ b/design/XFS_Filesystem_Structure/directories.asciidoc @@ -1419,6 +1419,7 @@ The hash value of a particular record. The directory/attribute logical block containing all entries up to the corresponding hash value. +// * The freeindex's +bests+ array starts from the end of the block and grows to the start of the block. diff --git a/design/XFS_Filesystem_Structure/docinfo.xml b/design/XFS_Filesystem_Structure/docinfo.xml index ff3818a..009376f 100644 --- a/design/XFS_Filesystem_Structure/docinfo.xml +++ b/design/XFS_Filesystem_Structure/docinfo.xml @@ -133,6 +133,8 @@ Document the reverse-mapping btree. + Document the reference-count btree. + Discuss block sharing, reflink, & deduplication. diff --git a/design/XFS_Filesystem_Structure/magic.asciidoc b/design/XFS_Filesystem_Structure/magic.asciidoc index c3d0341..7caf20e 100644 --- a/design/XFS_Filesystem_Structure/magic.asciidoc +++ b/design/XFS_Filesystem_Structure/magic.asciidoc @@ -45,6 +45,7 @@ relevant chapters. Magic numbers tend to have consistent locations: | +XFS_ATTR3_LEAF_MAGIC+ | 0x3bee | | xref:Leaf_Attributes[Leaf Attribute], v5 only | +XFS_ATTR3_RMT_MAGIC+ | 0x5841524d | XARM | xref:Remote_Values[Remote Attribute Value], v5 only | +XFS_RMAP_CRC_MAGIC+ | 0x524d4233 | RMB3 | xref:Reverse_Mapping_Btree[Reverse Mapping B+tree], v5 only +| +XFS_REFC_CRC_MAGIC+ | 0x52334643 | R3FC | xref:Reference_Count_Btree[Reference Count B+tree], v5 only |===== The magic numbers for log items are at offset zero in each log item, but items diff --git a/design/XFS_Filesystem_Structure/ondisk_inode.asciidoc b/design/XFS_Filesystem_Structure/ondisk_inode.asciidoc index f1b0421..737a57b 100644 --- a/design/XFS_Filesystem_Structure/ondisk_inode.asciidoc +++ b/design/XFS_Filesystem_Structure/ondisk_inode.asciidoc @@ -108,7 +108,8 @@ struct xfs_dinode_core { __be64 di_changecount; __be64 di_lsn; __be64 di_flags2; - __u8 di_pad2[16]; + __be32 di_cowextsize; + __u8 di_pad2[12]; xfs_timestamp_t di_crtime; __be64 di_ino; uuid_t di_uuid; @@ -214,7 +215,7 @@ including relevant metadata like B+trees. This does not include blocks used for extended attributes. *di_extsize*:: -Specifies the extent size for filesystems with real-time devices and an extent +Specifies the extent size for filesystems with real-time devices or an extent size hint for standard filesystems. For normal filesystems, and with directories, the +XFS_DIFLAG_EXTSZINHERIT+ flag must be set in +di_flags+ if this field is used. Inodes created in these directories will inherit the @@ -278,7 +279,7 @@ For directory inodes, new inodes inherit the +di_projid+ value. For directory inodes, symlinks cannot be created. | +XFS_DIFLAG_EXTSIZE+ | -Specifies the extent size for real-time files or a and extent size hint for regular files. +Specifies the extent size for real-time files or an extent size hint for regular files. | +XFS_DIFLAG_EXTSZINHERIT+ | For directory inodes, new inodes inherit the +di_extsize+ value. @@ -322,8 +323,26 @@ Specifies extended flags associated with a v3 inode. | +XFS_DIFLAG2_DAX+ | For a file, enable DAX to increase performance on persistent-memory storage. If set on a directory, files created in the directory will inherit this flag. +| +XFS_DIFLAG2_REFLINK+ | +This inode shares (or has shared) data blocks with another inode. +| +XFS_DIFLAG2_COWEXTSIZE+ | +For files, this is the extent size hint for copy on write operations; see ++di_cowextsize+ for details. For directories, the value in +di_cowextsize+ +will be copied to all newly created files and directories. |===== +*di_cowextsize*:: +Specifies the extent size hint for copy on write operations. When allocating +extents for a copy on write operation, the allocator will be asked to align +its allocations to either +di_cowextsize+ blocks or +di_extsize+ blocks, +whichever is greater. The +XFS_DIFLAG2_COWEXTSIZE+ flag must be set if this +field is used. If this field and its flag are set on a directory file, the +value will be copied into any files or directories created within this +directory. During a block sharing operation, this value will be copied from +the source file to the destination file if the sharing operation completely +overwrites the destination file's contents and the destination file does not +already have +di_cowextsize+ set. + *di_pad2*:: Padding for future expansion of the inode. diff --git a/design/XFS_Filesystem_Structure/refcountbt.asciidoc b/design/XFS_Filesystem_Structure/refcountbt.asciidoc new file mode 100644 index 0000000..dbbb98e --- /dev/null +++ b/design/XFS_Filesystem_Structure/refcountbt.asciidoc @@ -0,0 +1,145 @@ +[[Reference_Count_Btree]] +== Reference Count B+tree + +[NOTE] +This data structure is under construction! Details may change. + +To support the sharing of file data blocks (reflink), each allocation group has +its own reference count B+tree, which grows in the allocated space like the +inode B+trees. This data could be gleaned by performing an interval query of +the reverse-mapping B+tree, but doing so would come at a huge performance +penalty. Therefore, this data structure is a cache of computable information. + +This B+tree is only present if the +XFS_SB_FEAT_RO_COMPAT_REFLINK+ +feature is enabled. The feature requires a version 5 filesystem. + +Each record in the reference count B+tree has the following structure: + +[source, c] +---- +struct xfs_refcount_rec { + __be32 rc_startblock; + __be32 rc_blockcount; + __be32 rc_refcount; +}; +---- + +*rc_startblock*:: +AG block number of this record. + +*rc_blockcount*:: +The length of this extent. + +*rc_refcount*:: +Number of mappings of this filesystem extent. + +Node pointers are an AG relative block pointer: + +[source, c] +---- +struct xfs_refcount_key { + __be32 rc_startblock; +}; +---- + +* As the reference counting is AG relative, all the block numbers are only +32-bits. +* The +bb_magic+ value is "R3FC" (0x52334643). +* The +xfs_btree_sblock_t+ header is used for intermediate B+tree node as well +as the leaves. + +=== xfs_db refcntbt Example + +For this example, an XFS filesystem was populated with a root filesystem and +a deduplication program was run to create shared blocks: + +---- +xfs_db> agf 0 +xfs_db> addr refcntroot +xfs_db> p +magic = 0x52334643 +level = 1 +numrecs = 6 +leftsib = null +rightsib = null +bno = 36892 +lsn = 0x200004ec2 +uuid = f1f89746-e00b-49c9-96b3-ecef0f2f14ae +owner = 0 +crc = 0x75f35128 (correct) +keys[1-6] = [startblock] 1:[14] 2:[65633] 3:[65780] 4:[94571] 5:[117201] 6:[152442] +ptrs[1-6] = 1:7 2:25836 3:25835 4:18447 5:18445 6:18449 +xfs_db> addr ptrs[3] +xfs_db> p +magic = 0x52334643 +level = 0 +numrecs = 80 +leftsib = 25836 +rightsib = 18447 +bno = 51670 +lsn = 0x200004ec2 +uuid = f1f89746-e00b-49c9-96b3-ecef0f2f14ae +owner = 0 +crc = 0xc3962813 (correct) +recs[1-80] = [startblock,blockcount,refcount] + 1:[65780,1,2] 2:[65781,1,3] 3:[65785,2,2] 4:[66640,1,2] + 5:[69602,4,2] 6:[72256,16,2] 7:[72871,4,2] 8:[72879,20,2] + 9:[73395,4,2] 10:[75063,4,2] 11:[79093,4,2] 12:[86344,16,2] +---- + +Record 6 in the reference count B+tree for AG 0 indicates that the AG extent +starting at block 72,256 and running for 16 blocks has a reference count of 2. +This means that there are two files sharing the block: + +---- +xfs_db> blockget -n +xfs_db> fsblock 72256 +xfs_db> blockuse +block 72256 (0/72256) type rldata inode 25169197 +---- + +The blockuse type changes to ``rldata'' to indicate that the block is shared +data. Unfortunately, blockuse only tells us about one block owner. If we +happen to have enabled the reverse-mapping B+tree, we can use it to find all +inodes that own this block: + +---- +xfs_db> agf 0 +xfs_db> addr rmaproot +... +xfs_db> addr ptrs[3] +... +xfs_db> addr ptrs[7] +xfs_db> p +magic = 0x524d4233 +level = 0 +numrecs = 22 +leftsib = 65057 +rightsib = 65058 +bno = 291478 +lsn = 0x200004ec2 +uuid = f1f89746-e00b-49c9-96b3-ecef0f2f14ae +owner = 0 +crc = 0xed7da3f7 (correct) +recs[1-22] = [startblock,blockcount,owner,offset,extentflag,attrfork,bmbtblock] + 1:[68957,8,3201,0,0,0,0] 2:[68965,4,25260953,0,0,0,0] + ... + 18:[72232,58,3227,0,0,0,0] 19:[72256,16,25169197,24,0,0,0] + 20:[72290,75,3228,0,0,0,0] 21:[72365,46,3229,0,0,0,0] +---- + +Records 18 and 19 intersect the block 72,256; they tell us that inodes 3,227 +and 25,169,197 both claim ownership. Let us confirm this: + +---- +xfs_db> inode 25169197 +xfs_db> bmap +data offset 0 startblock 12632259 (3/49347) count 24 flag 0 +data offset 24 startblock 72256 (0/72256) count 16 flag 0 +data offset 40 startblock 12632299 (3/49387) count 18 flag 0 +xfs_db> inode 3227 +xfs_db> bmap +data offset 0 startblock 72232 (0/72232) count 58 flag 0 +---- + +Inodes 25,169,197 and 3,227 both contain mappings to block 0/72,256. diff --git a/design/XFS_Filesystem_Structure/reflink.asciidoc b/design/XFS_Filesystem_Structure/reflink.asciidoc new file mode 100644 index 0000000..8f52b90 --- /dev/null +++ b/design/XFS_Filesystem_Structure/reflink.asciidoc @@ -0,0 +1,40 @@ +[[Reflink_Deduplication]] += Sharing Data Blocks + +On a traditional filesystem, there is a 1:1 mapping between a logical block +offset in a file and a physical block on disk, which is to say that physical +blocks are not shared. However, there exist various use cases for being able +to share blocks between files -- deduplicating files saves space on archival +systems; creating space-efficient clones of disk images for virtual machines +and containers facilitates efficient datacenters; and deferring the payment of +the allocation cost of a file system tree copy as long as possible makes +regular work faster. In all of these cases, a write to one of the shared +copies *must* not affect the other shared copies, which means that writes to +shared blocks must employ a copy-on-write strategy. Sharing blocks in this +manner is commonly referred to as ``reflinking''. + +XFS implements block sharing in a fairly straightforward manner. All existing +data fork structures remain unchanged, save for the addition of a +per-allocation group xref:Reference_Count_Btree[reference count B+tree]. This +data structure tracks reference counts for all shared physical blocks, with a +few rules to maintain compatibility with existing code: If a block is free, it +will be tracked in the free space B+trees. If a block is owned by a single +file, it appears in neither the free space nor the reference count B+trees. If +a block is shared, it will appear in the reference count B+tree with a +reference count >= 2. The first two cases are established precedent in XFS, so +the third case is the only behavioral change. + +When a filesystem block is shared, the block mapping in the destination file is +updated to point to that filesystem block and the reference count B+tree records +are updated to reflect the increased refcount. If a shared block is written, a +new block will be allocated, the dirty data written to this new block, and the +file's block mapping updated to point to the new block. If a shared block is +unmapped, the reference count records are updated to reflect the decreased +refcount and the block is also freed if its reference count becomes zero. This +enables users to create space efficient clones of disk images and to copy +filesystem subtrees quickly, using the standard Linux coreutils packages. + +Deduplication employs the same mechanism to share blocks and copy them at write +time. However, the kernel confirms that the contents of both files are +identical before updating the destination file's mapping. This enables XFS to +be used by userspace deduplication programs such as +duperemove+. diff --git a/design/XFS_Filesystem_Structure/rmapbt.asciidoc b/design/XFS_Filesystem_Structure/rmapbt.asciidoc index f05f2df..2be28fa 100644 --- a/design/XFS_Filesystem_Structure/rmapbt.asciidoc +++ b/design/XFS_Filesystem_Structure/rmapbt.asciidoc @@ -57,6 +57,7 @@ absolute inode number, but can also correspond to one of the following: | +XFS_RMAP_OWN_INOBT+ | Per-allocation group inode B+tree blocks. This includes free inode B+tree blocks. | +XFS_RMAP_OWN_INODES+ | Inode chunks | +XFS_RMAP_OWN_REFC+ | Per-allocation group refcount B+tree blocks. This will be used for reflink support. +| +XFS_RMAP_OWN_COW+ | Blocks that have been reserved for a copy-on-write operation that has not completed. |===== *rm_fork*:: diff --git a/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc b/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc index 1b8658d..7916fbe 100644 --- a/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc +++ b/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc @@ -48,6 +48,8 @@ include::overview.asciidoc[] include::metadata_integrity.asciidoc[] +include::reflink.asciidoc[] + include::reconstruction.asciidoc[] include::common_types.asciidoc[] @@ -70,6 +72,8 @@ include::allocation_groups.asciidoc[] include::rmapbt.asciidoc[] +include::refcountbt.asciidoc[] + include::journaling_log.asciidoc[] include::internal_inodes.asciidoc[] From darrick.wong@oracle.com Fri Mar 4 18:36:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BD21F7CB7 for ; Fri, 4 Mar 2016 18:36:25 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 26BAEAC001 for ; Fri, 4 Mar 2016 16:36:25 -0800 (PST) X-ASG-Debug-ID: 1457138176-04cbb00b711c66d0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id V8Qvq7kdnbL69tBh (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 16:36:17 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u250ZqWw017419 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 5 Mar 2016 00:35:52 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u250ZqJE009572 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 5 Mar 2016 00:35:52 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u250ZkcQ006384; Sat, 5 Mar 2016 00:35:52 GMT Received: from localhost (/10.159.166.81) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 04 Mar 2016 16:35:46 -0800 Subject: [PATCH 6/6] xfsdocs: document the extended rmap btree From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 6/6] xfsdocs: document the extended rmap btree To: hch@infradead.org, david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Fri, 04 Mar 2016 16:35:45 -0800 Message-ID: <20160305003545.28327.99480.stgit@birch.djwong.org> In-Reply-To: <20160305003505.28327.95288.stgit@birch.djwong.org> References: <20160305003505.28327.95288.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1457138177 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27587 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines The reverse mapping btree now comes in two flavors: a fat one for reflink filesystems supporting overlapped interval queries and a thin one for filesystems that don't share blocks. Document the new on-disk formats. Signed-off-by: Darrick J. Wong --- design/XFS_Filesystem_Structure/docinfo.xml | 16 +++ design/XFS_Filesystem_Structure/magic.asciidoc | 1 design/XFS_Filesystem_Structure/rmapbt.asciidoc | 108 +++++++++++++++++++++-- 3 files changed, 116 insertions(+), 9 deletions(-) diff --git a/design/XFS_Filesystem_Structure/docinfo.xml b/design/XFS_Filesystem_Structure/docinfo.xml index 009376f..7d32260 100644 --- a/design/XFS_Filesystem_Structure/docinfo.xml +++ b/design/XFS_Filesystem_Structure/docinfo.xml @@ -138,4 +138,20 @@ + + 3.1415 + March 2016 + + Darrick + Wong + + + + + Move the b+tree discussion to a separate chapter. + Discuss overlapping interval b+trees. + Document the reverse mapping btree changes when reflink is enabled. + + + diff --git a/design/XFS_Filesystem_Structure/magic.asciidoc b/design/XFS_Filesystem_Structure/magic.asciidoc index 7caf20e..5ce19a5 100644 --- a/design/XFS_Filesystem_Structure/magic.asciidoc +++ b/design/XFS_Filesystem_Structure/magic.asciidoc @@ -45,6 +45,7 @@ relevant chapters. Magic numbers tend to have consistent locations: | +XFS_ATTR3_LEAF_MAGIC+ | 0x3bee | | xref:Leaf_Attributes[Leaf Attribute], v5 only | +XFS_ATTR3_RMT_MAGIC+ | 0x5841524d | XARM | xref:Remote_Values[Remote Attribute Value], v5 only | +XFS_RMAP_CRC_MAGIC+ | 0x524d4233 | RMB3 | xref:Reverse_Mapping_Btree[Reverse Mapping B+tree], v5 only +| +XFS_RMAPX_CRC_MAGIC+ | 0x34524d42 | 4RMB | xref:Reverse_Mapping_Btree[Reverse Mapping B+tree], v5 only | +XFS_REFC_CRC_MAGIC+ | 0x52334643 | R3FC | xref:Reference_Count_Btree[Reference Count B+tree], v5 only |===== diff --git a/design/XFS_Filesystem_Structure/rmapbt.asciidoc b/design/XFS_Filesystem_Structure/rmapbt.asciidoc index 2be28fa..bfdc74e 100644 --- a/design/XFS_Filesystem_Structure/rmapbt.asciidoc +++ b/design/XFS_Filesystem_Structure/rmapbt.asciidoc @@ -81,18 +81,40 @@ For the moment, there is a requirement that all records in the data or attribute forks must match exactly with the corresponding entry in the reverse-mapping B+tree. This may be lifted in future versions of the patchset. -For the reverse-mapping B+tree, the key definition is larger than the usual AG -block number. On a classic XFS filesystem, each block has only one owner, which -means that +rm_startblock+ is sufficient to uniquely identify each record. -However, shared block support (reflink) on XFS breaks that assumption; now -filesystem blocks can be linked to any logical block offset of any file inode. -Therefore, the key must include the owner and offset information to preserve the -1 to 1 relation between key and record. The key has the following structure: +=== Reverse Mapping B+tree without Shared Blocks + +For the reverse-mapping B+tree on a filesystem that does not support sharing +file data blocks, we can uniquely identify each record using only the per-AG +block number. The key has the following structure: [source, c] ---- struct xfs_rmap_key { __be32 rm_startblock; +}; +---- + +* As the reference counting is AG relative, all the block numbers are only +32-bits. +* The +bb_magic+ value is "RMB3" (0x524d4233). +* The +xfs_btree_sblock_t+ header is used for intermediate B+tree node as well +as the leaves. + +=== Reverse Mapping B+tree with Shared Blocks + +For the reverse-mapping B+tree on a filesystem that supports sharing of file +data blocks, the key definition is larger than the usual AG block number. On a +classic XFS filesystem, each block has only one owner, which means that ++rm_startblock+ is sufficient to uniquely identify each record. However, +shared block support (reflink) on XFS breaks that assumption; now filesystem +blocks can be linked to any logical block offset of any file inode. Therefore, +the key must include the owner and offset information to preserve the 1 to 1 +relation between key and record. The key has the following structure: + +[source, c] +---- +struct xfs_rmapx_key { + __be32 rm_startblock; __be64 rm_owner; __be64 rm_fork:1; __be64 rm_bmbt:1; @@ -102,9 +124,17 @@ struct xfs_rmap_key { * As the reference counting is AG relative, all the block numbers are only 32-bits. -* The +bb_magic+ value is "RMB3" (0x524d4233). +* The +bb_magic+ value is "4RMB" (0x34524d42). * The +xfs_btree_sblock_t+ header is used for intermediate B+tree node as well as the leaves. +* Each pointer is associated with two keys. The first of these is the "low +key", which is the key of the smallest record accessible through the pointer. +This low key has the same meaning as the key in all other btrees. The second +key is the high key, which is the maximum of the largest key that can be used +to access a given record underneath the pointer. Recall that each record +in the reverse mapping b+tree describes an interval of physical blocks mapped +to an interval of logical file block offsets; therefore, it makes sense that +a range of keys can be used to find to a record. === xfs_db rmapbt Example @@ -112,7 +142,7 @@ This example shows a reverse-mapping B+tree from a freshly formatted root filesystem: ---- -xfs_db> agi 0 +xfs_db> agf 0 xfs_db> addr rmaproot xfs_db> p magic = 0x524d4233 @@ -222,3 +252,63 @@ magic = 0x524d4233 As you can see, the reverse block-mapping B+tree is an important secondary metadata structure, which can be used to reconstruct damaged primary metadata. +Now let's look at an extend rmap btree: + +---- +xfs_db> agf 0 +xfs_db> addr rmaproot +xfs_db> p +magic = 0x34524d42 +level = 1 +numrecs = 5 +leftsib = null +rightsib = null +bno = 6368 +lsn = 0x100000d1b +uuid = 400f0928-6b88-4c37-af1e-cef1f8911f3f +owner = 0 +crc = 0x8d4ace05 (correct) +keys[1-5] = [startblock,owner,offset,attrfork,bmbtblock,startblock_hi,owner_hi,offset_hi,attrfork_hi,bmbtblock_hi] +1:[0,-3,0,0,0,705,132,681,0,0] +2:[24,5761,0,0,0,548,5761,524,0,0] +3:[24,5929,0,0,0,380,5929,356,0,0] +4:[24,6097,0,0,0,212,6097,188,0,0] +5:[24,6277,0,0,0,807,-7,0,0,0] +ptrs[1-5] = 1:5 2:771 3:9 4:10 5:11 +---- + +The second pointer stores both the low key [24,5761,0,0,0] and the high key +[548,5761,524,0,0], which means that we can expect block 771 to contain records +starting at physical block 24, inode 5761, offset zero; and that one of the +records can be used to find a reverse mapping for physical block 548, inode +5761, and offset 524: + +---- +xfs_db> addr ptrs[2] +xfs_db> p +magic = 0x34524d42 +level = 0 +numrecs = 168 +leftsib = 5 +rightsib = 9 +bno = 6168 +lsn = 0x100000d1b +uuid = 400f0928-6b88-4c37-af1e-cef1f8911f3f +owner = 0 +crc = 0xd58eff0e (correct) +recs[1-168] = [startblock,blockcount,owner,offset,extentflag,attrfork,bmbtblock] +1:[24,525,5761,0,0,0,0] +2:[24,524,5762,0,0,0,0] +3:[24,523,5763,0,0,0,0] +... +166:[24,360,5926,0,0,0,0] +167:[24,359,5927,0,0,0,0] +168:[24,358,5928,0,0,0,0] +---- + +Observe that the first record in the block starts at physical block 24, inode +5761, offset zero, just as we expected. Note that this first record is also +indexed by the highest key as provided in the node block; physical block 548, +inode 5761, offset 524 is the very last block mapped by this record. Furthermore, +note that record 168, despite being the last record in this block, has a lower +maximum key (physical block 382, inode 5928, offset 23) than the first record. From darrick.wong@oracle.com Fri Mar 4 18:37:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D93AB7CA3 for ; Fri, 4 Mar 2016 18:37:29 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 90245304039 for ; Fri, 4 Mar 2016 16:37:26 -0800 (PST) X-ASG-Debug-ID: 1457138244-04bdf002eb1bab40001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id TX1x5ArcxvQOpGHp (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 16:37:25 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u250bKIo018602 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 5 Mar 2016 00:37:20 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u250bJoo031952 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 5 Mar 2016 00:37:20 GMT Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u250bJUN025882; Sat, 5 Mar 2016 00:37:19 GMT Received: from localhost (/10.159.166.81) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 04 Mar 2016 16:37:19 -0800 Subject: [PATCH v5 00/12] xfstests: minor fixes for the reflink/dedupe tests From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH v5 00/12] xfstests: minor fixes for the reflink/dedupe tests To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Fri, 04 Mar 2016 16:37:18 -0800 Message-ID: <20160305003717.28738.98818.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1457138244 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27587 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines This is a patch set for xfstests, associated with the fifth revision to a patch series adding reverse mapping and reflink to XFS. Patches 1, 3-9, and 11 are bug fixes to existing reflink tests. Patches 2 and 10 add a few more XFS-specific reflink tests to ensure that we get the CoW and metadata reservation accounting correct. Patch 12 adds tests for the new block device fallocate call; don't bother merging it unless the corresponding kernel patches aren't shouted down after a reasonable amount of time. Comments and questions are, as always, welcome. The fixes are available on github[1]. --D [1] https://github.com/djwong/xfstests/tree/reflink-devel From darrick.wong@oracle.com Fri Mar 4 18:37:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 57D0C7CA3 for ; Fri, 4 Mar 2016 18:37:38 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2BB62304032 for ; Fri, 4 Mar 2016 16:37:38 -0800 (PST) X-ASG-Debug-ID: 1457138256-04cb6c5831192ce0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 6OLU4ecotbZUW93W (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 16:37:37 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u250bWti018678 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Sat, 5 Mar 2016 00:37:32 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u250bVIk024153 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 5 Mar 2016 00:37:32 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u250bPA2006789; Sat, 5 Mar 2016 00:37:31 GMT Received: from localhost (/10.159.166.81) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 04 Mar 2016 16:37:25 -0800 Subject: [PATCH 01/12] xfs/207: fix golden output to match FS_IOC_FSSETXATTR hoist From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 01/12] xfs/207: fix golden output to match FS_IOC_FSSETXATTR hoist To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Fri, 04 Mar 2016 16:37:24 -0800 Message-ID: <20160305003724.28738.94718.stgit@birch.djwong.org> In-Reply-To: <20160305003717.28738.98818.stgit@birch.djwong.org> References: <20160305003717.28738.98818.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1457138256 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27587 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Signed-off-by: Darrick J. Wong --- tests/xfs/207.out | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/xfs/207.out b/tests/xfs/207.out index 14eede4..434b8d9 100644 --- a/tests/xfs/207.out +++ b/tests/xfs/207.out @@ -3,7 +3,7 @@ Format and mount Create the original files Set extsz and cowextsz on zero byte file Set extsz and cowextsz on 1Mbyte file -xfs_io: XFS_IOC_FSSETXATTR SCRATCH_MNT/test-207/file2: Invalid argument +xfs_io: FS_IOC_FSSETXATTR SCRATCH_MNT/test-207/file2: Invalid argument Check extsz and cowextsz settings on zero byte file [1048576] SCRATCH_MNT/test-207/file1 [1048576] SCRATCH_MNT/test-207/file1 @@ -11,8 +11,8 @@ Check extsz and cowextsz settings on 1Mbyte file [0] SCRATCH_MNT/test-207/file2 [1048576] SCRATCH_MNT/test-207/file2 Set cowextsize and check flag -fsxattr.xflags = 0x20000 [---------------C] +fsxattr.xflags = 0x20000 [----------------C] [1048576] SCRATCH_MNT/test-207/file3 Unset cowextsize and check flag -fsxattr.xflags = 0x0 [----------------] +fsxattr.xflags = 0x0 [-----------------] [0] SCRATCH_MNT/test-207/file3 From darrick.wong@oracle.com Fri Mar 4 18:37:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9B3BE7CA3 for ; Fri, 4 Mar 2016 18:37:46 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6E869304032 for ; Fri, 4 Mar 2016 16:37:46 -0800 (PST) X-ASG-Debug-ID: 1457138264-04cbb00b6f1c6760001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id qgx3RPgCXFo2U4wa (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 16:37:44 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u250bd7T018886 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Sat, 5 Mar 2016 00:37:40 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u250bd0O024472 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 5 Mar 2016 00:37:39 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u250bcGD005838; Sat, 5 Mar 2016 00:37:39 GMT Received: from localhost (/10.159.166.81) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 04 Mar 2016 16:37:38 -0800 Subject: [PATCH 03/12] reflink: fix fragmentation tests to work on >4k block size filesystems From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 03/12] reflink: fix fragmentation tests to work on >4k block size filesystems To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Fri, 04 Mar 2016 16:37:37 -0800 Message-ID: <20160305003737.28738.35234.stgit@birch.djwong.org> In-Reply-To: <20160305003717.28738.98818.stgit@birch.djwong.org> References: <20160305003717.28738.98818.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1457138264 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27587 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines For tests that only overwrite part of a file, only consider the number of extents in the *rewritten* blocks when deciding if the FS fragmentation performance is satisfactory. (Also slip in a fix for xfs/127 so that it formats correctly when we specify big blocksizes via MKFS_OPTIONS.) Signed-off-by: Darrick J. Wong --- tests/xfs/127 | 2 +- tests/xfs/215 | 2 +- tests/xfs/218 | 2 +- tests/xfs/219 | 2 +- tests/xfs/221 | 2 +- tests/xfs/223 | 2 +- tests/xfs/224 | 2 +- tests/xfs/225 | 2 +- tests/xfs/226 | 2 +- tests/xfs/228 | 2 +- tests/xfs/230 | 2 +- tests/xfs/231 | 2 +- tests/xfs/232 | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/tests/xfs/127 b/tests/xfs/127 index f44daae..6b768c9 100755 --- a/tests/xfs/127 +++ b/tests/xfs/127 @@ -48,7 +48,7 @@ _require_scratch_reflink _require_cp_reflink echo "Format and mount" -_scratch_mkfs -d size=$((2 * 4096 * 4096)) -l size=4194304 > $seqres.full 2>&1 +_scratch_mkfs_sized $((2 * 4096 * 4096)) > $seqres.full 2>&1 _scratch_mount >> $seqres.full 2>&1 testdir=$SCRATCH_MNT/test-$seq diff --git a/tests/xfs/215 b/tests/xfs/215 index 5ae4d85..7a517d7 100755 --- a/tests/xfs/215 +++ b/tests/xfs/215 @@ -95,7 +95,7 @@ new_extents=$(_count_extents $testdir/file3) echo "old extents: $old_extents" >> $seqres.full echo "new extents: $new_extents" >> $seqres.full echo "maximum extents: $internal_blks" >> $seqres.full -test $new_extents -lt $((internal_blks / 20)) || echo "file3 badly fragmented" +test $((new_extents - (nr / 2))) -lt $((internal_blks / 2)) || echo "file3 badly fragmented" # success, all done status=0 diff --git a/tests/xfs/218 b/tests/xfs/218 index ea464f2..0ab4102 100755 --- a/tests/xfs/218 +++ b/tests/xfs/218 @@ -94,7 +94,7 @@ new_extents=$(_count_extents $testdir/file3) echo "old extents: $old_extents" >> $seqres.full echo "new extents: $new_extents" >> $seqres.full echo "maximum extents: $internal_blks" >> $seqres.full -test $new_extents -lt $((internal_blks / 20)) || echo "file3 badly fragmented" +test $((new_extents - (nr / 2))) -lt $((internal_blks / 2)) || echo "file3 badly fragmented" # success, all done status=0 diff --git a/tests/xfs/219 b/tests/xfs/219 index 012b07c..df57e07 100755 --- a/tests/xfs/219 +++ b/tests/xfs/219 @@ -95,7 +95,7 @@ new_extents=$(_count_extents $testdir/file3) echo "old extents: $old_extents" >> $seqres.full echo "new extents: $new_extents" >> $seqres.full echo "maximum extents: $internal_blks" >> $seqres.full -test $new_extents -lt $((internal_blks / 20)) || echo "file3 badly fragmented" +test $((new_extents - (nr / 4))) -lt $((internal_blks / 2)) || echo "file3 badly fragmented" # success, all done status=0 diff --git a/tests/xfs/221 b/tests/xfs/221 index 8b860f2..03d81ac 100755 --- a/tests/xfs/221 +++ b/tests/xfs/221 @@ -94,7 +94,7 @@ new_extents=$(_count_extents $testdir/file3) echo "old extents: $old_extents" >> $seqres.full echo "new extents: $new_extents" >> $seqres.full echo "maximum extents: $internal_blks" >> $seqres.full -test $new_extents -lt $((internal_blks / 20)) || echo "file3 badly fragmented" +test $((new_extents - (nr / 4))) -lt $((internal_blks / 2)) || echo "file3 badly fragmented" # success, all done status=0 diff --git a/tests/xfs/223 b/tests/xfs/223 index 1e6ba98..7c990a2 100755 --- a/tests/xfs/223 +++ b/tests/xfs/223 @@ -97,7 +97,7 @@ new_extents=$(_count_extents $testdir/file3) echo "old extents: $old_extents" >> $seqres.full echo "new extents: $new_extents" >> $seqres.full echo "maximum extents: $internal_blks" >> $seqres.full -test $new_extents -lt $((internal_blks / 20)) || echo "file3 badly fragmented" +test $((new_extents - (nr / 2))) -lt $((internal_blks / 2)) || echo "file3 badly fragmented" # success, all done status=0 diff --git a/tests/xfs/224 b/tests/xfs/224 index 3d19f94..bf33d1f 100755 --- a/tests/xfs/224 +++ b/tests/xfs/224 @@ -96,7 +96,7 @@ new_extents=$(_count_extents $testdir/file3) echo "old extents: $old_extents" >> $seqres.full echo "new extents: $new_extents" >> $seqres.full echo "maximum extents: $internal_blks" >> $seqres.full -test $new_extents -lt $((internal_blks / 20)) || echo "file3 badly fragmented" +test $((new_extents - (nr / 2))) -lt $((internal_blks / 2)) || echo "file3 badly fragmented" # success, all done status=0 diff --git a/tests/xfs/225 b/tests/xfs/225 index c2e5b82..749816f 100755 --- a/tests/xfs/225 +++ b/tests/xfs/225 @@ -95,7 +95,7 @@ new_extents=$(_count_extents $testdir/file3) echo "old extents: $old_extents" >> $seqres.full echo "new extents: $new_extents" >> $seqres.full echo "maximum extents: $internal_blks" >> $seqres.full -test $new_extents -lt $((internal_blks / 20)) || echo "file3 badly fragmented" +test $((new_extents - (nr / 2))) -lt $((internal_blks / 2)) || echo "file3 badly fragmented" # success, all done status=0 diff --git a/tests/xfs/226 b/tests/xfs/226 index 3f035b4..bb94d24 100755 --- a/tests/xfs/226 +++ b/tests/xfs/226 @@ -94,7 +94,7 @@ new_extents=$(_count_extents $testdir/file3) echo "old extents: $old_extents" >> $seqres.full echo "new extents: $new_extents" >> $seqres.full echo "maximum extents: $internal_blks" >> $seqres.full -test $new_extents -lt $((internal_blks / 20)) || echo "file3 badly fragmented" +test $((new_extents - (nr / 2))) -lt $((internal_blks / 2)) || echo "file3 badly fragmented" # success, all done status=0 diff --git a/tests/xfs/228 b/tests/xfs/228 index 52fbb75..df1fd7a 100755 --- a/tests/xfs/228 +++ b/tests/xfs/228 @@ -103,7 +103,7 @@ new_extents=$(_count_extents $testdir/file3) echo "old extents: $old_extents" >> $seqres.full echo "new extents: $new_extents" >> $seqres.full echo "maximum extents: $internal_blks" >> $seqres.full -test $new_extents -lt $((internal_blks / 20)) || echo "file3 badly fragmented" +test $((new_extents - (nr * 4 / 10))) -lt $((internal_blks / 2)) || echo "file3 badly fragmented" # success, all done status=0 diff --git a/tests/xfs/230 b/tests/xfs/230 index 91e4d3f..73f599a 100755 --- a/tests/xfs/230 +++ b/tests/xfs/230 @@ -103,7 +103,7 @@ new_extents=$(_count_extents $testdir/file3) echo "old extents: $old_extents" >> $seqres.full echo "new extents: $new_extents" >> $seqres.full echo "maximum extents: $internal_blks" >> $seqres.full -test $new_extents -lt $((internal_blks / 20)) || echo "file3 badly fragmented" +test $((new_extents - (nr * 4 / 10))) -lt $((internal_blks / 2)) || echo "file3 badly fragmented" # success, all done status=0 diff --git a/tests/xfs/231 b/tests/xfs/231 index 60f59a9..166f6b0 100755 --- a/tests/xfs/231 +++ b/tests/xfs/231 @@ -123,7 +123,7 @@ new_extents=$(_count_extents $testdir/file2) echo "old extents: $old_extents" >> $seqres.full echo "new extents: $new_extents" >> $seqres.full echo "maximum extents: $internal_blks" >> $seqres.full -test $new_extents -lt $((internal_blks / 7)) || echo "file2 badly fragmented" +test $new_extents -le $((3 * nr / bufnr)) || echo "file2 more fragmented than expected" # success, all done status=0 diff --git a/tests/xfs/232 b/tests/xfs/232 index 9a8403c..0008dbf 100755 --- a/tests/xfs/232 +++ b/tests/xfs/232 @@ -125,7 +125,7 @@ new_extents=$(_count_extents $testdir/file2) echo "old extents: $old_extents" >> $seqres.full echo "new extents: $new_extents" >> $seqres.full echo "maximum extents: $internal_blks" >> $seqres.full -test $new_extents -lt $((internal_blks / 12)) || echo "file2 not sufficiently fragmented" +test $new_extents -le $((2 * nr / bufnr)) || echo "file2 more fragmented than expected" # success, all done status=0 From darrick.wong@oracle.com Fri Mar 4 18:37:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D09637CB1 for ; Fri, 4 Mar 2016 18:37:46 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6F09D8F8035 for ; Fri, 4 Mar 2016 16:37:46 -0800 (PST) X-ASG-Debug-ID: 1457138262-04bdf002ee1bab70001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Fz91cJlZtvNr9hju (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 16:37:43 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u250bcQj011392 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 5 Mar 2016 00:37:39 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u250bcdj012305 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 5 Mar 2016 00:37:38 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u250bWPA006806; Sat, 5 Mar 2016 00:37:37 GMT Received: from localhost (/10.159.166.81) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 04 Mar 2016 16:37:32 -0800 Subject: [PATCH 02/12] xfs: test copy-on-write leftover recovery From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 02/12] xfs: test copy-on-write leftover recovery To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Fri, 04 Mar 2016 16:37:30 -0800 Message-ID: <20160305003730.28738.33436.stgit@birch.djwong.org> In-Reply-To: <20160305003717.28738.98818.stgit@birch.djwong.org> References: <20160305003717.28738.98818.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1457138263 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27587 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Test recovery of CoW leftovers in xfs_repair. Signed-off-by: Darrick J. Wong --- tests/xfs/853 | 179 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/853.out | 13 ++++ tests/xfs/854 | 180 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/854.out | 13 ++++ tests/xfs/group | 2 + 5 files changed, 387 insertions(+) create mode 100755 tests/xfs/853 create mode 100644 tests/xfs/853.out create mode 100755 tests/xfs/854 create mode 100644 tests/xfs/854.out diff --git a/tests/xfs/853 b/tests/xfs/853 new file mode 100755 index 0000000..14a6940 --- /dev/null +++ b/tests/xfs/853 @@ -0,0 +1,179 @@ +#! /bin/bash +# FS QA Test No. 853 +# +# Test recovery of "lost" CoW blocks: +# - Use the debugger to fake a leftover CoW extent +# - See if xfs_repair fixes it +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. 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 -rf $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_scratch_reflink + +rm -f $seqres.full + +echo "Format" +_scratch_mkfs > $seqres.full 2>&1 +_scratch_mount >> $seqres.full +is_rmap=$(xfs_info $SCRATCH_MNT | grep -c "rmapbt=1") +umount $SCRATCH_MNT + +_get_agf_data() { + field="$1" + shift + + xfs_db -c 'agf 1' "$@" -c "p $field" $SCRATCH_DEV | awk '{print $3}' +} + +_set_agf_data() { + field="$1" + value="$2" + shift; shift + + xfs_db -x -c 'agf 1' "$@" -c "write $field -- $value" $SCRATCH_DEV >> $seqres.full +} + +_get_sb_data() { + field="$1" + shift + + xfs_db -c 'sb 0' "$@" -c "p $field" $SCRATCH_DEV | awk '{print $3}' +} + +_set_sb_data() { + field="$1" + value="$2" + shift; shift + + xfs_db -x -c 'sb 0' "$@" -c "write $field -- $value" $SCRATCH_DEV >> $seqres.full +} + +_filter_leftover() { + grep "^leftover" | sed -e "s/[0-9]\+/NR/g" +} + +_dump_status() { + echo "** " "$@" + xfs_db -c 'sb 0' -c p $SCRATCH_DEV + echo "** agf header" + xfs_db -c 'agf 1' -c p $SCRATCH_DEV + echo "** refcntbt" + xfs_db -c 'agf 1' -c 'addr refcntroot' -c p $SCRATCH_DEV + echo "** rmapbt" + test $is_rmap -gt 0 && xfs_db -c 'agf 1' -c 'addr rmaproot' -c p $SCRATCH_DEV + echo "** bnobt" + xfs_db -c 'agf 1' -c 'addr bnoroot' -c p $SCRATCH_DEV + echo "** cntbt" + xfs_db -c 'agf 1' -c 'addr cntroot' -c p $SCRATCH_DEV +} + +echo "We need AG1 to have a single free extent" +bno_lvl=$(_get_agf_data level -c 'addr bnoroot') +bno_nr=$(_get_agf_data numrecs -c 'addr bnoroot') +refc_lvl=$(_get_agf_data level -c 'addr refcntroot') +refc_nr=$(_get_agf_data numrecs -c 'addr refcntroot') + +test $bno_lvl -eq 0 || echo " AG 1 bnobt must only have one level" +test $bno_nr -eq 1 || echo " AG 1 bnobt must only have one record" +test $refc_lvl -eq 0 || echo " AG 1 refcountbt must only have one level" +test $refc_nr -eq 0 || echo " AG 1 refcountbt must only have one record" + +if [ $is_rmap -gt 0 ]; then + rmap_lvl=$(_get_agf_data level -c 'addr rmaproot') + rmap_nr=$(_get_agf_data numrecs -c 'addr rmaproot') + test $rmap_lvl -eq 0 || echo " AG 1 rmapbt must only have one level" +fi + +echo "Find our extent and old counter values" +bno=$(_get_agf_data "recs[1].startblock" -c 'addr bnoroot') +len=$(_get_agf_data "recs[1].blockcount" -c 'addr bnoroot') +agf_freeblks=$(_get_agf_data freeblks) +sb_fdblocks=$(_get_sb_data fdblocks) + +test $len -ge 200 || echo " AG 1 doesn't have enough free blocks" + +# Take the last 100 blocks of the free extent +debris_len=100 +debris_bno=$((bno + len - debris_len)) + +echo "Remove the extent from the freesp btrees" +_set_agf_data "recs[1].blockcount" $((len - debris_len)) -c 'addr bnoroot' +_set_agf_data "recs[1].blockcount" $((len - debris_len)) -c 'addr cntroot' +_set_agf_data freeblks $((agf_freeblks - debris_len)) +_set_agf_data longest $((len - debris_len)) +_set_sb_data fdblocks $((sb_fdblocks - debris_len)) + +echo "Add the extent to the refcount btree" +_set_agf_data numrecs 1 -c 'addr refcntroot' +_set_agf_data "recs[1].startblock" $debris_bno -c 'addr refcntroot' +_set_agf_data "recs[1].blockcount" $debris_len -c 'addr refcntroot' +_set_agf_data "recs[1].refcount" 1 -c 'addr refcntroot' + +if [ $is_rmap -gt 0 ]; then + rmap_nr=$((rmap_nr + 1)) + _set_agf_data numrecs $rmap_nr -c 'addr rmaproot' + _set_agf_data "recs[$rmap_nr].startblock" $debris_bno -c 'addr rmaproot' + _set_agf_data "recs[$rmap_nr].blockcount" $debris_len -c 'addr rmaproot' + _set_agf_data "recs[$rmap_nr].owner" -9 -c 'addr rmaproot' + _set_agf_data "recs[$rmap_nr].offset" 0 -c 'addr rmaproot' +fi + +_dump_status "broken fs config" >> $seqres.full + +echo "Look for leftover warning in xfs_check" +_scratch_xfs_check | _filter_leftover + +echo "Look for leftover warning in xfs_repair" +_scratch_xfs_repair -n 2>&1 | _filter_leftover + +echo "Fix filesystem" +_scratch_xfs_repair >> $seqres.full 2>&1 || echo "xfs_repair failed?" + +_dump_status "supposedly fixed fs config" >> $seqres.full + +echo "Look for no more leftover warning in xfs_check" +_scratch_xfs_check | _filter_leftover + +echo "Look for no more leftover warning in xfs_repair" +_scratch_xfs_repair -n 2>&1 | _filter_leftover + +# success, all done +status=0 +exit diff --git a/tests/xfs/853.out b/tests/xfs/853.out new file mode 100644 index 0000000..3224e8d --- /dev/null +++ b/tests/xfs/853.out @@ -0,0 +1,13 @@ +QA output created by 853 +Format +We need AG1 to have a single free extent +Find our extent and old counter values +Remove the extent from the freesp btrees +Add the extent to the refcount btree +Look for leftover warning in xfs_check +leftover CoW extent (NR/NR) len NR +Look for leftover warning in xfs_repair +leftover CoW extent (NR/NR) len NR +Fix filesystem +Look for no more leftover warning in xfs_check +Look for no more leftover warning in xfs_repair diff --git a/tests/xfs/854 b/tests/xfs/854 new file mode 100755 index 0000000..5c6bec9 --- /dev/null +++ b/tests/xfs/854 @@ -0,0 +1,180 @@ +#! /bin/bash +# FS QA Test No. 854 +# +# Test recovery of "lost" CoW blocks: +# - Use the debugger to fake a leftover CoW extent +# - See if mount/umount fixes it +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. 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 -rf $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_scratch_reflink + +rm -f $seqres.full + +echo "Format" +_scratch_mkfs > $seqres.full 2>&1 +_scratch_mount >> $seqres.full +is_rmap=$(xfs_info $SCRATCH_MNT | grep -c "rmapbt=1") +umount $SCRATCH_MNT + +_get_agf_data() { + field="$1" + shift + + xfs_db -c 'agf 1' "$@" -c "p $field" $SCRATCH_DEV | awk '{print $3}' +} + +_set_agf_data() { + field="$1" + value="$2" + shift; shift + + xfs_db -x -c 'agf 1' "$@" -c "write $field -- $value" $SCRATCH_DEV >> $seqres.full +} + +_get_sb_data() { + field="$1" + shift + + xfs_db -c 'sb 0' "$@" -c "p $field" $SCRATCH_DEV | awk '{print $3}' +} + +_set_sb_data() { + field="$1" + value="$2" + shift; shift + + xfs_db -x -c 'sb 0' "$@" -c "write $field -- $value" $SCRATCH_DEV >> $seqres.full +} + +_filter_leftover() { + grep "^leftover" | sed -e "s/[0-9]\+/NR/g" +} + +_dump_status() { + echo "** " "$@" + xfs_db -c 'sb 0' -c p $SCRATCH_DEV + echo "** agf header" + xfs_db -c 'agf 1' -c p $SCRATCH_DEV + echo "** refcntbt" + xfs_db -c 'agf 1' -c 'addr refcntroot' -c p $SCRATCH_DEV + echo "** rmapbt" + test $is_rmap -gt 0 && xfs_db -c 'agf 1' -c 'addr rmaproot' -c p $SCRATCH_DEV + echo "** bnobt" + xfs_db -c 'agf 1' -c 'addr bnoroot' -c p $SCRATCH_DEV + echo "** cntbt" + xfs_db -c 'agf 1' -c 'addr cntroot' -c p $SCRATCH_DEV +} + +echo "We need AG1 to have a single free extent" +bno_lvl=$(_get_agf_data level -c 'addr bnoroot') +bno_nr=$(_get_agf_data numrecs -c 'addr bnoroot') +refc_lvl=$(_get_agf_data level -c 'addr refcntroot') +refc_nr=$(_get_agf_data numrecs -c 'addr refcntroot') + +test $bno_lvl -eq 0 || echo " AG 1 bnobt must only have one level" +test $bno_nr -eq 1 || echo " AG 1 bnobt must only have one record" +test $refc_lvl -eq 0 || echo " AG 1 refcountbt must only have one level" +test $refc_nr -eq 0 || echo " AG 1 refcountbt must only have one record" + +if [ $is_rmap -gt 0 ]; then + rmap_lvl=$(_get_agf_data level -c 'addr rmaproot') + rmap_nr=$(_get_agf_data numrecs -c 'addr rmaproot') + test $rmap_lvl -eq 0 || echo " AG 1 rmapbt must only have one level" +fi + +echo "Find our extent and old counter values" +bno=$(_get_agf_data "recs[1].startblock" -c 'addr bnoroot') +len=$(_get_agf_data "recs[1].blockcount" -c 'addr bnoroot') +agf_freeblks=$(_get_agf_data freeblks) +sb_fdblocks=$(_get_sb_data fdblocks) + +test $len -ge 200 || echo " AG 1 doesn't have enough free blocks" + +# Take the last 100 blocks of the free extent +debris_len=100 +debris_bno=$((bno + len - debris_len)) + +echo "Remove the extent from the freesp btrees" +_set_agf_data "recs[1].blockcount" $((len - debris_len)) -c 'addr bnoroot' +_set_agf_data "recs[1].blockcount" $((len - debris_len)) -c 'addr cntroot' +_set_agf_data freeblks $((agf_freeblks - debris_len)) +_set_agf_data longest $((len - debris_len)) +_set_sb_data fdblocks $((sb_fdblocks - debris_len)) + +echo "Add the extent to the refcount btree" +_set_agf_data numrecs 1 -c 'addr refcntroot' +_set_agf_data "recs[1].startblock" $debris_bno -c 'addr refcntroot' +_set_agf_data "recs[1].blockcount" $debris_len -c 'addr refcntroot' +_set_agf_data "recs[1].refcount" 1 -c 'addr refcntroot' + +if [ $is_rmap -gt 0 ]; then + rmap_nr=$((rmap_nr + 1)) + _set_agf_data numrecs $rmap_nr -c 'addr rmaproot' + _set_agf_data "recs[$rmap_nr].startblock" $debris_bno -c 'addr rmaproot' + _set_agf_data "recs[$rmap_nr].blockcount" $debris_len -c 'addr rmaproot' + _set_agf_data "recs[$rmap_nr].owner" -9 -c 'addr rmaproot' + _set_agf_data "recs[$rmap_nr].offset" 0 -c 'addr rmaproot' +fi + +_dump_status "broken fs config" >> $seqres.full + +echo "Look for leftover warning in xfs_check" +_scratch_xfs_check | _filter_leftover + +echo "Look for leftover warning in xfs_repair" +_scratch_xfs_repair -n 2>&1 | _filter_leftover + +echo "Mount filesystem" +_scratch_mount +umount $SCRATCH_MNT + +_dump_status "supposedly fixed fs config" >> $seqres.full + +echo "Look for no more leftover warning in xfs_check" +_scratch_xfs_check | _filter_leftover + +echo "Look for no more leftover warning in xfs_repair" +_scratch_xfs_repair -n 2>&1 | _filter_leftover + +# success, all done +status=0 +exit diff --git a/tests/xfs/854.out b/tests/xfs/854.out new file mode 100644 index 0000000..aae2fd7 --- /dev/null +++ b/tests/xfs/854.out @@ -0,0 +1,13 @@ +QA output created by 854 +Format +We need AG1 to have a single free extent +Find our extent and old counter values +Remove the extent from the freesp btrees +Add the extent to the refcount btree +Look for leftover warning in xfs_check +leftover CoW extent (NR/NR) len NR +Look for leftover warning in xfs_repair +leftover CoW extent (NR/NR) len NR +Mount filesystem +Look for no more leftover warning in xfs_check +Look for no more leftover warning in xfs_repair diff --git a/tests/xfs/group b/tests/xfs/group index e0c4553..50353f1 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -284,3 +284,5 @@ 303 auto quick quota 304 auto quick quota 305 auto quota +853 auto quick clone +854 auto quick clone From darrick.wong@oracle.com Fri Mar 4 18:37:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E15627CA3 for ; Fri, 4 Mar 2016 18:37:52 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 90F81304043 for ; Fri, 4 Mar 2016 16:37:52 -0800 (PST) X-ASG-Debug-ID: 1457138270-04bdf002eb1bab70001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 6sJsGXyZfZLsldOM (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 16:37:51 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u250bkdp018929 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 5 Mar 2016 00:37:46 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u250bjHc014745 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 5 Mar 2016 00:37:46 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u250bjjI005917; Sat, 5 Mar 2016 00:37:45 GMT Received: from localhost (/10.159.166.81) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 04 Mar 2016 16:37:45 -0800 Subject: [PATCH 04/12] xfs/23[3-6]: don't source common/xfs, it doesn't exist From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 04/12] xfs/23[3-6]: don't source common/xfs, it doesn't exist To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Fri, 04 Mar 2016 16:37:43 -0800 Message-ID: <20160305003743.28738.8245.stgit@birch.djwong.org> In-Reply-To: <20160305003717.28738.98818.stgit@birch.djwong.org> References: <20160305003717.28738.98818.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1457138271 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27587 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Don't source common/xfs, since it doesn't (yet) exist. Signed-off-by: Darrick J. Wong --- tests/xfs/233 | 1 - tests/xfs/234 | 1 - tests/xfs/235 | 1 - tests/xfs/236 | 1 - 4 files changed, 4 deletions(-) diff --git a/tests/xfs/233 b/tests/xfs/233 index f10af2b..8fcf766 100755 --- a/tests/xfs/233 +++ b/tests/xfs/233 @@ -39,7 +39,6 @@ _cleanup() # get standard environment, filters and checks . ./common/rc . ./common/filter -. ./common/xfs # real QA test starts here _supported_os Linux diff --git a/tests/xfs/234 b/tests/xfs/234 index 649cb7e..2bbf295 100755 --- a/tests/xfs/234 +++ b/tests/xfs/234 @@ -41,7 +41,6 @@ _cleanup() # get standard environment, filters and checks . ./common/rc . ./common/filter -. ./common/xfs # real QA test starts here _supported_os Linux diff --git a/tests/xfs/235 b/tests/xfs/235 index 5af72a6..370131b 100755 --- a/tests/xfs/235 +++ b/tests/xfs/235 @@ -41,7 +41,6 @@ _cleanup() . ./common/rc . ./common/filter . ./common/attr -. ./common/xfs # real QA test starts here _supported_os Linux diff --git a/tests/xfs/236 b/tests/xfs/236 index 99e9a75..c7b3a19 100755 --- a/tests/xfs/236 +++ b/tests/xfs/236 @@ -41,7 +41,6 @@ _cleanup() # get standard environment, filters and checks . ./common/rc . ./common/filter -. ./common/xfs # real QA test starts here _supported_os Linux From darrick.wong@oracle.com Fri Mar 4 18:37:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C2CDA7CBA for ; Fri, 4 Mar 2016 18:37:58 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7F578304039 for ; Fri, 4 Mar 2016 16:37:58 -0800 (PST) X-ASG-Debug-ID: 1457138277-04cb6c5833192d10001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 3nQvlMyLXYeq3sVy (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 16:37:57 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u250bqPD018992 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 5 Mar 2016 00:37:52 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u250bqWE014944 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 5 Mar 2016 00:37:52 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u250bp2k026050; Sat, 5 Mar 2016 00:37:51 GMT Received: from localhost (/10.159.166.81) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 04 Mar 2016 16:37:51 -0800 Subject: [PATCH 05/12] xfs/206: fix output when mkfs knows about reflink From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 05/12] xfs/206: fix output when mkfs knows about reflink To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Fri, 04 Mar 2016 16:37:50 -0800 Message-ID: <20160305003750.28738.48204.stgit@birch.djwong.org> In-Reply-To: <20160305003717.28738.98818.stgit@birch.djwong.org> References: <20160305003717.28738.98818.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1457138277 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27587 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Signed-off-by: Darrick J. Wong --- tests/xfs/206 | 1 + tests/xfs/206.out | 2 ++ 2 files changed, 3 insertions(+) diff --git a/tests/xfs/206 b/tests/xfs/206 index 0f5d97d..24e690a 100755 --- a/tests/xfs/206 +++ b/tests/xfs/206 @@ -80,6 +80,7 @@ mkfs_filter() -e "s/\(^log.*blocks=\)\([0-9]*,\)/\1XXXXX,/" \ -e "s/, projid32bit=[0-9]//" \ -e "s/ ftype=[0-9]//" \ + -e "s/ reflink=[0-9]//" \ -e "s/\(sectsz\)\(=[0-9]* *\)/\1=512 /" \ -e "s/\(sunit=\)\([0-9]* blks,\)/\10 blks,/" \ -e "s/, lazy-count=[0-9]//" \ diff --git a/tests/xfs/206.out b/tests/xfs/206.out index 2db839d..e73a954 100644 --- a/tests/xfs/206.out +++ b/tests/xfs/206.out @@ -12,6 +12,7 @@ realtime =none extsz=4096 blocks=0, rtextents=0 === xfs_growfs === meta-data=FILE isize=N agcount=52, agsize=76288719 blks = sectsz=512 attr=2 + = data = bsize=4096 blocks=3905982455, imaxpct=5 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 @@ -22,6 +23,7 @@ data blocks changed from 3905982455 to 4882478016 === xfs_info === meta-data=FILE isize=N agcount=64, agsize=76288719 blks = sectsz=512 attr=2 + = data = bsize=4096 blocks=4882478016, imaxpct=5 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 From darrick.wong@oracle.com Fri Mar 4 18:38:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id ABF6B7CB1 for ; Fri, 4 Mar 2016 18:38:09 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7E9CD8F8035 for ; Fri, 4 Mar 2016 16:38:09 -0800 (PST) X-ASG-Debug-ID: 1457138288-04cb6c5830192d10001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id wy105vmvLDdM7Mla (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 16:38:08 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u250c436011938 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 5 Mar 2016 00:38:04 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u250c4EH000692 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 5 Mar 2016 00:38:04 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u250bw74006939; Sat, 5 Mar 2016 00:38:03 GMT Received: from localhost (/10.159.166.81) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 04 Mar 2016 16:37:57 -0800 Subject: [PATCH 06/12] xfs/030: fix output on newer filesystems From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 06/12] xfs/030: fix output on newer filesystems To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Fri, 04 Mar 2016 16:37:56 -0800 Message-ID: <20160305003756.28738.26362.stgit@birch.djwong.org> In-Reply-To: <20160305003717.28738.98818.stgit@birch.djwong.org> References: <20160305003717.28738.98818.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1457138288 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27587 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Signed-off-by: Darrick J. Wong --- tests/xfs/030 | 5 ++++- tests/xfs/030.out.linux | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/xfs/030 b/tests/xfs/030 index 4cb1524..33c906c 100755 --- a/tests/xfs/030 +++ b/tests/xfs/030 @@ -57,7 +57,10 @@ _check_ag() echo "Corrupting $structure - setting bits to $1" _check_repair $1 "$structure" | sed -e '/^error following ag 0 unlinked list$/d' \ - -e '/^bad agbno AGBNO for finobt/d' + -e '/^bad agbno AGBNO for finobt/d' \ + -e '/^bad agbno AGBNO for rmapbt/d' \ + -e '/^bad agbno AGBNO for refcntbt/d' \ + -e '/^Missing reverse-mapping record.*/d' done } diff --git a/tests/xfs/030.out.linux b/tests/xfs/030.out.linux index cf3259f..14b9b35 100644 --- a/tests/xfs/030.out.linux +++ b/tests/xfs/030.out.linux @@ -231,6 +231,8 @@ bad agbno AGBNO in agfl, agno 0 bad agbno AGBNO in agfl, agno 0 bad agbno AGBNO in agfl, agno 0 bad agbno AGBNO in agfl, agno 0 +bad agbno AGBNO in agfl, agno 0 +bad agbno AGBNO in agfl, agno 0 - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... From darrick.wong@oracle.com Fri Mar 4 18:38:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 980B07F56 for ; Fri, 4 Mar 2016 18:38:11 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5B54D304039 for ; Fri, 4 Mar 2016 16:38:11 -0800 (PST) X-ASG-Debug-ID: 1457138290-04cbb00b721c67a0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id uK5vBT7NoJoIpnS8 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 16:38:10 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u250c5M3019364 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 5 Mar 2016 00:38:05 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u250c5b7015462 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 5 Mar 2016 00:38:05 GMT Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u250c4lJ005978; Sat, 5 Mar 2016 00:38:04 GMT Received: from localhost (/10.159.166.81) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 04 Mar 2016 16:38:04 -0800 Subject: [PATCH 07/12] xfs/073: fix output From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 07/12] xfs/073: fix output To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Fri, 04 Mar 2016 16:38:03 -0800 Message-ID: <20160305003803.28738.34407.stgit@birch.djwong.org> In-Reply-To: <20160305003717.28738.98818.stgit@birch.djwong.org> References: <20160305003717.28738.98818.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1457138290 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27587 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Signed-off-by: Darrick J. Wong --- tests/xfs/073.out | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/xfs/073.out b/tests/xfs/073.out index 3f27467..fb035cb 100644 --- a/tests/xfs/073.out +++ b/tests/xfs/073.out @@ -1,4 +1,7 @@ QA output created by 073 +warning: finobt not supported without CRC support, disabled. +warning: rmapbt not supported without CRC support, disabled. +warning: reflink not supported without CRC support, disabled. meta-data=DDEV isize=XXX agcount=N, agsize=XXX blks data = bsize=XXX blocks=XXX, imaxpct=PCT = sunit=XXX swidth=XXX, unwritten=X From darrick.wong@oracle.com Fri Mar 4 18:38:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 508427CB0 for ; Fri, 4 Mar 2016 18:38:25 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0629E304048 for ; Fri, 4 Mar 2016 16:38:24 -0800 (PST) X-ASG-Debug-ID: 1457138303-04bdf002ee1babb0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id IXhwLaWw5L5WrR8n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 16:38:23 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u250cIYC019563 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 5 Mar 2016 00:38:18 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u250cHSS015816 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 5 Mar 2016 00:38:18 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u250cCBm006996; Sat, 5 Mar 2016 00:38:17 GMT Received: from localhost (/10.159.166.81) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 04 Mar 2016 16:38:10 -0800 Subject: [PATCH 08/12] xfs/122: define _GNU_SOURCE when compiling test program From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 08/12] xfs/122: define _GNU_SOURCE when compiling test program To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Fri, 04 Mar 2016 16:38:09 -0800 Message-ID: <20160305003809.28738.85961.stgit@birch.djwong.org> In-Reply-To: <20160305003717.28738.98818.stgit@birch.djwong.org> References: <20160305003717.28738.98818.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1457138303 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27587 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines This makes it so we don't get warnings about off64_t not being defined when compiling the test program. Signed-off-by: Darrick J. Wong --- tests/xfs/122 | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/xfs/122 b/tests/xfs/122 index 758cb50..dc28c56 100755 --- a/tests/xfs/122 +++ b/tests/xfs/122 @@ -73,6 +73,7 @@ oprog=$tmp.get_structs progout=$tmp.output cat >$cprog < EOF for hdr in /usr/include/xfs/xfs*.h; do From darrick.wong@oracle.com Fri Mar 4 18:38:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 65A357CAE for ; Fri, 4 Mar 2016 18:38:29 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 38ADD8F8035 for ; Fri, 4 Mar 2016 16:38:29 -0800 (PST) X-ASG-Debug-ID: 1457138307-04cb6c5830192d20001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id hRzkT0pPI6H5TBgp (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 16:38:27 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u250cNZR019600 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 5 Mar 2016 00:38:23 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u250cNk2013843 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 5 Mar 2016 00:38:23 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u250cHR0007027; Sat, 5 Mar 2016 00:38:22 GMT Received: from localhost (/10.159.166.81) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 04 Mar 2016 16:38:17 -0800 Subject: [PATCH 09/12] xfs/122: support rmapxbt From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 09/12] xfs/122: support rmapxbt To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Fri, 04 Mar 2016 16:38:16 -0800 Message-ID: <20160305003815.28738.81125.stgit@birch.djwong.org> In-Reply-To: <20160305003717.28738.98818.stgit@birch.djwong.org> References: <20160305003717.28738.98818.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1457138307 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27587 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Support the extended rmap btree key structure. Signed-off-by: Darrick J. Wong --- tests/xfs/122.out | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/xfs/122.out b/tests/xfs/122.out index c590166..451871e 100644 --- a/tests/xfs/122.out +++ b/tests/xfs/122.out @@ -77,8 +77,9 @@ sizeof(struct xfs_fs_eofblocks) = 128 sizeof(struct xfs_icreate_log) = 28 sizeof(struct xfs_refcount_key) = 4 sizeof(struct xfs_refcount_rec) = 12 -sizeof(struct xfs_rmap_key) = 20 +sizeof(struct xfs_rmap_key) = 4 sizeof(struct xfs_rmap_rec) = 24 +sizeof(struct xfs_rmapx_key) = 20 sizeof(xfs_agf_t) = 224 sizeof(xfs_agfl_t) = 36 sizeof(xfs_agi_t) = 336 From darrick.wong@oracle.com Fri Mar 4 18:38:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2BA247CB0 for ; Fri, 4 Mar 2016 18:38:37 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E4E74304048 for ; Fri, 4 Mar 2016 16:38:36 -0800 (PST) X-ASG-Debug-ID: 1457138314-04cbb00b6f1c67b0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 3dv9nt8COnb0w9p6 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 16:38:34 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u250cRQA012231 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 5 Mar 2016 00:38:28 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u250cQEo013927 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 5 Mar 2016 00:38:27 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u250cPV5006046; Sat, 5 Mar 2016 00:38:26 GMT Received: from localhost (/10.159.166.81) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 04 Mar 2016 16:38:25 -0800 Subject: [PATCH 10/12] xfs: test per-ag allocation accounting during truncate-caused refcountbt expansion From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 10/12] xfs: test per-ag allocation accounting during truncate-caused refcountbt expansion To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org, Christoph Hellwig , fstests@vger.kernel.org, xfs@oss.sgi.com Date: Fri, 04 Mar 2016 16:38:22 -0800 Message-ID: <20160305003822.28738.53832.stgit@birch.djwong.org> In-Reply-To: <20160305003717.28738.98818.stgit@birch.djwong.org> References: <20160305003717.28738.98818.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1457138314 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27587 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Ensure that refcountbt allocations during truncate operations come from the per-AG reservation and are not charged to the transaction. Reported-by: Christoph Hellwig Signed-off-by: Darrick J. Wong --- tests/xfs/855 | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/855.out | 10 ++++++ tests/xfs/group | 1 + 3 files changed, 106 insertions(+) create mode 100755 tests/xfs/855 create mode 100644 tests/xfs/855.out diff --git a/tests/xfs/855 b/tests/xfs/855 new file mode 100755 index 0000000..93bd286 --- /dev/null +++ b/tests/xfs/855 @@ -0,0 +1,95 @@ +#! /bin/bash +# FS QA Test No. 855 +# +# Ensure that we can create enough distinct reflink entries to force creation +# of a multi-level refcount btree by reflinking a file a number of times and +# truncating the copies at successively lower sizes. Delete and recreate a few +# times to exercise the refcount btree grow/shrink functions. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. 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 / + umount $SCRATCH_MNT > /dev/null 2>&1 + rm -rf $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_scratch_reflink +_require_cp_reflink + +rm -f $seqres.full + +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +testdir=$SCRATCH_MNT/test-$seq +mkdir $testdir + +echo "Create the original file blocks" +blksz="$(stat -f $testdir -c '%S')" +nr_blks=$((2 * blksz / 12)) + +for i in 1 2 x; do + _pwrite_byte 0x61 0 $((blksz * nr_blks)) $testdir/file1 >> $seqres.full + + echo "$i: Reflink a bunch of times" + seq 1 $nr_blks | while read nr; do + _cp_reflink $testdir/file1 $testdir/file1.$nr >> $seqres.full + done + sync + + echo "$i: Truncate files" + seq 1 $nr_blks | while read nr; do + truncate -s $((blksz * (nr_blks - nr))) $testdir/file1.$nr >> $seqres.full + done + + umount $SCRATCH_MNT + _check_scratch_fs + _scratch_mount + + test $i = "x" && break + + echo "$i: Delete both files" + rm -rf $testdir + mkdir -p $testdir + umount $SCRATCH_MNT + _check_scratch_fs + _scratch_mount +done + +# success, all done +status=0 +exit diff --git a/tests/xfs/855.out b/tests/xfs/855.out new file mode 100644 index 0000000..d196352 --- /dev/null +++ b/tests/xfs/855.out @@ -0,0 +1,10 @@ +QA output created by 855 +Create the original file blocks +1: Reflink a bunch of times +1: Truncate files +1: Delete both files +2: Reflink a bunch of times +2: Truncate files +2: Delete both files +x: Reflink a bunch of times +x: Truncate files diff --git a/tests/xfs/group b/tests/xfs/group index 50353f1..70f422e 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -286,3 +286,4 @@ 305 auto quota 853 auto quick clone 854 auto quick clone +855 auto clone From darrick.wong@oracle.com Fri Mar 4 18:38:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 87B9329E09 for ; Fri, 4 Mar 2016 18:38:39 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4CD248F8033 for ; Fri, 4 Mar 2016 16:38:39 -0800 (PST) X-ASG-Debug-ID: 1457138317-04cbb00b701c67c0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id pGMpp7A86FrK8sPr (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 16:38:37 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u250cWBN019694 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Sat, 5 Mar 2016 00:38:33 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u250cWDc026358 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Sat, 5 Mar 2016 00:38:32 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u250cWKN026158; Sat, 5 Mar 2016 00:38:32 GMT Received: from localhost (/10.159.166.81) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 04 Mar 2016 16:38:32 -0800 Subject: [PATCH 11/12] xfs: remove NOCOW_FL testing from test From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 11/12] xfs: remove NOCOW_FL testing from test To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Fri, 04 Mar 2016 16:38:30 -0800 Message-ID: <20160305003830.28738.38711.stgit@birch.djwong.org> In-Reply-To: <20160305003717.28738.98818.stgit@birch.djwong.org> References: <20160305003717.28738.98818.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1457138317 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27587 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Since XFS dropped support for the NOCOW_FL flag, cut it out of the tests. Signed-off-by: Darrick J. Wong --- tests/xfs/132 | 5 ----- tests/xfs/132.out | 20 -------------------- 2 files changed, 25 deletions(-) diff --git a/tests/xfs/132 b/tests/xfs/132 index f174b3f..b09ccb6 100755 --- a/tests/xfs/132 +++ b/tests/xfs/132 @@ -88,32 +88,27 @@ for i in `seq 2 $nr`; do done _test_cycle_mount free_blocks1=$(stat -f $testdir -c '%f') -lsattr -l $testdir/ | _filter_test_dir | _filter_spaces echo "funshare part of a file" $XFS_IO_PROG -f -c "falloc 0 $((sz / 2))" $testdir/file2 _test_cycle_mount -lsattr -l $testdir/ | _filter_test_dir | _filter_spaces echo "funshare some of the copies" $XFS_IO_PROG -f -c "falloc 0 $sz" $testdir/file2 $XFS_IO_PROG -f -c "falloc 0 $sz" $testdir/file3 _test_cycle_mount free_blocks2=$(stat -f $testdir -c '%f') -lsattr -l $testdir/ | _filter_test_dir | _filter_spaces echo "funshare the rest of the files" $XFS_IO_PROG -f -c "falloc 0 $sz" $testdir/file4 $XFS_IO_PROG -f -c "falloc 0 $sz" $testdir/file1 _test_cycle_mount free_blocks3=$(stat -f $testdir -c '%f') -lsattr -l $testdir/ | _filter_test_dir | _filter_spaces echo "Rewrite the original file" _pwrite_byte 0x65 0 $sz $testdir/file1 >> $seqres.full _test_cycle_mount free_blocks4=$(stat -f $testdir -c '%f') -lsattr -l $testdir/ | _filter_test_dir | _filter_spaces #echo $free_blocks0 $free_blocks1 $free_blocks2 $free_blocks3 $free_blocks4 _within_tolerance "free blocks after reflinking" $free_blocks1 $((free_blocks0 - blks)) $margin -v diff --git a/tests/xfs/132.out b/tests/xfs/132.out index f32db7d..3d1281c 100644 --- a/tests/xfs/132.out +++ b/tests/xfs/132.out @@ -1,30 +1,10 @@ QA output created by 132 Create the original file blocks Create the reflink copies -TEST_DIR/test-132/file1 --- -TEST_DIR/test-132/file2 --- -TEST_DIR/test-132/file3 --- -TEST_DIR/test-132/file4 --- funshare part of a file -TEST_DIR/test-132/file1 --- -TEST_DIR/test-132/file2 --- -TEST_DIR/test-132/file3 --- -TEST_DIR/test-132/file4 --- funshare some of the copies -TEST_DIR/test-132/file1 --- -TEST_DIR/test-132/file2 No_COW -TEST_DIR/test-132/file3 No_COW -TEST_DIR/test-132/file4 --- funshare the rest of the files -TEST_DIR/test-132/file1 No_COW -TEST_DIR/test-132/file2 No_COW -TEST_DIR/test-132/file3 No_COW -TEST_DIR/test-132/file4 No_COW Rewrite the original file -TEST_DIR/test-132/file1 No_COW -TEST_DIR/test-132/file2 No_COW -TEST_DIR/test-132/file3 No_COW -TEST_DIR/test-132/file4 No_COW free blocks after reflinking is in range free blocks after nocow'ing some copies is in range free blocks after nocow'ing all copies is in range From darrick.wong@oracle.com Fri Mar 4 18:38:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A96717CB0 for ; Fri, 4 Mar 2016 18:38:47 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2C4EEAC005 for ; Fri, 4 Mar 2016 16:38:47 -0800 (PST) X-ASG-Debug-ID: 1457138324-04bdf002ee1babf0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id JKP1O5zCYay0uWGq (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 16:38:44 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u250cdRS012362 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 5 Mar 2016 00:38:40 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u250cdXO014236 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 5 Mar 2016 00:38:39 GMT Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u250ccho026174; Sat, 5 Mar 2016 00:38:39 GMT Received: from localhost (/10.159.166.81) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 04 Mar 2016 16:38:38 -0800 Subject: [PATCH 12/12] block: test fallocate for block devices From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 12/12] block: test fallocate for block devices To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Fri, 04 Mar 2016 16:38:37 -0800 Message-ID: <20160305003837.28738.49794.stgit@birch.djwong.org> In-Reply-To: <20160305003717.28738.98818.stgit@birch.djwong.org> References: <20160305003717.28738.98818.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1457138324 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/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=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27587 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Now that we're wiring up fallocate's PUNCH_HOLE and ZERO_RANGE features for block devices, add some tests to make sure they work correctly. Signed-off-by: Darrick J. Wong --- common/scsi_debug | 6 ++- tests/generic/705 | 65 ++++++++++++++++++++++++++++ tests/generic/705.out | 6 +++ tests/generic/706 | 65 ++++++++++++++++++++++++++++ tests/generic/706.out | 6 +++ tests/generic/707 | 112 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/707.out | 28 ++++++++++++ tests/generic/group | 3 + 8 files changed, 290 insertions(+), 1 deletion(-) create mode 100755 tests/generic/705 create mode 100644 tests/generic/705.out create mode 100755 tests/generic/706 create mode 100644 tests/generic/706.out create mode 100755 tests/generic/707 create mode 100644 tests/generic/707.out diff --git a/common/scsi_debug b/common/scsi_debug index eb08126..74c3802 100644 --- a/common/scsi_debug +++ b/common/scsi_debug @@ -40,13 +40,17 @@ _get_scsi_debug_dev() logical=${2-512} unaligned=${3-0} size=${4-128} + test -n "$4" && shift + test -n "$3" && shift + test -n "$2" && shift + test -n "$1" && shift phys_exp=0 while [ $logical -lt $physical ]; do let physical=physical/2 let phys_exp=phys_exp+1 done - opts="sector_size=$logical physblk_exp=$phys_exp lowest_aligned=$unaligned dev_size_mb=$size" + opts="sector_size=$logical physblk_exp=$phys_exp lowest_aligned=$unaligned dev_size_mb=$size $@" echo "scsi_debug options $opts" >> $seqres.full modprobe scsi_debug $opts [ $? -eq 0 ] || _fail "scsi_debug modprobe failed" diff --git a/tests/generic/705 b/tests/generic/705 new file mode 100755 index 0000000..25872ac --- /dev/null +++ b/tests/generic/705 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. 705 +# +# Test fallocate(ZERO_RANGE) on a block device, which should be able to +# WRITE SAME (or equivalent) the range. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016 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 7 15 + +_cleanup() +{ + cd / + rm -rf $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/scsi_debug + +# real QA test starts here +_supported_os Linux +_require_scsi_debug +_require_xfs_io_command "fzero" + +echo "Create and format" +dev=$(_get_scsi_debug_dev 512 512 0 4 "lbpws=1 lbpws10=1") +_pwrite_byte 0x62 0 4m $dev >> $seqres.full + +echo "Zero range" +$XFS_IO_PROG -c "fzero -k 512k 1m" $dev + +echo "Check contents" +md5sum $dev | sed -e "s|$dev|SCSI_DEBUG_DEV|g" + +echo "Destroy device" +_put_scsi_debug_dev + +# success, all done +status=0 +exit diff --git a/tests/generic/705.out b/tests/generic/705.out new file mode 100644 index 0000000..7e58a07 --- /dev/null +++ b/tests/generic/705.out @@ -0,0 +1,6 @@ +QA output created by 705 +Create and format +Zero range +Check contents +caa26edd6c70ce862eb7ec6f10b138a8 SCSI_DEBUG_DEV +Destroy device diff --git a/tests/generic/706 b/tests/generic/706 new file mode 100755 index 0000000..432b800 --- /dev/null +++ b/tests/generic/706 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. 706 +# +# Test fallocate(PUNCH_HOLE) on a block device, which should be able to +# zero-TRIM (or equivalent) the range. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016 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 7 15 + +_cleanup() +{ + cd / + rm -rf $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/scsi_debug + +# real QA test starts here +_supported_os Linux +_require_scsi_debug +_require_xfs_io_command "fpunch" + +echo "Create and format" +dev=$(_get_scsi_debug_dev 512 512 0 4 "lbpws=1 lbpws10=1") +_pwrite_byte 0x62 0 4m $dev >> $seqres.full + +echo "Zero punch" +$XFS_IO_PROG -c "fpunch 512k 1m" $dev + +echo "Check contents" +md5sum $dev | sed -e "s|$dev|SCSI_DEBUG_DEV|g" + +echo "Destroy device" +_put_scsi_debug_dev + +# success, all done +status=0 +exit diff --git a/tests/generic/706.out b/tests/generic/706.out new file mode 100644 index 0000000..58b9c03 --- /dev/null +++ b/tests/generic/706.out @@ -0,0 +1,6 @@ +QA output created by 706 +Create and format +Zero punch +Check contents +caa26edd6c70ce862eb7ec6f10b138a8 SCSI_DEBUG_DEV +Destroy device diff --git a/tests/generic/707 b/tests/generic/707 new file mode 100755 index 0000000..fb378cd --- /dev/null +++ b/tests/generic/707 @@ -0,0 +1,112 @@ +#! /bin/bash +# FS QA Test No. 707 +# +# Test the unsupported fallocate flags on a block device. No collapse +# or insert range, no regular fallocate, no forgetting keep-space on +# zero range, no punching past EOD, no requests that aren't aligned +# with the logicalsector size, and make sure the fallbacks work for +# devices that don't support write_same or discard. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016 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 7 15 + +_cleanup() +{ + cd / + rm -rf $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/scsi_debug + +# real QA test starts here +_supported_os Linux +_require_scsi_debug +_require_xfs_io_command "falloc" +_require_xfs_io_command "finsert" +_require_xfs_io_command "fcollapse" +_require_xfs_io_command "fzero" +_require_xfs_io_command "fpunch" + + +echo "Create and format" +dev=$(_get_scsi_debug_dev 4096 4096 0 4 "lbpws=1 lbpws10=1") +_pwrite_byte 0x62 0 4m $dev >> $seqres.full +$XFS_IO_PROG -c "fsync" $dev + +echo "Regular fallocate" +$XFS_IO_PROG -c "falloc 64k 64k" $dev + +echo "Insert range" +$XFS_IO_PROG -c "finsert 128k 64k" $dev + +echo "Collapse range" +$XFS_IO_PROG -c "fcollapse 256k 64k" $dev + +echo "Zero range without keep_size" +$XFS_IO_PROG -c "fzero 384k 64k" $dev + +echo "Zero range past EOD" +$XFS_IO_PROG -c "fzero -k 3m 4m" $dev + +echo "Punch range past EOD" +$XFS_IO_PROG -c "fpunch 3m 4m" $dev + +echo "Unaligned zero range" +$XFS_IO_PROG -c "fzero -k 512 512" $dev + +echo "Unaligned punch" +$XFS_IO_PROG -c "fpunch 512 512" $dev + +echo "Check contents" +md5sum $dev | sed -e "s|$dev|SCSI_DEBUG_DEV|g" + +echo "Destroy device" +_put_scsi_debug_dev + +echo "Create w/o unmap or writesame and format" +dev=$(_get_scsi_debug_dev 512 512 0 4 "lbpws=0 lbpws10=0 lbpu=0 write_same_length=0 unmap_max_blocks=0") +_pwrite_byte 0x62 0 4m $dev >> $seqres.full +$XFS_IO_PROG -c "fsync" $dev + +echo "Zero punch, no fallback available" +$XFS_IO_PROG -c "fpunch 512k 512k" $dev + +echo "Zero range, write fallback" +$XFS_IO_PROG -c "fzero -k 1536k 512k" $dev + +echo "Check contents" +md5sum $dev | sed -e "s|$dev|SCSI_DEBUG_DEV|g" + +echo "Destroy device" +_put_scsi_debug_dev + +# success, all done +status=0 +exit diff --git a/tests/generic/707.out b/tests/generic/707.out new file mode 100644 index 0000000..a77e7e5 --- /dev/null +++ b/tests/generic/707.out @@ -0,0 +1,28 @@ +QA output created by 707 +Create and format +Regular fallocate +fallocate: Operation not supported +Insert range +fallocate: Operation not supported +Collapse range +fallocate: Operation not supported +Zero range without keep_size +fallocate: Operation not supported +Zero range past EOD +fallocate: Invalid argument +Punch range past EOD +fallocate: Invalid argument +Unaligned zero range +fallocate: Invalid argument +Unaligned punch +fallocate: Invalid argument +Check contents +b83f9394092e15bdcda585cd8e776dc6 SCSI_DEBUG_DEV +Destroy device +Create w/o unmap or writesame and format +Zero punch, no fallback available +fallocate: Operation not supported +Zero range, write fallback +Check contents +0fc6bc93cd0cd97e3cde5ea39ea1185d SCSI_DEBUG_DEV +Destroy device diff --git a/tests/generic/group b/tests/generic/group index 727648c..3d375b5 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -340,3 +340,6 @@ 335 auto quick metadata 336 auto quick metadata 337 auto quick metadata +705 auto quick rw +706 auto quick rw +707 auto quick rw From darrick.wong@oracle.com Fri Mar 4 19:16:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 67E317CA1 for ; Fri, 4 Mar 2016 19:16:06 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3A7D6304039 for ; Fri, 4 Mar 2016 17:16:03 -0800 (PST) X-ASG-Debug-ID: 1457140560-04cb6c5831193970001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id LkENikjDlPhV3c5l (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 17:16:01 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u251FYMM016093 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 5 Mar 2016 01:15:34 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u251FXLG030908 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 5 Mar 2016 01:15:33 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u251FV8Z017188; Sat, 5 Mar 2016 01:15:33 GMT Received: from localhost (/10.159.166.81) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 04 Mar 2016 17:15:31 -0800 Date: Fri, 4 Mar 2016 17:15:30 -0800 From: "Darrick J. Wong" To: david@fromorbit.com Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: [NOPATCH v5]: XFS reverse-mapping, reflink, and dedupe support Message-ID: <20160305011530.GG27973@birch.djwong.org> X-ASG-Orig-Subj: [NOPATCH v5]: XFS reverse-mapping, reflink, and dedupe support MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1457140561 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27588 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Hi all, Dave's started reviewing the rmap/reflink patches I sent him, and said he'll trickle the patches (with various edits) out to the mailing list as he gets to them. Therefore, I won't blast the mailing list with the kernel/xfsprogs patches that will soon be obsolete, though I will push out all the pending xfstests and xfsdocumentation fixes. I've also renamed the confusing 'for-dave' branches on github to 'rmap-reflink-devel' to make it clearer that it's just a development branch and not what I'm trying to get pushed upstream. Soooo... stuff I'm hoping to get upstream for 4.6: https://github.com/djwong/linux/tree/for-dave-for-4.6 https://github.com/djwong/xfsprogs/tree/for-dave-for-4.6 Stuff I hope to get upstream: https://github.com/djwong/xfs-documentation/tree/reflink-devel https://github.com/djwong/xfstests/tree/reflink-dev Development branch, not for upstream: https://github.com/djwong/linux/tree/rmap-reflink-devel https://github.com/djwong/xfsprogs/tree/rmap-reflink-devel I'm taking a break from active development for a week or two to concentrate on finding and fixing bugs. The content of the branches hasn't changed from a few days ago, so no need to re-pull if you just did. --D From Waiman.Long@hpe.com Fri Mar 4 20:52:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A83617CA0 for ; Fri, 4 Mar 2016 20:52:06 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7B1018F8040 for ; Fri, 4 Mar 2016 18:52:06 -0800 (PST) X-ASG-Debug-ID: 1457146323-04cb6c58331955e0001-NocioJ Received: from g2t4622.austin.hp.com (g2t4622.austin.hp.com [15.73.212.79]) by cuda.sgi.com with ESMTP id GmsjIkKEtQo1hcTh (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 18:52:04 -0800 (PST) X-Barracuda-Envelope-From: Waiman.Long@hpe.com X-Barracuda-Apparent-Source-IP: 15.73.212.79 Received: from g1t6217.austin.hpicorp.net (g1t6217.austin.hpicorp.net [15.67.1.144]) by g2t4622.austin.hp.com (Postfix) with ESMTP id 894BBF9; Sat, 5 Mar 2016 02:52:03 +0000 (UTC) Received: from RHEL65.localdomain (longwa3.americas.hpqcorp.net [16.214.147.243]) by g1t6217.austin.hpicorp.net (Postfix) with ESMTP id 40D325F; Sat, 5 Mar 2016 02:52:02 +0000 (UTC) From: Waiman Long To: Tejun Heo , Christoph Lameter , Dave Chinner Cc: xfs@oss.sgi.com, linux-kernel@vger.kernel.org, Ingo Molnar , Peter Zijlstra , Scott J Norton , Douglas Hatch , Waiman Long Subject: [RFC PATCH 2/2] xfs: Allow degeneration of m_fdblocks/m_ifree to global counters Date: Fri, 4 Mar 2016 21:51:39 -0500 X-ASG-Orig-Subj: [RFC PATCH 2/2] xfs: Allow degeneration of m_fdblocks/m_ifree to global counters Message-Id: <1457146299-1601-3-git-send-email-Waiman.Long@hpe.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1457146299-1601-1-git-send-email-Waiman.Long@hpe.com> References: <1457146299-1601-1-git-send-email-Waiman.Long@hpe.com> X-Barracuda-Connect: g2t4622.austin.hp.com[15.73.212.79] X-Barracuda-Start-Time: 1457146324 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27590 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Small XFS filesystems on systems with large number of CPUs can incur a significant overhead due to excessive calls to the percpu_counter_sum() function which needs to walk through a large number of different cachelines. This patch uses the newly added percpu_counter_set_limit() API to potentially switch the m_fdblocks and m_ifree per-cpu counters to a global counter with locks at filesystem mount time if its size is small relatively to the number of CPUs available. A possible use case is the use of the NVDIMM as an application scratch storage area for log file and other small files. Current battery-backed NVDIMMs are pretty small in size, e.g. 8G per DIMM. So we cannot create large filesystem on top of them. On a 4-socket 80-thread system running 4.5-rc6 kernel, this patch can improve the throughput of the AIM7 XFS disk workload by 25%. Before the patch, the perf profile was: 18.68% 0.08% reaim [k] __percpu_counter_compare 18.05% 9.11% reaim [k] __percpu_counter_sum 0.37% 0.36% reaim [k] __percpu_counter_add After the patch, the perf profile was: 0.73% 0.36% reaim [k] __percpu_counter_add 0.27% 0.27% reaim [k] __percpu_counter_compare Signed-off-by: Waiman Long --- fs/xfs/xfs_mount.c | 1 - fs/xfs/xfs_mount.h | 5 +++++ fs/xfs/xfs_super.c | 6 ++++++ 3 files changed, 11 insertions(+), 1 deletions(-) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index bb753b3..fe74b91 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1163,7 +1163,6 @@ xfs_mod_ifree( * a large batch count (1024) to minimise global counter updates except when * we get near to ENOSPC and we have to be very accurate with our updates. */ -#define XFS_FDBLOCKS_BATCH 1024 int xfs_mod_fdblocks( struct xfs_mount *mp, diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index b570984..d9520f4 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -206,6 +206,11 @@ typedef struct xfs_mount { #define XFS_WSYNC_WRITEIO_LOG 14 /* 16k */ /* + * FD blocks batch size for per-cpu compare + */ +#define XFS_FDBLOCKS_BATCH 1024 + +/* * Allow large block sizes to be reported to userspace programs if the * "largeio" mount option is used. * diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 59c9b7b..c0b4f79 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1412,6 +1412,12 @@ xfs_reinit_percpu_counters( percpu_counter_set(&mp->m_icount, mp->m_sb.sb_icount); percpu_counter_set(&mp->m_ifree, mp->m_sb.sb_ifree); percpu_counter_set(&mp->m_fdblocks, mp->m_sb.sb_fdblocks); + + /* + * Use default batch size for m_ifree + */ + percpu_counter_set_limit(&mp->m_ifree, 0); + percpu_counter_set_limit(&mp->m_fdblocks, 4 * XFS_FDBLOCKS_BATCH); } static void -- 1.7.1 From Waiman.Long@hpe.com Fri Mar 4 20:52:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D7EFC7CA2 for ; Fri, 4 Mar 2016 20:52:06 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id AB7FE304032 for ; Fri, 4 Mar 2016 18:52:03 -0800 (PST) X-ASG-Debug-ID: 1457146321-04cbb00b721c93b0001-NocioJ Received: from g1t6214.austin.hp.com (g1t6214.austin.hp.com [15.73.96.122]) by cuda.sgi.com with ESMTP id HBRFDNj7SyAlGtPY (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 18:52:01 -0800 (PST) X-Barracuda-Envelope-From: Waiman.Long@hpe.com X-Barracuda-Apparent-Source-IP: 15.73.96.122 Received: from g1t6217.austin.hpicorp.net (g1t6217.austin.hpicorp.net [15.67.1.144]) by g1t6214.austin.hp.com (Postfix) with ESMTP id 2D97BD2; Sat, 5 Mar 2016 02:52:00 +0000 (UTC) Received: from RHEL65.localdomain (longwa3.americas.hpqcorp.net [16.214.147.243]) by g1t6217.austin.hpicorp.net (Postfix) with ESMTP id DD6265F; Sat, 5 Mar 2016 02:51:57 +0000 (UTC) From: Waiman Long To: Tejun Heo , Christoph Lameter , Dave Chinner Cc: xfs@oss.sgi.com, linux-kernel@vger.kernel.org, Ingo Molnar , Peter Zijlstra , Scott J Norton , Douglas Hatch , Waiman Long Subject: [RFC PATCH 0/2] percpu_counter: Enable switching to global counter Date: Fri, 4 Mar 2016 21:51:37 -0500 X-ASG-Orig-Subj: [RFC PATCH 0/2] percpu_counter: Enable switching to global counter Message-Id: <1457146299-1601-1-git-send-email-Waiman.Long@hpe.com> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: g1t6214.austin.hp.com[15.73.96.122] X-Barracuda-Start-Time: 1457146321 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27590 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header This patchset allows the degeneration of per-cpu counters back to global counters when: 1) The number of CPUs in the system is large, hence a high cost for calling percpu_counter_sum(). 2) The initial count value is small so that it has a high chance of excessive percpu_counter_sum() calls. When the above 2 conditions are true, this patchset allows the user of per-cpu counters to selectively degenerate them into global counters with lock. This is done by calling the new percpu_counter_set_limit() API after percpu_counter_set(). Without this call, there is no change in the behavior of the per-cpu counters. Patch 1 implements the new percpu_counter_set_limit() API. Patch 2 modifies XFS to call the new API for the m_ifree and m_fdblocks per-cpu counters. Waiman Long (2): percpu_counter: Allow falling back to global counter on large system xfs: Allow degeneration of m_fdblocks/m_ifree to global counters fs/xfs/xfs_mount.c | 1 - fs/xfs/xfs_mount.h | 5 +++ fs/xfs/xfs_super.c | 6 +++ include/linux/percpu_counter.h | 10 +++++ lib/percpu_counter.c | 72 +++++++++++++++++++++++++++++++++++++++- 5 files changed, 92 insertions(+), 2 deletions(-) From Waiman.Long@hpe.com Fri Mar 4 20:52:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B6FA87CA1 for ; Fri, 4 Mar 2016 20:52:06 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5E4958F8039 for ; Fri, 4 Mar 2016 18:52:06 -0800 (PST) X-ASG-Debug-ID: 1457146323-04bdf002ee1bd6c0001-NocioJ Received: from g1t6220.austin.hp.com (g1t6220.austin.hp.com [15.73.96.84]) by cuda.sgi.com with ESMTP id qBx393gMBjT0043W (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 18:52:03 -0800 (PST) X-Barracuda-Envelope-From: Waiman.Long@hpe.com X-Barracuda-Apparent-Source-IP: 15.73.96.84 Received: from g1t6217.austin.hpicorp.net (g1t6217.austin.hpicorp.net [15.67.1.144]) by g1t6220.austin.hp.com (Postfix) with ESMTP id 4761D8F; Sat, 5 Mar 2016 02:52:02 +0000 (UTC) Received: from RHEL65.localdomain (longwa3.americas.hpqcorp.net [16.214.147.243]) by g1t6217.austin.hpicorp.net (Postfix) with ESMTP id 738BD69; Sat, 5 Mar 2016 02:52:00 +0000 (UTC) From: Waiman Long To: Tejun Heo , Christoph Lameter , Dave Chinner Cc: xfs@oss.sgi.com, linux-kernel@vger.kernel.org, Ingo Molnar , Peter Zijlstra , Scott J Norton , Douglas Hatch , Waiman Long Subject: [RFC PATCH 1/2] percpu_counter: Allow falling back to global counter on large system Date: Fri, 4 Mar 2016 21:51:38 -0500 X-ASG-Orig-Subj: [RFC PATCH 1/2] percpu_counter: Allow falling back to global counter on large system Message-Id: <1457146299-1601-2-git-send-email-Waiman.Long@hpe.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1457146299-1601-1-git-send-email-Waiman.Long@hpe.com> References: <1457146299-1601-1-git-send-email-Waiman.Long@hpe.com> X-Barracuda-Connect: g1t6220.austin.hp.com[15.73.96.84] X-Barracuda-Start-Time: 1457146323 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27590 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Per-cpu counters are used in quite a number of places within the kernel. On large system with a lot of CPUs, however, doing a percpu_counter_sum() can be very expensive as nr_cpu cachelines will need to be read. In __percpu_counter_compare(), the chance of calling percpu_counter_sum() also increases with increasing number of CPUs if the global counter value is relatively small. On large system, using a global counter with lock may actually be faster than doing a percpu_counter_sum() which can be frequently called from __percpu_counter_compare(). This patch provides a mechanism to selectively degenerate per-cpu counters to global counters at per-cpu counter initialization time. The following new API is added: percpu_counter_set_limit(struct percpu_counter *fbc, u32 percpu_limit) The function should be called after percpu_counter_set(). It will compare the total limit (nr_cpu * percpu_limit) against the current counter value. If the limit is not smaller, it will disable per-cpu counter and use only the global counter instead. At run time, when the counter value grows past the total limit, per-cpu counter will be enabled again. Runtime disabling of per-cpu counters, however, is not currently supported as it will slow down the per-cpu fast path. Signed-off-by: Waiman Long --- include/linux/percpu_counter.h | 10 +++++ lib/percpu_counter.c | 72 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 81 insertions(+), 1 deletions(-) diff --git a/include/linux/percpu_counter.h b/include/linux/percpu_counter.h index 84a1094..04a3783 100644 --- a/include/linux/percpu_counter.h +++ b/include/linux/percpu_counter.h @@ -16,8 +16,14 @@ #ifdef CONFIG_SMP +/* + * The per-cpu counter will be degenerated into a global counter when limit + * is set at initialization time. It will change back to a real per-cpu + * counter once the count exceed the given limit. + */ struct percpu_counter { raw_spinlock_t lock; + u32 limit; s64 count; #ifdef CONFIG_HOTPLUG_CPU struct list_head list; /* All percpu_counters are on a list */ @@ -42,6 +48,7 @@ void percpu_counter_set(struct percpu_counter *fbc, s64 amount); void __percpu_counter_add(struct percpu_counter *fbc, s64 amount, s32 batch); s64 __percpu_counter_sum(struct percpu_counter *fbc); int __percpu_counter_compare(struct percpu_counter *fbc, s64 rhs, s32 batch); +void percpu_counter_set_limit(struct percpu_counter *fbc, u32 percpu_limit); static inline int percpu_counter_compare(struct percpu_counter *fbc, s64 rhs) { @@ -170,6 +177,9 @@ static inline int percpu_counter_initialized(struct percpu_counter *fbc) return 1; } +static inline void percpu_counter_set_limit(struct percpu_counter *fbc, + u32 percpu_limit) { } + #endif /* CONFIG_SMP */ static inline void percpu_counter_inc(struct percpu_counter *fbc) diff --git a/lib/percpu_counter.c b/lib/percpu_counter.c index f051d69..f101c06 100644 --- a/lib/percpu_counter.c +++ b/lib/percpu_counter.c @@ -75,11 +75,25 @@ EXPORT_SYMBOL(percpu_counter_set); void __percpu_counter_add(struct percpu_counter *fbc, s64 amount, s32 batch) { s64 count; + unsigned long flags; + + if (fbc->limit) { + raw_spin_lock_irqsave(&fbc->lock, flags); + if (unlikely(!fbc->limit)) { + raw_spin_unlock_irqrestore(&fbc->lock, flags); + goto percpu_add; + } + fbc->count += amount; + if (abs(fbc->count) > fbc->limit) + fbc->limit = 0; /* Revert back to per-cpu counter */ + raw_spin_unlock_irqrestore(&fbc->lock, flags); + return; + } +percpu_add: preempt_disable(); count = __this_cpu_read(*fbc->counters) + amount; if (count >= batch || count <= -batch) { - unsigned long flags; raw_spin_lock_irqsave(&fbc->lock, flags); fbc->count += count; __this_cpu_sub(*fbc->counters, count - amount); @@ -94,6 +108,8 @@ EXPORT_SYMBOL(__percpu_counter_add); /* * Add up all the per-cpu counts, return the result. This is a more accurate * but much slower version of percpu_counter_read_positive() + * + * If a limit is set, the count can be returned directly without locking. */ s64 __percpu_counter_sum(struct percpu_counter *fbc) { @@ -101,6 +117,9 @@ s64 __percpu_counter_sum(struct percpu_counter *fbc) int cpu; unsigned long flags; + if (READ_ONCE(fbc->limit)) + return READ_ONCE(fbc->count); + raw_spin_lock_irqsave(&fbc->lock, flags); ret = fbc->count; for_each_online_cpu(cpu) { @@ -120,6 +139,7 @@ int __percpu_counter_init(struct percpu_counter *fbc, s64 amount, gfp_t gfp, raw_spin_lock_init(&fbc->lock); lockdep_set_class(&fbc->lock, key); fbc->count = amount; + fbc->limit = 0; fbc->counters = alloc_percpu_gfp(s32, gfp); if (!fbc->counters) return -ENOMEM; @@ -202,6 +222,9 @@ int __percpu_counter_compare(struct percpu_counter *fbc, s64 rhs, s32 batch) s64 count; count = percpu_counter_read(fbc); + if (READ_ONCE(fbc->limit)) + goto compare; + /* Check to see if rough count will be sufficient for comparison */ if (abs(count - rhs) > (batch * num_online_cpus())) { if (count > rhs) @@ -211,6 +234,7 @@ int __percpu_counter_compare(struct percpu_counter *fbc, s64 rhs, s32 batch) } /* Need to use precise count */ count = percpu_counter_sum(fbc); +compare: if (count > rhs) return 1; else if (count < rhs) @@ -220,6 +244,52 @@ int __percpu_counter_compare(struct percpu_counter *fbc, s64 rhs, s32 batch) } EXPORT_SYMBOL(__percpu_counter_compare); +/* + * Set the limit if the count is less than the given per-cpu limit * # of cpus. + * + * This function should only be called at initialization time right after + * percpu_counter_set(). Limit will only be set if there is more than + * 32 cpus in the system and the current counter value is not bigger than + * the limit. Once it is set, it can be cleared as soon as the counter + * value exceeds the given limit and real per-cpu counters are used again. + * However, switching from per-cpu counters back to global counter is not + * currently supported as that will slow down the per-cpu counter fastpath. + * + * The magic number 32 is chosen to be a compromise between the cost of + * reading all the per-cpu counters and that of locking. It can be changed + * if there is a better value. + */ +#define PERCPU_SET_LIMIT_CPU_THRESHOLD 32 +void percpu_counter_set_limit(struct percpu_counter *fbc, u32 percpu_limit) +{ + unsigned long flags; + int nrcpus = num_possible_cpus(); + u32 limit; + + if (nrcpus <= PERCPU_SET_LIMIT_CPU_THRESHOLD) + return; + + if (!fbc->count) { + WARN(1, "percpu_counter_set_limit() called without an initial counter value!\n"); + return; + } + /* + * Use default batch size if the given percpu limit is 0. + */ + if (!percpu_limit) + percpu_limit = percpu_counter_batch; + limit = percpu_limit * nrcpus; + + /* + * Limit will not be set if the count is large enough + */ + raw_spin_lock_irqsave(&fbc->lock, flags); + if (abs(fbc->count) <= limit) + fbc->limit = limit; + raw_spin_unlock_irqrestore(&fbc->lock, flags); +} +EXPORT_SYMBOL(percpu_counter_set_limit); + static int __init percpu_counter_startup(void) { compute_batch_value(); -- 1.7.1 From dchinner@redhat.com Sat Mar 5 00:35:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7709E7CA0 for ; Sat, 5 Mar 2016 00:35:00 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id F1AE3AC001 for ; Fri, 4 Mar 2016 22:34:56 -0800 (PST) X-ASG-Debug-ID: 1457159695-04bdf002ed1c2850001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id uKZEE01rfohXq7fv (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 04 Mar 2016 22:34:56 -0800 (PST) X-Barracuda-Envelope-From: dchinner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 6554ADB002; Sat, 5 Mar 2016 06:34:55 +0000 (UTC) Received: from devil.localdomain (ovpn-113-54.phx2.redhat.com [10.3.113.54]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u256YrZV028423 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sat, 5 Mar 2016 01:34:54 -0500 Received: from dchinner by devil.localdomain with local (Exim 4.76) (envelope-from ) id 1ac5nb-00071l-RP; Sat, 05 Mar 2016 17:34:47 +1100 Date: Sat, 5 Mar 2016 17:34:47 +1100 From: Dave Chinner To: Waiman Long Cc: Tejun Heo , Christoph Lameter , xfs@oss.sgi.com, linux-kernel@vger.kernel.org, Ingo Molnar , Peter Zijlstra , Scott J Norton , Douglas Hatch Subject: Re: [RFC PATCH 0/2] percpu_counter: Enable switching to global counter Message-ID: <20160305063447.GB2235@devil.localdomain> X-ASG-Orig-Subj: Re: [RFC PATCH 0/2] percpu_counter: Enable switching to global counter References: <1457146299-1601-1-git-send-email-Waiman.Long@hpe.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1457146299-1601-1-git-send-email-Waiman.Long@hpe.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Sat, 05 Mar 2016 06:34:55 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1457159695 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Mar 04, 2016 at 09:51:37PM -0500, Waiman Long wrote: > This patchset allows the degeneration of per-cpu counters back to > global counters when: > > 1) The number of CPUs in the system is large, hence a high cost for > calling percpu_counter_sum(). > 2) The initial count value is small so that it has a high chance of > excessive percpu_counter_sum() calls. > > When the above 2 conditions are true, this patchset allows the user of > per-cpu counters to selectively degenerate them into global counters > with lock. This is done by calling the new percpu_counter_set_limit() > API after percpu_counter_set(). Without this call, there is no change > in the behavior of the per-cpu counters. > > Patch 1 implements the new percpu_counter_set_limit() API. > > Patch 2 modifies XFS to call the new API for the m_ifree and m_fdblocks > per-cpu counters. > > Waiman Long (2): > percpu_counter: Allow falling back to global counter on large system > xfs: Allow degeneration of m_fdblocks/m_ifree to global counters NACK. This change to turns off per-counter free block counters for 32p for the XFS free block counters. We proved 10 years ago that a global lock for these counters was a massive scalability limitation for concurrent buffered writes on 16p machines. IOWs, this change is going to cause fast path concurrent sequential write regressions for just about everyone, even on empty filesystems. The behaviour you are seeing only occurs when the filesystem is near to ENOSPC. As i asked you last time - if you want to make this problem go away, please increase the size of the filesystem you are running your massively concurrent benchmarks on. IOWs, please stop trying to optimise a filesystem slow path that: a) 99.9% of production workloads never execute, b) where we expect performance to degrade as allocation gets computationally expensive as we close in on ENOSPC, c) we start to execute blocking data flush operations that slow everything down massively, and d) is indicative that the workload is about to suffer from a fatal, unrecoverable error (i.e. ENOSPC) Cheers, Dave. -- Dave Chinner dchinner@redhat.com From BATV+ab83588c3b37261f9506+4577+infradead.org+hch@bombadil.srs.infradead.org Sat Mar 5 12:25:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3437D7CA0 for ; Sat, 5 Mar 2016 12:25:18 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id EDD58304039 for ; Sat, 5 Mar 2016 10:25:14 -0800 (PST) X-ASG-Debug-ID: 1457202310-04bdf002ee1d3f40001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id KDXoNEzffd2K4CyO (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 05 Mar 2016 10:25:11 -0800 (PST) X-Barracuda-Envelope-From: BATV+ab83588c3b37261f9506+4577+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 1acGt2-0002I3-F3; Sat, 05 Mar 2016 18:25:08 +0000 Date: Sat, 5 Mar 2016 10:25:08 -0800 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 12/12] block: test fallocate for block devices Message-ID: <20160305182508.GA25528@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 12/12] block: test fallocate for block devices References: <20160305003717.28738.98818.stgit@birch.djwong.org> <20160305003837.28738.49794.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160305003837.28738.49794.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457202311 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27605 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS I'm not sure xfstests is the right fit, as it does not test a file system, but rather block devices. If people think it should go into xfstests we should at least not add it to the default group, but just to a new bdev group. From BATV+ab83588c3b37261f9506+4577+infradead.org+hch@bombadil.srs.infradead.org Sat Mar 5 12:27:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6C1DF7CA2 for ; Sat, 5 Mar 2016 12:27:27 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 30B2A304039 for ; Sat, 5 Mar 2016 10:27:27 -0800 (PST) X-ASG-Debug-ID: 1457202444-04bdf002ee1d3ff0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id WdPLt0aV4mqcE2tL (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 05 Mar 2016 10:27:24 -0800 (PST) X-Barracuda-Envelope-From: BATV+ab83588c3b37261f9506+4577+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 1acGvE-0002QC-9u; Sat, 05 Mar 2016 18:27:24 +0000 Date: Sat, 5 Mar 2016 10:27:24 -0800 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/4] xfs: debug mode forced buffered write failure Message-ID: <20160305182724.GA9171@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/4] xfs: debug mode forced buffered write failure References: <1457102431-5215-1-git-send-email-bfoster@redhat.com> <1457102431-5215-2-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1457102431-5215-2-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457202444 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/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=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27605 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+ab83588c3b37261f9506+4577+infradead.org+hch@bombadil.srs.infradead.org Sat Mar 5 14:10:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E84437CA4 for ; Sat, 5 Mar 2016 14:10:37 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id BA9D88F8035 for ; Sat, 5 Mar 2016 12:10:34 -0800 (PST) X-ASG-Debug-ID: 1457208630-04cb6c58301aabb0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id vUCtprJto1SWpW2W (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 05 Mar 2016 12:10:31 -0800 (PST) X-Barracuda-Envelope-From: BATV+ab83588c3b37261f9506+4577+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 1acIWy-0000MK-Ij; Sat, 05 Mar 2016 20:10:28 +0000 Date: Sat, 5 Mar 2016 12:10:28 -0800 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-ext4@vger.kernel.org, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 11/12] xfs: remove NOCOW_FL testing from test Message-ID: <20160305201028.GA28728@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 11/12] xfs: remove NOCOW_FL testing from test References: <20160305003717.28738.98818.stgit@birch.djwong.org> <20160305003830.28738.38711.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160305003830.28738.38711.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457208630 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/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=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27607 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+ab83588c3b37261f9506+4577+infradead.org+hch@bombadil.srs.infradead.org Sat Mar 5 14:10:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BB7B17CAF for ; Sat, 5 Mar 2016 14:10:53 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8CD03304039 for ; Sat, 5 Mar 2016 12:10:50 -0800 (PST) X-ASG-Debug-ID: 1457208648-04cb6c58311aabd0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 5pwLtc9xNAMFW60h (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 05 Mar 2016 12:10:48 -0800 (PST) X-Barracuda-Envelope-From: BATV+ab83588c3b37261f9506+4577+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 1acIXE-0000Oi-4v; Sat, 05 Mar 2016 20:10:44 +0000 Date: Sat, 5 Mar 2016 12:10:44 -0800 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-ext4@vger.kernel.org, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 08/12] xfs/122: define _GNU_SOURCE when compiling test program Message-ID: <20160305201044.GB28728@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 08/12] xfs/122: define _GNU_SOURCE when compiling test program References: <20160305003717.28738.98818.stgit@birch.djwong.org> <20160305003809.28738.85961.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160305003809.28738.85961.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457208648 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/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=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27607 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+ab83588c3b37261f9506+4577+infradead.org+hch@bombadil.srs.infradead.org Sat Mar 5 14:12:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 32AD27CA7 for ; Sat, 5 Mar 2016 14:12:14 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 06A5E8F8039 for ; Sat, 5 Mar 2016 12:12:13 -0800 (PST) X-ASG-Debug-ID: 1457208731-04cbb00b721e0c20001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 3vz7OkFmMfY4Xsdm (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 05 Mar 2016 12:12:12 -0800 (PST) X-Barracuda-Envelope-From: BATV+ab83588c3b37261f9506+4577+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 1acIYc-0000Wj-NS; Sat, 05 Mar 2016 20:12:10 +0000 Date: Sat, 5 Mar 2016 12:12:10 -0800 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-ext4@vger.kernel.org, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 09/12] xfs/122: support rmapxbt Message-ID: <20160305201210.GC28728@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 09/12] xfs/122: support rmapxbt References: <20160305003717.28738.98818.stgit@birch.djwong.org> <20160305003815.28738.81125.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160305003815.28738.81125.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457208732 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/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=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27607 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+ab83588c3b37261f9506+4577+infradead.org+hch@bombadil.srs.infradead.org Sat Mar 5 14:16:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7E0667CB1 for ; Sat, 5 Mar 2016 14:16:30 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 509D5304043 for ; Sat, 5 Mar 2016 12:16:30 -0800 (PST) X-ASG-Debug-ID: 1457208988-04cbb00b711e0d60001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id QBAtWxo9Td7PbdgK (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 05 Mar 2016 12:16:28 -0800 (PST) X-Barracuda-Envelope-From: BATV+ab83588c3b37261f9506+4577+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 1acIcl-0002p8-1y; Sat, 05 Mar 2016 20:16:27 +0000 Date: Sat, 5 Mar 2016 12:16:27 -0800 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-ext4@vger.kernel.org, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 01/12] xfs/207: fix golden output to match FS_IOC_FSSETXATTR hoist Message-ID: <20160305201627.GA10245@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 01/12] xfs/207: fix golden output to match FS_IOC_FSSETXATTR hoist References: <20160305003717.28738.98818.stgit@birch.djwong.org> <20160305003724.28738.94718.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160305003724.28738.94718.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457208988 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/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=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27607 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+ab83588c3b37261f9506+4577+infradead.org+hch@bombadil.srs.infradead.org Sat Mar 5 14:17:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EE36F7CB4 for ; Sat, 5 Mar 2016 14:17:24 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 724ECAC002 for ; Sat, 5 Mar 2016 12:17:21 -0800 (PST) X-ASG-Debug-ID: 1457209039-04cbb00b701e0d90001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id YsBLeGrLM7Bl9nte (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 05 Mar 2016 12:17:19 -0800 (PST) X-Barracuda-Envelope-From: BATV+ab83588c3b37261f9506+4577+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 1acIda-0003V2-90; Sat, 05 Mar 2016 20:17:18 +0000 Date: Sat, 5 Mar 2016 12:17:18 -0800 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-ext4@vger.kernel.org, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 02/12] xfs: test copy-on-write leftover recovery Message-ID: <20160305201718.GB10245@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 02/12] xfs: test copy-on-write leftover recovery References: <20160305003717.28738.98818.stgit@birch.djwong.org> <20160305003730.28738.33436.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160305003730.28738.33436.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457209039 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/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=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27607 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+ab83588c3b37261f9506+4577+infradead.org+hch@bombadil.srs.infradead.org Sat Mar 5 14:18:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BF6C57CB4 for ; Sat, 5 Mar 2016 14:18:02 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 75FAB8F8035 for ; Sat, 5 Mar 2016 12:18:02 -0800 (PST) X-ASG-Debug-ID: 1457209080-04bdf002ee1d6740001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 8sGKJZgUYHhl5VZF (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 05 Mar 2016 12:18:00 -0800 (PST) X-Barracuda-Envelope-From: BATV+ab83588c3b37261f9506+4577+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 1acIeF-0003hS-0H; Sat, 05 Mar 2016 20:17:59 +0000 Date: Sat, 5 Mar 2016 12:17:58 -0800 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-ext4@vger.kernel.org, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 03/12] reflink: fix fragmentation tests to work on >4k block size filesystems Message-ID: <20160305201758.GC10245@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 03/12] reflink: fix fragmentation tests to work on >4k block size filesystems References: <20160305003717.28738.98818.stgit@birch.djwong.org> <20160305003737.28738.35234.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160305003737.28738.35234.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457209080 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/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=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27607 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+ab83588c3b37261f9506+4577+infradead.org+hch@bombadil.srs.infradead.org Sat Mar 5 14:19:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4ABE87CB6 for ; Sat, 5 Mar 2016 14:19:14 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B4CEBAC003 for ; Sat, 5 Mar 2016 12:19:13 -0800 (PST) X-ASG-Debug-ID: 1457209151-04cbb00b6f1e0e10001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id KCbCXZI1TvZ1rXTi (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 05 Mar 2016 12:19:11 -0800 (PST) X-Barracuda-Envelope-From: BATV+ab83588c3b37261f9506+4577+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 1acIfN-0004C9-UP; Sat, 05 Mar 2016 20:19:09 +0000 Date: Sat, 5 Mar 2016 12:19:09 -0800 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-ext4@vger.kernel.org, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 04/12] xfs/23[3-6]: don't source common/xfs, it doesn't exist Message-ID: <20160305201909.GD10245@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 04/12] xfs/23[3-6]: don't source common/xfs, it doesn't exist References: <20160305003717.28738.98818.stgit@birch.djwong.org> <20160305003743.28738.8245.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160305003743.28738.8245.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457209151 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27607 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, Mar 04, 2016 at 04:37:43PM -0800, Darrick J. Wong wrote: > Don't source common/xfs, since it doesn't (yet) exist. Heh. Wonder how they ever worked before.. (they probably didn't, and I didn't notice as I never ran with rmapbt) Reviewed-by: Christoph Hellwig From BATV+ab83588c3b37261f9506+4577+infradead.org+hch@bombadil.srs.infradead.org Sat Mar 5 14:19:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 14E0B7CBB for ; Sat, 5 Mar 2016 14:19:43 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CE2768F8033 for ; Sat, 5 Mar 2016 12:19:42 -0800 (PST) X-ASG-Debug-ID: 1457209181-04bdf002eb1d67b0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id ABqXtpYOLBbpF972 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 05 Mar 2016 12:19:41 -0800 (PST) X-Barracuda-Envelope-From: BATV+ab83588c3b37261f9506+4577+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 1acIfr-0004Hk-So; Sat, 05 Mar 2016 20:19:39 +0000 Date: Sat, 5 Mar 2016 12:19:39 -0800 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-ext4@vger.kernel.org, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 05/12] xfs/206: fix output when mkfs knows about reflink Message-ID: <20160305201939.GE10245@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 05/12] xfs/206: fix output when mkfs knows about reflink References: <20160305003717.28738.98818.stgit@birch.djwong.org> <20160305003750.28738.48204.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160305003750.28738.48204.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457209181 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/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=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27607 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+ab83588c3b37261f9506+4577+infradead.org+hch@bombadil.srs.infradead.org Sat Mar 5 14:20:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C1C777CA2 for ; Sat, 5 Mar 2016 14:20:53 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 51675AC001 for ; Sat, 5 Mar 2016 12:20:53 -0800 (PST) X-ASG-Debug-ID: 1457209251-04bdf002eb1d67f0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id YukahjuN0avk6Vzr (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 05 Mar 2016 12:20:51 -0800 (PST) X-Barracuda-Envelope-From: BATV+ab83588c3b37261f9506+4577+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 1acIh0-0005hV-BM; Sat, 05 Mar 2016 20:20:50 +0000 Date: Sat, 5 Mar 2016 12:20:50 -0800 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-ext4@vger.kernel.org, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 06/12] xfs/030: fix output on newer filesystems Message-ID: <20160305202050.GF10245@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 06/12] xfs/030: fix output on newer filesystems References: <20160305003717.28738.98818.stgit@birch.djwong.org> <20160305003756.28738.26362.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160305003756.28738.26362.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457209251 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27607 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Still fails for me: --- tests/xfs/030.out 2016-03-03 07:55:58.556427678 +0000 +++ /root/xfstests/results//xfs/030.out.bad 2016-03-05 20:20:17.561433837 +0000 @@ -231,8 +231,6 @@ bad agbno AGBNO in agfl, agno 0 bad agbno AGBNO in agfl, agno 0 bad agbno AGBNO in agfl, agno 0 -bad agbno AGBNO in agfl, agno 0 -bad agbno AGBNO in agfl, agno 0 - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... From BATV+ab83588c3b37261f9506+4577+infradead.org+hch@bombadil.srs.infradead.org Sat Mar 5 14:22:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 233AB7CA7 for ; Sat, 5 Mar 2016 14:22:22 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DB24230404E for ; Sat, 5 Mar 2016 12:22:21 -0800 (PST) X-ASG-Debug-ID: 1457209340-04cbb00b711e0ee0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id gZhVRUGmICEN4m6E (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 05 Mar 2016 12:22:20 -0800 (PST) X-Barracuda-Envelope-From: BATV+ab83588c3b37261f9506+4577+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 1acIiQ-0005md-Pb; Sat, 05 Mar 2016 20:22:18 +0000 Date: Sat, 5 Mar 2016 12:22:18 -0800 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-ext4@vger.kernel.org, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 07/12] xfs/073: fix output Message-ID: <20160305202218.GG10245@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 07/12] xfs/073: fix output References: <20160305003717.28738.98818.stgit@birch.djwong.org> <20160305003803.28738.34407.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160305003803.28738.34407.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457209340 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27607 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Fixes one warning for my config, but adds two new ones (see below). Looks like we need to do some better feature detection. --- tests/xfs/073.out 2016-03-03 07:55:58.556427678 +0000 +++ /root/xfstests/results//xfs/073.out.bad 2016-03-05 20:21:07.368100504 +0000 @@ -1,6 +1,4 @@ QA output created by 073 -warning: finobt not supported without CRC support, disabled. -warning: rmapbt not supported without CRC support, disabled. warning: reflink not supported without CRC support, disabled. meta-data=DDEV isize=XXX agcount=N, agsize=XXX blks data = bsize=XXX blocks=XXX, imaxpct=PCT @@ -38,6 +36,7 @@ unmounting and removing new image === copying scratch device to single target, large ro device +warning: reflink not supported without CRC support, disabled. meta-data=DDEV isize=XXX agcount=N, agsize=XXX blks data = bsize=XXX blocks=XXX, imaxpct=PCT = sunit=XXX swidth=XXX, unwritten=X @@ -51,6 +50,7 @@ checking new image mounting new image on loopback comparing new image files to old +File /mnt/test/23382.source_dir/xfstests/dev is a block special file while file /mnt/test/23382.loop/xfstests/dev is a block special file comparing new image directories to old comparing new image geometry to old unmounting and removing new image From BATV+ab83588c3b37261f9506+4577+infradead.org+hch@bombadil.srs.infradead.org Sat Mar 5 14:23:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 90A207CA7 for ; Sat, 5 Mar 2016 14:23:08 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 55A6B8F8033 for ; Sat, 5 Mar 2016 12:23:08 -0800 (PST) X-ASG-Debug-ID: 1457209387-04bdf002eb1d6890001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id T5gtMMNpY5AZuSOE (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 05 Mar 2016 12:23:07 -0800 (PST) X-Barracuda-Envelope-From: BATV+ab83588c3b37261f9506+4577+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 1acIj9-0005oi-4V; Sat, 05 Mar 2016 20:23:03 +0000 Date: Sat, 5 Mar 2016 12:23:03 -0800 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, fstests@vger.kernel.org, linux-ext4@vger.kernel.org, Christoph Hellwig , linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 10/12] xfs: test per-ag allocation accounting during truncate-caused refcountbt expansion Message-ID: <20160305202303.GH10245@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 10/12] xfs: test per-ag allocation accounting during truncate-caused refcountbt expansion References: <20160305003717.28738.98818.stgit@birch.djwong.org> <20160305003822.28738.53832.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160305003822.28738.53832.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457209387 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/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=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27607 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+ab83588c3b37261f9506+4577+infradead.org+hch@bombadil.srs.infradead.org Sat Mar 5 14:25:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C449B7CA7 for ; Sat, 5 Mar 2016 14:25:06 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 865478F8039 for ; Sat, 5 Mar 2016 12:25:06 -0800 (PST) X-ASG-Debug-ID: 1457209504-04bdf002eb1d6940001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id Vok9D1hWnYxozPR7 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 05 Mar 2016 12:25:04 -0800 (PST) X-Barracuda-Envelope-From: BATV+ab83588c3b37261f9506+4577+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 1acIl4-0006JA-Vp; Sat, 05 Mar 2016 20:25:02 +0000 Date: Sat, 5 Mar 2016 12:25:02 -0800 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-ext4@vger.kernel.org, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: [PATCH 13/12] xfs/209: filter scratch dir properly Message-ID: <20160305202502.GI10245@infradead.org> X-ASG-Orig-Subj: [PATCH 13/12] xfs/209: filter scratch dir properly References: <20160305003717.28738.98818.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160305003717.28738.98818.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457209504 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27607 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Signed-off-by: Christoph Hellwig diff --git a/tests/xfs/209 b/tests/xfs/209 index cecd9c7..9bf1f12 100755 --- a/tests/xfs/209 +++ b/tests/xfs/209 @@ -73,7 +73,7 @@ echo "Check cowextsize settings" seq 1 2 | while read nr; do seq 1 4 | while read nnr; do file="$testdir/dir-$nr/file-$nnr" - $XFS_IO_PROG -c "cowextsize" $file + $XFS_IO_PROG -c "cowextsize" $file | _filter_scratch done done diff --git a/tests/xfs/209.out b/tests/xfs/209.out index 109af34..b97fa96 100644 --- a/tests/xfs/209.out +++ b/tests/xfs/209.out @@ -3,11 +3,11 @@ Format and mount Set extsz and cowextsz on directory Create a fake tree structure Check cowextsize settings -[1048576] /opt/test-209/dir-1/file-1 -[1048576] /opt/test-209/dir-1/file-2 -[1048576] /opt/test-209/dir-1/file-3 -[1048576] /opt/test-209/dir-1/file-4 -[1048576] /opt/test-209/dir-2/file-1 -[1048576] /opt/test-209/dir-2/file-2 -[1048576] /opt/test-209/dir-2/file-3 -[1048576] /opt/test-209/dir-2/file-4 +[1048576] SCRATCH_MNT/test-209/dir-1/file-1 +[1048576] SCRATCH_MNT/test-209/dir-1/file-2 +[1048576] SCRATCH_MNT/test-209/dir-1/file-3 +[1048576] SCRATCH_MNT/test-209/dir-1/file-4 +[1048576] SCRATCH_MNT/test-209/dir-2/file-1 +[1048576] SCRATCH_MNT/test-209/dir-2/file-2 +[1048576] SCRATCH_MNT/test-209/dir-2/file-3 +[1048576] SCRATCH_MNT/test-209/dir-2/file-4 From BATV+ab83588c3b37261f9506+4577+infradead.org+hch@bombadil.srs.infradead.org Sat Mar 5 14:34:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CC20E7F51 for ; Sat, 5 Mar 2016 14:34:51 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8D4AE8F8035 for ; Sat, 5 Mar 2016 12:34:51 -0800 (PST) X-ASG-Debug-ID: 1457210089-04cbb00b711e11e0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id eUzQFLYsAxt50JPn (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 05 Mar 2016 12:34:49 -0800 (PST) X-Barracuda-Envelope-From: BATV+ab83588c3b37261f9506+4577+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 1acIuW-0001JR-A4; Sat, 05 Mar 2016 20:34:48 +0000 Date: Sat, 5 Mar 2016 12:34:48 -0800 From: Christoph Hellwig To: "Darrick J. Wong" Cc: hch@infradead.org, david@fromorbit.com, xfs@oss.sgi.com Subject: Re: [PATCH 1/6] xfsdocs: document known testing procedures Message-ID: <20160305203448.GA4989@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/6] xfsdocs: document known testing procedures References: <20160305003505.28327.95288.stgit@birch.djwong.org> <20160305003511.28327.61259.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160305003511.28327.61259.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457210089 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/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=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27607 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+ab83588c3b37261f9506+4577+infradead.org+hch@bombadil.srs.infradead.org Sat Mar 5 14:36:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5743C7F51 for ; Sat, 5 Mar 2016 14:36:59 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 27F80304039 for ; Sat, 5 Mar 2016 12:36:59 -0800 (PST) X-ASG-Debug-ID: 1457210217-04cb6c58301ab850001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 5ZRX5Dpr6jewwVK7 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 05 Mar 2016 12:36:57 -0800 (PST) X-Barracuda-Envelope-From: BATV+ab83588c3b37261f9506+4577+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 1acIwa-0002Wt-NF; Sat, 05 Mar 2016 20:36:56 +0000 Date: Sat, 5 Mar 2016 12:36:56 -0800 From: Christoph Hellwig To: "Darrick J. Wong" Cc: hch@infradead.org, david@fromorbit.com, xfs@oss.sgi.com Subject: Re: [PATCH 2/6] xfsdocs: update the on-disk format with changes for Linux 4.5 Message-ID: <20160305203656.GB4989@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/6] xfsdocs: update the on-disk format with changes for Linux 4.5 References: <20160305003505.28327.95288.stgit@birch.djwong.org> <20160305003518.28327.15601.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160305003518.28327.15601.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457210217 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27607 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > -The inode's core is 96 bytes in size and contains information about the file > +The inode's core is 176 bytes in size and contains information about the file maybe this should read "96 or 176 bytes in size" From BATV+ab83588c3b37261f9506+4577+infradead.org+hch@bombadil.srs.infradead.org Sat Mar 5 14:38:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C808C7F55 for ; Sat, 5 Mar 2016 14:38:14 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8DB04304043 for ; Sat, 5 Mar 2016 12:38:14 -0800 (PST) X-ASG-Debug-ID: 1457210292-04cb6c58311ab8b0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id pZmtZrJfEJSmS2tE (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 05 Mar 2016 12:38:13 -0800 (PST) X-Barracuda-Envelope-From: BATV+ab83588c3b37261f9506+4577+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 1acIxm-0002b5-LB; Sat, 05 Mar 2016 20:38:10 +0000 Date: Sat, 5 Mar 2016 12:38:10 -0800 From: Christoph Hellwig To: "Darrick J. Wong" Cc: hch@infradead.org, david@fromorbit.com, darrick.wong@oracle.com, xfs@oss.sgi.com Subject: Re: [PATCH 3/6] xfsdocs: move the discussions of short and long format btrees to a separate chapter Message-ID: <20160305203810.GC4989@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 3/6] xfsdocs: move the discussions of short and long format btrees to a separate chapter References: <20160305003505.28327.95288.stgit@birch.djwong.org> <20160305003524.28327.95523.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160305003524.28327.95523.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457210292 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/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=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27607 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+ab83588c3b37261f9506+4577+infradead.org+hch@bombadil.srs.infradead.org Sat Mar 5 14:45:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AB4297F58 for ; Sat, 5 Mar 2016 14:45:20 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6B0758F8039 for ; Sat, 5 Mar 2016 12:45:20 -0800 (PST) X-ASG-Debug-ID: 1457210718-04cbb00b721e1440001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id vfu5QyO6sw0DKPSq (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 05 Mar 2016 12:45:18 -0800 (PST) X-Barracuda-Envelope-From: BATV+ab83588c3b37261f9506+4577+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 1acJ4f-0005qe-QL; Sat, 05 Mar 2016 20:45:17 +0000 Date: Sat, 5 Mar 2016 12:45:17 -0800 From: Christoph Hellwig To: Eryu Guan Cc: fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs/259: disable CRC if testing with 512 bytes block size Message-ID: <20160305204517.GA10065@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs/259: disable CRC if testing with 512 bytes block size References: <1456937518-20505-1-git-send-email-eguan@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1456937518-20505-1-git-send-email-eguan@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457210718 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27607 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS This will force crcs off for all the blocksizes. We should either always skip 512 bytes, or disable crcs only for the 512 byte inode size case. The first seems either, but the second would give better test coverage. From david@fromorbit.com Sat Mar 5 16:49:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=unavailable version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9A13B7F5D for ; Sat, 5 Mar 2016 16:49:01 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 01D42AC003 for ; Sat, 5 Mar 2016 14:48:57 -0800 (PST) X-ASG-Debug-ID: 1457218127-04cbb00b701e3a20001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id kIMtthrPHawDnnHa; Sat, 05 Mar 2016 14:48:47 -0800 (PST) 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: A2BWDgAFYdtWOVEqLHldKAECgw+BP4Jtg3mfdQEBAQEBAQaLfYVJhAqGCQICAQECgR5NAQEBAQEBBwEBAQFAAUBBEgGDbgEBBB4cHCMQCAMOCgklDwUlAwcaE4ghvyABAQEBBgIBHRiFN4UFg38ChHMBBIdbhVWJeo1jgW2HaYUuRI4RgmUZFIFIKC6HF4IpAQEB Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl2.internode.on.net with ESMTP; 06 Mar 2016 09:18:45 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1acL09-0007QU-2j; Sun, 06 Mar 2016 09:48:45 +1100 Date: Sun, 6 Mar 2016 09:48:45 +1100 From: Dave Chinner To: Brian Foster Cc: Stefan Priebe , linux-fsdevel@vger.kernel.org, "xfs-masters@oss.sgi.com" , "xfs@oss.sgi.com" Subject: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage Message-ID: <20160305224845.GR30721@dastard> X-ASG-Orig-Subj: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage References: <56C81D94.7090603@profihost.ag> <20160220144533.GA36182@bfoster.bfoster> <56D9D834.2000303@profihost.ag> <20160304191329.GC3758@bfoster.bfoster> <56D9E9BE.40101@profihost.ag> <20160304210341.GA8035@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160304210341.GA8035@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: 1457218127 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27608 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Mar 04, 2016 at 04:03:42PM -0500, Brian Foster wrote: > On Fri, Mar 04, 2016 at 09:02:06PM +0100, Stefan Priebe wrote: > > Am 04.03.2016 um 20:13 schrieb Brian Foster: > > >On Fri, Mar 04, 2016 at 07:47:16PM +0100, Stefan Priebe wrote: > > >>Am 20.02.2016 um 19:02 schrieb Stefan Priebe - Profihost AG: > > >>> > > >>>>Am 20.02.2016 um 15:45 schrieb Brian Foster : > > >>>> > > >>>>>On Sat, Feb 20, 2016 at 09:02:28AM +0100, Stefan Priebe wrote: > > >>>>>Hi, > > >>>>> > > >>>>>got this one today. Not sure if this is a bug. > > >>>> > > >>>>That looks like the releasepage() delayed allocation block warning. I'm > > >>>>not sure we've had any fixes for (or reports of) that issue since the > > >>>>v4.2 timeframe. > > >>>> > > >>>>What is the xfs_info of the associated filesystem? Also, do you have any > > >>>>insight as to the possible reproducer application or workload? Is this > > >>>>reproducible at all? Note that this is a WARN_ON_ONCE(), so the warning > > >>>>won't fire again regardless until after a reboot. > > >> > > >>Toda i got this one running 4.3.3. > > >> > > >>[154152.949610] ------------[ cut here ]------------ > > >>[154152.950704] WARNING: CPU: 0 PID: 79 at fs/xfs/xfs_aops.c:1232 > > >>xfs_vm_releasepage+0xc3/0xf0() > > >>[154152.952596] Modules linked in: netconsole mpt3sas raid_class > > >>nf_conntrack_ipv4 nf_defrag_ipv4 xt_state nf_conntrack xt_tcpudp ipt_REJECT > > >>nf_reject_ipv4 xt_owner xt_multiport iptable_filter ip_tables x_tables 8021q > > >>garp coretemp k8temp ehci_pci ehci_hcd sb_edac ipmi_si usbcore edac_core > > >>ipmi_msghandler i2c_i801 usb_common button btrfs xor raid6_pq sg igb sd_mod > > >>i2c_algo_bit isci i2c_core libsas ahci ptp libahci scsi_transport_sas > > >>megaraid_sas pps_core > > >>[154152.963240] CPU: 0 PID: 79 Comm: kswapd0 Not tainted 4.4.3+3-ph #1 > > >>[154152.964625] Hardware name: Supermicro > > >>X9SRE/X9SRE-3F/X9SRi/X9SRi-3F/X9SRE/X9SRE-3F/X9SRi/X9SRi-3F, BIOS 1.0a > > >>03/06/2012 > > >>[154152.967029] 0000000000000000 ffff88103dd67a98 ffffffffa73c3b5f > > >>0000000000000000 > > >>[154152.968836] ffffffffa7a5063b ffff88103dd67ad8 ffffffffa7083757 > > >>0000000000000000 > > >>[154152.970641] 0000000000000001 ffffea0001e7bfc0 ffff88071ef72dd0 > > >>ffffea0001e7bfe0 > > >>[154152.972447] Call Trace: > > >>[154152.973011] [] dump_stack+0x63/0x84 > > >>[154152.974167] [] warn_slowpath_common+0x97/0xe0 > > >>[154152.975515] [] warn_slowpath_null+0x1a/0x20 > > >>[154152.976826] [] xfs_vm_releasepage+0xc3/0xf0 > > >>[154152.978137] [] try_to_release_page+0x32/0x50 > > >>[154152.979467] [] shrink_active_list+0x3ce/0x3e0 > > >>[154152.980816] [] shrink_lruvec+0x687/0x7d0 > > >>[154152.982068] [] shrink_zone+0xdc/0x2c0 > > >>[154152.983262] [] kswapd+0x4f9/0x970 > > >>[154152.984380] [] ? > > >>mem_cgroup_shrink_node_zone+0x1a0/0x1a0 > > >>[154152.985942] [] kthread+0xc9/0xe0 > > >>[154152.987040] [] ? kthread_stop+0x100/0x100 > > >>[154152.988313] [] ret_from_fork+0x3f/0x70 > > >>[154152.989527] [] ? kthread_stop+0x100/0x100 > > >>[154152.990818] ---[ end trace 3fac2515e92c7cb1 ]--- > > >> > > >>This time with an xfs info: > > >># xfs_info / > > >>meta-data=/dev/disk/by-uuid/9befe321-e9cc-4e31-82df-efabb3211bac isize=256 > > >>agcount=4, agsize=58224256 blks > > >> = sectsz=512 attr=2, projid32bit=0 > > >> = crc=0 finobt=0 > > >>data = bsize=4096 blocks=232897024, imaxpct=25 > > >> = sunit=64 swidth=384 blks > > >>naming =version 2 bsize=4096 ascii-ci=0 ftype=0 > > >>log =internal bsize=4096 blocks=113728, version=2 > > >> = sectsz=512 sunit=64 blks, lazy-count=1 > > >>realtime =none extsz=4096 blocks=0, rtextents=0 > > >> > > > > > >Can you describe the workload to the filesystem? > > > > At the time of this trace the rsync backup of the fs has started. So the > > workload was going from nearly idle to 4000 iop/s read at 60 MB/s peak. > > > > Interesting. The warning is associated with releasing a page that has a > delayed allocation when it shouldn't. That means something had written > to a file to cause the delalloc in the first place. Any idea what could > have been writing at the time or shortly before the rsync read workload > had kicked in? It's memory reclaim that tripped over it, so the cause is long gone - couple have been anything in the previous 24 hours that caused the issue. i.e. rsync has triggered memory reclaim which triggered the warning, but I don't think rsync has anything to do with causing the page to be in a state that caused the warning. I'd be interested to know if there are any other warnings in the logs - stuff like IO errors, page discards, ENOSPC issues, etc that could trigger less travelled write error paths... -Dave. -- Dave Chinner david@fromorbit.com From s.priebe@profihost.ag Sat Mar 5 16:58:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=unavailable version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CE5567F5E for ; Sat, 5 Mar 2016 16:58:09 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 52188AC003 for ; Sat, 5 Mar 2016 14:58:09 -0800 (PST) X-ASG-Debug-ID: 1457218684-04bdf002ed1d98e0001-NocioJ Received: from mail-ph.de-nserver.de (mail-ph.de-nserver.de [85.158.179.214]) by cuda.sgi.com with ESMTP id PVltm8djZ4ETIOX3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 05 Mar 2016 14:58:06 -0800 (PST) X-Barracuda-Envelope-From: s.priebe@profihost.ag X-Barracuda-Apparent-Source-IP: 85.158.179.214 Received: (qmail 2017 invoked from network); 5 Mar 2016 23:58:04 +0100 X-Fcrdns: No Received: from phoffice.de-nserver.de (HELO [10.242.2.6]) (185.39.223.5) (smtp-auth username s.priebe@profihost.ag, mechanism plain) by mail-ph.de-nserver.de (qpsmtpd/0.92) with (ECDHE-RSA-AES256-SHA encrypted) ESMTPSA; Sat, 05 Mar 2016 23:58:04 +0100 Subject: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage To: Dave Chinner , Brian Foster X-ASG-Orig-Subj: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage References: <56C81D94.7090603@profihost.ag> <20160220144533.GA36182@bfoster.bfoster> <56D9D834.2000303@profihost.ag> <20160304191329.GC3758@bfoster.bfoster> <56D9E9BE.40101@profihost.ag> <20160304210341.GA8035@bfoster.bfoster> <20160305224845.GR30721@dastard> Cc: linux-fsdevel@vger.kernel.org, "xfs-masters@oss.sgi.com" , "xfs@oss.sgi.com" From: Stefan Priebe Message-ID: <56DB649D.7030502@profihost.ag> Date: Sat, 5 Mar 2016 23:58:37 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <20160305224845.GR30721@dastard> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-User-Auth: Auth by s.priebe@profihost.ag through 185.39.223.5 X-Barracuda-Connect: mail-ph.de-nserver.de[85.158.179.214] X-Barracuda-Start-Time: 1457218685 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27608 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Am 05.03.2016 um 23:48 schrieb Dave Chinner: > On Fri, Mar 04, 2016 at 04:03:42PM -0500, Brian Foster wrote: >> On Fri, Mar 04, 2016 at 09:02:06PM +0100, Stefan Priebe wrote: >>> Am 04.03.2016 um 20:13 schrieb Brian Foster: >>>> On Fri, Mar 04, 2016 at 07:47:16PM +0100, Stefan Priebe wrote: >>>>> Am 20.02.2016 um 19:02 schrieb Stefan Priebe - Profihost AG: >>>>>> >>>>>>> Am 20.02.2016 um 15:45 schrieb Brian Foster : >>>>>>> >>>>>>>> On Sat, Feb 20, 2016 at 09:02:28AM +0100, Stefan Priebe wrote: >>>>>>>> Hi, >>>>>>>> >>>>>>>> got this one today. Not sure if this is a bug. >>>>>>> >>>>>>> That looks like the releasepage() delayed allocation block warning. I'm >>>>>>> not sure we've had any fixes for (or reports of) that issue since the >>>>>>> v4.2 timeframe. >>>>>>> >>>>>>> What is the xfs_info of the associated filesystem? Also, do you have any >>>>>>> insight as to the possible reproducer application or workload? Is this >>>>>>> reproducible at all? Note that this is a WARN_ON_ONCE(), so the warning >>>>>>> won't fire again regardless until after a reboot. >>>>> >>>>> Toda i got this one running 4.3.3. >>>>> >>>>> [154152.949610] ------------[ cut here ]------------ >>>>> [154152.950704] WARNING: CPU: 0 PID: 79 at fs/xfs/xfs_aops.c:1232 >>>>> xfs_vm_releasepage+0xc3/0xf0() >>>>> [154152.952596] Modules linked in: netconsole mpt3sas raid_class >>>>> nf_conntrack_ipv4 nf_defrag_ipv4 xt_state nf_conntrack xt_tcpudp ipt_REJECT >>>>> nf_reject_ipv4 xt_owner xt_multiport iptable_filter ip_tables x_tables 8021q >>>>> garp coretemp k8temp ehci_pci ehci_hcd sb_edac ipmi_si usbcore edac_core >>>>> ipmi_msghandler i2c_i801 usb_common button btrfs xor raid6_pq sg igb sd_mod >>>>> i2c_algo_bit isci i2c_core libsas ahci ptp libahci scsi_transport_sas >>>>> megaraid_sas pps_core >>>>> [154152.963240] CPU: 0 PID: 79 Comm: kswapd0 Not tainted 4.4.3+3-ph #1 >>>>> [154152.964625] Hardware name: Supermicro >>>>> X9SRE/X9SRE-3F/X9SRi/X9SRi-3F/X9SRE/X9SRE-3F/X9SRi/X9SRi-3F, BIOS 1.0a >>>>> 03/06/2012 >>>>> [154152.967029] 0000000000000000 ffff88103dd67a98 ffffffffa73c3b5f >>>>> 0000000000000000 >>>>> [154152.968836] ffffffffa7a5063b ffff88103dd67ad8 ffffffffa7083757 >>>>> 0000000000000000 >>>>> [154152.970641] 0000000000000001 ffffea0001e7bfc0 ffff88071ef72dd0 >>>>> ffffea0001e7bfe0 >>>>> [154152.972447] Call Trace: >>>>> [154152.973011] [] dump_stack+0x63/0x84 >>>>> [154152.974167] [] warn_slowpath_common+0x97/0xe0 >>>>> [154152.975515] [] warn_slowpath_null+0x1a/0x20 >>>>> [154152.976826] [] xfs_vm_releasepage+0xc3/0xf0 >>>>> [154152.978137] [] try_to_release_page+0x32/0x50 >>>>> [154152.979467] [] shrink_active_list+0x3ce/0x3e0 >>>>> [154152.980816] [] shrink_lruvec+0x687/0x7d0 >>>>> [154152.982068] [] shrink_zone+0xdc/0x2c0 >>>>> [154152.983262] [] kswapd+0x4f9/0x970 >>>>> [154152.984380] [] ? >>>>> mem_cgroup_shrink_node_zone+0x1a0/0x1a0 >>>>> [154152.985942] [] kthread+0xc9/0xe0 >>>>> [154152.987040] [] ? kthread_stop+0x100/0x100 >>>>> [154152.988313] [] ret_from_fork+0x3f/0x70 >>>>> [154152.989527] [] ? kthread_stop+0x100/0x100 >>>>> [154152.990818] ---[ end trace 3fac2515e92c7cb1 ]--- >>>>> >>>>> This time with an xfs info: >>>>> # xfs_info / >>>>> meta-data=/dev/disk/by-uuid/9befe321-e9cc-4e31-82df-efabb3211bac isize=256 >>>>> agcount=4, agsize=58224256 blks >>>>> = sectsz=512 attr=2, projid32bit=0 >>>>> = crc=0 finobt=0 >>>>> data = bsize=4096 blocks=232897024, imaxpct=25 >>>>> = sunit=64 swidth=384 blks >>>>> naming =version 2 bsize=4096 ascii-ci=0 ftype=0 >>>>> log =internal bsize=4096 blocks=113728, version=2 >>>>> = sectsz=512 sunit=64 blks, lazy-count=1 >>>>> realtime =none extsz=4096 blocks=0, rtextents=0 >>>>> >>>> >>>> Can you describe the workload to the filesystem? >>> >>> At the time of this trace the rsync backup of the fs has started. So the >>> workload was going from nearly idle to 4000 iop/s read at 60 MB/s peak. >>> >> >> Interesting. The warning is associated with releasing a page that has a >> delayed allocation when it shouldn't. That means something had written >> to a file to cause the delalloc in the first place. Any idea what could >> have been writing at the time or shortly before the rsync read workload >> had kicked in? > > It's memory reclaim that tripped over it, so the cause is long gone > - couple have been anything in the previous 24 hours that caused the > issue. i.e. rsync has triggered memory reclaim which triggered the > warning, but I don't think rsync has anything to do with causing the > page to be in a state that caused the warning. > > I'd be interested to know if there are any other warnings in the > logs - stuff like IO errors, page discards, ENOSPC issues, etc that > could trigger less travelled write error paths... No dmesg is absolutely clean. This hasn't happened with 4.1.18 before. It has started after upgrade from 4.1 to 4.4. Stefan > > -Dave. > From alex@zadarastorage.com Sun Mar 6 03:47:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 DFF7C7F5E for ; Sun, 6 Mar 2016 03:47:03 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 953148F8033 for ; Sun, 6 Mar 2016 01:47:03 -0800 (PST) X-ASG-Debug-ID: 1457257618-04bdf002ec1e7390001-NocioJ Received: from mail-yw0-f178.google.com (mail-yw0-f178.google.com [209.85.161.178]) by cuda.sgi.com with ESMTP id EltdG0EBYuNAuhpj (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 06 Mar 2016 01:46:59 -0800 (PST) X-Barracuda-Envelope-From: alex@zadarastorage.com X-Barracuda-Apparent-Source-IP: 209.85.161.178 Received: by mail-yw0-f178.google.com with SMTP id g3so19460744ywa.3 for ; Sun, 06 Mar 2016 01:46:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zadarastorage-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=LhFdBvVPT2bn++MXMkLGljphKDMIQBvDpNcOpn1dhBA=; b=cIWGN9Vz7jk7nWSA3Ads1oZinkvkC9A1venwjTzZs5a38U4dVukSldZEkkxPxV5nX+ ++D8LeOOxlPnCEn6KvqW9M1FbKFjJGR9pSmlSnMjD4S/g/1r6hCHW6tN2Mo4la51IqTS TDmMT2ZeoQnCnXXyDojZhr3xoc4FgSVmdMcVrpaiMrWoO4W4Po8eDcwnej3khT16/2hz PLZxULnmuQ5CM9GY9UibtI9Em9rrb4aGcf3eKicfVTN3+i3NNxJmvsFkCzsAEZeGieXI rXW3FyqRU1WMTkb+0KStPsbzhXDUdNy//ufqY3L/8ikB5Oc71awvWTV6RzXvgLe62nMC d0Rg== 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; bh=LhFdBvVPT2bn++MXMkLGljphKDMIQBvDpNcOpn1dhBA=; b=YrEKQXTnFrTYGrUDVEw9FDiw3zOmIBoGHP5GPAgfL4G09uEztTMgw8Ki1I1sZYLPa1 jDDFkxmaVrijfhVCF5/Wcy6PCqi2kI8ueGOi+qRunGKUhObUlxZuwLxBynfBhRH1y6JT 0jQvmXi76H3wJ8p+3kmPJww0W6PULTMogQdMG0rFKklTP0mGp3eGfsMVG61aoNG15+qG /zB5icCbF06n7dg7vMhYMW8Nu7wUEOqO42jSPTxzDPhyH/MPSMFFgVCttOZ+az2vgMo3 L3Iv37uE/pHHmhIw65RJHRZn+ZD0sV8eN5L8UNuSwaoxwvlUnxHGoJ01d5DuX6u0m0za f2sw== X-Gm-Message-State: AD7BkJK9WyR5zAGx2rd8s2MK70B5FalNmzye71WLBXEvZoqUe8L7jU77JOMZFZOugH+qPjZU6LatREbJz5IOQg== MIME-Version: 1.0 X-Received: by 10.129.92.65 with SMTP id q62mr9851554ywb.46.1457257618723; Sun, 06 Mar 2016 01:46:58 -0800 (PST) Received: by 10.37.19.6 with HTTP; Sun, 6 Mar 2016 01:46:58 -0800 (PST) In-Reply-To: <20160303213108.GQ30721@dastard> References: <3685DFAD20214109878873CF81232704@alyakaslap> <20160222212019.GI25832@dastard> <20160222235628.GK25832@dastard> <20160223225926.GN25832@dastard> <20160229211628.GK29057@dastard> <20160301072011.GF30721@dastard> <20160303213108.GQ30721@dastard> Date: Sun, 6 Mar 2016 11:46:58 +0200 Message-ID: Subject: Re: xfs resize: primary superblock is not updated immediately From: Alex Lyakas X-ASG-Orig-Subj: Re: xfs resize: primary superblock is not updated immediately To: Dave Chinner Cc: Christoph Hellwig , Danny Shavit , xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-yw0-f178.google.com[209.85.161.178] X-Barracuda-Start-Time: 1457257619 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27612 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hello Dave, On Thu, Mar 3, 2016 at 11:31 PM, Dave Chinner wrote: > On Thu, Mar 03, 2016 at 11:18:43AM +0200, Alex Lyakas wrote: >> Hello Dave, >> Thanks for the patch! I confirm that it fixes the scenario. >> >> At [1] please find all the blknos that are being used during the log >> recovery (if that's of any interest). > .... >> Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.129739] >> _xfs_buf_find: blkno=200705 eofs=204800 >m_sb.sb_dblocks=25600 >> Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.129746] >> _xfs_buf_find: blkno=200705 eofs=204800 >m_sb.sb_dblocks=25600 > > Where is the warning that this block is out of range? Perhaps you are being confused by the ">" mark that appears in the prints? This was definitely added by mistake, it appears on every print. I apologize for that. If not, then my understanding is that 200705 is still less than 204800, so this block number is not out of range. And since we have added the new pag structure, the issue is now fixed. Otherwise, I can provide an XFS metadump for you to analyze. Thanks, Alex. > > And why didn't recovery fail at this point because the block > requested is out of range and so the buffer lookup should have > failed? > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From sandeen@sandeen.net Sun Mar 6 09:46:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 09D3B7F61 for ; Sun, 6 Mar 2016 09:46:42 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id CECB88F8035 for ; Sun, 6 Mar 2016 07:46:38 -0800 (PST) X-ASG-Debug-ID: 1457279192-04cbb00b6f1f65d0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id t1SVjFDFX2nJI4e6 for ; Sun, 06 Mar 2016 07:46:32 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [21.218.11.209] (unknown [172.56.13.18]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 7A4AE4429; Sun, 6 Mar 2016 09:46:25 -0600 (CST) Content-Type: text/plain; charset=us-ascii Mime-Version: 1.0 (1.0) Subject: Re: xfs resize: primary superblock is not updated immediately From: Eric Sandeen X-ASG-Orig-Subj: Re: xfs resize: primary superblock is not updated immediately X-Mailer: iPhone Mail (13D15) In-Reply-To: Date: Sun, 6 Mar 2016 09:46:30 -0600 Cc: Dave Chinner , Christoph Hellwig , Danny Shavit , xfs@oss.sgi.com Content-Transfer-Encoding: quoted-printable Message-Id: <84645B23-7F3E-4E81-9888-B8C2DBDE0E7D@sandeen.net> References: <3685DFAD20214109878873CF81232704@alyakaslap> <20160222212019.GI25832@dastard> <20160222235628.GK25832@dastard> <20160223225926.GN25832@dastard> <20160229211628.GK29057@dastard> <20160301072011.GF30721@dastard> <20160303213108.GQ30721@dastard> To: Alex Lyakas X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1457279192 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, MIME_QP_LONG_LINE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27618 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars > On Mar 6, 2016, at 3:46 AM, Alex Lyakas wrote: >=20 > Hello Dave, >=20 >> On Thu, Mar 3, 2016 at 11:31 PM, Dave Chinner wrote= : >>> On Thu, Mar 03, 2016 at 11:18:43AM +0200, Alex Lyakas wrote: >>> Hello Dave, >>> Thanks for the patch! I confirm that it fixes the scenario. >>>=20 >>> At [1] please find all the blknos that are being used during the log >>> recovery (if that's of any interest). >> .... >>> Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.129739] >>> _xfs_buf_find: blkno=3D200705 eofs=3D204800 >m_sb.sb_dblocks=3D25600 >>> Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.129746] >>> _xfs_buf_find: blkno=3D200705 eofs=3D204800 >m_sb.sb_dblocks=3D25600 >>=20 >> Where is the warning that this block is out of range? > Perhaps you are being confused by the ">" mark that appears in the > prints? This was definitely added by mistake, it appears on every > print. I apologize for that. > If not, then my understanding is that 200705 is still less than > 204800, so this block number is not out of range. And since we have > added the new pag structure, the issue is now fixed. Block units in printks are never clear; 204800 sectors is 25600 4K blocks, a= nd yes, the buffer at sector 200705 looks to be in range of the filesystem. Eric > Otherwise, I can provide an XFS metadump for you to analyze. >=20 > Thanks, > Alex. >=20 >>=20 >> And why didn't recovery fail at this point because the block >> requested is out of range and so the buffer lookup should have >> failed? >>=20 >> Cheers, >>=20 >> Dave. >> -- >> Dave Chinner >> david@fromorbit.com >=20 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs >=20 From david@fromorbit.com Sun Mar 6 14:49:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4EAFD7F63 for ; Sun, 6 Mar 2016 14:49:48 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 247F08F8035 for ; Sun, 6 Mar 2016 12:49:45 -0800 (PST) X-ASG-Debug-ID: 1457297379-04cbb00b6f1fc770001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 5jeEvLvBnCdYBvvc for ; Sun, 06 Mar 2016 12:49:40 -0800 (PST) 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: A2DPDwCNltxWPFEqLHldKAECgw+BP4Jtg3mfeQaLfYlThgkCAgEBAoEbTQEBAQEBAQcBAQEBQUBBEgGDbgEBBDocIxAIAxgJJQ8FJQMHGhOIIb81AQEIAgEdGIU3hQWIdAWXKo1jgW2ERIhTjlWEWiguhxKCKwEBAQ Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl2.internode.on.net with ESMTP; 07 Mar 2016 07:19:38 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1acfcQ-0000Tt-AJ; Mon, 07 Mar 2016 07:49:38 +1100 Date: Mon, 7 Mar 2016 07:49:38 +1100 From: Dave Chinner To: Alex Lyakas Cc: Christoph Hellwig , Danny Shavit , xfs@oss.sgi.com Subject: Re: xfs resize: primary superblock is not updated immediately Message-ID: <20160306204938.GS30721@dastard> X-ASG-Orig-Subj: Re: xfs resize: primary superblock is not updated immediately References: <20160222235628.GK25832@dastard> <20160223225926.GN25832@dastard> <20160229211628.GK29057@dastard> <20160301072011.GF30721@dastard> <20160303213108.GQ30721@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: 1457297379 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27625 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sun, Mar 06, 2016 at 11:46:58AM +0200, Alex Lyakas wrote: > Hello Dave, > > On Thu, Mar 3, 2016 at 11:31 PM, Dave Chinner wrote: > > On Thu, Mar 03, 2016 at 11:18:43AM +0200, Alex Lyakas wrote: > >> Hello Dave, > >> Thanks for the patch! I confirm that it fixes the scenario. > >> > >> At [1] please find all the blknos that are being used during the log > >> recovery (if that's of any interest). > > .... > >> Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.129739] > >> _xfs_buf_find: blkno=200705 eofs=204800 >m_sb.sb_dblocks=25600 > >> Mar 3 11:17:41 vc-00-00-350-dev kernel: [ 68.129746] > >> _xfs_buf_find: blkno=200705 eofs=204800 >m_sb.sb_dblocks=25600 > > > > Where is the warning that this block is out of range? > Perhaps you are being confused by the ">" mark that appears in the > prints? This was definitely added by mistake, it appears on every > print. I apologize for that. > If not, then my understanding is that 200705 is still less than > 204800, so this block number is not out of range. And since we have > added the new pag structure, the issue is now fixed. Sorry, I misread it as 200480, not 204800. My fault, too much to do, brain mostly fried by other stuff. So the patch works. Cheers, Dave. -- Dave Chinner david@fromorbit.com From dave@fromorbit.com Sun Mar 6 15:50:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 052BF7F61 for ; Sun, 6 Mar 2016 15:50:14 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id CF2DE8F8033 for ; Sun, 6 Mar 2016 13:50:13 -0800 (PST) X-ASG-Debug-ID: 1457301011-04cb6c58311c8170001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id QD2PbZaUeTEEPq0A for ; Sun, 06 Mar 2016 13:50:12 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2APCgCupNxWPFEqLHldKAECgw+BP4Zmn3kGkUaLNk0BAQEBAQEHAQEBAUFAhEIBBVYzCBgxOQMHFBmIIb9jhU+KC4NuBY0wiXqNb454RI4RghgBCz4cgVwoLok9AQEB Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl2.internode.on.net with ESMTP; 07 Mar 2016 08:20:04 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1acgYt-0000YA-My for xfs@oss.sgi.com; Mon, 07 Mar 2016 08:50:03 +1100 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1acgYh-0004oO-VL for xfs@oss.sgi.com; Mon, 07 Mar 2016 08:49:51 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 6/6] xfs: pad xfs_attr_leaf_name_remote to avoid tripping on m68k Date: Mon, 7 Mar 2016 08:49:50 +1100 X-ASG-Orig-Subj: [PATCH 6/6] xfs: pad xfs_attr_leaf_name_remote to avoid tripping on m68k Message-Id: <1457300990-18300-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1457300990-18300-1-git-send-email-david@fromorbit.com> References: <1457300990-18300-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1457301011 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27626 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: "Darrick J. Wong" Pad the xfs_attr_leaf_name_remote so that we don't trip the structure size checker on m68k. [dchinner: add comment, XFS_ATTR_LEAF_NAME_BYTES constant and make sure xfs_attr_leaf_entsize_remote() does the right thing. ] Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_da_format.h | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/fs/xfs/libxfs/xfs_da_format.h b/fs/xfs/libxfs/xfs_da_format.h index 8d4d8bc..b6d58f6 100644 --- a/fs/xfs/libxfs/xfs_da_format.h +++ b/fs/xfs/libxfs/xfs_da_format.h @@ -686,11 +686,19 @@ typedef struct xfs_attr_leaf_name_local { __u8 nameval[1]; /* name/value bytes */ } xfs_attr_leaf_name_local_t; +/* + * some platforms (like m68k) don't like non-word sized structures and pad them + * out inappropriately. To work around this, we set the name array to the size + * that pads out to a 4 byte word size. We need to take this away from the size + * of the structure when calculating the length of the entry in + * xfs_attr_leaf_entsize_remote(), hence we define a constant for this value. + */ +#define XFS_ATTR_LEAF_NAME_BYTES 3 typedef struct xfs_attr_leaf_name_remote { __be32 valueblk; /* block number of value bytes */ __be32 valuelen; /* number of bytes in value */ __u8 namelen; /* length of name bytes */ - __u8 name[1]; /* name bytes */ + __u8 name[XFS_ATTR_LEAF_NAME_BYTES]; /* name bytes */ } xfs_attr_leaf_name_remote_t; typedef struct xfs_attr_leafblock { @@ -847,8 +855,10 @@ xfs_attr3_leaf_name_local(xfs_attr_leafblock_t *leafp, int idx) */ static inline int xfs_attr_leaf_entsize_remote(int nlen) { - return ((uint)sizeof(xfs_attr_leaf_name_remote_t) - 1 + (nlen) + \ - XFS_ATTR_LEAF_NAME_ALIGN - 1) & ~(XFS_ATTR_LEAF_NAME_ALIGN - 1); + return ((uint)sizeof(xfs_attr_leaf_name_remote_t) - + XFS_ATTR_LEAF_NAME_BYTES + nlen + + XFS_ATTR_LEAF_NAME_ALIGN - 1) & + ~(XFS_ATTR_LEAF_NAME_ALIGN - 1); } static inline int xfs_attr_leaf_entsize_local(int nlen, int vlen) -- 2.7.0 From dave@fromorbit.com Sun Mar 6 15:50:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 428407F63 for ; Sun, 6 Mar 2016 15:50:14 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 07D04304043 for ; Sun, 6 Mar 2016 13:50:13 -0800 (PST) X-ASG-Debug-ID: 1457301007-04cb6c58321c8170002-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id cvEwvG9oK9THMZKQ for ; Sun, 06 Mar 2016 13:50:11 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2ANCgCupNxWPFEqLHldKAECgw9SbaZNEgaRRoQvhwdNAQEBAQEBBwEBAQFBQIRCAQUnLzMIGDE5AwcUGYghD79UhU+EHYVug24FlyqFY4gMjniOVYIYAQuCNiguAQEDiTgBAQE Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl2.internode.on.net with ESMTP; 07 Mar 2016 08:20:04 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1acgYt-0000Y7-Lh for xfs@oss.sgi.com; Mon, 07 Mar 2016 08:50:03 +1100 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1acgYh-0004o9-U7 for xfs@oss.sgi.com; Mon, 07 Mar 2016 08:49:51 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/6] xfs: fix computation of inode btree maxlevels Date: Mon, 7 Mar 2016 08:49:47 +1100 X-ASG-Orig-Subj: [PATCH 3/6] xfs: fix computation of inode btree maxlevels Message-Id: <1457300990-18300-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1457300990-18300-1-git-send-email-david@fromorbit.com> References: <1457300990-18300-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1457301009 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27626 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: "Darrick J. Wong" Commit 88740da18[1] introduced a function to compute the maximum height of the inode btree back in 1994. Back then, apparently, the freespace and inode btrees shared the same geometry; however, it has long since been the case that the inode and freespace btrees have different record and key sizes. Therefore, we must use m_inobt_mnr if we want a correct calculation/log reservation/etc. (Yes, this bug has been around for 21 years and ten months.) (Yes, I was in middle school when this bug was committed.) [1] http://oss.sgi.com/cgi-bin/gitweb.cgi?p=archive/xfs-import.git;a=commitdiff;h=88740da18ddd9d7ba3ebaa9502fefc6ef2fd19cd Historical-research-by: Dave Chinner Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_ialloc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 66d702e..22297f9 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -2403,8 +2403,8 @@ xfs_ialloc_compute_maxlevels( maxleafents = (1LL << XFS_INO_AGINO_BITS(mp)) >> XFS_INODES_PER_CHUNK_LOG; - minleafrecs = mp->m_alloc_mnr[0]; - minnoderecs = mp->m_alloc_mnr[1]; + minleafrecs = mp->m_inobt_mnr[0]; + minnoderecs = mp->m_inobt_mnr[1]; maxblocks = (maxleafents + minleafrecs - 1) / minleafrecs; for (level = 1; maxblocks > 1; level++) maxblocks = (maxblocks + minnoderecs - 1) / minnoderecs; -- 2.7.0 From dave@fromorbit.com Sun Mar 6 15:50:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C8BBD7F63 for ; Sun, 6 Mar 2016 15:50:15 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9CAD2304043 for ; Sun, 6 Mar 2016 13:50:15 -0800 (PST) X-ASG-Debug-ID: 1457301011-04cb6c58311c8170002-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id EprId6LS98l3sSTv for ; Sun, 06 Mar 2016 13:50:13 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2ARCgCupNxWPFEqLHldKAECgw+BP4Zmn3kGkUaGZ4RPTQEBAQEBAQcBAQEBQUCEQgEFVjMIGDE5AwcUGYghv2OFT415BZZoQo1vjniOVYIYAQtBGYFcKC6JPQEBAQ Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl2.internode.on.net with ESMTP; 07 Mar 2016 08:20:04 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1acgYt-0000Y9-MY for xfs@oss.sgi.com; Mon, 07 Mar 2016 08:50:03 +1100 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1acgYh-0004oJ-Uw for xfs@oss.sgi.com; Mon, 07 Mar 2016 08:49:51 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 5/6] xfs: check sizes of XFS on-disk structures at compile time Date: Mon, 7 Mar 2016 08:49:49 +1100 X-ASG-Orig-Subj: [PATCH 5/6] xfs: check sizes of XFS on-disk structures at compile time Message-Id: <1457300990-18300-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1457300990-18300-1-git-send-email-david@fromorbit.com> References: <1457300990-18300-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1457301013 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27626 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: "Darrick J. Wong" Check the sizes of XFS on-disk structures when compiling the kernel. Use this to catch inadvertent changes in structure size due to padding and alignment issues, etc. Signed-off-by: Darrick J. Wong Reviewed-by: Brian Foster Signed-off-by: Dave Chinner --- fs/xfs/xfs_ondisk.h | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_super.c | 3 ++ 2 files changed, 111 insertions(+) create mode 100644 fs/xfs/xfs_ondisk.h diff --git a/fs/xfs/xfs_ondisk.h b/fs/xfs/xfs_ondisk.h new file mode 100644 index 0000000..9a78408 --- /dev/null +++ b/fs/xfs/xfs_ondisk.h @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2016 Oracle. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef __XFS_ONDISK_H +#define __XFS_ONDISK_H + +#define XFS_CHECK_STRUCT_SIZE(structname, size) \ + BUILD_BUG_ON_MSG(sizeof(structname) != (size), "XFS: sizeof(" \ + #structname ") is wrong, expected " #size) + +static inline void __init +xfs_check_ondisk_structs(void) +{ + /* ag/file structures */ + XFS_CHECK_STRUCT_SIZE(struct xfs_acl, 4); + XFS_CHECK_STRUCT_SIZE(struct xfs_acl_entry, 12); + XFS_CHECK_STRUCT_SIZE(struct xfs_agf, 224); + XFS_CHECK_STRUCT_SIZE(struct xfs_agfl, 36); + XFS_CHECK_STRUCT_SIZE(struct xfs_agi, 336); + XFS_CHECK_STRUCT_SIZE(struct xfs_bmbt_key, 8); + XFS_CHECK_STRUCT_SIZE(struct xfs_bmbt_rec, 16); + XFS_CHECK_STRUCT_SIZE(struct xfs_bmdr_block, 4); + XFS_CHECK_STRUCT_SIZE(struct xfs_btree_block, 72); + XFS_CHECK_STRUCT_SIZE(struct xfs_dinode, 176); + XFS_CHECK_STRUCT_SIZE(struct xfs_disk_dquot, 104); + XFS_CHECK_STRUCT_SIZE(struct xfs_dqblk, 136); + XFS_CHECK_STRUCT_SIZE(struct xfs_dsb, 264); + XFS_CHECK_STRUCT_SIZE(struct xfs_dsymlink_hdr, 56); + XFS_CHECK_STRUCT_SIZE(struct xfs_inobt_key, 4); + XFS_CHECK_STRUCT_SIZE(struct xfs_inobt_rec, 16); + XFS_CHECK_STRUCT_SIZE(struct xfs_timestamp, 8); + XFS_CHECK_STRUCT_SIZE(xfs_alloc_key_t, 8); + XFS_CHECK_STRUCT_SIZE(xfs_alloc_ptr_t, 4); + XFS_CHECK_STRUCT_SIZE(xfs_alloc_rec_t, 8); + XFS_CHECK_STRUCT_SIZE(xfs_inobt_ptr_t, 4); + + /* dir/attr trees */ + XFS_CHECK_STRUCT_SIZE(struct xfs_attr3_leaf_hdr, 80); + XFS_CHECK_STRUCT_SIZE(struct xfs_attr3_leafblock, 88); + XFS_CHECK_STRUCT_SIZE(struct xfs_attr3_rmt_hdr, 56); + XFS_CHECK_STRUCT_SIZE(struct xfs_da3_blkinfo, 56); + XFS_CHECK_STRUCT_SIZE(struct xfs_da3_intnode, 64); + XFS_CHECK_STRUCT_SIZE(struct xfs_da3_node_hdr, 64); + XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_blk_hdr, 48); + XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_data_hdr, 64); + XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_free, 64); + XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_free_hdr, 64); + XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_leaf, 64); + XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_leaf_hdr, 64); + XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_entry_t, 8); + XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_hdr_t, 32); + XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_map_t, 4); + XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_name_local_t, 4); + XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_name_remote_t, 12); + XFS_CHECK_STRUCT_SIZE(xfs_attr_leafblock_t, 40); + XFS_CHECK_STRUCT_SIZE(xfs_attr_shortform_t, 8); + XFS_CHECK_STRUCT_SIZE(xfs_da_blkinfo_t, 12); + XFS_CHECK_STRUCT_SIZE(xfs_da_intnode_t, 16); + XFS_CHECK_STRUCT_SIZE(xfs_da_node_entry_t, 8); + XFS_CHECK_STRUCT_SIZE(xfs_da_node_hdr_t, 16); + XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_free_t, 4); + XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_hdr_t, 16); + XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_unused_t, 6); + XFS_CHECK_STRUCT_SIZE(xfs_dir2_free_hdr_t, 16); + XFS_CHECK_STRUCT_SIZE(xfs_dir2_free_t, 16); + XFS_CHECK_STRUCT_SIZE(xfs_dir2_ino4_t, 4); + XFS_CHECK_STRUCT_SIZE(xfs_dir2_ino8_t, 8); + XFS_CHECK_STRUCT_SIZE(xfs_dir2_inou_t, 8); + XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_entry_t, 8); + XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_hdr_t, 16); + XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_t, 16); + XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_tail_t, 4); + XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_entry_t, 3); + XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_hdr_t, 10); + XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_off_t, 2); + + /* log structures */ + XFS_CHECK_STRUCT_SIZE(struct xfs_dq_logformat, 24); + XFS_CHECK_STRUCT_SIZE(struct xfs_efd_log_format_32, 28); + XFS_CHECK_STRUCT_SIZE(struct xfs_efd_log_format_64, 32); + XFS_CHECK_STRUCT_SIZE(struct xfs_efi_log_format_32, 28); + XFS_CHECK_STRUCT_SIZE(struct xfs_efi_log_format_64, 32); + XFS_CHECK_STRUCT_SIZE(struct xfs_extent_32, 12); + XFS_CHECK_STRUCT_SIZE(struct xfs_extent_64, 16); + XFS_CHECK_STRUCT_SIZE(struct xfs_log_dinode, 176); + XFS_CHECK_STRUCT_SIZE(struct xfs_icreate_log, 28); + XFS_CHECK_STRUCT_SIZE(struct xfs_ictimestamp, 8); + XFS_CHECK_STRUCT_SIZE(struct xfs_inode_log_format_32, 52); + XFS_CHECK_STRUCT_SIZE(struct xfs_inode_log_format_64, 56); + XFS_CHECK_STRUCT_SIZE(struct xfs_qoff_logformat, 20); + XFS_CHECK_STRUCT_SIZE(struct xfs_trans_header, 16); +} + +#endif /* __XFS_ONDISK_H */ diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 59c9b7b..3bd2027 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -45,6 +45,7 @@ #include "xfs_filestream.h" #include "xfs_quota.h" #include "xfs_sysfs.h" +#include "xfs_ondisk.h" #include #include @@ -1817,6 +1818,8 @@ init_xfs_fs(void) { int error; + xfs_check_ondisk_structs(); + printk(KERN_INFO XFS_VERSION_STRING " with " XFS_BUILD_OPTIONS " enabled\n"); -- 2.7.0 From dave@fromorbit.com Sun Mar 6 15:50:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 404217F61 for ; Sun, 6 Mar 2016 15:50:15 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 068B6304043 for ; Sun, 6 Mar 2016 13:50:11 -0800 (PST) X-ASG-Debug-ID: 1457301007-04cb6c58321c8170001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id WHP1peVsJ3owUEdb for ; Sun, 06 Mar 2016 13:50:08 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2APCgCupNxWPFEqLHldKAECgw+BP4Zmn3kGkUaLNk0BAQEBAQEHAQEBAUFAhEIBBScvMwgYMTkDBxQZiCG/Y4VPiQ1+g24FlyqIUoUdjniOVYIYAQuCNiguiAKBOwEBAQ Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl2.internode.on.net with ESMTP; 07 Mar 2016 08:20:04 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1acgYt-0000Y6-LH for xfs@oss.sgi.com; Mon, 07 Mar 2016 08:50:03 +1100 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1acgYh-0004o4-Te for xfs@oss.sgi.com; Mon, 07 Mar 2016 08:49:51 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/6] xfs: ioends require logically contiguous file offsets Date: Mon, 7 Mar 2016 08:49:46 +1100 X-ASG-Orig-Subj: [PATCH 2/6] xfs: ioends require logically contiguous file offsets Message-Id: <1457300990-18300-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1457300990-18300-1-git-send-email-david@fromorbit.com> References: <1457300990-18300-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1457301007 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27626 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: "Darrick J. Wong" We need to create a new ioend if the current writepage call isn't logically contiguous with the range contained in the previous ioend. Hopefully writepage gets called in order of increasing file offset. Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- fs/xfs/xfs_aops.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 7a467b3..75a39a8 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -526,7 +526,8 @@ xfs_add_to_ioend( struct list_head *iolist) { if (!wpc->ioend || wpc->io_type != wpc->ioend->io_type || - bh->b_blocknr != wpc->last_block + 1) { + bh->b_blocknr != wpc->last_block + 1 || + offset != wpc->ioend->io_offset + wpc->ioend->io_size) { struct xfs_ioend *new; if (wpc->ioend) -- 2.7.0 From dave@fromorbit.com Sun Mar 6 15:50:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6C87F7F6F for ; Sun, 6 Mar 2016 15:50:38 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 315348F8033 for ; Sun, 6 Mar 2016 13:50:38 -0800 (PST) X-ASG-Debug-ID: 1457301004-04bdf002ee1f7760001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 7CBdvZrBwWfF88Pr for ; Sun, 06 Mar 2016 13:50:05 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2ALCgCupNxWPFEqLHldKAECgw+IJZ95BpFGizZNAQEBAQEBBwEBAQFBQIUeO4ECAweITqEPnlSFT4oLg24FlyqNb454jlWCGAEBCAEBAQGCNCiJawEBAQ Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl2.internode.on.net with ESMTP; 07 Mar 2016 08:20:04 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1acgYt-0000Y4-KQ for xfs@oss.sgi.com; Mon, 07 Mar 2016 08:50:03 +1100 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1acgYh-0004nw-Sj for xfs@oss.sgi.com; Mon, 07 Mar 2016 08:49:51 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/6] xfs: accumulated fixes for 4.6 Date: Mon, 7 Mar 2016 08:49:44 +1100 X-ASG-Orig-Subj: [PATCH 0/6] xfs: accumulated fixes for 4.6 Message-Id: <1457300990-18300-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1457301005 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27626 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, This series is mostly fixes pulled from Darrick's rmap tree and one for a growfs log recovery fix from me. I'm posting them mainly for a final check before I merge them, and so everyone knows what is going to be merged from Darrick's trees before the merge actually occurs. Realistically, I'm not going to wait for days for people to check/review these patch series before I merge them. If i don't hear any objections within a couple of days, I'll simply push them out into the for-next tree. Yes, I know this is a bit different to the normal process, but I'm not posting these patches from Darrick's tree until I've already reviewed (and therefore tested) them. Cheers, Dave. From dave@fromorbit.com Sun Mar 6 15:50:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DB9007F6F for ; Sun, 6 Mar 2016 15:50:38 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 83FD38F8033 for ; Sun, 6 Mar 2016 13:50:38 -0800 (PST) X-ASG-Debug-ID: 1457301004-04bdf002ee1f7760002-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id C1zmm0DfOBLRC4Uz for ; Sun, 06 Mar 2016 13:50:07 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2APCgCupNxWPFEqLHldKAECgw+BP4Zmn3kGkUaLNk0BAQEBAQEHAQEBAUFAhEIBBScvMwgYMTkDBxQZiCG/Y4VPjXkFh1iHCYhJjW+BYYdphS6OVYIYAQtugUgoLok9AQEB Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl2.internode.on.net with ESMTP; 07 Mar 2016 08:20:04 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1acgYt-0000Y5-Ko for xfs@oss.sgi.com; Mon, 07 Mar 2016 08:50:03 +1100 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1acgYh-0004nz-T9 for xfs@oss.sgi.com; Mon, 07 Mar 2016 08:49:51 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/6] xfs: reinitialise per-AG structures if geometry changes during recovery Date: Mon, 7 Mar 2016 08:49:45 +1100 X-ASG-Orig-Subj: [PATCH 1/6] xfs: reinitialise per-AG structures if geometry changes during recovery Message-Id: <1457300990-18300-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1457300990-18300-1-git-send-email-david@fromorbit.com> References: <1457300990-18300-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1457301006 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27626 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner If a crash occurs immediately after a filesystem grow operation, the updated superblock geometry is found only in the log. After we recover the log, the superblock is reread and re-initialised and so has the new geometry in memory. If the new geometry has more AGs than prior to the grow operation, then the new AGs will not have in-memory xfs_perag structurea associated with them. This will result in an oops when the first metadata buffer from a new AG is looked up in the buffer cache, as the block lies within the new geometry but then fails to find a perag structure on lookup. This is easily fixed by simply re-initialising the perag structure after re-reading the superblock at the conclusion of the first pahse of log recovery. This, however, does not fix the case of log recovery requiring access to metadata in the newly grown space. Fortunately for us, because the in-core superblock has not been updated, this will result in detection of access beyond the end of the filesystem and so recovery will fail at that point. If this proves to be a problem, then we can address it separately to the current reported issue. Reported-by: Alex Lyakas Tested-by: Alex Lyakas Signed-off-by: Dave Chinner --- fs/xfs/xfs_log_recover.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 1dc0e14..520471b 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -4898,6 +4898,7 @@ xlog_do_recover( xfs_daddr_t head_blk, xfs_daddr_t tail_blk) { + struct xfs_mount *mp = log->l_mp; int error; xfs_buf_t *bp; xfs_sb_t *sbp; @@ -4912,7 +4913,7 @@ xlog_do_recover( /* * If IO errors happened during recovery, bail out. */ - if (XFS_FORCED_SHUTDOWN(log->l_mp)) { + if (XFS_FORCED_SHUTDOWN(mp)) { return -EIO; } @@ -4925,13 +4926,13 @@ xlog_do_recover( * or iunlinks they will have some entries in the AIL; so we look at * the AIL to determine how to set the tail_lsn. */ - xlog_assign_tail_lsn(log->l_mp); + xlog_assign_tail_lsn(mp); /* * Now that we've finished replaying all buffer and inode * updates, re-read in the superblock and reverify it. */ - bp = xfs_getsb(log->l_mp, 0); + bp = xfs_getsb(mp, 0); bp->b_flags &= ~(XBF_DONE | XBF_ASYNC); ASSERT(!(bp->b_flags & XBF_WRITE)); bp->b_flags |= XBF_READ; @@ -4939,7 +4940,7 @@ xlog_do_recover( error = xfs_buf_submit_wait(bp); if (error) { - if (!XFS_FORCED_SHUTDOWN(log->l_mp)) { + if (!XFS_FORCED_SHUTDOWN(mp)) { xfs_buf_ioerror_alert(bp, __func__); ASSERT(0); } @@ -4948,14 +4949,17 @@ xlog_do_recover( } /* Convert superblock from on-disk format */ - sbp = &log->l_mp->m_sb; + sbp = &mp->m_sb; xfs_sb_from_disk(sbp, XFS_BUF_TO_SBP(bp)); - ASSERT(sbp->sb_magicnum == XFS_SB_MAGIC); - ASSERT(xfs_sb_good_version(sbp)); - xfs_reinit_percpu_counters(log->l_mp); - xfs_buf_relse(bp); + /* re-initialise in-core superblock and geometry structures */ + xfs_reinit_percpu_counters(mp); + error = xfs_initialize_perag(mp, sbp->sb_agcount, &mp->m_maxagi); + if (error) { + xfs_warn(mp, "Failed post-recovery per-ag init: %d", error); + return error; + } xlog_recover_check_summary(log); -- 2.7.0 From dave@fromorbit.com Sun Mar 6 15:50:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UPPERCASE_50_75 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E45A97F75 for ; Sun, 6 Mar 2016 15:50:38 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9D8A48F8035 for ; Sun, 6 Mar 2016 13:50:38 -0800 (PST) X-ASG-Debug-ID: 1457301004-04bdf002ee1f7760003-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id kZ7Hwmr7ZtmGzlfW for ; Sun, 06 Mar 2016 13:50:12 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2APCgCupNxWPFEqLHldKAECgw+BP4Zmn3kGkUaLNk0BAQEBAQEHAQEBAUFAhEIBBScvMwgYMTkDBxQZiCG/Y4VPiS2ETAWHW49PiFKFHY54jlWCGAELPhyBXCguiT0BAQE Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl2.internode.on.net with ESMTP; 07 Mar 2016 08:20:04 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1acgYt-0000Y8-MA for xfs@oss.sgi.com; Mon, 07 Mar 2016 08:50:03 +1100 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1acgYh-0004oE-UX for xfs@oss.sgi.com; Mon, 07 Mar 2016 08:49:51 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 4/6] xfs: use named array initializers for log item dumping Date: Mon, 7 Mar 2016 08:49:48 +1100 X-ASG-Orig-Subj: [PATCH 4/6] xfs: use named array initializers for log item dumping Message-Id: <1457300990-18300-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1457300990-18300-1-git-send-email-david@fromorbit.com> References: <1457300990-18300-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1457301008 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.49 X-Barracuda-Spam-Status: No, SCORE=0.49 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UPPERCASE_50_75, UPPERCASE_50_75_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27626 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UPPERCASE_50_75 message body is 50-75% uppercase 0.49 UPPERCASE_50_75_2 message body is 50-75% uppercase From: "Darrick J. Wong" Use named array initializers for the string arrays used to dump log items, rather than depending on the order being maintained correctly. Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- fs/xfs/xfs_log.c | 132 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 68 insertions(+), 64 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 40b700d..b49ccf5 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -2008,77 +2008,81 @@ xlog_print_tic_res( uint ophdr_spc = ticket->t_res_num_ophdrs * (uint)sizeof(xlog_op_header_t); /* match with XLOG_REG_TYPE_* in xfs_log.h */ - static char *res_type_str[XLOG_REG_TYPE_MAX] = { - "bformat", - "bchunk", - "efi_format", - "efd_format", - "iformat", - "icore", - "iext", - "ibroot", - "ilocal", - "iattr_ext", - "iattr_broot", - "iattr_local", - "qformat", - "dquot", - "quotaoff", - "LR header", - "unmount", - "commit", - "trans header" +#define REG_TYPE_STR(type, str) [XLOG_REG_TYPE_##type] = str + static char *res_type_str[XLOG_REG_TYPE_MAX + 1] = { + REG_TYPE_STR(BFORMAT, "bformat"), + REG_TYPE_STR(BCHUNK, "bchunk"), + REG_TYPE_STR(EFI_FORMAT, "efi_format"), + REG_TYPE_STR(EFD_FORMAT, "efd_format"), + REG_TYPE_STR(IFORMAT, "iformat"), + REG_TYPE_STR(ICORE, "icore"), + REG_TYPE_STR(IEXT, "iext"), + REG_TYPE_STR(IBROOT, "ibroot"), + REG_TYPE_STR(ILOCAL, "ilocal"), + REG_TYPE_STR(IATTR_EXT, "iattr_ext"), + REG_TYPE_STR(IATTR_BROOT, "iattr_broot"), + REG_TYPE_STR(IATTR_LOCAL, "iattr_local"), + REG_TYPE_STR(QFORMAT, "qformat"), + REG_TYPE_STR(DQUOT, "dquot"), + REG_TYPE_STR(QUOTAOFF, "quotaoff"), + REG_TYPE_STR(LRHEADER, "LR header"), + REG_TYPE_STR(UNMOUNT, "unmount"), + REG_TYPE_STR(COMMIT, "commit"), + REG_TYPE_STR(TRANSHDR, "trans header"), + REG_TYPE_STR(ICREATE, "inode create") }; +#undef REG_TYPE_STR +#define TRANS_TYPE_STR(type) [XFS_TRANS_##type] = #type static char *trans_type_str[XFS_TRANS_TYPE_MAX] = { - "SETATTR_NOT_SIZE", - "SETATTR_SIZE", - "INACTIVE", - "CREATE", - "CREATE_TRUNC", - "TRUNCATE_FILE", - "REMOVE", - "LINK", - "RENAME", - "MKDIR", - "RMDIR", - "SYMLINK", - "SET_DMATTRS", - "GROWFS", - "STRAT_WRITE", - "DIOSTRAT", - "WRITE_SYNC", - "WRITEID", - "ADDAFORK", - "ATTRINVAL", - "ATRUNCATE", - "ATTR_SET", - "ATTR_RM", - "ATTR_FLAG", - "CLEAR_AGI_BUCKET", - "QM_SBCHANGE", - "DUMMY1", - "DUMMY2", - "QM_QUOTAOFF", - "QM_DQALLOC", - "QM_SETQLIM", - "QM_DQCLUSTER", - "QM_QINOCREATE", - "QM_QUOTAOFF_END", - "FSYNC_TS", - "GROWFSRT_ALLOC", - "GROWFSRT_ZERO", - "GROWFSRT_FREE", - "SWAPEXT", - "CHECKPOINT", - "ICREATE", - "CREATE_TMPFILE" + TRANS_TYPE_STR(SETATTR_NOT_SIZE), + TRANS_TYPE_STR(SETATTR_SIZE), + TRANS_TYPE_STR(INACTIVE), + TRANS_TYPE_STR(CREATE), + TRANS_TYPE_STR(CREATE_TRUNC), + TRANS_TYPE_STR(TRUNCATE_FILE), + TRANS_TYPE_STR(REMOVE), + TRANS_TYPE_STR(LINK), + TRANS_TYPE_STR(RENAME), + TRANS_TYPE_STR(MKDIR), + TRANS_TYPE_STR(RMDIR), + TRANS_TYPE_STR(SYMLINK), + TRANS_TYPE_STR(SET_DMATTRS), + TRANS_TYPE_STR(GROWFS), + TRANS_TYPE_STR(STRAT_WRITE), + TRANS_TYPE_STR(DIOSTRAT), + TRANS_TYPE_STR(WRITEID), + TRANS_TYPE_STR(ADDAFORK), + TRANS_TYPE_STR(ATTRINVAL), + TRANS_TYPE_STR(ATRUNCATE), + TRANS_TYPE_STR(ATTR_SET), + TRANS_TYPE_STR(ATTR_RM), + TRANS_TYPE_STR(ATTR_FLAG), + TRANS_TYPE_STR(CLEAR_AGI_BUCKET), + TRANS_TYPE_STR(SB_CHANGE), + TRANS_TYPE_STR(DUMMY1), + TRANS_TYPE_STR(DUMMY2), + TRANS_TYPE_STR(QM_QUOTAOFF), + TRANS_TYPE_STR(QM_DQALLOC), + TRANS_TYPE_STR(QM_SETQLIM), + TRANS_TYPE_STR(QM_DQCLUSTER), + TRANS_TYPE_STR(QM_QINOCREATE), + TRANS_TYPE_STR(QM_QUOTAOFF_END), + TRANS_TYPE_STR(FSYNC_TS), + TRANS_TYPE_STR(GROWFSRT_ALLOC), + TRANS_TYPE_STR(GROWFSRT_ZERO), + TRANS_TYPE_STR(GROWFSRT_FREE), + TRANS_TYPE_STR(SWAPEXT), + TRANS_TYPE_STR(CHECKPOINT), + TRANS_TYPE_STR(ICREATE), + TRANS_TYPE_STR(CREATE_TMPFILE) }; +#undef TRANS_TYPE_STR xfs_warn(mp, "xlog_write: reservation summary:"); xfs_warn(mp, " trans type = %s (%u)", ((ticket->t_trans_type <= 0 || ticket->t_trans_type > XFS_TRANS_TYPE_MAX) ? - "bad-trans-type" : trans_type_str[ticket->t_trans_type-1]), + "bad-trans-type" : trans_type_str[ticket->t_trans_type]), ticket->t_trans_type); xfs_warn(mp, " unit res = %d bytes", ticket->t_unit_res); @@ -2097,7 +2101,7 @@ xlog_print_tic_res( uint r_type = ticket->t_res_arr[i].r_type; xfs_warn(mp, "region[%u]: %s - %u bytes", i, ((r_type <= 0 || r_type > XLOG_REG_TYPE_MAX) ? - "bad-rtype" : res_type_str[r_type-1]), + "bad-rtype" : res_type_str[r_type]), ticket->t_res_arr[i].r_len); } -- 2.7.0 From darrick.wong@oracle.com Sun Mar 6 16:10:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7A71C7F77 for ; Sun, 6 Mar 2016 16:10:15 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4EFCE30404E for ; Sun, 6 Mar 2016 14:10:15 -0800 (PST) X-ASG-Debug-ID: 1457302210-04cbb00b721fdd00001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id wz7UNyqc4jcYC90b (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 06 Mar 2016 14:10:10 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u26M9cdv004097 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Sun, 6 Mar 2016 22:09:38 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u26M9cLN007984 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Sun, 6 Mar 2016 22:09:38 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u26M9bDO015150; Sun, 6 Mar 2016 22:09:37 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Sun, 06 Mar 2016 14:09:37 -0800 Date: Sun, 6 Mar 2016 14:09:35 -0800 From: "Darrick J. Wong" To: Christoph Hellwig Cc: david@fromorbit.com, linux-ext4@vger.kernel.org, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 13/12] xfs/209: filter scratch dir properly Message-ID: <20160306220935.GB27960@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 13/12] xfs/209: filter scratch dir properly References: <20160305003717.28738.98818.stgit@birch.djwong.org> <20160305202502.GI10245@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160305202502.GI10245@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1457302210 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27626 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Good catch, Reviewed-by: Darrick J. Wong --D On Sat, Mar 05, 2016 at 12:25:02PM -0800, Christoph Hellwig wrote: > Signed-off-by: Christoph Hellwig > > diff --git a/tests/xfs/209 b/tests/xfs/209 > index cecd9c7..9bf1f12 100755 > --- a/tests/xfs/209 > +++ b/tests/xfs/209 > @@ -73,7 +73,7 @@ echo "Check cowextsize settings" > seq 1 2 | while read nr; do > seq 1 4 | while read nnr; do > file="$testdir/dir-$nr/file-$nnr" > - $XFS_IO_PROG -c "cowextsize" $file > + $XFS_IO_PROG -c "cowextsize" $file | _filter_scratch > done > done > > diff --git a/tests/xfs/209.out b/tests/xfs/209.out > index 109af34..b97fa96 100644 > --- a/tests/xfs/209.out > +++ b/tests/xfs/209.out > @@ -3,11 +3,11 @@ Format and mount > Set extsz and cowextsz on directory > Create a fake tree structure > Check cowextsize settings > -[1048576] /opt/test-209/dir-1/file-1 > -[1048576] /opt/test-209/dir-1/file-2 > -[1048576] /opt/test-209/dir-1/file-3 > -[1048576] /opt/test-209/dir-1/file-4 > -[1048576] /opt/test-209/dir-2/file-1 > -[1048576] /opt/test-209/dir-2/file-2 > -[1048576] /opt/test-209/dir-2/file-3 > -[1048576] /opt/test-209/dir-2/file-4 > +[1048576] SCRATCH_MNT/test-209/dir-1/file-1 > +[1048576] SCRATCH_MNT/test-209/dir-1/file-2 > +[1048576] SCRATCH_MNT/test-209/dir-1/file-3 > +[1048576] SCRATCH_MNT/test-209/dir-1/file-4 > +[1048576] SCRATCH_MNT/test-209/dir-2/file-1 > +[1048576] SCRATCH_MNT/test-209/dir-2/file-2 > +[1048576] SCRATCH_MNT/test-209/dir-2/file-3 > +[1048576] SCRATCH_MNT/test-209/dir-2/file-4 > -- > To unsubscribe from this list: send the line "unsubscribe linux-ext4" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html From david@fromorbit.com Sun Mar 6 17:52:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B861D7F55 for ; Sun, 6 Mar 2016 17:52:39 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 23026AC001 for ; Sun, 6 Mar 2016 15:52:38 -0800 (PST) X-ASG-Debug-ID: 1457308354-04cbb00b701ffe50001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 7kvHUJYee2Uf4kML for ; Sun, 06 Mar 2016 15:52:35 -0800 (PST) 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: A2BUDQASwtxWPFEqLHldKAECgw8iMG2CbYN5n1sCChIGgQ+KboVJhAoXAoVwBIEgTQEBAQEBAQcBAQEBQUBBEgGESjskNAUlAwctiCGhCJ5KCBiFN4oLgXwLQIEnBYdbix+EMIVjgm+FEYFtjRUChXmIXIIYCwEBAYI0KC6HEoIrAQEB Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl2.internode.on.net with ESMTP; 07 Mar 2016 10:22:33 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aciTQ-0000kD-Ui for xfs@oss.sgi.com; Mon, 07 Mar 2016 10:52:33 +1100 Date: Mon, 7 Mar 2016 10:52:32 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfs: for-next rebased to 3c1a79f Message-ID: <20160306235232.GT30721@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfs: for-next rebased to 3c1a79f MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="O3RTKUHj+75w1tg5" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1457308355 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.20 X-Barracuda-Spam-Status: No, SCORE=0.20 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27629 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) --O3RTKUHj+75w1tg5 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The for-next branch of the xfs kernel repository at git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git has just been rebased. The rebase is really only a rework of the merge order of the patches due to the torn log write detection fixes that Brian sent. These need to go to Linus before anything, so I have pushed them into the tree immediately after the commits that went into 4.5-rc4. Once they've been in linux-next for a couple of days I'll send a pull-req to Linus. As a result, none of the original commit IDs have changed ias none of the topic branches have been changed - only the merge commits have changed. This remerge also cleans up the double merge of the xfs-dio-fix-4.6 topic branch which was done after adding an ext4 fix to that branch. I've also appended Darrick's fix for the writepage rework in that topic branch, as it will make merging the rest of the fixes from him simpler (now only one topic branch dependency, not two). -Dave. The new head of the for-next branch is commit: 3c1a79f Merge branch 'xfs-misc-fixes-4.6-2' into for-next New Commits: Brian Foster (4): [82ff6cc] xfs: separate log head record discovery from verification [65b99a0] xfs: refactor unmount record detection into helper [717bc0e] xfs: refactor in-core log state update to helper [7f6aff3] xfs: only run torn log write detection on dirty logs Darrick J. Wong (1): [0df61da] xfs: ioends require logically contiguous file offsets Dave Chinner (10): [9deed09] Merge branch 'xfs-torn-log-fixes-4.5' into for-next [c53473b] Merge branch 'xfs-rt-fixes-4.6' into for-next [1b186d2] Merge branch 'xfs-get-next-dquot-4.6' into for-next [acb3e26] Merge branch 'xfs-dio-fix-4.6' into for-next [6d247d4] Merge branch 'xfs-misc-fixes-4.6' into for-next [a2bbcb6] Merge branch 'xfs-gut-icdinode-4.6' into for-next [7f0ed54] Merge branch 'xfs-buf-macro-cleanup-4.6' into for-next [3d93ec0] Merge branch 'xfs-writepage-rework-4.6' into for-next [85a9f38] Merge branch 'xfs-dax-fixes-4.6' into for-next [3c1a79f] Merge branch 'xfs-misc-fixes-4.6-2' into for-next Code Diffstat: fs/xfs/xfs_aops.c | 3 +- fs/xfs/xfs_log_recover.c | 271 ++++++++++++++++++++++++++++++-------------= ------ 2 files changed, 170 insertions(+), 104 deletions(-) --=20 Dave Chinner david@fromorbit.com --O3RTKUHj+75w1tg5 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJW3MLAAAoJEK3oKUf0dfodVZ8QAMlA72Oc2aNHbj+9yVrZkngC DbNC6yPj7DY2kOXnJTYILSa3huWrnLMEBNEMJhfHMgPOE9lMNz7cfAAOv4B/LiTs aHk6DkN2m+I7AEBNe6x/DzDTJFvqPWyw8s0lZ4oQswQ3KiUCqj+98kpjkSHzmq4O V5/Tr9IH/8bnzM3AlWAoLmL9qEC0S+skw5BIMjWdKrcRW/sjZRFUpv8b6VBX5UnH vmDi3if3G6K1Ft8lwDfxzZ0Chnko24+OLylSlsc0Y1WO6Oh/IAU/xackGPm/A75k 0HPEYTLPLuv1RYFmRq7S8aM4+t2VbVd4cSQDY3OVwDYEbH4szmIJk98TWrGBpO0B 5irn3xzPE7AiHDdhWNFH0/xwedOPF5WkvIpVliUiLnX5Feqzy8EUNZ6ZK2P97iyZ wSOX3FKiKTE9a0/9Y5eWee48xp4ESZwGQXd4OaJKD27C2QOmDyvzwlX9SwgEmsF6 Vkt3UldS1K444DYNTBBba9rwMtEplni//8jP/SSe2lV2g2BWTCE92IGL5nD0FOOM JHewp2D+nabD0zhAW0tuOglt2Fwp5a1z5/cw58ZqpUeQDVtXe8i6dWMMaKsol+sC Gc5Jk4b0VixlfT00ZPDyh9s3lI4/TDQfE5I1xESfDrBndfwW8yklP23GtlWRVZVq TrsYYRZ/0ZKghJd9YF2D =W6RE -----END PGP SIGNATURE----- --O3RTKUHj+75w1tg5-- From eguan@redhat.com Sun Mar 6 21:04:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1997129E08 for ; Sun, 6 Mar 2016 21:04:53 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D18E78F8039 for ; Sun, 6 Mar 2016 19:04:49 -0800 (PST) X-ASG-Debug-ID: 1457319887-04cb6c58321d0440001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id czFsYMwTfTzk0adU (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 06 Mar 2016 19:04:48 -0800 (PST) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id C6AD164D26; Mon, 7 Mar 2016 03:04:47 +0000 (UTC) Received: from localhost (dhcp-13-211.nay.redhat.com [10.66.13.211]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2734jYE004409; Sun, 6 Mar 2016 22:04:46 -0500 Date: Mon, 7 Mar 2016 11:04:44 +0800 From: Eryu Guan To: Christoph Hellwig Cc: fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs/259: disable CRC if testing with 512 bytes block size Message-ID: <20160307030444.GA11419@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs/259: disable CRC if testing with 512 bytes block size References: <1456937518-20505-1-git-send-email-eguan@redhat.com> <20160305204517.GA10065@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160305204517.GA10065@infradead.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 07 Mar 2016 03:04:47 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1457319888 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sat, Mar 05, 2016 at 12:45:17PM -0800, Christoph Hellwig wrote: > This will force crcs off for all the blocksizes. We should > either always skip 512 bytes, or disable crcs only for the 512 byte > inode size case. The first seems either, but the second would give > better test coverage. Thanks for the review! I think the test itself has already disabled crc for 512 block size fs, and this patch disables crc only if the TEST_DEV has no crc, so it just fixes a corner case in this crc detecting, and doesn't reduce the test coverage. Thanks, Eryu From darrick.wong@oracle.com Mon Mar 7 02:26:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 392337CB4 for ; Mon, 7 Mar 2016 02:26:56 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0C9818F8035 for ; Mon, 7 Mar 2016 00:26:52 -0800 (PST) X-ASG-Debug-ID: 1457339207-04cbb00b6f213cb0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 30V1PefkKG82xU1f (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 07 Mar 2016 00:26:47 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u278QKJs028082 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 7 Mar 2016 08:26:20 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u278QJ9b019683 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Mon, 7 Mar 2016 08:26:19 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u278QHws020524; Mon, 7 Mar 2016 08:26:18 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 07 Mar 2016 00:26:17 -0800 Date: Mon, 7 Mar 2016 00:26:12 -0800 From: "Darrick J. Wong" To: Christoph Hellwig Cc: david@fromorbit.com, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 12/12] block: test fallocate for block devices Message-ID: <20160307082612.GE22185@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 12/12] block: test fallocate for block devices References: <20160305003717.28738.98818.stgit@birch.djwong.org> <20160305003837.28738.49794.stgit@birch.djwong.org> <20160305182508.GA25528@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160305182508.GA25528@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1457339207 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27638 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Sat, Mar 05, 2016 at 10:25:08AM -0800, Christoph Hellwig wrote: > I'm not sure xfstests is the right fit, as it does not test a file > system, but rather block devices. I asked Dave if he'd take a fallocate-for-bdevs test, and he didn't object. After all, we're testing a semi-standard FS API, just with block devices. > If people think it should go into xfstests we should at least not > add it to the default group, but just to a new bdev group. Sure, I don't mind changing the group to 'bdev' or something. --D From BATV+8dba85674009479af37e+4579+infradead.org+hch@bombadil.srs.infradead.org Mon Mar 7 10:24:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 11AAB7CA0 for ; Mon, 7 Mar 2016 10:24:34 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C53F68F8039 for ; Mon, 7 Mar 2016 08:24:30 -0800 (PST) X-ASG-Debug-ID: 1457367867-04cb6c58321f5940001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id hhApPluJC00AQwUd (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 07 Mar 2016 08:24:28 -0800 (PST) X-Barracuda-Envelope-From: BATV+8dba85674009479af37e+4579+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 1acxxL-0005az-BZ; Mon, 07 Mar 2016 16:24:27 +0000 Date: Mon, 7 Mar 2016 08:24:27 -0800 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/6] xfs: reinitialise per-AG structures if geometry changes during recovery Message-ID: <20160307162427.GA19784@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/6] xfs: reinitialise per-AG structures if geometry changes during recovery References: <1457300990-18300-1-git-send-email-david@fromorbit.com> <1457300990-18300-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1457300990-18300-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457367867 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/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=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27646 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+8dba85674009479af37e+4579+infradead.org+hch@bombadil.srs.infradead.org Mon Mar 7 10:26:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CE7CA7CA0 for ; Mon, 7 Mar 2016 10:26:53 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 40662AC001 for ; Mon, 7 Mar 2016 08:26:47 -0800 (PST) X-ASG-Debug-ID: 1457368004-04cbb00b702301b0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id nUjViY02t8Oo4KJI (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 07 Mar 2016 08:26:45 -0800 (PST) X-Barracuda-Envelope-From: BATV+8dba85674009479af37e+4579+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 1acxzY-0000P4-7z; Mon, 07 Mar 2016 16:26:44 +0000 Date: Mon, 7 Mar 2016 08:26:44 -0800 From: Christoph Hellwig To: Dave Chinner , darrick.wong@oracle.com Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/6] xfs: ioends require logically contiguous file offsets Message-ID: <20160307162644.GB19784@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/6] xfs: ioends require logically contiguous file offsets References: <1457300990-18300-1-git-send-email-david@fromorbit.com> <1457300990-18300-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1457300990-18300-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457368005 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27646 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Mar 07, 2016 at 08:49:46AM +1100, Dave Chinner wrote: > From: "Darrick J. Wong" > > We need to create a new ioend if the current writepage call isn't > logically contiguous with the range contained in the previous ioend. > Hopefully writepage gets called in order of increasing file offset. This looks reasonable, but how did we manage to get away without this for so long? I think as-is we do not actually require it - for setting i_size we just care about the highest offset, and for unwritten extent conversion we just need the lowest and highest offset, and we were making use of that fact in direct I/O extensively before I rewrote that code not to use ioends. So this looks fine to me, but the description could use some better wording. Signed-off-by: Christoph Hellwig From BATV+8dba85674009479af37e+4579+infradead.org+hch@bombadil.srs.infradead.org Mon Mar 7 10:27:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D9E517CA0 for ; Mon, 7 Mar 2016 10:27:16 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A96648F8039 for ; Mon, 7 Mar 2016 08:27:16 -0800 (PST) X-ASG-Debug-ID: 1457368034-04cb6c58301f5ca0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id OE9g7JAyZHoRJPwF (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 07 Mar 2016 08:27:15 -0800 (PST) X-Barracuda-Envelope-From: BATV+8dba85674009479af37e+4579+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 1acy02-0000q3-Mn; Mon, 07 Mar 2016 16:27:14 +0000 Date: Mon, 7 Mar 2016 08:27:14 -0800 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/6] xfs: use named array initializers for log item dumping Message-ID: <20160307162714.GC19784@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 4/6] xfs: use named array initializers for log item dumping References: <1457300990-18300-1-git-send-email-david@fromorbit.com> <1457300990-18300-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1457300990-18300-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457368035 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/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=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27646 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+8dba85674009479af37e+4579+infradead.org+hch@bombadil.srs.infradead.org Mon Mar 7 10:27:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EF54B7CA0 for ; Mon, 7 Mar 2016 10:27:49 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id BF9D8304048 for ; Mon, 7 Mar 2016 08:27:46 -0800 (PST) X-ASG-Debug-ID: 1457368065-04cb6c58301f5d70001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id YMN1Y5nzoKoccyfY (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 07 Mar 2016 08:27:45 -0800 (PST) X-Barracuda-Envelope-From: BATV+8dba85674009479af37e+4579+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 1acy0X-0001I6-8o; Mon, 07 Mar 2016 16:27:45 +0000 Date: Mon, 7 Mar 2016 08:27:45 -0800 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/6] xfs: check sizes of XFS on-disk structures at compile time Message-ID: <20160307162745.GD19784@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 5/6] xfs: check sizes of XFS on-disk structures at compile time References: <1457300990-18300-1-git-send-email-david@fromorbit.com> <1457300990-18300-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1457300990-18300-6-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457368065 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27646 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks okay-ish. My minor complain will be in the next patch instead.. Reviewed-by: Christoph Hellwig From BATV+8dba85674009479af37e+4579+infradead.org+hch@bombadil.srs.infradead.org Mon Mar 7 10:29:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2A28C7CA0 for ; Mon, 7 Mar 2016 10:29:01 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id F068E304048 for ; Mon, 7 Mar 2016 08:29:00 -0800 (PST) X-ASG-Debug-ID: 1457368139-04cb6c58301f5ee0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id q7CHQ2Hp2cBGxQ4n (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 07 Mar 2016 08:28:59 -0800 (PST) X-Barracuda-Envelope-From: BATV+8dba85674009479af37e+4579+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 1acy1i-0002be-Vm; Mon, 07 Mar 2016 16:28:59 +0000 Date: Mon, 7 Mar 2016 08:28:58 -0800 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 6/6] xfs: pad xfs_attr_leaf_name_remote to avoid tripping on m68k Message-ID: <20160307162858.GE19784@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 6/6] xfs: pad xfs_attr_leaf_name_remote to avoid tripping on m68k References: <1457300990-18300-1-git-send-email-david@fromorbit.com> <1457300990-18300-7-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1457300990-18300-7-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457368139 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27646 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Mar 07, 2016 at 08:49:50AM +1100, Dave Chinner wrote: > From: "Darrick J. Wong" > > Pad the xfs_attr_leaf_name_remote so that we don't trip the structure > size checker on m68k. > > [dchinner: add comment, XFS_ATTR_LEAF_NAME_BYTES constant and make sure > xfs_attr_leaf_entsize_remote() does the right thing. ] I think using a small fixed size array as a variable sized array is not a good idea, especially with increasinly "smart" optimizing compilers. I'd rather take this structure out the size checking, and then move it to a C99 VLA instead of the size 1 hack in the long run. From cl@linux.com Mon Mar 7 12:24:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 AF45A7CA0 for ; Mon, 7 Mar 2016 12:24:39 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 31EF6AC002 for ; Mon, 7 Mar 2016 10:24:36 -0800 (PST) X-ASG-Debug-ID: 1457375072-04bdf002ee231170001-NocioJ Received: from resqmta-ch2-10v.sys.comcast.net (resqmta-ch2-10v.sys.comcast.net [69.252.207.42]) by cuda.sgi.com with ESMTP id 5pRYTpvEPw02oiFb (version=TLSv1.2 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Mon, 07 Mar 2016 10:24:33 -0800 (PST) X-Barracuda-Envelope-From: cl@linux.com X-Barracuda-Apparent-Source-IP: 69.252.207.42 Received: from resomta-ch2-20v.sys.comcast.net ([69.252.207.116]) by resqmta-ch2-10v.sys.comcast.net with comcast id T6PX1s0012XD5SV016QYLt; Mon, 07 Mar 2016 18:24:32 +0000 Received: from gentwo.org ([98.222.162.64]) by resomta-ch2-20v.sys.comcast.net with comcast id T6QX1s00L1PgSZ6016QXup; Mon, 07 Mar 2016 18:24:32 +0000 Received: by gentwo.org (Postfix, from userid 1001) id 66A4416C6; Mon, 7 Mar 2016 12:24:31 -0600 (CST) Received: from localhost (localhost [127.0.0.1]) by gentwo.org (Postfix) with ESMTP id 6424D7BE; Mon, 7 Mar 2016 12:24:31 -0600 (CST) Date: Mon, 7 Mar 2016 12:24:31 -0600 (CST) From: Christoph Lameter X-X-Sender: cl@east.gentwo.org To: Waiman Long cc: Tejun Heo , Dave Chinner , xfs@oss.sgi.com, linux-kernel@vger.kernel.org, Ingo Molnar , Peter Zijlstra , Scott J Norton , Douglas Hatch Subject: Re: [RFC PATCH 1/2] percpu_counter: Allow falling back to global counter on large system In-Reply-To: <1457146299-1601-2-git-send-email-Waiman.Long@hpe.com> X-ASG-Orig-Subj: Re: [RFC PATCH 1/2] percpu_counter: Allow falling back to global counter on large system Message-ID: References: <1457146299-1601-1-git-send-email-Waiman.Long@hpe.com> <1457146299-1601-2-git-send-email-Waiman.Long@hpe.com> Content-Type: text/plain; charset=US-ASCII DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=comcast.net; s=q20140121; t=1457375072; bh=fV7mbUfBIz/+TJayRuC8l+iCFcO4p2iE+mzRS1Jkn4g=; h=Received:Received:Received:Received:Date:From:To:Subject: Message-ID:Content-Type; b=kMm9EUAQe5Z59LGUDGCyn3Ari55BPwJTorS9j7RJK0LHIgc+CDigG4WHFEtcMcLyU A7uLM1qaY2NMnSQr1l/zbBVA8dPQcXmQQEF/y+g+G6+b/T+bYWGivrXNZ+VMvsMT5+ +m4TPs1ELWLSODXO3bsdhpQkHhD3ojEn+hi38JQUId+mOn5J05yxdhZmT+8D09ikaQ k3RrcUAY9OnpK1jyp/ndK8pEM1KAGphyaIT2D+i2fOQHNpCtOv/ggRbc6olu1TzLFg cknGXZ63qSoIiVRPCl8zBUiZZqXfCdBLGelwcGxxzrTSVtYLATcPDnhfM8yDaxbXJa wKQIV65x8+E9w== X-Barracuda-Connect: resqmta-ch2-10v.sys.comcast.net[69.252.207.42] X-Barracuda-Start-Time: 1457375073 X-Barracuda-Encrypted: DHE-RSA-AES128-SHA X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27648 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Fri, 4 Mar 2016, Waiman Long wrote: > This patch provides a mechanism to selectively degenerate per-cpu > counters to global counters at per-cpu counter initialization time. The > following new API is added: > > percpu_counter_set_limit(struct percpu_counter *fbc, > u32 percpu_limit) > > The function should be called after percpu_counter_set(). It will > compare the total limit (nr_cpu * percpu_limit) against the current > counter value. If the limit is not smaller, it will disable per-cpu > counter and use only the global counter instead. At run time, when > the counter value grows past the total limit, per-cpu counter will > be enabled again. Hmmm... That is requiring manual setting of a limit. Would it not be possible to completely automatize the switch over? F.e. one could keep a cpumask of processors that use the per cpu counters. Then in the fastpath if the current cpu is a member increment the per cpu counter. If not do the spinlock thing. If there is contention add the cpu to the cpumask and use the per cpu counters. Thus automatically scaling for the processors on which frequent increments are operating. Then regularly (once per minute or so) degenerate the counter by folding the per cpu diffs into the global count and zapping the cpumask. If the cpumask is empty you can use the global count. Otherwise you just need to add up the counters of the cpus set in the cpumask. From david@fromorbit.com Mon Mar 7 15:34:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B2CB07CA0 for ; Mon, 7 Mar 2016 15:34:01 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 88F0D304043 for ; Mon, 7 Mar 2016 13:33:58 -0800 (PST) X-ASG-Debug-ID: 1457386434-04cb6c5832207c60001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id uoj9oOBALJUPXleC for ; Mon, 07 Mar 2016 13:33:55 -0800 (PST) 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: A2AsDwDl8t1W/1EqLHlcgzpSLEGCbYpDmR8MAQEBAQEBBot9hUmECiGFaAQCAoEuTQEBAQEBAWUnQRIBg20BAQECAQE6HCMFCwgDGAklDwUlAyETG4gBBw++UAEBAQcCHhiFN4UFglqBKhEThEwFlyqFY4gAgW2ERIhTRI4RYoN4KC4BhxFxgToBAQE Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail07.adl2.internode.on.net with ESMTP; 08 Mar 2016 08:03:53 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ad2ma-00032z-Kt; Tue, 08 Mar 2016 08:33:40 +1100 Date: Tue, 8 Mar 2016 08:33:40 +1100 From: Dave Chinner To: Waiman Long Cc: Dave Chinner , Tejun Heo , Christoph Lameter , xfs@oss.sgi.com, linux-kernel@vger.kernel.org, Ingo Molnar , Peter Zijlstra , Scott J Norton , Douglas Hatch Subject: Re: [RFC PATCH 0/2] percpu_counter: Enable switching to global counter Message-ID: <20160307213340.GU30721@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 0/2] percpu_counter: Enable switching to global counter References: <1457146299-1601-1-git-send-email-Waiman.Long@hpe.com> <20160305063447.GB2235@devil.localdomain> <56DDBCEB.8060307@hpe.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56DDBCEB.8060307@hpe.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: 1457386434 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27654 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 BSF_SC5_SA210e Custom Rule SA210e On Mon, Mar 07, 2016 at 12:39:55PM -0500, Waiman Long wrote: > On 03/05/2016 01:34 AM, Dave Chinner wrote: > >On Fri, Mar 04, 2016 at 09:51:37PM -0500, Waiman Long wrote: > >>This patchset allows the degeneration of per-cpu counters back > >>to global counters when: > >> > >> 1) The number of CPUs in the system is large, hence a high > >> cost for calling percpu_counter_sum(). 2) The initial count > >> value is small so that it has a high chance of excessive > >> percpu_counter_sum() calls. > >> > >>When the above 2 conditions are true, this patchset allows the > >>user of per-cpu counters to selectively degenerate them into > >>global counters with lock. This is done by calling the new > >>percpu_counter_set_limit() API after percpu_counter_set(). > >>Without this call, there is no change in the behavior of the > >>per-cpu counters. > >> > >>Patch 1 implements the new percpu_counter_set_limit() API. > >> > >>Patch 2 modifies XFS to call the new API for the m_ifree and > >>m_fdblocks per-cpu counters. > >> > >>Waiman Long (2): percpu_counter: Allow falling back to global > >>counter on large system xfs: Allow degeneration of > >>m_fdblocks/m_ifree to global counters > >NACK. > > > >This change to turns off per-counter free block counters for 32p > >for the XFS free block counters. We proved 10 years ago that a > >global lock for these counters was a massive scalability > >limitation for concurrent buffered writes on 16p machines. > > > >IOWs, this change is going to cause fast path concurrent > >sequential write regressions for just about everyone, even on > >empty filesystems. > > That is not really the case here. The patch won't change anything > if there is enough free blocks available in the filesystem. It > will turn on global lock at mount time iff the number of free > blocks available is less than the given limit. In the case of XFS, > it is 12MB per CPU. On the 80-thread system that I used for > testing, it will be a bit less than 1GB. Even if global lock is > enabled at the beginning, it will be transitioned back to percpu > lock as soon as enough free blocks become available. Again: How is this an optimisation that is generally useful? Nobody runs their production 80-thread workloads on a filesystems with less than 1GB of free space. This is a situation that most admins would consider "impending doom". > I am aware that if there are enough threads pounding on the lock, > it can cause a scalability bottleneck. However, the qspinlock used > in x86 should greatly alleviate the scalability impact compared > with 10 years ago when we used the ticket lock. Regardless of whether there is less contention, it still brings back a global serialisation point and modified cacheline (the free block counter) in the filesystem that, at some point, will limit concurrency.... > BTW, what exactly > was the microbenchmark that you used to exercise concurrent > sequential write? I would like to try it out on the new hardware > and kernel. Just something that HPC apps have been known to do for more then 20 years: concurrent sequential write from every CPU in the system. http://oss.sgi.com/projects/xfs/papers/ols2006/ols-2006-paper.pdf > >near to ENOSPC. As i asked you last time - if you want to make > >this problem go away, please increase the size of the filesystem > >you are running your massively concurrent benchmarks on. > > > >IOWs, please stop trying to optimise a filesystem slow path that: > > > > a) 99.9% of production workloads never execute, b) where we > > expect performance to degrade as allocation gets > > computationally expensive as we close in on ENOSPC, c) we > > start to execute blocking data flush operations that slow > > everything down massively, and d) is indicative that the > > workload is about to suffer from a fatal, unrecoverable > > error (i.e. ENOSPC) > > > > I totally agree. I am not trying to optimize a filesystem > slowpath. Where else in the kernel is there a requirement for 100% accurate threshold detection on per-cpu counters? There isn't, is there? > There are use cases, however, where we may want to > create relatively small filesystem. One example that I cited in > patch 2 is the battery backed NVDIMM that I have played with > recently. They can be used for log files or other small files. > Each dimm is 8 GB. You can have a few of those available. So the > filesystem size could be 32GB or so. That can come close to the > the limit where excessive percpu_counter_sum() call can happen. > What I want to do here is to try to reduce the chance of excessive > percpu_counter_sum() calls causing a performance problem. For a > large filesystem that is nowhere near ENOSPC, my patch will have > no performance impact whatsoever. Yet your patch won't have any effect on these "small" filesystems because unless they have less free space than your threshold at mount time (rare!) they won't ever have this global lock turned on. Not to mention if space if freed in the fs, the global lock is turned off, and will never get turned back on. Further, anyone using XFS on nvdimms will be enabling DAX, which goes through the direct IO path rather than the buffered IO path that is generating all this block accounting pressure. Hence it will behave differently, and so your solution doesn't obviously apply to that workload space, either. When we get production workloads hitting free block accounting issues near ENOSPC, then we'll look at optimising the XFS accounting code. Microbenchmarks are great when they have real-work relevance, but this doesn't right now. Not to mention we've got bigger things to worry about in XFS right now in terms of ENOSPC accounting (think reverse mapping, shared blocks and breaking shares via COW right next to ENOSPC) and getting these working *correctly* takes precendence of optimisation of the accounting code. Cheers, Dave. -- Dave Chinner david@fromorbit.com From darrick.wong@oracle.com Mon Mar 7 20:33:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9FA607CA0 for ; Mon, 7 Mar 2016 20:33:53 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 152E6AC001 for ; Mon, 7 Mar 2016 18:33:49 -0800 (PST) X-ASG-Debug-ID: 1457404427-04cb6c583120d290001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 3nBJoUvFDDI74mI2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 07 Mar 2016 18:33:48 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u282XFKc030039 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 8 Mar 2016 02:33:15 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u282XECr014746 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Tue, 8 Mar 2016 02:33:14 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u282XDEa032253; Tue, 8 Mar 2016 02:33:13 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 07 Mar 2016 18:33:12 -0800 Date: Mon, 7 Mar 2016 18:33:11 -0800 From: "Darrick J. Wong" To: Christoph Hellwig Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 2/6] xfs: ioends require logically contiguous file offsets Message-ID: <20160308023311.GB27689@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 2/6] xfs: ioends require logically contiguous file offsets References: <1457300990-18300-1-git-send-email-david@fromorbit.com> <1457300990-18300-3-git-send-email-david@fromorbit.com> <20160307162644.GB19784@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160307162644.GB19784@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1457404428 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27660 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Mon, Mar 07, 2016 at 08:26:44AM -0800, Christoph Hellwig wrote: > On Mon, Mar 07, 2016 at 08:49:46AM +1100, Dave Chinner wrote: > > From: "Darrick J. Wong" > > > > We need to create a new ioend if the current writepage call isn't > > logically contiguous with the range contained in the previous ioend. > > Hopefully writepage gets called in order of increasing file offset. > > This looks reasonable, but how did we manage to get away without this for > so long? I think as-is we do not actually require it - for setting > i_size we just care about the highest offset, and for unwritten extent > conversion we just need the lowest and highest offset, and we were > making use of that fact in direct I/O extensively before I rewrote that > code not to use ioends. The way I found this was by one of the cow tests failing (generic/139, I think?) -- if two non-adjacent file blocks were both CoW but mapped to adjacent physical blocks, the ioend check behaved as if the two file blocks were logically adjacent and combine them into one ioend. That sounds confusing even as I write it, so let's try an example: Say that /tmp/a block 10 and block 12 are both shared and dirty. Writepage comes along and allocates blocks 980 and 981 as replacements. This means that 10 -> 980 and 12 -> 981. The ioend combining code seems that 980 and 981 are adjacent and submits an ioend with offset 10 and length 2, instead of two ioends {10, 1} and {12, 1} like you'd expect, and as a result the CoW remapping is incorrect. I think we used to get away with this because _vm_writepage gets a mapping that only extends as far as the next io_type change, because XFS_IO_OVERWRITE and XFS_IO_UNWRITTEN only change at bmbt record boundaries and since for CoW we only deal with CoW fork bmbt records, that still holds true. Therefore, we performed only limited ioend chaining that ended at every extent boundary. Now that we collect the ioends in a struct writepage_ctx that can span several writepage calls, we can end up with ioends crossing bmbt record boundaries. --D > So this looks fine to me, but the description could use some better > wording. > > Signed-off-by: Christoph Hellwig From darrick.wong@oracle.com Mon Mar 7 20:35:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 97F137CA0 for ; Mon, 7 Mar 2016 20:35:31 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1B037AC002 for ; Mon, 7 Mar 2016 18:35:30 -0800 (PST) X-ASG-Debug-ID: 1457404527-04cbb00b70247f60001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id pJlQDLnVo0TCMtI2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 07 Mar 2016 18:35:28 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u282Z0xm031237 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 8 Mar 2016 02:35:01 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u282Z0iF005936 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Tue, 8 Mar 2016 02:35:00 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u282Yxiq024111; Tue, 8 Mar 2016 02:35:00 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 07 Mar 2016 18:34:59 -0800 Date: Mon, 7 Mar 2016 18:34:58 -0800 From: "Darrick J. Wong" To: Christoph Hellwig Cc: david@fromorbit.com, xfs@oss.sgi.com Subject: Re: [PATCH 2/6] xfsdocs: update the on-disk format with changes for Linux 4.5 Message-ID: <20160308023458.GC27689@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 2/6] xfsdocs: update the on-disk format with changes for Linux 4.5 References: <20160305003505.28327.95288.stgit@birch.djwong.org> <20160305003518.28327.15601.stgit@birch.djwong.org> <20160305203656.GB4989@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160305203656.GB4989@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1457404528 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27660 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Sat, Mar 05, 2016 at 12:36:56PM -0800, Christoph Hellwig wrote: > > -The inode's core is 96 bytes in size and contains information about the file > > +The inode's core is 176 bytes in size and contains information about the file > > maybe this should read "96 or 176 bytes in size" > Ok, I'll reword it to state that it's 96 on V4 and 176 on V5. --D From david@fromorbit.com Mon Mar 7 21:56:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BECBE7CA0 for ; Mon, 7 Mar 2016 21:56:57 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3A242AC001 for ; Mon, 7 Mar 2016 19:56:54 -0800 (PST) X-ASG-Debug-ID: 1457409410-04cbb00b7124a4c0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 0t8sNd8ZYDOYF7d0 for ; Mon, 07 Mar 2016 19:56:50 -0800 (PST) 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: A2CtEAAVTd5WPFEqLHlcKAECgw+BP4Jtg3mgAwaLfYVJhAqGCQICAQECgTVNAQEBAQEBBwEBAQFBQEEBBA2DbgEBAQQ6HCMQCAMOBwMJJQ8FJQMHGhOII75OAQEIAgEdGIU3hQWIdAWSeoQwjWSPBESOEYRaKC6GVIECgikBAQE Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl6.internode.on.net with ESMTP; 08 Mar 2016 14:26:49 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ad8lM-00047f-At; Tue, 08 Mar 2016 14:56:48 +1100 Date: Tue, 8 Mar 2016 14:56:48 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 6/6] xfs: pad xfs_attr_leaf_name_remote to avoid tripping on m68k Message-ID: <20160308035648.GV30721@dastard> X-ASG-Orig-Subj: Re: [PATCH 6/6] xfs: pad xfs_attr_leaf_name_remote to avoid tripping on m68k References: <1457300990-18300-1-git-send-email-david@fromorbit.com> <1457300990-18300-7-git-send-email-david@fromorbit.com> <20160307162858.GE19784@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160307162858.GE19784@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: 1457409410 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27662 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Mar 07, 2016 at 08:28:58AM -0800, Christoph Hellwig wrote: > On Mon, Mar 07, 2016 at 08:49:50AM +1100, Dave Chinner wrote: > > From: "Darrick J. Wong" > > > > Pad the xfs_attr_leaf_name_remote so that we don't trip the structure > > size checker on m68k. > > > > [dchinner: add comment, XFS_ATTR_LEAF_NAME_BYTES constant and make sure > > xfs_attr_leaf_entsize_remote() does the right thing. ] > > I think using a small fixed size array as a variable sized array > is not a good idea, especially with increasinly "smart" optimizing > compilers. I'd rather take this structure out the size checking, > and then move it to a C99 VLA instead of the size 1 hack in the long > run. I don't have the time right now to do this, so I'm just going to drop it - I'd guess the overlap between m68k and XFS users is so close to zero that it just doesn't matter. I'll just drop this patch for now. Cheers, Dave. -- Dave Chinner david@fromorbit.com From dave@fromorbit.com Mon Mar 7 22:17:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6FF3E7CA0 for ; Mon, 7 Mar 2016 22:17:07 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 23E58304032 for ; Mon, 7 Mar 2016 20:17:07 -0800 (PST) X-ASG-Debug-ID: 1457410624-04bdf002ec2427c0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id IIlNmmYomyZ4psqe for ; Mon, 07 Mar 2016 20:17:04 -0800 (PST) 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: A2ChCAC/Ud5WPFEqLHlcKAECgw+BP4Zmn30BAgEBAQaRRotQTQEBAQEBAQcBAQEBQUCEQgEFVjMISTkDBxQZiCO+eIVPiSRng24FlyqNcI54jlaCGAELgjYoLohFgToBAQE Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl6.internode.on.net with ESMTP; 08 Mar 2016 14:46:33 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ad94S-0004A5-Vf for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:33 +1100 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ad94G-0007u8-D3 for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:20 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 02/16] xfs: add rmap btree stats infrastructure Date: Tue, 8 Mar 2016 15:16:04 +1100 X-ASG-Orig-Subj: [PATCH 02/16] xfs: add rmap btree stats infrastructure Message-Id: <1457410578-30233-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1457410578-30233-1-git-send-email-david@fromorbit.com> References: <1457410578-30233-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1457410624 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27662 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- >From : Dave Chinner The rmap btree will require the same stats as all the other generic btrees, so add al the code for that now. Signed-off-by: Dave Chinner Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_btree.h | 7 ++++--- fs/xfs/xfs_stats.c | 1 + fs/xfs/xfs_stats.h | 18 +++++++++++++++++- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h index ac9c355..1fcf272 100644 --- a/fs/xfs/libxfs/xfs_btree.h +++ b/fs/xfs/libxfs/xfs_btree.h @@ -96,8 +96,8 @@ do { \ case XFS_BTNUM_BMAP: __XFS_BTREE_STATS_INC(__mp, bmbt, stat); break; \ case XFS_BTNUM_INO: __XFS_BTREE_STATS_INC(__mp, ibt, stat); break; \ case XFS_BTNUM_FINO: __XFS_BTREE_STATS_INC(__mp, fibt, stat); break; \ - case XFS_BTNUM_RMAP: break; \ - case XFS_BTNUM_MAX: ASSERT(0); /* fucking gcc */ ; break; \ + case XFS_BTNUM_RMAP: __XFS_BTREE_STATS_INC(__mp, rmap, stat); break; \ + case XFS_BTNUM_MAX: ASSERT(0); /* fucking gcc */ ; break; \ } \ } while (0) @@ -117,7 +117,8 @@ do { \ __XFS_BTREE_STATS_ADD(__mp, ibt, stat, val); break; \ case XFS_BTNUM_FINO: \ __XFS_BTREE_STATS_ADD(__mp, fibt, stat, val); break; \ - case XFS_BTNUM_RMAP: break; \ + case XFS_BTNUM_RMAP: \ + __XFS_BTREE_STATS_ADD(__mp, rmap, stat, val); break; \ case XFS_BTNUM_MAX: ASSERT(0); /* fucking gcc */ ; break; \ } \ } while (0) diff --git a/fs/xfs/xfs_stats.c b/fs/xfs/xfs_stats.c index 8686df6..f04f547 100644 --- a/fs/xfs/xfs_stats.c +++ b/fs/xfs/xfs_stats.c @@ -61,6 +61,7 @@ int xfs_stats_format(struct xfsstats __percpu *stats, char *buf) { "bmbt2", XFSSTAT_END_BMBT_V2 }, { "ibt2", XFSSTAT_END_IBT_V2 }, { "fibt2", XFSSTAT_END_FIBT_V2 }, + { "rmapbt", XFSSTAT_END_RMAP_V2 }, /* we print both series of quota information together */ { "qm", XFSSTAT_END_QM }, }; diff --git a/fs/xfs/xfs_stats.h b/fs/xfs/xfs_stats.h index 483b0ef..657865f 100644 --- a/fs/xfs/xfs_stats.h +++ b/fs/xfs/xfs_stats.h @@ -197,7 +197,23 @@ struct xfsstats { __uint32_t xs_fibt_2_alloc; __uint32_t xs_fibt_2_free; __uint32_t xs_fibt_2_moves; -#define XFSSTAT_END_XQMSTAT (XFSSTAT_END_FIBT_V2+6) +#define XFSSTAT_END_RMAP_V2 (XFSSTAT_END_FIBT_V2+15) + __uint32_t xs_rmap_2_lookup; + __uint32_t xs_rmap_2_compare; + __uint32_t xs_rmap_2_insrec; + __uint32_t xs_rmap_2_delrec; + __uint32_t xs_rmap_2_newroot; + __uint32_t xs_rmap_2_killroot; + __uint32_t xs_rmap_2_increment; + __uint32_t xs_rmap_2_decrement; + __uint32_t xs_rmap_2_lshift; + __uint32_t xs_rmap_2_rshift; + __uint32_t xs_rmap_2_split; + __uint32_t xs_rmap_2_join; + __uint32_t xs_rmap_2_alloc; + __uint32_t xs_rmap_2_free; + __uint32_t xs_rmap_2_moves; +#define XFSSTAT_END_XQMSTAT (XFSSTAT_END_RMAP_V2+6) __uint32_t xs_qm_dqreclaims; __uint32_t xs_qm_dqreclaim_misses; __uint32_t xs_qm_dquot_dups; -- 2.7.0 From dave@fromorbit.com Mon Mar 7 22:17:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A9DCD29E05 for ; Mon, 7 Mar 2016 22:17:07 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7C39D8F8039 for ; Mon, 7 Mar 2016 20:17:07 -0800 (PST) X-ASG-Debug-ID: 1457410623-04cb6c583320ed40002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id urPUTN9blpNum0rT for ; Mon, 07 Mar 2016 20:17:05 -0800 (PST) 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: A2ChCAC/Ud5WPFEqLHlcKAECgw+BP4Zmn30BAgEBAQaRRotQTQEBAQEBAQcBAQEBQUCEQgEFJy8zCBgxOQMHFBmII754hU+NeQWXKohThR2OeESOEoIYAQtBGYFcKC6JfwEBAQ Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl6.internode.on.net with ESMTP; 08 Mar 2016 14:46:33 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ad94T-0004A7-0h for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:33 +1100 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ad94G-0007uI-F8 for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:20 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 04/16] libxfs: rearrange xfs_bmap_add_free parameters Date: Tue, 8 Mar 2016 15:16:06 +1100 X-ASG-Orig-Subj: [PATCH 04/16] libxfs: rearrange xfs_bmap_add_free parameters Message-Id: <1457410578-30233-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1457410578-30233-1-git-send-email-david@fromorbit.com> References: <1457410578-30233-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1457410625 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27662 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: "Darrick J. Wong" The order is different to convention, making it a bit strange. Reorder it according to convention before we start adding new parameters. Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_bmap.c | 12 ++++++------ fs/xfs/libxfs/xfs_bmap.h | 4 ++-- fs/xfs/libxfs/xfs_bmap_btree.c | 2 +- fs/xfs/libxfs/xfs_ialloc.c | 9 ++++----- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index cb58d72..7aef8d8 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -573,10 +573,10 @@ xfs_bmap_validate_ret( */ void xfs_bmap_add_free( + struct xfs_mount *mp, /* mount point structure */ + struct xfs_bmap_free *flist, /* list of extents */ xfs_fsblock_t bno, /* fs block number of extent */ - xfs_filblks_t len, /* length of extent */ - xfs_bmap_free_t *flist, /* list of extents */ - xfs_mount_t *mp) /* mount point structure */ + xfs_filblks_t len) /* length of extent */ { xfs_bmap_free_item_t *cur; /* current (next) element */ xfs_bmap_free_item_t *new; /* new element */ @@ -702,7 +702,7 @@ xfs_bmap_btree_to_extents( cblock = XFS_BUF_TO_BLOCK(cbp); if ((error = xfs_btree_check_block(cur, cblock, 0, cbp))) return error; - xfs_bmap_add_free(cbno, 1, cur->bc_private.b.flist, mp); + xfs_bmap_add_free(mp, cur->bc_private.b.flist, cbno, 1); ip->i_d.di_nblocks--; xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, -1L); xfs_trans_binval(tp, cbp); @@ -5016,8 +5016,8 @@ xfs_bmap_del_extent( * If we need to, add to list of extents to delete. */ if (do_fx) - xfs_bmap_add_free(del->br_startblock, del->br_blockcount, flist, - mp); + xfs_bmap_add_free(mp, flist, del->br_startblock, + del->br_blockcount); /* * Adjust inode # blocks in the file. */ diff --git a/fs/xfs/libxfs/xfs_bmap.h b/fs/xfs/libxfs/xfs_bmap.h index 423a34e..e081c76 100644 --- a/fs/xfs/libxfs/xfs_bmap.h +++ b/fs/xfs/libxfs/xfs_bmap.h @@ -191,8 +191,8 @@ void xfs_bmap_trace_exlist(struct xfs_inode *ip, xfs_extnum_t cnt, int xfs_bmap_add_attrfork(struct xfs_inode *ip, int size, int rsvd); void xfs_bmap_local_to_extents_empty(struct xfs_inode *ip, int whichfork); -void xfs_bmap_add_free(xfs_fsblock_t bno, xfs_filblks_t len, - struct xfs_bmap_free *flist, struct xfs_mount *mp); +void xfs_bmap_add_free(struct xfs_mount *mp, struct xfs_bmap_free *flist, + xfs_fsblock_t bno, xfs_filblks_t len); void xfs_bmap_cancel(struct xfs_bmap_free *flist); int xfs_bmap_finish(struct xfs_trans **tp, struct xfs_bmap_free *flist, struct xfs_inode *ip); diff --git a/fs/xfs/libxfs/xfs_bmap_btree.c b/fs/xfs/libxfs/xfs_bmap_btree.c index 6282f6e..db0c71e 100644 --- a/fs/xfs/libxfs/xfs_bmap_btree.c +++ b/fs/xfs/libxfs/xfs_bmap_btree.c @@ -526,7 +526,7 @@ xfs_bmbt_free_block( struct xfs_trans *tp = cur->bc_tp; xfs_fsblock_t fsbno = XFS_DADDR_TO_FSB(mp, XFS_BUF_ADDR(bp)); - xfs_bmap_add_free(fsbno, 1, cur->bc_private.b.flist, mp); + xfs_bmap_add_free(mp, cur->bc_private.b.flist, fsbno, 1); ip->i_d.di_nblocks--; xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 22297f9..e3c0af7 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -1828,9 +1828,8 @@ xfs_difree_inode_chunk( if (!xfs_inobt_issparse(rec->ir_holemask)) { /* not sparse, calculate extent info directly */ - xfs_bmap_add_free(XFS_AGB_TO_FSB(mp, agno, - XFS_AGINO_TO_AGBNO(mp, rec->ir_startino)), - mp->m_ialloc_blks, flist, mp); + xfs_bmap_add_free(mp, flist, XFS_AGB_TO_FSB(mp, agno, sagbno), + mp->m_ialloc_blks); return; } @@ -1873,8 +1872,8 @@ xfs_difree_inode_chunk( ASSERT(agbno % mp->m_sb.sb_spino_align == 0); ASSERT(contigblk % mp->m_sb.sb_spino_align == 0); - xfs_bmap_add_free(XFS_AGB_TO_FSB(mp, agno, agbno), contigblk, - flist, mp); + xfs_bmap_add_free(mp, flist, XFS_AGB_TO_FSB(mp, agno, agbno), + contigblk); /* reset range to current bit and carry on... */ startidx = endidx = nextbit; -- 2.7.0 From dave@fromorbit.com Mon Mar 7 22:17:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8A3E27CA1 for ; Mon, 7 Mar 2016 22:17:07 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5D331304039 for ; Mon, 7 Mar 2016 20:17:07 -0800 (PST) X-ASG-Debug-ID: 1457410622-04cb6c583120ed30002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 8oVXAa4QSvkCxst1 for ; Mon, 07 Mar 2016 20:17:04 -0800 (PST) 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: A2ChCAC/Ud5WPFEqLHlcKAECgw+BP4Zmn30BAgEBAQaRRotQTQEBAQEBAQcBAQEBQUCEQgEFJy8zCDAZOQMHFBmII754hU+JfoN7BZcqjXCOeI5WghgBC4I2KC6JfwEBAQ Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl6.internode.on.net with ESMTP; 08 Mar 2016 14:46:33 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ad94T-0004A6-06 for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:33 +1100 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ad94G-0007uD-EP for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:20 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 03/16] xfs: rmap btree add more reserved blocks Date: Tue, 8 Mar 2016 15:16:05 +1100 X-ASG-Orig-Subj: [PATCH 03/16] xfs: rmap btree add more reserved blocks Message-Id: <1457410578-30233-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1457410578-30233-1-git-send-email-david@fromorbit.com> References: <1457410578-30233-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1457410624 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27662 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- >From : Dave Chinner XFS reserves a small amount of space in each AG for the minimum number of free blocks needed for operation. Adding the rmap btree increases the number of reserved blocks, but it also increases the complexity of the calculation as the free inode btree is optional (like the rmbt). Rather than calculate the prealloc blocks every time we need to check it, add a function to calculate it at mount time and store it in the struct xfs_mount, and convert the XFS_PREALLOC_BLOCKS macro just to use the xfs-mount variable directly. Signed-off-by: Dave Chinner Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_alloc.c | 11 +++++++++++ fs/xfs/libxfs/xfs_alloc.h | 2 ++ fs/xfs/libxfs/xfs_format.h | 9 +-------- fs/xfs/xfs_fsops.c | 6 +++--- fs/xfs/xfs_mount.c | 2 ++ fs/xfs/xfs_mount.h | 1 + 6 files changed, 20 insertions(+), 11 deletions(-) diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index d0b78b7..19b7521 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -49,6 +49,17 @@ STATIC int xfs_alloc_ag_vextent_size(xfs_alloc_arg_t *); STATIC int xfs_alloc_ag_vextent_small(xfs_alloc_arg_t *, xfs_btree_cur_t *, xfs_agblock_t *, xfs_extlen_t *, int *); +xfs_extlen_t +xfs_prealloc_blocks( + struct xfs_mount *mp) +{ + if (xfs_sb_version_hasrmapbt(&mp->m_sb)) + return XFS_RMAP_BLOCK(mp) + 1; + if (xfs_sb_version_hasfinobt(&mp->m_sb)) + return XFS_FIBT_BLOCK(mp) + 1; + return XFS_IBT_BLOCK(mp) + 1; +} + /* * Lookup the record equal to [bno, len] in the btree given by cur. */ diff --git a/fs/xfs/libxfs/xfs_alloc.h b/fs/xfs/libxfs/xfs_alloc.h index 135eb3d..d260916 100644 --- a/fs/xfs/libxfs/xfs_alloc.h +++ b/fs/xfs/libxfs/xfs_alloc.h @@ -237,4 +237,6 @@ int xfs_read_agf(struct xfs_mount *mp, struct xfs_trans *tp, xfs_agnumber_t agno, int flags, struct xfs_buf **bpp); int xfs_alloc_fix_freelist(struct xfs_alloc_arg *args, int flags); +xfs_extlen_t xfs_prealloc_blocks(struct xfs_mount *mp); + #endif /* __XFS_ALLOC_H__ */ diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 4a48977..ebe0eec 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -1319,18 +1319,11 @@ typedef __be32 xfs_inobt_ptr_t; */ #define XFS_RMAP_CRC_MAGIC 0x524d4233 /* 'RMB3' */ -/* - * The first data block of an AG depends on whether the filesystem was formatted - * with the finobt feature. If so, account for the finobt reserved root btree - * block. - */ -#define XFS_PREALLOC_BLOCKS(mp) \ +#define XFS_RMAP_BLOCK(mp) \ (xfs_sb_version_hasfinobt(&((mp)->m_sb)) ? \ XFS_FIBT_BLOCK(mp) + 1 : \ XFS_IBT_BLOCK(mp) + 1) - - /* * BMAP Btree format definitions * diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index ee3aaa0a..32e24ec 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -246,7 +246,7 @@ xfs_growfs_data_private( agf->agf_flfirst = 0; agf->agf_fllast = cpu_to_be32(XFS_AGFL_SIZE(mp) - 1); agf->agf_flcount = 0; - tmpsize = agsize - XFS_PREALLOC_BLOCKS(mp); + tmpsize = agsize - mp->m_ag_prealloc_blocks; agf->agf_freeblks = cpu_to_be32(tmpsize); agf->agf_longest = cpu_to_be32(tmpsize); if (xfs_sb_version_hascrc(&mp->m_sb)) @@ -343,7 +343,7 @@ xfs_growfs_data_private( agno, 0); arec = XFS_ALLOC_REC_ADDR(mp, XFS_BUF_TO_BLOCK(bp), 1); - arec->ar_startblock = cpu_to_be32(XFS_PREALLOC_BLOCKS(mp)); + arec->ar_startblock = cpu_to_be32(mp->m_ag_prealloc_blocks); arec->ar_blockcount = cpu_to_be32( agsize - be32_to_cpu(arec->ar_startblock)); @@ -372,7 +372,7 @@ xfs_growfs_data_private( agno, 0); arec = XFS_ALLOC_REC_ADDR(mp, XFS_BUF_TO_BLOCK(bp), 1); - arec->ar_startblock = cpu_to_be32(XFS_PREALLOC_BLOCKS(mp)); + arec->ar_startblock = cpu_to_be32(mp->m_ag_prealloc_blocks); arec->ar_blockcount = cpu_to_be32( agsize - be32_to_cpu(arec->ar_startblock)); nfree += be32_to_cpu(arec->ar_blockcount); diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 536a0ee..ef5de545 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -231,6 +231,8 @@ xfs_initialize_perag( if (maxagi) *maxagi = index; + + mp->m_ag_prealloc_blocks = xfs_prealloc_blocks(mp); return 0; out_unwind: diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 1c8611f..9788686 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -93,6 +93,7 @@ typedef struct xfs_mount { uint m_ag_maxlevels; /* XFS_AG_MAXLEVELS */ uint m_bm_maxlevels[2]; /* XFS_BM_MAXLEVELS */ uint m_in_maxlevels; /* max inobt btree levels. */ + xfs_extlen_t m_ag_prealloc_blocks; /* reserved ag blocks */ struct radix_tree_root m_perag_tree; /* per-ag accounting info */ spinlock_t m_perag_lock; /* lock for m_perag_tree */ struct mutex m_growlock; /* growfs mutex */ -- 2.7.0 From dave@fromorbit.com Mon Mar 7 22:17:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 23B6229E05 for ; Mon, 7 Mar 2016 22:17:09 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E9CF5304032 for ; Mon, 7 Mar 2016 20:17:05 -0800 (PST) X-ASG-Debug-ID: 1457410623-04cb6c583320ed40001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id rSfd3j2IjXK0H56V for ; Mon, 07 Mar 2016 20:17:03 -0800 (PST) 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: A2ChCAC/Ud5WPFEqLHlcKAECgw+BP4Zmn30BAgEBAQaRRotQTQEBAQEBAQcBAQEBQUCEQgEFJy8zCDAZOQMHFBmII754hU+JfoN7BZcqjXCOeI5WghgBC4I2KC6JfwEBAQ Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl6.internode.on.net with ESMTP; 08 Mar 2016 14:46:33 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ad94S-0004A4-UH for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:32 +1100 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ad94G-0007u3-Ca for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:20 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 01/16] xfs: introduce rmap btree definitions Date: Tue, 8 Mar 2016 15:16:03 +1100 X-ASG-Orig-Subj: [PATCH 01/16] xfs: introduce rmap btree definitions Message-Id: <1457410578-30233-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1457410578-30233-1-git-send-email-david@fromorbit.com> References: <1457410578-30233-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1457410623 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27662 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- >From : Dave Chinner Add new per-ag rmap btree definitions to the per-ag structures. The rmap btree will sit inthe empty slots on disk after the free space btrees, and hence form a part of the array of space management btrees. This requires the definition of the btree to be contiguous with the free space btrees. Signed-off-by: Dave Chinner Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_alloc.c | 6 ++++++ fs/xfs/libxfs/xfs_btree.c | 4 ++-- fs/xfs/libxfs/xfs_btree.h | 3 +++ fs/xfs/libxfs/xfs_format.h | 22 +++++++++++++++++----- fs/xfs/libxfs/xfs_types.h | 4 ++-- 5 files changed, 30 insertions(+), 9 deletions(-) diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index a708e38..d0b78b7 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -2282,6 +2282,10 @@ xfs_agf_verify( be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNT]) > XFS_BTREE_MAXLEVELS) return false; + if (xfs_sb_version_hasrmapbt(&mp->m_sb) && + be32_to_cpu(agf->agf_levels[XFS_BTNUM_RMAP]) > 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 @@ -2413,6 +2417,8 @@ xfs_alloc_read_agf( be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNOi]); pag->pagf_levels[XFS_BTNUM_CNTi] = be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNTi]); + pag->pagf_levels[XFS_BTNUM_RMAPi] = + be32_to_cpu(agf->agf_levels[XFS_BTNUM_RMAPi]); spin_lock_init(&pag->pagb_lock); pag->pagb_count = 0; pag->pagb_tree = RB_ROOT; diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index 1f88e1c..5953764 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c @@ -43,9 +43,9 @@ kmem_zone_t *xfs_btree_cur_zone; * Btree magic numbers. */ static const __uint32_t xfs_magics[2][XFS_BTNUM_MAX] = { - { XFS_ABTB_MAGIC, XFS_ABTC_MAGIC, XFS_BMAP_MAGIC, XFS_IBT_MAGIC, + { XFS_ABTB_MAGIC, XFS_ABTC_MAGIC, 0, XFS_BMAP_MAGIC, XFS_IBT_MAGIC, XFS_FIBT_MAGIC }, - { XFS_ABTB_CRC_MAGIC, XFS_ABTC_CRC_MAGIC, + { XFS_ABTB_CRC_MAGIC, XFS_ABTC_CRC_MAGIC, XFS_RMAP_CRC_MAGIC, XFS_BMAP_CRC_MAGIC, XFS_IBT_CRC_MAGIC, XFS_FIBT_CRC_MAGIC } }; #define xfs_btree_magic(cur) \ diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h index 2e874be..ac9c355 100644 --- a/fs/xfs/libxfs/xfs_btree.h +++ b/fs/xfs/libxfs/xfs_btree.h @@ -63,6 +63,7 @@ union xfs_btree_rec { #define XFS_BTNUM_BMAP ((xfs_btnum_t)XFS_BTNUM_BMAPi) #define XFS_BTNUM_INO ((xfs_btnum_t)XFS_BTNUM_INOi) #define XFS_BTNUM_FINO ((xfs_btnum_t)XFS_BTNUM_FINOi) +#define XFS_BTNUM_RMAP ((xfs_btnum_t)XFS_BTNUM_RMAPi) /* * For logging record fields. @@ -95,6 +96,7 @@ do { \ case XFS_BTNUM_BMAP: __XFS_BTREE_STATS_INC(__mp, bmbt, stat); break; \ case XFS_BTNUM_INO: __XFS_BTREE_STATS_INC(__mp, ibt, stat); break; \ case XFS_BTNUM_FINO: __XFS_BTREE_STATS_INC(__mp, fibt, stat); break; \ + case XFS_BTNUM_RMAP: break; \ case XFS_BTNUM_MAX: ASSERT(0); /* fucking gcc */ ; break; \ } \ } while (0) @@ -115,6 +117,7 @@ do { \ __XFS_BTREE_STATS_ADD(__mp, ibt, stat, val); break; \ case XFS_BTNUM_FINO: \ __XFS_BTREE_STATS_ADD(__mp, fibt, stat, val); break; \ + case XFS_BTNUM_RMAP: break; \ case XFS_BTNUM_MAX: ASSERT(0); /* fucking gcc */ ; break; \ } \ } while (0) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index dc97eb21..4a48977 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -455,6 +455,7 @@ xfs_sb_has_compat_feature( } #define XFS_SB_FEAT_RO_COMPAT_FINOBT (1 << 0) /* free inode btree */ +#define XFS_SB_FEAT_RO_COMPAT_RMAPBT (1 << 1) /* reverse map btree */ #define XFS_SB_FEAT_RO_COMPAT_ALL \ (XFS_SB_FEAT_RO_COMPAT_FINOBT) #define XFS_SB_FEAT_RO_COMPAT_UNKNOWN ~XFS_SB_FEAT_RO_COMPAT_ALL @@ -538,6 +539,12 @@ static inline bool xfs_sb_version_hasmetauuid(struct xfs_sb *sbp) (sbp->sb_features_incompat & XFS_SB_FEAT_INCOMPAT_META_UUID); } +static inline bool xfs_sb_version_hasrmapbt(struct xfs_sb *sbp) +{ + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) && + (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_RMAPBT); +} + /* * end of superblock version macros */ @@ -598,10 +605,10 @@ xfs_is_quota_inode(struct xfs_sb *sbp, xfs_ino_t ino) #define XFS_AGI_GOOD_VERSION(v) ((v) == XFS_AGI_VERSION) /* - * Btree number 0 is bno, 1 is cnt. This value gives the size of the + * Btree number 0 is bno, 1 is cnt, 2 is rmap. This value gives the size of the * arrays below. */ -#define XFS_BTNUM_AGF ((int)XFS_BTNUM_CNTi + 1) +#define XFS_BTNUM_AGF ((int)XFS_BTNUM_RMAPi + 1) /* * The second word of agf_levels in the first a.g. overlaps the EFS @@ -618,12 +625,10 @@ typedef struct xfs_agf { __be32 agf_seqno; /* sequence # starting from 0 */ __be32 agf_length; /* size in blocks of a.g. */ /* - * Freespace information + * Freespace and rmap information */ __be32 agf_roots[XFS_BTNUM_AGF]; /* root blocks */ - __be32 agf_spare0; /* spare field */ __be32 agf_levels[XFS_BTNUM_AGF]; /* btree levels */ - __be32 agf_spare1; /* spare field */ __be32 agf_flfirst; /* first freelist block's index */ __be32 agf_fllast; /* last freelist block's index */ @@ -1308,6 +1313,13 @@ typedef __be32 xfs_inobt_ptr_t; #define XFS_FIBT_BLOCK(mp) ((xfs_agblock_t)(XFS_IBT_BLOCK(mp) + 1)) /* + * Reverse mapping btree format definitions + * + * There is a btree for the reverse map per allocation group + */ +#define XFS_RMAP_CRC_MAGIC 0x524d4233 /* 'RMB3' */ + +/* * The first data block of an AG depends on whether the filesystem was formatted * with the finobt feature. If so, account for the finobt reserved root btree * block. diff --git a/fs/xfs/libxfs/xfs_types.h b/fs/xfs/libxfs/xfs_types.h index b79dc66..3d50364 100644 --- a/fs/xfs/libxfs/xfs_types.h +++ b/fs/xfs/libxfs/xfs_types.h @@ -108,8 +108,8 @@ typedef enum { } xfs_lookup_t; typedef enum { - XFS_BTNUM_BNOi, XFS_BTNUM_CNTi, XFS_BTNUM_BMAPi, XFS_BTNUM_INOi, - XFS_BTNUM_FINOi, XFS_BTNUM_MAX + XFS_BTNUM_BNOi, XFS_BTNUM_CNTi, XFS_BTNUM_RMAPi, XFS_BTNUM_BMAPi, + XFS_BTNUM_INOi, XFS_BTNUM_FINOi, XFS_BTNUM_MAX } xfs_btnum_t; struct xfs_name { -- 2.7.0 From dave@fromorbit.com Mon Mar 7 22:17:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 860F37CA0 for ; Mon, 7 Mar 2016 22:17:09 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 31DE28F804B for ; Mon, 7 Mar 2016 20:17:09 -0800 (PST) X-ASG-Debug-ID: 1457410624-04bdf002ec2427c0002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id M0PgBkdKjfPCHPV1 for ; Mon, 07 Mar 2016 20:17:06 -0800 (PST) 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: A2ChCAC/Ud5WPFEqLHlcKAECgw+BP4Zmn30BAgEBAQaRRotQTQEBAQEBAQcBAQEBQUCEQgEFJy8zCBgYGTkDBxQZiCO+eIVPiX6DewWXKo1wgWGHaYUujlaCGAELgjYoLol/AQEB Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl6.internode.on.net with ESMTP; 08 Mar 2016 14:46:34 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ad94T-0004AB-2Q for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:33 +1100 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ad94G-0007uc-Gt for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:20 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 08/16] xfs: add rmap btree growfs support Date: Tue, 8 Mar 2016 15:16:10 +1100 X-ASG-Orig-Subj: [PATCH 08/16] xfs: add rmap btree growfs support Message-Id: <1457410578-30233-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1457410578-30233-1-git-send-email-david@fromorbit.com> References: <1457410578-30233-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1457410626 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27662 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Now we can read and write rmap btree blocks, we can add support to the growfs code to initialise new rmap btree blocks. [darrick.wong@oracle.com: fill out the rmap offset fields] Signed-off-by: Dave Chinner Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- fs/xfs/xfs_fsops.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index b4ab22c..042f215 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -32,6 +32,7 @@ #include "xfs_btree.h" #include "xfs_alloc_btree.h" #include "xfs_alloc.h" +#include "xfs_rmap_btree.h" #include "xfs_ialloc.h" #include "xfs_fsops.h" #include "xfs_itable.h" @@ -243,6 +244,12 @@ xfs_growfs_data_private( agf->agf_roots[XFS_BTNUM_CNTi] = cpu_to_be32(XFS_CNT_BLOCK(mp)); agf->agf_levels[XFS_BTNUM_BNOi] = cpu_to_be32(1); agf->agf_levels[XFS_BTNUM_CNTi] = cpu_to_be32(1); + if (xfs_sb_version_hasrmapbt(&mp->m_sb)) { + agf->agf_roots[XFS_BTNUM_RMAPi] = + cpu_to_be32(XFS_RMAP_BLOCK(mp)); + agf->agf_levels[XFS_BTNUM_RMAPi] = cpu_to_be32(1); + } + agf->agf_flfirst = 0; agf->agf_fllast = cpu_to_be32(XFS_AGFL_SIZE(mp) - 1); agf->agf_flcount = 0; @@ -382,6 +389,72 @@ xfs_growfs_data_private( if (error) goto error0; + /* RMAP btree root block */ + if (xfs_sb_version_hasrmapbt(&mp->m_sb)) { + struct xfs_rmap_rec *rrec; + struct xfs_btree_block *block; + + bp = xfs_growfs_get_hdr_buf(mp, + XFS_AGB_TO_DADDR(mp, agno, XFS_RMAP_BLOCK(mp)), + BTOBB(mp->m_sb.sb_blocksize), 0, + &xfs_rmapbt_buf_ops); + if (!bp) { + error = -ENOMEM; + goto error0; + } + + xfs_btree_init_block(mp, bp, XFS_RMAP_CRC_MAGIC, 0, 0, + agno, XFS_BTREE_CRC_BLOCKS); + block = XFS_BUF_TO_BLOCK(bp); + + + /* + * mark the AG header regions as static metadata The BNO + * btree block is the first block after the headers, so + * it's location defines the size of region the static + * metadata consumes. + * + * Note: unlike mkfs, we never have to account for log + * space when growing the data regions + */ + rrec = XFS_RMAP_REC_ADDR(block, 1); + rrec->rm_startblock = 0; + rrec->rm_blockcount = cpu_to_be32(XFS_BNO_BLOCK(mp)); + rrec->rm_owner = cpu_to_be64(XFS_RMAP_OWN_FS); + rrec->rm_offset = 0; + be16_add_cpu(&block->bb_numrecs, 1); + + /* account freespace btree root blocks */ + rrec = XFS_RMAP_REC_ADDR(block, 2); + rrec->rm_startblock = cpu_to_be32(XFS_BNO_BLOCK(mp)); + rrec->rm_blockcount = cpu_to_be32(2); + rrec->rm_owner = cpu_to_be64(XFS_RMAP_OWN_AG); + rrec->rm_offset = 0; + be16_add_cpu(&block->bb_numrecs, 1); + + /* account inode btree root blocks */ + rrec = XFS_RMAP_REC_ADDR(block, 3); + rrec->rm_startblock = cpu_to_be32(XFS_IBT_BLOCK(mp)); + rrec->rm_blockcount = cpu_to_be32(XFS_RMAP_BLOCK(mp) - + XFS_IBT_BLOCK(mp)); + rrec->rm_owner = cpu_to_be64(XFS_RMAP_OWN_INOBT); + rrec->rm_offset = 0; + be16_add_cpu(&block->bb_numrecs, 1); + + /* account for rmap btree root */ + rrec = XFS_RMAP_REC_ADDR(block, 4); + rrec->rm_startblock = cpu_to_be32(XFS_RMAP_BLOCK(mp)); + rrec->rm_blockcount = cpu_to_be32(1); + rrec->rm_owner = cpu_to_be64(XFS_RMAP_OWN_AG); + rrec->rm_offset = 0; + be16_add_cpu(&block->bb_numrecs, 1); + + error = xfs_bwrite(bp); + xfs_buf_relse(bp); + if (error) + goto error0; + } + /* * INO btree root block */ -- 2.7.0 From dave@fromorbit.com Mon Mar 7 22:17:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9C76B29E07 for ; Mon, 7 Mar 2016 22:17:08 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 604D98F8039 for ; Mon, 7 Mar 2016 20:17:05 -0800 (PST) X-ASG-Debug-ID: 1457410622-04cb6c583120ed30001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id OGgDHFr8VkMCszn1 for ; Mon, 07 Mar 2016 20:17:02 -0800 (PST) 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: A2CdCAC/Ud5WPFEqLHlcKAECgw+IJZ99AQIBAQEGkUaLUE0BAQEBAQEHAQEBAUFAhR47gQIDB4hQnzmfP4VPiguDbgWSeoQwjXCOeI5WghgBAQgBAQEBPxmBXCiKLQEBAQ Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl6.internode.on.net with ESMTP; 08 Mar 2016 14:46:33 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ad94S-0004A3-Tp for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:32 +1100 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ad94G-0007u0-Bl for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:20 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/16] xfs: first part of rmapbt functionality Date: Tue, 8 Mar 2016 15:16:02 +1100 X-ASG-Orig-Subj: [PATCH 0/16] xfs: first part of rmapbt functionality Message-Id: <1457410578-30233-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1457410622 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27662 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, This is the first set of patches for reverse mapping support that I've grabbed from Darrick's tree. They are are largely unchanged from his tree, with minor cleanups to the commit messages and formatting (e.g. de-shouting inline functions), some small bug fixes and some code/patch rearrangement. Changes are noted in the commit messages. This isn't all of the rmap functionality. It's patches up to the point where I've come across the first piece that needs to be reworked (the rmap intent execution code), so there's no point holding these back until I've sorted that out. This builds on top of for-next and the patch set I posted yesterday. Darrick, I've changed the authorship of the patches to reflect the original series this has come from - can you check to see if there's anything I got wrong when I did that? Cheers, Dave. From dave@fromorbit.com Mon Mar 7 22:17:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 07E3029E19 for ; Mon, 7 Mar 2016 22:17:12 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 53EEAAC001 for ; Mon, 7 Mar 2016 20:17:11 -0800 (PST) X-ASG-Debug-ID: 1457410622-04cb6c583120ed30003-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id q53SoCqDg1gmldCk for ; Mon, 07 Mar 2016 20:17:07 -0800 (PST) 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: A2CxDAC/Ud5WPFEqLHlcKAECgw+BP4Zmn30BAgEBAQaRRoZngzKBN00BAQEBAQEHAQEBAUFAQQ4Bg3IBBScvMwgYMTkDBxQZiCO+eIVPiWuEDgWNMIk4Qo1wgWGHaYUujlaCGAELAUAZgVwoLogOgXEBAQE Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl6.internode.on.net with ESMTP; 08 Mar 2016 14:46:33 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ad94T-0004AA-1s for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:33 +1100 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ad94G-0007uX-GS for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:20 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 07/16] xfs: define the on-disk rmap btree format Date: Tue, 8 Mar 2016 15:16:09 +1100 X-ASG-Orig-Subj: [PATCH 07/16] xfs: define the on-disk rmap btree format Message-Id: <1457410578-30233-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1457410578-30233-1-git-send-email-david@fromorbit.com> References: <1457410578-30233-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1457410626 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27662 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Now we have all the surrounding call infrastructure in place, we can start filling out the rmap btree implementation. Start with the on-disk btree format; add everything needed to read, write and manipulate rmap btree blocks. This prepares the way for adding the btree operations implementation. [darrick.wong@oracle.com: record owner and offset info in rmap btree] [darrick.wong@oracle.com: fork, bmbt and unwritten state in rmap btree] Signed-off-by: Dave Chinner Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- fs/xfs/Makefile | 1 + fs/xfs/libxfs/xfs_btree.c | 3 + fs/xfs/libxfs/xfs_btree.h | 18 +++-- fs/xfs/libxfs/xfs_format.h | 95 +++++++++++++++++++++++ fs/xfs/libxfs/xfs_rmap_btree.c | 170 +++++++++++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_rmap_btree.h | 31 ++++++++ fs/xfs/libxfs/xfs_sb.c | 6 ++ fs/xfs/libxfs/xfs_shared.h | 2 + fs/xfs/xfs_mount.h | 2 + fs/xfs/xfs_ondisk.h | 3 + 10 files changed, 323 insertions(+), 8 deletions(-) create mode 100644 fs/xfs/libxfs/xfs_rmap_btree.c diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index c202ce3..9391080 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -52,6 +52,7 @@ xfs-y += $(addprefix libxfs/, \ xfs_inode_buf.o \ xfs_log_rlimit.o \ xfs_rmap.o \ + xfs_rmap_btree.o \ xfs_sb.o \ xfs_symlink_remote.o \ xfs_trans_resv.o \ diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index 5953764..1240117 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c @@ -1144,6 +1144,9 @@ xfs_btree_set_refs( case XFS_BTNUM_BMAP: xfs_buf_set_ref(bp, XFS_BMAP_BTREE_REF); break; + case XFS_BTNUM_RMAP: + xfs_buf_set_ref(bp, XFS_RMAP_BTREE_REF); + break; default: ASSERT(0); } diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h index 1fcf272..07fa27e 100644 --- a/fs/xfs/libxfs/xfs_btree.h +++ b/fs/xfs/libxfs/xfs_btree.h @@ -38,17 +38,19 @@ union xfs_btree_ptr { }; union xfs_btree_key { - xfs_bmbt_key_t bmbt; - xfs_bmdr_key_t bmbr; /* bmbt root block */ - xfs_alloc_key_t alloc; - xfs_inobt_key_t inobt; + struct xfs_bmbt_key bmbt; + xfs_bmdr_key_t bmbr; /* bmbt root block */ + xfs_alloc_key_t alloc; + struct xfs_inobt_key inobt; + struct xfs_rmap_key rmap; }; union xfs_btree_rec { - xfs_bmbt_rec_t bmbt; - xfs_bmdr_rec_t bmbr; /* bmbt root block */ - xfs_alloc_rec_t alloc; - xfs_inobt_rec_t inobt; + struct xfs_bmbt_rec bmbt; + xfs_bmdr_rec_t bmbr; /* bmbt root block */ + struct xfs_alloc_rec alloc; + struct xfs_inobt_rec inobt; + struct xfs_rmap_rec rmap; }; /* diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 232c145..508b3ea 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -1384,11 +1384,106 @@ xfs_rmap_ino_owner( #define XFS_RMAP_OWN_INODES (-7ULL) /* Inode chunk */ #define XFS_RMAP_OWN_MIN (-8ULL) /* guard */ +#define XFS_RMAP_NON_INODE_OWNER(owner) (!!((owner) & (1ULL << 63))) + +/* + * Data record structure + */ +struct xfs_rmap_rec { + __be32 rm_startblock; /* extent start block */ + __be32 rm_blockcount; /* extent length */ + __be64 rm_owner; /* extent owner */ + __be64 rm_offset; /* offset within the owner */ +}; + +/* + * rmap btree record + * rm_blockcount:31 is the unwritten extent flag (same as l0:63 in bmbt) + * rm_blockcount:0-30 are the extent length + * rm_offset:63 is the attribute fork flag + * rm_offset:62 is the bmbt block flag + * rm_offset:0-61 is the block offset within the inode + */ +#define XFS_RMAP_OFF_ATTR ((__uint64_t)1ULL << 63) +#define XFS_RMAP_OFF_BMBT ((__uint64_t)1ULL << 62) +#define XFS_RMAP_LEN_UNWRITTEN ((xfs_extlen_t)1U << 31) + +#define XFS_RMAP_OFF_MASK ~(XFS_RMAP_OFF_ATTR | XFS_RMAP_OFF_BMBT) +#define XFS_RMAP_LEN_MASK ~XFS_RMAP_LEN_UNWRITTEN + +#define XFS_RMAP_OFF(off) ((off) & XFS_RMAP_OFF_MASK) +#define XFS_RMAP_LEN(len) ((len) & XFS_RMAP_LEN_MASK) + +#define XFS_RMAP_IS_BMBT(off) (!!((off) & XFS_RMAP_OFF_BMBT)) +#define XFS_RMAP_IS_ATTR_FORK(off) (!!((off) & XFS_RMAP_OFF_ATTR)) +#define XFS_RMAP_IS_UNWRITTEN(len) (!!((len) & XFS_RMAP_LEN_UNWRITTEN)) + +#define RMAPBT_STARTBLOCK_BITLEN 32 +#define RMAPBT_EXNTFLAG_BITLEN 1 +#define RMAPBT_BLOCKCOUNT_BITLEN 31 +#define RMAPBT_OWNER_BITLEN 64 +#define RMAPBT_ATTRFLAG_BITLEN 1 +#define RMAPBT_BMBTFLAG_BITLEN 1 +#define RMAPBT_OFFSET_BITLEN 62 + +struct xfs_rmap_irec { + xfs_agblock_t rm_startblock; /* extent start block */ + xfs_extlen_t rm_blockcount; /* extent length */ + __uint64_t rm_owner; /* extent owner */ + __uint64_t rm_offset; /* offset within the owner */ +}; + +/* + * Key structure + * + * We don't use the length for lookups + */ +struct xfs_rmap_key { + __be32 rm_startblock; /* extent start block */ + __be64 rm_owner; /* extent owner */ + __be64 rm_offset; /* offset within the owner */ +} __attribute__((packed)); + +/* btree pointer type */ +typedef __be32 xfs_rmap_ptr_t; + #define XFS_RMAP_BLOCK(mp) \ (xfs_sb_version_hasfinobt(&((mp)->m_sb)) ? \ XFS_FIBT_BLOCK(mp) + 1 : \ XFS_IBT_BLOCK(mp) + 1) +static inline void +xfs_owner_info_unpack( + struct xfs_owner_info *oinfo, + uint64_t *owner, + uint64_t *offset) +{ + __uint64_t r; + + *owner = oinfo->oi_owner; + r = oinfo->oi_offset; + if (oinfo->oi_flags & XFS_RMAP_INO_ATTR_FORK) + r |= XFS_RMAP_OFF_ATTR; + if (oinfo->oi_flags & XFS_RMAP_BMBT_BLOCK) + r |= XFS_RMAP_OFF_BMBT; + *offset = r; +} + +static inline void +xfs_owner_info_pack( + struct xfs_owner_info *oinfo, + uint64_t owner, + uint64_t offset) +{ + oinfo->oi_owner = owner; + oinfo->oi_offset = XFS_RMAP_OFF(offset); + oinfo->oi_flags = 0; + if (XFS_RMAP_IS_ATTR_FORK(offset)) + oinfo->oi_flags |= XFS_RMAP_INO_ATTR_FORK; + if (XFS_RMAP_IS_BMBT(offset)) + oinfo->oi_flags |= XFS_RMAP_BMBT_BLOCK; +} + /* * BMAP Btree format definitions * diff --git a/fs/xfs/libxfs/xfs_rmap_btree.c b/fs/xfs/libxfs/xfs_rmap_btree.c new file mode 100644 index 0000000..882e8e2 --- /dev/null +++ b/fs/xfs/libxfs/xfs_rmap_btree.c @@ -0,0 +1,170 @@ +/* + * Copyright (c) 2014 Red Hat, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include "xfs.h" +#include "xfs_fs.h" +#include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" +#include "xfs_bit.h" +#include "xfs_sb.h" +#include "xfs_mount.h" +#include "xfs_inode.h" +#include "xfs_trans.h" +#include "xfs_alloc.h" +#include "xfs_btree.h" +#include "xfs_rmap_btree.h" +#include "xfs_trace.h" +#include "xfs_cksum.h" +#include "xfs_error.h" +#include "xfs_extent_busy.h" + +static struct xfs_btree_cur * +xfs_rmapbt_dup_cursor( + struct xfs_btree_cur *cur) +{ + return xfs_rmapbt_init_cursor(cur->bc_mp, cur->bc_tp, + cur->bc_private.a.agbp, cur->bc_private.a.agno); +} + +static bool +xfs_rmapbt_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); + struct xfs_perag *pag = bp->b_pag; + unsigned int level; + + /* + * magic number and level verification + * + * During growfs operations, we can't verify the exact level or owner as + * the perag is not fully initialised and hence not attached to the + * buffer. In this case, check against the maximum tree depth. + * + * Similarly, during log recovery we will have a perag structure + * attached, but the agf information will not yet have been initialised + * from the on disk AGF. Again, we can only check against maximum limits + * in this case. + */ + if (block->bb_magic != cpu_to_be32(XFS_RMAP_CRC_MAGIC)) + return false; + + if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) + return false; + if (!xfs_btree_sblock_v5hdr_verify(bp)) + return false; + + level = be16_to_cpu(block->bb_level); + if (pag && pag->pagf_init) { + if (level >= pag->pagf_levels[XFS_BTNUM_RMAPi]) + return false; + } else if (level >= mp->m_ag_maxlevels) + return false; + + return xfs_btree_sblock_verify(bp, mp->m_rmap_mxr[level != 0]); +} + +static void +xfs_rmapbt_read_verify( + struct xfs_buf *bp) +{ + if (!xfs_btree_sblock_verify_crc(bp)) + xfs_buf_ioerror(bp, -EFSBADCRC); + else if (!xfs_rmapbt_verify(bp)) + xfs_buf_ioerror(bp, -EFSCORRUPTED); + + if (bp->b_error) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + xfs_verifier_error(bp); + } +} + +static void +xfs_rmapbt_write_verify( + struct xfs_buf *bp) +{ + if (!xfs_rmapbt_verify(bp)) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + xfs_buf_ioerror(bp, -EFSCORRUPTED); + xfs_verifier_error(bp); + return; + } + xfs_btree_sblock_calc_crc(bp); + +} + +const struct xfs_buf_ops xfs_rmapbt_buf_ops = { + .name = "xfs_rmapbt", + .verify_read = xfs_rmapbt_read_verify, + .verify_write = xfs_rmapbt_write_verify, +}; + +static const struct xfs_btree_ops xfs_rmapbt_ops = { + .rec_len = sizeof(struct xfs_rmap_rec), + .key_len = sizeof(struct xfs_rmap_key), + + .dup_cursor = xfs_rmapbt_dup_cursor, + .buf_ops = &xfs_rmapbt_buf_ops, +}; + +/* + * Allocate a new allocation btree cursor. + */ +struct xfs_btree_cur * +xfs_rmapbt_init_cursor( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_buf *agbp, + xfs_agnumber_t agno) +{ + struct xfs_agf *agf = XFS_BUF_TO_AGF(agbp); + struct xfs_btree_cur *cur; + + cur = kmem_zone_zalloc(xfs_btree_cur_zone, KM_SLEEP); + cur->bc_tp = tp; + cur->bc_mp = mp; + cur->bc_btnum = XFS_BTNUM_RMAP; + cur->bc_flags = XFS_BTREE_CRC_BLOCKS; + cur->bc_blocklog = mp->m_sb.sb_blocklog; + cur->bc_ops = &xfs_rmapbt_ops; + cur->bc_nlevels = be32_to_cpu(agf->agf_levels[XFS_BTNUM_RMAP]); + + cur->bc_private.a.agbp = agbp; + cur->bc_private.a.agno = agno; + + return cur; +} + +/* + * Calculate number of records in an rmap btree block. + */ +int +xfs_rmapbt_maxrecs( + struct xfs_mount *mp, + int blocklen, + int leaf) +{ + blocklen -= XFS_RMAP_BLOCK_LEN; + + if (leaf) + return blocklen / sizeof(struct xfs_rmap_rec); + return blocklen / + (sizeof(struct xfs_rmap_key) + sizeof(xfs_rmap_ptr_t)); +} diff --git a/fs/xfs/libxfs/xfs_rmap_btree.h b/fs/xfs/libxfs/xfs_rmap_btree.h index a3b8f90..2e02362 100644 --- a/fs/xfs/libxfs/xfs_rmap_btree.h +++ b/fs/xfs/libxfs/xfs_rmap_btree.h @@ -19,6 +19,37 @@ #define __XFS_RMAP_BTREE_H__ struct xfs_buf; +struct xfs_btree_cur; +struct xfs_mount; + +/* rmaps only exist on crc enabled filesystems */ +#define XFS_RMAP_BLOCK_LEN XFS_BTREE_SBLOCK_CRC_LEN + +/* + * Record, key, and pointer address macros for btree blocks. + * + * (note that some of these may appear unused, but they are used in userspace) + */ +#define XFS_RMAP_REC_ADDR(block, index) \ + ((struct xfs_rmap_rec *) \ + ((char *)(block) + XFS_RMAP_BLOCK_LEN + \ + (((index) - 1) * sizeof(struct xfs_rmap_rec)))) + +#define XFS_RMAP_KEY_ADDR(block, index) \ + ((struct xfs_rmap_key *) \ + ((char *)(block) + XFS_RMAP_BLOCK_LEN + \ + ((index) - 1) * sizeof(struct xfs_rmap_key))) + +#define XFS_RMAP_PTR_ADDR(block, index, maxrecs) \ + ((xfs_rmap_ptr_t *) \ + ((char *)(block) + XFS_RMAP_BLOCK_LEN + \ + (maxrecs) * sizeof(struct xfs_rmap_key) + \ + ((index) - 1) * sizeof(xfs_rmap_ptr_t))) + +struct xfs_btree_cur *xfs_rmapbt_init_cursor(struct xfs_mount *mp, + struct xfs_trans *tp, struct xfs_buf *bp, + xfs_agnumber_t agno); +int xfs_rmapbt_maxrecs(struct xfs_mount *mp, int blocklen, int leaf); int xfs_rmap_alloc(struct xfs_trans *tp, struct xfs_buf *agbp, xfs_agnumber_t agno, xfs_agblock_t bno, xfs_extlen_t len, diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index 8a53eaa..fadf750 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -36,6 +36,7 @@ #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" #include "xfs_log.h" +#include "xfs_rmap_btree.h" /* * Physical superblock buffer manipulations. Shared with libxfs in userspace. @@ -729,6 +730,11 @@ xfs_sb_mount_common( mp->m_bmap_dmnr[0] = mp->m_bmap_dmxr[0] / 2; mp->m_bmap_dmnr[1] = mp->m_bmap_dmxr[1] / 2; + mp->m_rmap_mxr[0] = xfs_rmapbt_maxrecs(mp, sbp->sb_blocksize, 1); + mp->m_rmap_mxr[1] = xfs_rmapbt_maxrecs(mp, sbp->sb_blocksize, 0); + mp->m_rmap_mnr[0] = mp->m_rmap_mxr[0] / 2; + mp->m_rmap_mnr[1] = mp->m_rmap_mxr[1] / 2; + mp->m_bsize = XFS_FSB_TO_BB(mp, 1); mp->m_ialloc_inos = (int)MAX((__uint16_t)XFS_INODES_PER_CHUNK, sbp->sb_inopblock); diff --git a/fs/xfs/libxfs/xfs_shared.h b/fs/xfs/libxfs/xfs_shared.h index 81ac870..4912072 100644 --- a/fs/xfs/libxfs/xfs_shared.h +++ b/fs/xfs/libxfs/xfs_shared.h @@ -38,6 +38,7 @@ extern const struct xfs_buf_ops xfs_agi_buf_ops; extern const struct xfs_buf_ops xfs_agf_buf_ops; extern const struct xfs_buf_ops xfs_agfl_buf_ops; extern const struct xfs_buf_ops xfs_allocbt_buf_ops; +extern const struct xfs_buf_ops xfs_rmapbt_buf_ops; extern const struct xfs_buf_ops xfs_attr3_leaf_buf_ops; extern const struct xfs_buf_ops xfs_attr3_rmt_buf_ops; extern const struct xfs_buf_ops xfs_bmbt_buf_ops; @@ -212,6 +213,7 @@ int xfs_log_calc_minimum_size(struct xfs_mount *); #define XFS_INO_BTREE_REF 3 #define XFS_ALLOC_BTREE_REF 2 #define XFS_BMAP_BTREE_REF 2 +#define XFS_RMAP_BTREE_REF 2 #define XFS_DIR_BTREE_REF 2 #define XFS_INO_REF 2 #define XFS_ATTR_BTREE_REF 1 diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 9788686..b409a2a 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -90,6 +90,8 @@ typedef struct xfs_mount { uint m_bmap_dmnr[2]; /* min bmap btree records */ uint m_inobt_mxr[2]; /* max inobt btree records */ uint m_inobt_mnr[2]; /* min inobt btree records */ + uint m_rmap_mxr[2]; /* max rmap btree records */ + uint m_rmap_mnr[2]; /* min rmap btree records */ uint m_ag_maxlevels; /* XFS_AG_MAXLEVELS */ uint m_bm_maxlevels[2]; /* XFS_BM_MAXLEVELS */ uint m_in_maxlevels; /* max inobt btree levels. */ diff --git a/fs/xfs/xfs_ondisk.h b/fs/xfs/xfs_ondisk.h index 9a78408..07fb5d8 100644 --- a/fs/xfs/xfs_ondisk.h +++ b/fs/xfs/xfs_ondisk.h @@ -42,11 +42,14 @@ xfs_check_ondisk_structs(void) XFS_CHECK_STRUCT_SIZE(struct xfs_dsymlink_hdr, 56); XFS_CHECK_STRUCT_SIZE(struct xfs_inobt_key, 4); XFS_CHECK_STRUCT_SIZE(struct xfs_inobt_rec, 16); + XFS_CHECK_STRUCT_SIZE(struct xfs_rmap_key, 20); + XFS_CHECK_STRUCT_SIZE(struct xfs_rmap_rec, 24); XFS_CHECK_STRUCT_SIZE(struct xfs_timestamp, 8); XFS_CHECK_STRUCT_SIZE(xfs_alloc_key_t, 8); XFS_CHECK_STRUCT_SIZE(xfs_alloc_ptr_t, 4); XFS_CHECK_STRUCT_SIZE(xfs_alloc_rec_t, 8); XFS_CHECK_STRUCT_SIZE(xfs_inobt_ptr_t, 4); + XFS_CHECK_STRUCT_SIZE(xfs_rmap_ptr_t, 4); /* dir/attr trees */ XFS_CHECK_STRUCT_SIZE(struct xfs_attr3_leaf_hdr, 80); -- 2.7.0 From dave@fromorbit.com Mon Mar 7 22:17:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E90D629E1B for ; Mon, 7 Mar 2016 22:17:12 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4D6CFAC001 for ; Mon, 7 Mar 2016 20:17:09 -0800 (PST) X-ASG-Debug-ID: 1457410623-04cb6c583320ed40003-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id DflHNA6hA4faTfH8 for ; Mon, 07 Mar 2016 20:17:07 -0800 (PST) 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: A2ChCAC/Ud5WPFEqLHlcKAECgw+BP4Zmn30BAgEBAQaRRotQTQEBAQEBAQcBAQEBQUCEQgEFJy8zCBgxOQMHFBmII754hU+NeQWXKo1wgWGNF4V6iFyCGAELgjYoLol/AQEB Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl6.internode.on.net with ESMTP; 08 Mar 2016 14:46:34 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ad94T-0004AQ-68 for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:33 +1100 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ad94G-0007vB-Kb for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:20 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 15/16] xfs: add rmap btree insert and delete helpers Date: Tue, 8 Mar 2016 15:16:17 +1100 X-ASG-Orig-Subj: [PATCH 15/16] xfs: add rmap btree insert and delete helpers Message-Id: <1457410578-30233-16-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1457410578-30233-1-git-send-email-david@fromorbit.com> References: <1457410578-30233-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1457410626 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27662 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: "Darrick J. Wong" Add a couple of helper functions to encapsulate rmap btree insert and delete operations. Add tracepoints to the update function. Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_rmap.c | 62 ++++++++++++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_rmap_btree.h | 2 ++ 2 files changed, 64 insertions(+) diff --git a/fs/xfs/libxfs/xfs_rmap.c b/fs/xfs/libxfs/xfs_rmap.c index d2e01b2..479cb73 100644 --- a/fs/xfs/libxfs/xfs_rmap.c +++ b/fs/xfs/libxfs/xfs_rmap.c @@ -88,6 +88,10 @@ xfs_rmap_update( { union xfs_btree_rec rec; + trace_xfs_rmapbt_update(cur->bc_mp, cur->bc_private.a.agno, + irec->rm_startblock, irec->rm_blockcount, + irec->rm_owner, irec->rm_offset); + rec.rmap.rm_startblock = cpu_to_be32(irec->rm_startblock); rec.rmap.rm_blockcount = cpu_to_be32(irec->rm_blockcount); rec.rmap.rm_owner = cpu_to_be64(irec->rm_owner); @@ -95,6 +99,64 @@ xfs_rmap_update( return xfs_btree_update(cur, &rec); } +int +xfs_rmapbt_insert( + struct xfs_btree_cur *rcur, + xfs_agblock_t agbno, + xfs_extlen_t len, + uint64_t owner, + uint64_t offset) +{ + int i; + int error; + + trace_xfs_rmapbt_insert(rcur->bc_mp, rcur->bc_private.a.agno, agbno, + len, owner, offset); + + error = xfs_rmap_lookup_eq(rcur, agbno, len, owner, offset, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(rcur->bc_mp, i == 0, done); + + rcur->bc_rec.r.rm_startblock = agbno; + rcur->bc_rec.r.rm_blockcount = len; + rcur->bc_rec.r.rm_owner = owner; + rcur->bc_rec.r.rm_offset = offset; + error = xfs_btree_insert(rcur, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(rcur->bc_mp, i == 1, done); +done: + return error; +} + +STATIC int +xfs_rmapbt_delete( + struct xfs_btree_cur *rcur, + xfs_agblock_t agbno, + xfs_extlen_t len, + uint64_t owner, + uint64_t offset) +{ + int i; + int error; + + trace_xfs_rmapbt_delete(rcur->bc_mp, rcur->bc_private.a.agno, agbno, + len, owner, offset); + + error = xfs_rmap_lookup_eq(rcur, agbno, len, owner, offset, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(rcur->bc_mp, i == 1, done); + + error = xfs_btree_delete(rcur, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(rcur->bc_mp, i == 1, done); +done: + return error; +} + /* * Get the data from the pointed-to record. */ diff --git a/fs/xfs/libxfs/xfs_rmap_btree.h b/fs/xfs/libxfs/xfs_rmap_btree.h index 0dfc151..d7c9722 100644 --- a/fs/xfs/libxfs/xfs_rmap_btree.h +++ b/fs/xfs/libxfs/xfs_rmap_btree.h @@ -55,6 +55,8 @@ int xfs_rmap_lookup_le(struct xfs_btree_cur *cur, xfs_agblock_t bno, xfs_extlen_t len, uint64_t owner, uint64_t offset, int *stat); int xfs_rmap_lookup_eq(struct xfs_btree_cur *cur, xfs_agblock_t bno, xfs_extlen_t len, uint64_t owner, uint64_t offset, int *stat); +int xfs_rmapbt_insert(struct xfs_btree_cur *rcur, xfs_agblock_t agbno, + xfs_extlen_t len, uint64_t owner, uint64_t offset); int xfs_rmap_get_rec(struct xfs_btree_cur *cur, struct xfs_rmap_irec *irec, int *stat); -- 2.7.0 From dave@fromorbit.com Mon Mar 7 22:17:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9B3B529E07 for ; Mon, 7 Mar 2016 22:17:13 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0FBF4AC002 for ; Mon, 7 Mar 2016 20:17:13 -0800 (PST) X-ASG-Debug-ID: 1457410622-04cb6c583120ed30004-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id OKRyGSxtGAwbWmIm for ; Mon, 07 Mar 2016 20:17:10 -0800 (PST) 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: A2ChCAC/Ud5WPFEqLHlcKAECgw+BP4Zmn30BAgEBAQaRRotQTQEBAQEBAQcBAQEBQUCEQgEFJy8zCBgxOQMHFBmII754hU+NeQWNMIl6jXCOeI5WghgBCwGCNSguiX8BAQE Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl6.internode.on.net with ESMTP; 08 Mar 2016 14:46:34 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ad94T-0004AL-4B for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:33 +1100 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ad94G-0007uw-Ie for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:20 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 12/16] xfs: add tracepoints for the rmap-mirrors-bmbt functions Date: Tue, 8 Mar 2016 15:16:14 +1100 X-ASG-Orig-Subj: [PATCH 12/16] xfs: add tracepoints for the rmap-mirrors-bmbt functions Message-Id: <1457410578-30233-13-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1457410578-30233-1-git-send-email-david@fromorbit.com> References: <1457410578-30233-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1457410630 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27662 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: "Darrick J. Wong" Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- fs/xfs/xfs_trace.h | 251 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 251 insertions(+) diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 7968e92..f5fb33f 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -1746,6 +1746,257 @@ DEFINE_RMAP_EVENT(xfs_rmap_alloc_extent); DEFINE_RMAP_EVENT(xfs_rmap_alloc_extent_done); DEFINE_RMAP_EVENT(xfs_rmap_alloc_extent_error); +/* rmap-mirrors-bmbt traces */ +DECLARE_EVENT_CLASS(xfs_rmap_bmbt3_class, + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, + xfs_ino_t ino, + int whichfork, + struct xfs_bmbt_irec *left, + struct xfs_bmbt_irec *prev, + struct xfs_bmbt_irec *right), + TP_ARGS(mp, agno, ino, whichfork, left, prev, right), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, agno) + __field(xfs_ino_t, ino) + __field(int, whichfork) + __field(xfs_fileoff_t, l_loff) + __field(xfs_fsblock_t, l_poff) + __field(xfs_filblks_t, l_len) + __field(xfs_fileoff_t, p_loff) + __field(xfs_fsblock_t, p_poff) + __field(xfs_filblks_t, p_len) + __field(xfs_fileoff_t, r_loff) + __field(xfs_fsblock_t, r_poff) + __field(xfs_filblks_t, r_len) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->agno = agno; + __entry->ino = ino; + __entry->whichfork = whichfork; + __entry->l_loff = left->br_startoff; + __entry->l_poff = left->br_startblock; + __entry->l_len = left->br_blockcount; + __entry->p_loff = prev->br_startoff; + __entry->p_poff = prev->br_startblock; + __entry->p_len = prev->br_blockcount; + __entry->r_loff = right->br_startoff; + __entry->r_poff = right->br_startblock; + __entry->r_len = right->br_blockcount; + ), + TP_printk("dev %d:%d agno %u ino 0x%llx %s (%llu:%lld:%lld):(%llu:%lld:%lld):(%llu:%lld:%lld)", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->agno, + __entry->ino, + __entry->whichfork == XFS_ATTR_FORK ? "attr" : "data", + __entry->l_poff, + __entry->l_len, + __entry->l_loff, + __entry->p_poff, + __entry->p_len, + __entry->p_loff, + __entry->r_poff, + __entry->r_len, + __entry->r_loff) +); +#define DEFINE_RMAP_BMBT3_EVENT(name) \ +DEFINE_EVENT(xfs_rmap_bmbt3_class, name, \ + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \ + xfs_ino_t ino, \ + int whichfork, \ + struct xfs_bmbt_irec *left, \ + struct xfs_bmbt_irec *prev, \ + struct xfs_bmbt_irec *right), \ + TP_ARGS(mp, agno, ino, whichfork, left, prev, right)) + +DECLARE_EVENT_CLASS(xfs_rmap_bmbt2_class, + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, + xfs_ino_t ino, + int whichfork, + struct xfs_bmbt_irec *left, + struct xfs_bmbt_irec *prev), + TP_ARGS(mp, agno, ino, whichfork, left, prev), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, agno) + __field(xfs_ino_t, ino) + __field(int, whichfork) + __field(xfs_fileoff_t, l_loff) + __field(xfs_fsblock_t, l_poff) + __field(xfs_filblks_t, l_len) + __field(xfs_fileoff_t, p_loff) + __field(xfs_fsblock_t, p_poff) + __field(xfs_filblks_t, p_len) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->agno = agno; + __entry->ino = ino; + __entry->whichfork = whichfork; + __entry->l_loff = left->br_startoff; + __entry->l_poff = left->br_startblock; + __entry->l_len = left->br_blockcount; + __entry->p_loff = prev->br_startoff; + __entry->p_poff = prev->br_startblock; + __entry->p_len = prev->br_blockcount; + ), + TP_printk("dev %d:%d agno %u ino 0x%llx %s (%llu:%lld:%lld):(%llu:%lld:%lld)", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->agno, + __entry->ino, + __entry->whichfork == XFS_ATTR_FORK ? "attr" : "data", + __entry->l_poff, + __entry->l_len, + __entry->l_loff, + __entry->p_poff, + __entry->p_len, + __entry->p_loff) +); +#define DEFINE_RMAP_BMBT2_EVENT(name) \ +DEFINE_EVENT(xfs_rmap_bmbt2_class, name, \ + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \ + xfs_ino_t ino, \ + int whichfork, \ + struct xfs_bmbt_irec *left, \ + struct xfs_bmbt_irec *prev), \ + TP_ARGS(mp, agno, ino, whichfork, left, prev)) + +DECLARE_EVENT_CLASS(xfs_rmap_bmbt1_class, + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, + xfs_ino_t ino, + int whichfork, + struct xfs_bmbt_irec *left), + TP_ARGS(mp, agno, ino, whichfork, left), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, agno) + __field(xfs_ino_t, ino) + __field(int, whichfork) + __field(xfs_fileoff_t, l_loff) + __field(xfs_fsblock_t, l_poff) + __field(xfs_filblks_t, l_len) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->agno = agno; + __entry->ino = ino; + __entry->whichfork = whichfork; + __entry->l_loff = left->br_startoff; + __entry->l_poff = left->br_startblock; + __entry->l_len = left->br_blockcount; + ), + TP_printk("dev %d:%d agno %u ino 0x%llx %s (%llu:%lld:%lld)", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->agno, + __entry->ino, + __entry->whichfork == XFS_ATTR_FORK ? "attr" : "data", + __entry->l_poff, + __entry->l_len, + __entry->l_loff) +); +#define DEFINE_RMAP_BMBT1_EVENT(name) \ +DEFINE_EVENT(xfs_rmap_bmbt1_class, name, \ + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \ + xfs_ino_t ino, \ + int whichfork, \ + struct xfs_bmbt_irec *left), \ + TP_ARGS(mp, agno, ino, whichfork, left)) + +DECLARE_EVENT_CLASS(xfs_rmap_adjust_class, + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, + xfs_ino_t ino, + int whichfork, + struct xfs_bmbt_irec *left, + long adj), + TP_ARGS(mp, agno, ino, whichfork, left, adj), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, agno) + __field(xfs_ino_t, ino) + __field(int, whichfork) + __field(xfs_fileoff_t, l_loff) + __field(xfs_fsblock_t, l_poff) + __field(xfs_filblks_t, l_len) + __field(long, adj) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->agno = agno; + __entry->ino = ino; + __entry->whichfork = whichfork; + __entry->l_loff = left->br_startoff; + __entry->l_poff = left->br_startblock; + __entry->l_len = left->br_blockcount; + __entry->adj = adj; + ), + TP_printk("dev %d:%d agno %u ino 0x%llx %s (%llu:%lld:%lld) adj %ld", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->agno, + __entry->ino, + __entry->whichfork == XFS_ATTR_FORK ? "attr" : "data", + __entry->l_poff, + __entry->l_len, + __entry->l_loff, + __entry->adj) +); +#define DEFINE_RMAP_ADJUST_EVENT(name) \ +DEFINE_EVENT(xfs_rmap_adjust_class, name, \ + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \ + xfs_ino_t ino, \ + int whichfork, \ + struct xfs_bmbt_irec *left, \ + long adj), \ + TP_ARGS(mp, agno, ino, whichfork, left, adj)) + +DECLARE_EVENT_CLASS(xfs_rmapbt_class, + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, + xfs_agblock_t agbno, xfs_extlen_t len, + uint64_t owner, uint64_t offset), + TP_ARGS(mp, agno, agbno, len, owner, offset), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, agno) + __field(xfs_agblock_t, agbno) + __field(xfs_extlen_t, len) + __field(uint64_t, owner) + __field(uint64_t, offset) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->agno = agno; + __entry->agbno = agbno; + __entry->len = len; + __entry->owner = owner; + __entry->offset = offset; + ), + TP_printk("dev %d:%d agno %u agbno %u len %u, owner 0x%llx, offset %llu", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->agno, + __entry->agbno, + __entry->len, + __entry->owner, + __entry->offset) +); +#define DEFINE_RMAPBT_EVENT(name) \ +DEFINE_EVENT(xfs_rmapbt_class, name, \ + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \ + xfs_agblock_t agbno, xfs_extlen_t len, \ + uint64_t owner, uint64_t offset), \ + TP_ARGS(mp, agno, agbno, len, owner, offset)) + +DEFINE_RMAP_BMBT3_EVENT(xfs_rmap_combine); +DEFINE_RMAP_BMBT2_EVENT(xfs_rmap_lcombine); +DEFINE_RMAP_BMBT2_EVENT(xfs_rmap_rcombine); +DEFINE_RMAP_BMBT1_EVENT(xfs_rmap_insert); +DEFINE_RMAP_BMBT1_EVENT(xfs_rmap_delete); +DEFINE_RMAP_ADJUST_EVENT(xfs_rmap_move); +DEFINE_RMAP_ADJUST_EVENT(xfs_rmap_slide); +DEFINE_RMAP_ADJUST_EVENT(xfs_rmap_resize); +DEFINE_RMAPBT_EVENT(xfs_rmapbt_update); +DEFINE_RMAPBT_EVENT(xfs_rmapbt_insert); +DEFINE_RMAPBT_EVENT(xfs_rmapbt_delete); + DECLARE_EVENT_CLASS(xfs_da_class, TP_PROTO(struct xfs_da_args *args), TP_ARGS(args), -- 2.7.0 From dave@fromorbit.com Mon Mar 7 22:17:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AA48029E1A for ; Mon, 7 Mar 2016 22:17:12 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0A0D7AC003 for ; Mon, 7 Mar 2016 20:17:11 -0800 (PST) X-ASG-Debug-ID: 1457410623-04cb6c583320ed40004-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id TssyXoERAIe8lcIf for ; Mon, 07 Mar 2016 20:17:08 -0800 (PST) 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: A2ChCAC/Ud5WPFEqLHlcKAECgw+BP4Zmn30BAgEBAQaRRotQTQEBAQEBAQcBAQEBQUCEQgEFJy8zCBgxOQMHFBmII754hU+NeQWXKohThR2BYY0XhXqIXIIYAQsBQBmBXCguiX8BAQE Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl6.internode.on.net with ESMTP; 08 Mar 2016 14:46:34 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ad94T-0004AI-3u for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:33 +1100 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ad94G-0007ur-IC for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:20 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 11/16] xfs: add rmap btree operations Date: Tue, 8 Mar 2016 15:16:13 +1100 X-ASG-Orig-Subj: [PATCH 11/16] xfs: add rmap btree operations Message-Id: <1457410578-30233-12-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1457410578-30233-1-git-send-email-david@fromorbit.com> References: <1457410578-30233-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1457410628 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27662 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Implement the generic btree operations needed to manipulate rmap btree blocks. This is very similar to the per-ag freespace btree implementation, and uses the AGFL for allocation and freeing of blocks. Adapt the rmap btree to store owner offsets within each rmap record, and to handle the primary key being redefined as the tuple [agblk, owner, offset]. The expansion of the primary key is crucial to allowing multiple owners per extent. Unfortunately, doing so adds the requirement that all rmap records for file extents (metadata always has one owner) correspond to some bmbt entry somewhere. [darrick.wong@oracle.com: adapt the btree ops to deal with offsets] Signed-off-by: Dave Chinner Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_btree.h | 1 + fs/xfs/libxfs/xfs_rmap.c | 82 ++++++++++++++ fs/xfs/libxfs/xfs_rmap_btree.c | 237 +++++++++++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_rmap_btree.h | 7 ++ 4 files changed, 327 insertions(+) diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h index 07fa27e..6443c74 100644 --- a/fs/xfs/libxfs/xfs_btree.h +++ b/fs/xfs/libxfs/xfs_btree.h @@ -212,6 +212,7 @@ typedef struct xfs_btree_cur xfs_alloc_rec_incore_t a; xfs_bmbt_irec_t b; xfs_inobt_rec_incore_t i; + struct xfs_rmap_irec r; } bc_rec; /* current insert/search record value */ struct xfs_buf *bc_bufs[XFS_BTREE_MAXLEVELS]; /* buf ptr per level */ int bc_ptrs[XFS_BTREE_MAXLEVELS]; /* key/record # */ diff --git a/fs/xfs/libxfs/xfs_rmap.c b/fs/xfs/libxfs/xfs_rmap.c index 3e17294..f6fe742 100644 --- a/fs/xfs/libxfs/xfs_rmap.c +++ b/fs/xfs/libxfs/xfs_rmap.c @@ -36,6 +36,88 @@ #include "xfs_error.h" #include "xfs_extent_busy.h" +/* + * Lookup the first record less than or equal to [bno, len, owner, offset] + * in the btree given by cur. + */ +int +xfs_rmap_lookup_le( + struct xfs_btree_cur *cur, + xfs_agblock_t bno, + xfs_extlen_t len, + uint64_t owner, + uint64_t offset, + int *stat) +{ + cur->bc_rec.r.rm_startblock = bno; + cur->bc_rec.r.rm_blockcount = len; + cur->bc_rec.r.rm_owner = owner; + cur->bc_rec.r.rm_offset = offset; + return xfs_btree_lookup(cur, XFS_LOOKUP_LE, stat); +} + +/* + * Lookup the record exactly matching [bno, len, owner, offset] + * in the btree given by cur. + */ +int +xfs_rmap_lookup_eq( + struct xfs_btree_cur *cur, + xfs_agblock_t bno, + xfs_extlen_t len, + uint64_t owner, + uint64_t offset, + int *stat) +{ + cur->bc_rec.r.rm_startblock = bno; + cur->bc_rec.r.rm_blockcount = len; + cur->bc_rec.r.rm_owner = owner; + cur->bc_rec.r.rm_offset = offset; + return xfs_btree_lookup(cur, XFS_LOOKUP_EQ, stat); +} + +/* + * Update the record referred to by cur to the value given + * by [bno, len, owner, offset]. + * This either works (return 0) or gets an EFSCORRUPTED error. + */ +STATIC int +xfs_rmap_update( + struct xfs_btree_cur *cur, + struct xfs_rmap_irec *irec) +{ + union xfs_btree_rec rec; + + rec.rmap.rm_startblock = cpu_to_be32(irec->rm_startblock); + rec.rmap.rm_blockcount = cpu_to_be32(irec->rm_blockcount); + rec.rmap.rm_owner = cpu_to_be64(irec->rm_owner); + rec.rmap.rm_offset = cpu_to_be64(irec->rm_offset); + return xfs_btree_update(cur, &rec); +} + +/* + * Get the data from the pointed-to record. + */ +int +xfs_rmap_get_rec( + struct xfs_btree_cur *cur, + struct xfs_rmap_irec *irec, + int *stat) +{ + union xfs_btree_rec *rec; + int error; + + error = xfs_btree_get_rec(cur, &rec, stat); + if (error || !*stat) + return error; + + irec->rm_startblock = be32_to_cpu(rec->rmap.rm_startblock); + irec->rm_blockcount = be32_to_cpu(rec->rmap.rm_blockcount); + irec->rm_owner = be64_to_cpu(rec->rmap.rm_owner); + irec->rm_offset = be64_to_cpu(rec->rmap.rm_offset); + return 0; +} + int xfs_rmap_free( struct xfs_trans *tp, diff --git a/fs/xfs/libxfs/xfs_rmap_btree.c b/fs/xfs/libxfs/xfs_rmap_btree.c index 882e8e2..54dd118 100644 --- a/fs/xfs/libxfs/xfs_rmap_btree.c +++ b/fs/xfs/libxfs/xfs_rmap_btree.c @@ -34,6 +34,31 @@ #include "xfs_error.h" #include "xfs_extent_busy.h" +/* + * Reverse map btree. + * + * This is a per-ag tree used to track the owner(s) of a given extent. With + * reflink it is possible for there to be multiple owners, which is a departure + * from classic XFS. Owner records for data extents are inserted when the + * extent is mapped and removed when an extent is unmapped. Owner records for + * all other block types (i.e. metadata) are inserted when an extent is + * allocated and removed when an extent is freed. There can only be one owner + * of a metadata extent, usually an inode or some other metadata structure like + * an AG btree. + * + * The rmap btree is part of the free space management, so blocks for the tree + * are sourced from the agfl. Hence we need transaction reservation support for + * this tree so that the freelist is always large enough. This also impacts on + * the minimum space we need to leave free in the AG. + * + * The tree is ordered by [ag block, owner, offset]. This is a large key size, + * but it is the only way to enforce unique keys when a block can be owned by + * multiple files at any offset. There's no need to order/search by extent + * size for online updating/management of the tree. It is intended that most + * reverse lookups will be to find the owner(s) of a particular block, or to + * try to recover tree and file data from corrupt primary metadata. + */ + static struct xfs_btree_cur * xfs_rmapbt_dup_cursor( struct xfs_btree_cur *cur) @@ -42,6 +67,166 @@ xfs_rmapbt_dup_cursor( cur->bc_private.a.agbp, cur->bc_private.a.agno); } +STATIC void +xfs_rmapbt_set_root( + struct xfs_btree_cur *cur, + union xfs_btree_ptr *ptr, + int inc) +{ + struct xfs_buf *agbp = cur->bc_private.a.agbp; + struct xfs_agf *agf = XFS_BUF_TO_AGF(agbp); + xfs_agnumber_t seqno = be32_to_cpu(agf->agf_seqno); + int btnum = cur->bc_btnum; + struct xfs_perag *pag = xfs_perag_get(cur->bc_mp, seqno); + + ASSERT(ptr->s != 0); + + agf->agf_roots[btnum] = ptr->s; + be32_add_cpu(&agf->agf_levels[btnum], inc); + pag->pagf_levels[btnum] += inc; + xfs_perag_put(pag); + + xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_ROOTS | XFS_AGF_LEVELS); +} + +STATIC int +xfs_rmapbt_alloc_block( + struct xfs_btree_cur *cur, + union xfs_btree_ptr *start, + union xfs_btree_ptr *new, + int *stat) +{ + int error; + xfs_agblock_t bno; + + XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); + + /* Allocate the new block from the freelist. If we can't, give up. */ + error = xfs_alloc_get_freelist(cur->bc_tp, cur->bc_private.a.agbp, + &bno, 1); + if (error) { + XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); + return error; + } + + if (bno == NULLAGBLOCK) { + XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); + *stat = 0; + return 0; + } + + xfs_extent_busy_reuse(cur->bc_mp, cur->bc_private.a.agno, bno, 1, false); + + xfs_trans_agbtree_delta(cur->bc_tp, 1); + new->s = cpu_to_be32(bno); + + XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); + *stat = 1; + return 0; +} + +STATIC int +xfs_rmapbt_free_block( + struct xfs_btree_cur *cur, + struct xfs_buf *bp) +{ + struct xfs_buf *agbp = cur->bc_private.a.agbp; + struct xfs_agf *agf = XFS_BUF_TO_AGF(agbp); + xfs_agblock_t bno; + int error; + + bno = xfs_daddr_to_agbno(cur->bc_mp, XFS_BUF_ADDR(bp)); + error = xfs_alloc_put_freelist(cur->bc_tp, agbp, NULL, bno, 1); + if (error) + return error; + + xfs_extent_busy_insert(cur->bc_tp, be32_to_cpu(agf->agf_seqno), bno, 1, + XFS_EXTENT_BUSY_SKIP_DISCARD); + xfs_trans_agbtree_delta(cur->bc_tp, -1); + + xfs_trans_binval(cur->bc_tp, bp); + return 0; +} + +STATIC int +xfs_rmapbt_get_minrecs( + struct xfs_btree_cur *cur, + int level) +{ + return cur->bc_mp->m_rmap_mnr[level != 0]; +} + +STATIC int +xfs_rmapbt_get_maxrecs( + struct xfs_btree_cur *cur, + int level) +{ + return cur->bc_mp->m_rmap_mxr[level != 0]; +} + +STATIC void +xfs_rmapbt_init_key_from_rec( + union xfs_btree_key *key, + union xfs_btree_rec *rec) +{ + key->rmap.rm_startblock = rec->rmap.rm_startblock; + key->rmap.rm_owner = rec->rmap.rm_owner; + key->rmap.rm_offset = rec->rmap.rm_offset; +} + +STATIC void +xfs_rmapbt_init_rec_from_key( + union xfs_btree_key *key, + union xfs_btree_rec *rec) +{ + rec->rmap.rm_startblock = key->rmap.rm_startblock; + rec->rmap.rm_owner = key->rmap.rm_owner; + rec->rmap.rm_offset = key->rmap.rm_offset; +} + +STATIC void +xfs_rmapbt_init_rec_from_cur( + struct xfs_btree_cur *cur, + union xfs_btree_rec *rec) +{ + rec->rmap.rm_startblock = cpu_to_be32(cur->bc_rec.r.rm_startblock); + rec->rmap.rm_blockcount = cpu_to_be32(cur->bc_rec.r.rm_blockcount); + rec->rmap.rm_owner = cpu_to_be64(cur->bc_rec.r.rm_owner); + rec->rmap.rm_offset = cpu_to_be64(cur->bc_rec.r.rm_offset); +} + +STATIC void +xfs_rmapbt_init_ptr_from_cur( + struct xfs_btree_cur *cur, + union xfs_btree_ptr *ptr) +{ + struct xfs_agf *agf = XFS_BUF_TO_AGF(cur->bc_private.a.agbp); + + ASSERT(cur->bc_private.a.agno == be32_to_cpu(agf->agf_seqno)); + ASSERT(agf->agf_roots[cur->bc_btnum] != 0); + + ptr->s = agf->agf_roots[cur->bc_btnum]; +} + +STATIC __int64_t +xfs_rmapbt_key_diff( + struct xfs_btree_cur *cur, + union xfs_btree_key *key) +{ + struct xfs_rmap_irec *rec = &cur->bc_rec.r; + struct xfs_rmap_key *kp = &key->rmap; + __int64_t d; + + d = (__int64_t)be32_to_cpu(kp->rm_startblock) - rec->rm_startblock; + if (d) + return d; + d = (__int64_t)be64_to_cpu(kp->rm_owner) - rec->rm_owner; + if (d) + return d; + d = (__int64_t)be64_to_cpu(kp->rm_offset) - rec->rm_offset; + return d; +} + static bool xfs_rmapbt_verify( struct xfs_buf *bp) @@ -116,12 +301,64 @@ const struct xfs_buf_ops xfs_rmapbt_buf_ops = { .verify_write = xfs_rmapbt_write_verify, }; +#if defined(DEBUG) || defined(XFS_WARN) +STATIC int +xfs_rmapbt_keys_inorder( + struct xfs_btree_cur *cur, + union xfs_btree_key *k1, + union xfs_btree_key *k2) +{ + if (be32_to_cpu(k1->rmap.rm_startblock) < + be32_to_cpu(k2->rmap.rm_startblock)) + return 1; + if (be64_to_cpu(k1->rmap.rm_owner) < + be64_to_cpu(k2->rmap.rm_owner)) + return 1; + if (be64_to_cpu(k1->rmap.rm_offset) <= + be64_to_cpu(k2->rmap.rm_offset)) + return 1; + return 0; +} + +STATIC int +xfs_rmapbt_recs_inorder( + struct xfs_btree_cur *cur, + union xfs_btree_rec *r1, + union xfs_btree_rec *r2) +{ + if (be32_to_cpu(r1->rmap.rm_startblock) < + be32_to_cpu(r2->rmap.rm_startblock)) + return 1; + if (be64_to_cpu(r1->rmap.rm_offset) < + be64_to_cpu(r2->rmap.rm_offset)) + return 1; + if (be64_to_cpu(r1->rmap.rm_owner) <= + be64_to_cpu(r2->rmap.rm_owner)) + return 1; + return 0; +} +#endif /* DEBUG */ + static const struct xfs_btree_ops xfs_rmapbt_ops = { .rec_len = sizeof(struct xfs_rmap_rec), .key_len = sizeof(struct xfs_rmap_key), .dup_cursor = xfs_rmapbt_dup_cursor, + .set_root = xfs_rmapbt_set_root, + .alloc_block = xfs_rmapbt_alloc_block, + .free_block = xfs_rmapbt_free_block, + .get_minrecs = xfs_rmapbt_get_minrecs, + .get_maxrecs = xfs_rmapbt_get_maxrecs, + .init_key_from_rec = xfs_rmapbt_init_key_from_rec, + .init_rec_from_key = xfs_rmapbt_init_rec_from_key, + .init_rec_from_cur = xfs_rmapbt_init_rec_from_cur, + .init_ptr_from_cur = xfs_rmapbt_init_ptr_from_cur, + .key_diff = xfs_rmapbt_key_diff, .buf_ops = &xfs_rmapbt_buf_ops, +#if defined(DEBUG) || defined(XFS_WARN) + .keys_inorder = xfs_rmapbt_keys_inorder, + .recs_inorder = xfs_rmapbt_recs_inorder, +#endif }; /* diff --git a/fs/xfs/libxfs/xfs_rmap_btree.h b/fs/xfs/libxfs/xfs_rmap_btree.h index 2e02362..a5c97f8 100644 --- a/fs/xfs/libxfs/xfs_rmap_btree.h +++ b/fs/xfs/libxfs/xfs_rmap_btree.h @@ -51,6 +51,13 @@ struct xfs_btree_cur *xfs_rmapbt_init_cursor(struct xfs_mount *mp, xfs_agnumber_t agno); int xfs_rmapbt_maxrecs(struct xfs_mount *mp, int blocklen, int leaf); +int xfs_rmap_lookup_le(struct xfs_btree_cur *cur, xfs_agblock_t bno, + xfs_extlen_t len, uint64_t owner, uint64_t offset, int *stat); +int xfs_rmap_lookup_eq(struct xfs_btree_cur *cur, xfs_agblock_t bno, + xfs_extlen_t len, uint64_t owner, uint64_t offset, int *stat); +int xfs_rmap_get_rec(struct xfs_btree_cur *cur, struct xfs_rmap_irec *irec, + int *stat); + int xfs_rmap_alloc(struct xfs_trans *tp, struct xfs_buf *agbp, xfs_agnumber_t agno, xfs_agblock_t bno, xfs_extlen_t len, struct xfs_owner_info *oinfo); -- 2.7.0 From dave@fromorbit.com Mon Mar 7 22:17:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0882129E15 for ; Mon, 7 Mar 2016 22:17:14 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9A4AA304032 for ; Mon, 7 Mar 2016 20:17:13 -0800 (PST) X-ASG-Debug-ID: 1457410624-04bdf002ec2427c0003-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id gj0GOILLEc8fMnIx for ; Mon, 07 Mar 2016 20:17:08 -0800 (PST) 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: A2C/CAC/Ud5WPFEqLHlcKAECgw9SbYZmn3EMAQIBAQEGkUaEI4ctTQEBAQEBAQcBAQEBQUCEQgEFJy8zCBgxOQMHFBmII754hU+NeQWXKoVjiA2CLIxMjlaCGAELAUAZgVwoLohGJYEUAQEB Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl6.internode.on.net with ESMTP; 08 Mar 2016 14:46:33 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ad94T-0004A8-13 for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:33 +1100 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ad94G-0007uN-Fd for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:20 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 05/16] xfs: add owner field to extent allocation and freeing Date: Tue, 8 Mar 2016 15:16:07 +1100 X-ASG-Orig-Subj: [PATCH 05/16] xfs: add owner field to extent allocation and freeing Message-Id: <1457410578-30233-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1457410578-30233-1-git-send-email-david@fromorbit.com> References: <1457410578-30233-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1457410628 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27662 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: "Darrick J. Wong" For the rmap btree to work, we have to fed the extent owner information to the the allocation and freeing functions. This information is what will end up in the rmap btree that tracks allocated extents. While we technically don't need the owner information when freeing extents, passing it allows us to validate that the extent we are removing from the rmap btree actually belonged to the owner we expected it to belong to. We also define a special set of owner values for internal metadata that would otherwise have no owner. This allows us to tell the difference between metadata owned by different per-ag btrees, as well as static fs metadata (e.g. AG headers) and internal journal blocks. There are also a couple of special cases we need to take care of - during EFI recovery, we don't actually know who the original owner was, so we need to pass a wildcard to indicate that we aren't checking the owner for validity. We also need special handling in growfs, as we "free" the space in the last AG when extending it, but because it's new space it has no actual owner... Extend the owner field to include both the owner type and some sort of index within the owner. The index field will be used to support reverse mappings when reflink is enabled. This is based upon a patch originally from Dave Chinner. It has been extended to add more owner information with the intent of helping recovery operations when things go wrong (e.g. offset of user data block in a file). [dchinner: de-shout the xfs_rmap_*_owner helpers] Signed-off-by: Dave Chinner Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_alloc.c | 12 ++++++-- fs/xfs/libxfs/xfs_alloc.h | 4 ++- fs/xfs/libxfs/xfs_bmap.c | 17 +++++++++-- fs/xfs/libxfs/xfs_bmap.h | 4 ++- fs/xfs/libxfs/xfs_bmap_btree.c | 6 +++- fs/xfs/libxfs/xfs_format.h | 65 ++++++++++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_ialloc.c | 7 +++-- fs/xfs/libxfs/xfs_ialloc_btree.c | 7 ++++- fs/xfs/xfs_bmap_util.c | 3 +- fs/xfs/xfs_fsops.c | 16 +++++++--- fs/xfs/xfs_log_recover.c | 5 +++- fs/xfs/xfs_trans.h | 2 +- fs/xfs/xfs_trans_extfree.c | 5 ++-- 13 files changed, 132 insertions(+), 21 deletions(-) diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index 19b7521..0222e03 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -1595,6 +1595,7 @@ xfs_free_ag_extent( xfs_agnumber_t agno, /* allocation group number */ xfs_agblock_t bno, /* starting block number */ xfs_extlen_t len, /* length of extent */ + struct xfs_owner_info *oinfo, /* extent owner */ int isfl) /* set if is freelist blocks - no sb acctg */ { xfs_btree_cur_t *bno_cur; /* cursor for by-block btree */ @@ -2015,13 +2016,15 @@ xfs_alloc_fix_freelist( * back on the free list? Maybe we should only do this when space is * getting low or the AGFL is more than half full? */ + xfs_rmap_ag_owner(&targs.oinfo, XFS_RMAP_OWN_AG); while (pag->pagf_flcount > need) { struct xfs_buf *bp; error = xfs_alloc_get_freelist(tp, agbp, &bno, 0); if (error) goto out_agbp_relse; - error = xfs_free_ag_extent(tp, agbp, args->agno, bno, 1, 1); + error = xfs_free_ag_extent(tp, agbp, args->agno, bno, 1, + &targs.oinfo, 1); if (error) goto out_agbp_relse; bp = xfs_btree_get_bufs(mp, tp, args->agno, bno, 0); @@ -2031,6 +2034,7 @@ xfs_alloc_fix_freelist( memset(&targs, 0, sizeof(targs)); targs.tp = tp; targs.mp = mp; + xfs_rmap_ag_owner(&targs.oinfo, XFS_RMAP_OWN_AG); targs.agbp = agbp; targs.agno = args->agno; targs.alignment = targs.minlen = targs.prod = targs.isfl = 1; @@ -2684,7 +2688,8 @@ int /* error */ xfs_free_extent( xfs_trans_t *tp, /* transaction pointer */ xfs_fsblock_t bno, /* starting block number of extent */ - xfs_extlen_t len) /* length of extent */ + xfs_extlen_t len, /* length of extent */ + struct xfs_owner_info *oinfo) /* extent owner */ { xfs_alloc_arg_t args; int error; @@ -2720,7 +2725,8 @@ xfs_free_extent( goto error0; } - error = xfs_free_ag_extent(tp, args.agbp, args.agno, args.agbno, len, 0); + error = xfs_free_ag_extent(tp, args.agbp, args.agno, args.agbno, + len, oinfo, 0); if (!error) xfs_extent_busy_insert(tp, args.agno, args.agbno, len, 0); error0: diff --git a/fs/xfs/libxfs/xfs_alloc.h b/fs/xfs/libxfs/xfs_alloc.h index d260916..6d0f328 100644 --- a/fs/xfs/libxfs/xfs_alloc.h +++ b/fs/xfs/libxfs/xfs_alloc.h @@ -123,6 +123,7 @@ typedef struct xfs_alloc_arg { char isfl; /* set if is freelist blocks - !acctg */ char userdata; /* mask defining userdata treatment */ xfs_fsblock_t firstblock; /* io first block allocated */ + struct xfs_owner_info oinfo; /* owner of blocks being allocated */ } xfs_alloc_arg_t; /* @@ -210,7 +211,8 @@ int /* error */ xfs_free_extent( struct xfs_trans *tp, /* transaction pointer */ xfs_fsblock_t bno, /* starting block number of extent */ - xfs_extlen_t len); /* length of extent */ + xfs_extlen_t len, /* length of extent */ + struct xfs_owner_info *oinfo); /* extent owner */ int /* error */ xfs_alloc_lookup_le( diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 7aef8d8..59d4fd1 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -576,7 +576,8 @@ xfs_bmap_add_free( struct xfs_mount *mp, /* mount point structure */ struct xfs_bmap_free *flist, /* list of extents */ xfs_fsblock_t bno, /* fs block number of extent */ - xfs_filblks_t len) /* length of extent */ + xfs_filblks_t len, /* length of extent */ + struct xfs_owner_info *oinfo) /* extent owner */ { xfs_bmap_free_item_t *cur; /* current (next) element */ xfs_bmap_free_item_t *new; /* new element */ @@ -597,9 +598,14 @@ xfs_bmap_add_free( ASSERT(agbno + len <= mp->m_sb.sb_agblocks); #endif ASSERT(xfs_bmap_free_item_zone != NULL); + new = kmem_zone_alloc(xfs_bmap_free_item_zone, KM_SLEEP); new->xbfi_startblock = bno; new->xbfi_blockcount = (xfs_extlen_t)len; + if (oinfo) + memcpy(&new->xbfi_oinfo, oinfo, sizeof(struct xfs_owner_info)); + else + memset(&new->xbfi_oinfo, 0, sizeof(struct xfs_owner_info)); for (prev = NULL, cur = flist->xbf_first; cur != NULL; prev = cur, cur = cur->xbfi_next) { @@ -679,6 +685,7 @@ xfs_bmap_btree_to_extents( xfs_mount_t *mp; /* mount point structure */ __be64 *pp; /* ptr to block address */ struct xfs_btree_block *rblock;/* root btree block */ + struct xfs_owner_info oinfo; mp = ip->i_mount; ifp = XFS_IFORK_PTR(ip, whichfork); @@ -702,7 +709,8 @@ xfs_bmap_btree_to_extents( cblock = XFS_BUF_TO_BLOCK(cbp); if ((error = xfs_btree_check_block(cur, cblock, 0, cbp))) return error; - xfs_bmap_add_free(mp, cur->bc_private.b.flist, cbno, 1); + xfs_rmap_ino_bmbt_owner(&oinfo, ip->i_ino, whichfork); + xfs_bmap_add_free(mp, cur->bc_private.b.flist, cbno, 1, &oinfo); ip->i_d.di_nblocks--; xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, -1L); xfs_trans_binval(tp, cbp); @@ -783,6 +791,7 @@ xfs_bmap_extents_to_btree( memset(&args, 0, sizeof(args)); args.tp = tp; args.mp = mp; + xfs_rmap_ino_bmbt_owner(&args.oinfo, ip->i_ino, whichfork); args.firstblock = *firstblock; if (*firstblock == NULLFSBLOCK) { args.type = XFS_ALLOCTYPE_START_BNO; @@ -929,6 +938,7 @@ xfs_bmap_local_to_extents( memset(&args, 0, sizeof(args)); args.tp = tp; args.mp = ip->i_mount; + xfs_rmap_ino_owner(&args.oinfo, ip->i_ino, whichfork, 0); args.firstblock = *firstblock; /* * Allocate a block. We know we need only one, since the @@ -4831,6 +4841,7 @@ xfs_bmap_del_extent( nblks = 0; do_fx = 0; } + /* * Set flag value to use in switch statement. * Left-contig is 2, right-contig is 1. @@ -5017,7 +5028,7 @@ xfs_bmap_del_extent( */ if (do_fx) xfs_bmap_add_free(mp, flist, del->br_startblock, - del->br_blockcount); + del->br_blockcount, NULL); /* * Adjust inode # blocks in the file. */ diff --git a/fs/xfs/libxfs/xfs_bmap.h b/fs/xfs/libxfs/xfs_bmap.h index e081c76..06dbe08 100644 --- a/fs/xfs/libxfs/xfs_bmap.h +++ b/fs/xfs/libxfs/xfs_bmap.h @@ -66,6 +66,7 @@ typedef struct xfs_bmap_free_item { xfs_fsblock_t xbfi_startblock;/* starting fs block number */ xfs_extlen_t xbfi_blockcount;/* number of blocks in extent */ + struct xfs_owner_info xbfi_oinfo; /* extent owner */ struct xfs_bmap_free_item *xbfi_next; /* link to next entry */ } xfs_bmap_free_item_t; @@ -192,7 +193,8 @@ void xfs_bmap_trace_exlist(struct xfs_inode *ip, xfs_extnum_t cnt, int xfs_bmap_add_attrfork(struct xfs_inode *ip, int size, int rsvd); void xfs_bmap_local_to_extents_empty(struct xfs_inode *ip, int whichfork); void xfs_bmap_add_free(struct xfs_mount *mp, struct xfs_bmap_free *flist, - xfs_fsblock_t bno, xfs_filblks_t len); + xfs_fsblock_t bno, xfs_filblks_t len, + struct xfs_owner_info *oinfo); void xfs_bmap_cancel(struct xfs_bmap_free *flist); int xfs_bmap_finish(struct xfs_trans **tp, struct xfs_bmap_free *flist, struct xfs_inode *ip); diff --git a/fs/xfs/libxfs/xfs_bmap_btree.c b/fs/xfs/libxfs/xfs_bmap_btree.c index db0c71e..e247b02 100644 --- a/fs/xfs/libxfs/xfs_bmap_btree.c +++ b/fs/xfs/libxfs/xfs_bmap_btree.c @@ -446,6 +446,8 @@ xfs_bmbt_alloc_block( args.mp = cur->bc_mp; args.fsbno = cur->bc_private.b.firstblock; args.firstblock = args.fsbno; + xfs_rmap_ino_bmbt_owner(&args.oinfo, cur->bc_private.b.ip->i_ino, + cur->bc_private.b.whichfork); if (args.fsbno == NULLFSBLOCK) { args.fsbno = be64_to_cpu(start->l); @@ -525,8 +527,10 @@ xfs_bmbt_free_block( struct xfs_inode *ip = cur->bc_private.b.ip; struct xfs_trans *tp = cur->bc_tp; xfs_fsblock_t fsbno = XFS_DADDR_TO_FSB(mp, XFS_BUF_ADDR(bp)); + struct xfs_owner_info oinfo; - xfs_bmap_add_free(mp, cur->bc_private.b.flist, fsbno, 1); + xfs_rmap_ino_bmbt_owner(&oinfo, ip->i_ino, cur->bc_private.b.whichfork); + xfs_bmap_add_free(mp, cur->bc_private.b.flist, fsbno, 1, &oinfo); ip->i_d.di_nblocks--; xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index ebe0eec..232c145 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -1319,6 +1319,71 @@ typedef __be32 xfs_inobt_ptr_t; */ #define XFS_RMAP_CRC_MAGIC 0x524d4233 /* 'RMB3' */ +/* + * Ownership info for an extent. This is used to create reverse-mapping + * entries. + */ +#define XFS_RMAP_INO_ATTR_FORK (1) +#define XFS_RMAP_BMBT_BLOCK (2) +struct xfs_owner_info { + uint64_t oi_owner; + xfs_fileoff_t oi_offset; + unsigned int oi_flags; +}; + +static inline void +xfs_rmap_ag_owner( + struct xfs_owner_info *oi, + uint64_t owner) +{ + oi->oi_owner = owner; + oi->oi_offset = 0; + oi->oi_flags = 0; +} + +static inline void +xfs_rmap_ino_bmbt_owner( + struct xfs_owner_info *oi, + xfs_ino_t ino, + int whichfork) +{ + oi->oi_owner = ino; + oi->oi_offset = 0; + oi->oi_flags = XFS_RMAP_BMBT_BLOCK; + if (whichfork == XFS_ATTR_FORK) + oi->oi_flags |= XFS_RMAP_INO_ATTR_FORK; +} + +static inline void +xfs_rmap_ino_owner( + struct xfs_owner_info *oi, + xfs_ino_t ino, + int whichfork, + xfs_fileoff_t offset) +{ + oi->oi_owner = ino; + oi->oi_offset = offset; + oi->oi_flags = 0; + if (whichfork == XFS_ATTR_FORK) + oi->oi_flags |= XFS_RMAP_INO_ATTR_FORK; +} + +/* + * Special owner types. + * + * Seeing as we only support up to 8EB, we have the upper bit of the owner field + * to tell us we have a special owner value. We use these for static metadata + * allocated at mkfs/growfs time, as well as for freespace management metadata. + */ +#define XFS_RMAP_OWN_NULL (-1ULL) /* No owner, for growfs */ +#define XFS_RMAP_OWN_UNKNOWN (-2ULL) /* Unknown owner, for EFI recovery */ +#define XFS_RMAP_OWN_FS (-3ULL) /* static fs metadata */ +#define XFS_RMAP_OWN_LOG (-4ULL) /* static fs metadata */ +#define XFS_RMAP_OWN_AG (-5ULL) /* AG freespace btree blocks */ +#define XFS_RMAP_OWN_INOBT (-6ULL) /* Inode btree blocks */ +#define XFS_RMAP_OWN_INODES (-7ULL) /* Inode chunk */ +#define XFS_RMAP_OWN_MIN (-8ULL) /* guard */ + #define XFS_RMAP_BLOCK(mp) \ (xfs_sb_version_hasfinobt(&((mp)->m_sb)) ? \ XFS_FIBT_BLOCK(mp) + 1 : \ diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index e3c0af7..aa3d10e 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -614,6 +614,7 @@ xfs_ialloc_ag_alloc( args.tp = tp; args.mp = tp->t_mountp; args.fsbno = NULLFSBLOCK; + xfs_rmap_ag_owner(&args.oinfo, XFS_RMAP_OWN_INODES); #ifdef DEBUG /* randomly do sparse inode allocations */ @@ -1824,12 +1825,14 @@ xfs_difree_inode_chunk( int nextbit; xfs_agblock_t agbno; int contigblk; + struct xfs_owner_info oinfo; DECLARE_BITMAP(holemask, XFS_INOBT_HOLEMASK_BITS); + xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_INODES); if (!xfs_inobt_issparse(rec->ir_holemask)) { /* not sparse, calculate extent info directly */ xfs_bmap_add_free(mp, flist, XFS_AGB_TO_FSB(mp, agno, sagbno), - mp->m_ialloc_blks); + mp->m_ialloc_blks, &oinfo); return; } @@ -1873,7 +1876,7 @@ xfs_difree_inode_chunk( ASSERT(agbno % mp->m_sb.sb_spino_align == 0); ASSERT(contigblk % mp->m_sb.sb_spino_align == 0); xfs_bmap_add_free(mp, flist, XFS_AGB_TO_FSB(mp, agno, agbno), - contigblk); + contigblk, &oinfo); /* reset range to current bit and carry on... */ startidx = endidx = nextbit; diff --git a/fs/xfs/libxfs/xfs_ialloc_btree.c b/fs/xfs/libxfs/xfs_ialloc_btree.c index 89c21d7..1a7b016 100644 --- a/fs/xfs/libxfs/xfs_ialloc_btree.c +++ b/fs/xfs/libxfs/xfs_ialloc_btree.c @@ -96,6 +96,7 @@ xfs_inobt_alloc_block( memset(&args, 0, sizeof(args)); args.tp = cur->bc_tp; args.mp = cur->bc_mp; + xfs_rmap_ag_owner(&args.oinfo, XFS_RMAP_OWN_INOBT); args.fsbno = XFS_AGB_TO_FSB(args.mp, cur->bc_private.a.agno, sbno); args.minlen = 1; args.maxlen = 1; @@ -125,8 +126,12 @@ xfs_inobt_free_block( struct xfs_btree_cur *cur, struct xfs_buf *bp) { + struct xfs_owner_info oinfo; + + xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_INOBT); return xfs_free_extent(cur->bc_tp, - XFS_DADDR_TO_FSB(cur->bc_mp, XFS_BUF_ADDR(bp)), 1); + XFS_DADDR_TO_FSB(cur->bc_mp, XFS_BUF_ADDR(bp)), 1, + &oinfo); } STATIC int diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index a32c1dc..834639d 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -149,7 +149,8 @@ xfs_bmap_finish( next = free->xbfi_next; error = xfs_trans_free_extent(*tp, efd, free->xbfi_startblock, - free->xbfi_blockcount); + free->xbfi_blockcount, + &free->xbfi_oinfo); if (error) return error; diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 32e24ec..b4ab22c 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -439,6 +439,8 @@ xfs_growfs_data_private( * There are new blocks in the old last a.g. */ if (new) { + struct xfs_owner_info oinfo; + /* * Change the agi length. */ @@ -466,14 +468,20 @@ xfs_growfs_data_private( be32_to_cpu(agi->agi_length)); xfs_alloc_log_agf(tp, bp, XFS_AGF_LENGTH); + /* * Free the new space. + * + * XFS_RMAP_OWN_NULL is used here to tell the rmap btree that + * this doesn't actually exist in the rmap btree. */ - error = xfs_free_extent(tp, XFS_AGB_TO_FSB(mp, agno, - be32_to_cpu(agf->agf_length) - new), new); - if (error) { + xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_NULL); + error = xfs_free_extent(tp, + XFS_AGB_TO_FSB(mp, agno, + be32_to_cpu(agf->agf_length) - new), + new, &oinfo); + if (error) goto error0; - } } /* diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 396565f..7c9bc7c 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -4179,6 +4179,7 @@ xlog_recover_process_efi( int error = 0; xfs_extent_t *extp; xfs_fsblock_t startblock_fsb; + struct xfs_owner_info oinfo; ASSERT(!test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)); @@ -4211,10 +4212,12 @@ xlog_recover_process_efi( goto abort_error; efdp = xfs_trans_get_efd(tp, efip, efip->efi_format.efi_nextents); + xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_UNKNOWN); for (i = 0; i < efip->efi_format.efi_nextents; i++) { extp = &(efip->efi_format.efi_extents[i]); error = xfs_trans_free_extent(tp, efdp, extp->ext_start, - extp->ext_len); + extp->ext_len, + &oinfo); if (error) goto abort_error; diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index e7c49cf..d49dfef 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -221,7 +221,7 @@ struct xfs_efd_log_item *xfs_trans_get_efd(xfs_trans_t *, uint); int xfs_trans_free_extent(struct xfs_trans *, struct xfs_efd_log_item *, xfs_fsblock_t, - xfs_extlen_t); + xfs_extlen_t, struct xfs_owner_info *); int xfs_trans_commit(struct xfs_trans *); int __xfs_trans_roll(struct xfs_trans **, struct xfs_inode *, int *); int xfs_trans_roll(struct xfs_trans **, struct xfs_inode *); diff --git a/fs/xfs/xfs_trans_extfree.c b/fs/xfs/xfs_trans_extfree.c index a96ae54..d1b8833 100644 --- a/fs/xfs/xfs_trans_extfree.c +++ b/fs/xfs/xfs_trans_extfree.c @@ -118,13 +118,14 @@ xfs_trans_free_extent( struct xfs_trans *tp, struct xfs_efd_log_item *efdp, xfs_fsblock_t start_block, - xfs_extlen_t ext_len) + xfs_extlen_t ext_len, + struct xfs_owner_info *oinfo) { uint next_extent; struct xfs_extent *extp; int error; - error = xfs_free_extent(tp, start_block, ext_len); + error = xfs_free_extent(tp, start_block, ext_len, oinfo); /* * Mark the transaction dirty, even on error. This ensures the -- 2.7.0 From dave@fromorbit.com Mon Mar 7 22:17:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3F34C29E19 for ; Mon, 7 Mar 2016 22:17:14 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id DBE59304039 for ; Mon, 7 Mar 2016 20:17:13 -0800 (PST) X-ASG-Debug-ID: 1457410624-04bdf002ec2427c0004-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id SN5wHCn9dZ7sRTwi for ; Mon, 07 Mar 2016 20:17:11 -0800 (PST) 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: A2ChCAC/Ud5WPFEqLHlcKAECgw+BP4Zmn30BAgEBAQaRRotQTQEBAQEBAQcBAQEBQUCEQgEFJy8zCBgxOQMHFBmII754hU+JDYRsBZcqjXCBYY0XhXqIXIIYAQuCNiguiESBOwEBAQ Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl6.internode.on.net with ESMTP; 08 Mar 2016 14:46:34 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ad94T-0004AO-5F for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:33 +1100 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ad94G-0007v1-JA for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:20 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 13/16] xfs: add an extent to the rmap btree Date: Tue, 8 Mar 2016 15:16:15 +1100 X-ASG-Orig-Subj: [PATCH 13/16] xfs: add an extent to the rmap btree Message-Id: <1457410578-30233-14-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1457410578-30233-1-git-send-email-david@fromorbit.com> References: <1457410578-30233-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1457410631 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27662 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Now all the btree, free space and transaction infrastructure is in place, we can finally add the code to insert reverse mappings to the rmap btree. Freeing will be done in a spearate patch, so just the addition operation can be focussed on here. [darrick.wong@oracle.com: handle owner offsets, fork and bmbt bits when adding rmaps] [dchinner: remove remaining debug printk statements] Signed-off-by: Dave Chinner Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_rmap.c | 159 ++++++++++++++++++++++++++++++++++++++++- fs/xfs/libxfs/xfs_rmap_btree.h | 1 + 2 files changed, 159 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_rmap.c b/fs/xfs/libxfs/xfs_rmap.c index f6fe742..56627c1c 100644 --- a/fs/xfs/libxfs/xfs_rmap.c +++ b/fs/xfs/libxfs/xfs_rmap.c @@ -144,6 +144,36 @@ out_error: return error; } +/* + * A mergeable rmap should have the same owner, cannot be unwritten, and + * must be a bmbt rmap if we're asking about a bmbt rmap. + */ +static bool +xfs_rmap_is_mergeable( + struct xfs_rmap_irec *irec, + uint64_t owner, + uint64_t offset) +{ + if (irec->rm_owner == XFS_RMAP_OWN_NULL) + return false; + if (irec->rm_owner != owner) + return false; + if (XFS_RMAP_IS_UNWRITTEN(irec->rm_blockcount)) + return false; + if (XFS_RMAP_IS_ATTR_FORK(offset) ^ + XFS_RMAP_IS_ATTR_FORK(irec->rm_offset)) + return false; + if (XFS_RMAP_IS_BMBT(offset) ^ XFS_RMAP_IS_BMBT(irec->rm_offset)) + return false; + return true; +} + +/* + * When we allocate a new block, the first thing we do is add a reference to + * the extent in the rmap btree. This takes the form of a [agbno, length, + * owner, offset] record. Flags are encoded in the high bits of the offset + * field. + */ int xfs_rmap_alloc( struct xfs_trans *tp, @@ -154,18 +184,145 @@ xfs_rmap_alloc( struct xfs_owner_info *oinfo) { struct xfs_mount *mp = tp->t_mountp; + struct xfs_btree_cur *cur; + struct xfs_rmap_irec ltrec; + struct xfs_rmap_irec gtrec; + int have_gt; int error = 0; + int i; + uint64_t owner; + uint64_t offset; if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) return 0; trace_xfs_rmap_alloc_extent(mp, agno, bno, len, oinfo); - if (1) + cur = xfs_rmapbt_init_cursor(mp, tp, agbp, agno); + + xfs_owner_info_unpack(oinfo, &owner, &offset); + + /* + * For the initial lookup, look for and exact match or the left-adjacent + * record for our insertion point. This will also give us the record for + * start block contiguity tests. + */ + error = xfs_rmap_lookup_le(cur, bno, len, owner, offset, &i); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, out_error); + + error = xfs_rmap_get_rec(cur, <rec, &i); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, out_error); + + if (!xfs_rmap_is_mergeable(<rec, owner, offset)) + ltrec.rm_owner = XFS_RMAP_OWN_NULL; + + XFS_WANT_CORRUPTED_GOTO(mp, + ltrec.rm_owner == XFS_RMAP_OWN_NULL || + ltrec.rm_startblock + ltrec.rm_blockcount <= bno, out_error); + + /* + * Increment the cursor to see if we have a right-adjacent record to our + * insertion point. This will give us the record for end block + * contiguity tests. + */ + error = xfs_btree_increment(cur, 0, &have_gt); + if (error) goto out_error; + if (have_gt) { + error = xfs_rmap_get_rec(cur, >rec, &i); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, out_error); + XFS_WANT_CORRUPTED_GOTO(mp, bno + len <= gtrec.rm_startblock, + out_error); + } else { + gtrec.rm_owner = XFS_RMAP_OWN_NULL; + } + if (!xfs_rmap_is_mergeable(>rec, owner, offset)) + gtrec.rm_owner = XFS_RMAP_OWN_NULL; + + /* + * Note: cursor currently points one record to the right of ltrec, even + * if there is no record in the tree to the right. + */ + if (ltrec.rm_owner == owner && + ltrec.rm_startblock + ltrec.rm_blockcount == bno) { + /* + * left edge contiguous, merge into left record. + * + * ltbno ltlen + * orig: |ooooooooo| + * adding: |aaaaaaaaa| + * result: |rrrrrrrrrrrrrrrrrrr| + * bno len + */ + ltrec.rm_blockcount += len; + if (gtrec.rm_owner == owner && + bno + len == gtrec.rm_startblock) { + //printk("add middle\n"); + /* + * right edge also contiguous, delete right record + * and merge into left record. + * + * ltbno ltlen gtbno gtlen + * orig: |ooooooooo| |ooooooooo| + * adding: |aaaaaaaaa| + * result: |rrrrrrrrrrrrrrrrrrrrrrrrrrrrr| + */ + ltrec.rm_blockcount += gtrec.rm_blockcount; + error = xfs_btree_delete(cur, &i); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, out_error); + } + + /* point the cursor back to the left record and update */ + error = xfs_btree_decrement(cur, 0, &have_gt); + if (error) + goto out_error; + error = xfs_rmap_update(cur, <rec); + if (error) + goto out_error; + } else if (gtrec.rm_owner == owner && + bno + len == gtrec.rm_startblock) { + /* + * right edge contiguous, merge into right record. + * + * gtbno gtlen + * Orig: |ooooooooo| + * adding: |aaaaaaaaa| + * Result: |rrrrrrrrrrrrrrrrrrr| + * bno len + */ + gtrec.rm_startblock = bno; + gtrec.rm_blockcount += len; + error = xfs_rmap_update(cur, >rec); + if (error) + goto out_error; + } else { + /* + * no contiguous edge with identical owner, insert + * new record at current cursor position. + */ + cur->bc_rec.r.rm_startblock = bno; + cur->bc_rec.r.rm_blockcount = len; + cur->bc_rec.r.rm_owner = owner; + cur->bc_rec.r.rm_offset = offset; + error = xfs_btree_insert(cur, &i); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, out_error); + } + trace_xfs_rmap_alloc_extent_done(mp, agno, bno, len, oinfo); + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); return 0; out_error: trace_xfs_rmap_alloc_extent_error(mp, agno, bno, len, oinfo); + xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); return error; } diff --git a/fs/xfs/libxfs/xfs_rmap_btree.h b/fs/xfs/libxfs/xfs_rmap_btree.h index a5c97f8..0dfc151 100644 --- a/fs/xfs/libxfs/xfs_rmap_btree.h +++ b/fs/xfs/libxfs/xfs_rmap_btree.h @@ -58,6 +58,7 @@ int xfs_rmap_lookup_eq(struct xfs_btree_cur *cur, xfs_agblock_t bno, int xfs_rmap_get_rec(struct xfs_btree_cur *cur, struct xfs_rmap_irec *irec, int *stat); +/* functions for updating the rmapbt for bmbt blocks and AG btree blocks */ int xfs_rmap_alloc(struct xfs_trans *tp, struct xfs_buf *agbp, xfs_agnumber_t agno, xfs_agblock_t bno, xfs_extlen_t len, struct xfs_owner_info *oinfo); -- 2.7.0 From dave@fromorbit.com Mon Mar 7 22:17:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C758129E26 for ; Mon, 7 Mar 2016 22:17:15 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2D79AAC002 for ; Mon, 7 Mar 2016 20:17:15 -0800 (PST) X-ASG-Debug-ID: 1457410622-04cb6c583120ed30005-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id T4GerkLpWSA56DwG for ; Mon, 07 Mar 2016 20:17:12 -0800 (PST) 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: A2CjCAC/Ud5WPFEqLHlcKAECgw+BP4Zmn30BAgEBAQaRRoZnhGlNAQEBAQEBBwEBAQFBQIRCAQUnLzMIGDE5AwcUGYgjvniFT4kNhGwFjTCJOEKNcI54jlaCGAELAYI1KC6IRIE7AQEB Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl6.internode.on.net with ESMTP; 08 Mar 2016 14:46:34 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ad94T-0004A9-1U for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:33 +1100 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ad94G-0007uS-G3 for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:20 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 06/16] xfs: introduce rmap extent operation stubs Date: Tue, 8 Mar 2016 15:16:08 +1100 X-ASG-Orig-Subj: [PATCH 06/16] xfs: introduce rmap extent operation stubs Message-Id: <1457410578-30233-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1457410578-30233-1-git-send-email-david@fromorbit.com> References: <1457410578-30233-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1457410632 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27662 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Add the stubs into the extent allocation and freeing paths that the rmap btree implementation will hook into. While doing this, add the trace points that will be used to track rmap btree extent manipulations. [darrick.wong@oracle.com: Extend the stubs to take full owner info.] Signed-off-by: Dave Chinner Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- fs/xfs/Makefile | 1 + fs/xfs/libxfs/xfs_alloc.c | 18 ++++++++- fs/xfs/libxfs/xfs_rmap.c | 89 ++++++++++++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_rmap_btree.h | 30 ++++++++++++++ fs/xfs/xfs_trace.h | 45 +++++++++++++++++++++ 5 files changed, 182 insertions(+), 1 deletion(-) create mode 100644 fs/xfs/libxfs/xfs_rmap.c create mode 100644 fs/xfs/libxfs/xfs_rmap_btree.h diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index f646391..c202ce3 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -51,6 +51,7 @@ xfs-y += $(addprefix libxfs/, \ xfs_inode_fork.o \ xfs_inode_buf.o \ xfs_log_rlimit.o \ + xfs_rmap.o \ xfs_sb.o \ xfs_symlink_remote.o \ xfs_trans_resv.o \ diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index 0222e03..9ecbe0f 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -26,6 +26,7 @@ #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_btree.h" +#include "xfs_rmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_alloc.h" #include "xfs_extent_busy.h" @@ -647,6 +648,14 @@ xfs_alloc_ag_vextent( ASSERT(!args->wasfromfl || !args->isfl); ASSERT(args->agbno % args->alignment == 0); + /* if not file data, insert new block into the reverse map btree */ + if (args->oinfo.oi_owner) { + error = xfs_rmap_alloc(args->tp, args->agbp, args->agno, + args->agbno, args->len, &args->oinfo); + if (error) + return error; + } + if (!args->wasfromfl) { error = xfs_alloc_update_counters(args->tp, args->pag, args->agbp, @@ -1613,12 +1622,19 @@ xfs_free_ag_extent( xfs_extlen_t nlen; /* new length of freespace */ xfs_perag_t *pag; /* per allocation group data */ + bno_cur = cnt_cur = NULL; mp = tp->t_mountp; + + if (oinfo->oi_owner) { + error = xfs_rmap_free(tp, agbp, agno, bno, len, oinfo); + if (error) + goto error0; + } + /* * Allocate and initialize a cursor for the by-block btree. */ bno_cur = xfs_allocbt_init_cursor(mp, tp, agbp, agno, XFS_BTNUM_BNO); - cnt_cur = NULL; /* * Look for a neighboring block on the left (lower block numbers) * that is contiguous with this space. diff --git a/fs/xfs/libxfs/xfs_rmap.c b/fs/xfs/libxfs/xfs_rmap.c new file mode 100644 index 0000000..3e17294 --- /dev/null +++ b/fs/xfs/libxfs/xfs_rmap.c @@ -0,0 +1,89 @@ + +/* + * Copyright (c) 2014 Red Hat, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include "xfs.h" +#include "xfs_fs.h" +#include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" +#include "xfs_bit.h" +#include "xfs_sb.h" +#include "xfs_mount.h" +#include "xfs_da_format.h" +#include "xfs_da_btree.h" +#include "xfs_btree.h" +#include "xfs_trans.h" +#include "xfs_alloc.h" +#include "xfs_rmap_btree.h" +#include "xfs_trans_space.h" +#include "xfs_trace.h" +#include "xfs_error.h" +#include "xfs_extent_busy.h" + +int +xfs_rmap_free( + struct xfs_trans *tp, + struct xfs_buf *agbp, + xfs_agnumber_t agno, + xfs_agblock_t bno, + xfs_extlen_t len, + struct xfs_owner_info *oinfo) +{ + struct xfs_mount *mp = tp->t_mountp; + int error = 0; + + if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) + return 0; + + trace_xfs_rmap_free_extent(mp, agno, bno, len, oinfo); + if (1) + goto out_error; + trace_xfs_rmap_free_extent_done(mp, agno, bno, len, oinfo); + return 0; + +out_error: + trace_xfs_rmap_free_extent_error(mp, agno, bno, len, oinfo); + return error; +} + +int +xfs_rmap_alloc( + struct xfs_trans *tp, + struct xfs_buf *agbp, + xfs_agnumber_t agno, + xfs_agblock_t bno, + xfs_extlen_t len, + struct xfs_owner_info *oinfo) +{ + struct xfs_mount *mp = tp->t_mountp; + int error = 0; + + if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) + return 0; + + trace_xfs_rmap_alloc_extent(mp, agno, bno, len, oinfo); + if (1) + goto out_error; + trace_xfs_rmap_alloc_extent_done(mp, agno, bno, len, oinfo); + return 0; + +out_error: + trace_xfs_rmap_alloc_extent_error(mp, agno, bno, len, oinfo); + return error; +} diff --git a/fs/xfs/libxfs/xfs_rmap_btree.h b/fs/xfs/libxfs/xfs_rmap_btree.h new file mode 100644 index 0000000..a3b8f90 --- /dev/null +++ b/fs/xfs/libxfs/xfs_rmap_btree.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2014 Red Hat, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef __XFS_RMAP_BTREE_H__ +#define __XFS_RMAP_BTREE_H__ + +struct xfs_buf; + +int xfs_rmap_alloc(struct xfs_trans *tp, struct xfs_buf *agbp, + xfs_agnumber_t agno, xfs_agblock_t bno, xfs_extlen_t len, + struct xfs_owner_info *oinfo); +int xfs_rmap_free(struct xfs_trans *tp, struct xfs_buf *agbp, + xfs_agnumber_t agno, xfs_agblock_t bno, xfs_extlen_t len, + struct xfs_owner_info *oinfo); + +#endif /* __XFS_RMAP_BTREE_H__ */ diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index c8d5842..7968e92 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -1701,6 +1701,51 @@ DEFINE_ALLOC_EVENT(xfs_alloc_vextent_noagbp); DEFINE_ALLOC_EVENT(xfs_alloc_vextent_loopfailed); DEFINE_ALLOC_EVENT(xfs_alloc_vextent_allfailed); +DECLARE_EVENT_CLASS(xfs_rmap_class, + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, + xfs_agblock_t agbno, xfs_extlen_t len, + struct xfs_owner_info *oinfo), + TP_ARGS(mp, agno, agbno, len, oinfo), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, agno) + __field(xfs_agblock_t, agbno) + __field(xfs_extlen_t, len) + __field(uint64_t, owner) + __field(uint64_t, offset) + __field(unsigned long, flags) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->agno = agno; + __entry->agbno = agbno; + __entry->len = len; + __entry->owner = oinfo->oi_owner; + __entry->offset = oinfo->oi_offset; + __entry->flags = oinfo->oi_flags; + ), + TP_printk("dev %d:%d agno %u agbno %u len %u, owner 0x%llx, offset %llu, flags 0x%lx", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->agno, + __entry->agbno, + __entry->len, + __entry->owner, + __entry->offset, + __entry->flags) +); +#define DEFINE_RMAP_EVENT(name) \ +DEFINE_EVENT(xfs_rmap_class, name, \ + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \ + xfs_agblock_t agbno, xfs_extlen_t len, \ + struct xfs_owner_info *oinfo), \ + TP_ARGS(mp, agno, agbno, len, oinfo)) +DEFINE_RMAP_EVENT(xfs_rmap_free_extent); +DEFINE_RMAP_EVENT(xfs_rmap_free_extent_done); +DEFINE_RMAP_EVENT(xfs_rmap_free_extent_error); +DEFINE_RMAP_EVENT(xfs_rmap_alloc_extent); +DEFINE_RMAP_EVENT(xfs_rmap_alloc_extent_done); +DEFINE_RMAP_EVENT(xfs_rmap_alloc_extent_error); + DECLARE_EVENT_CLASS(xfs_da_class, TP_PROTO(struct xfs_da_args *args), TP_ARGS(args), -- 2.7.0 From dave@fromorbit.com Mon Mar 7 22:17:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 719F229E1F for ; Mon, 7 Mar 2016 22:17:14 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 322198F8039 for ; Mon, 7 Mar 2016 20:17:14 -0800 (PST) X-ASG-Debug-ID: 1457410623-04cb6c583320ed40005-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id weWnXaoq3NVeAWRE for ; Mon, 07 Mar 2016 20:17:11 -0800 (PST) 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: A2ChCAC/Ud5WPFEqLHlcKAECgw+BP4Zmn30BAgEBAQaRRotQTQEBAQEBAQcBAQEBQUCEQgEFJy8cFwgYMTkDBxQZiCO+eIVPiRqEXwWHWAOHBohJiFOFHYFhjReFeohcghgBCwGCNSguiEWBOgEBAQ Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl6.internode.on.net with ESMTP; 08 Mar 2016 14:46:34 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ad94T-0004AF-3U for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:33 +1100 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ad94G-0007um-Hm for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:20 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 10/16] xfs: rmap btree requires more reserved free space Date: Tue, 8 Mar 2016 15:16:12 +1100 X-ASG-Orig-Subj: [PATCH 10/16] xfs: rmap btree requires more reserved free space Message-Id: <1457410578-30233-11-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1457410578-30233-1-git-send-email-david@fromorbit.com> References: <1457410578-30233-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1457410630 X-Barracuda-URL: https://192.48.176.15:443/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.27662 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words From: Dave Chinner The rmap btree is allocated from the AGFL, which means we have to ensure ENOSPC is reported to userspace before we run out of free space in each AG. The last allocation in an AG can cause a full height rmap btree split, and that means we have to reserve at least this many blocks *in each AG* to be placed on the AGFL at ENOSPC. Update the various space calculation functiosn to handle this. Also, because the macros are now executing conditional code and are called quite frequently, convert them to functions that initialise varaibles in the struct xfs_mount, use the new variables everywhere and document the calculations better. [darrick.wong@oracle.com: don't reserve blocks if !rmap] [dchinner@redhat.com: update m_ag_max_usable after growfs] Signed-off-by: Dave Chinner Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_alloc.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_alloc.h | 41 ++++----------------------- fs/xfs/libxfs/xfs_bmap.c | 2 +- fs/xfs/libxfs/xfs_sb.c | 2 ++ fs/xfs/xfs_discard.c | 2 +- fs/xfs/xfs_fsops.c | 5 ++-- fs/xfs/xfs_log_recover.c | 1 + fs/xfs/xfs_mount.c | 2 +- fs/xfs/xfs_mount.h | 2 ++ fs/xfs/xfs_super.c | 2 +- 10 files changed, 88 insertions(+), 42 deletions(-) diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index 9ecbe0f..585ebfa 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -62,6 +62,72 @@ xfs_prealloc_blocks( } /* + * In order to avoid ENOSPC-related deadlock caused by out-of-order locking of + * AGF buffer (PV 947395), we place constraints on the relationship among actual + * allocations for data blocks, freelist blocks, and potential file data bmap + * btree blocks. However, these restrictions may result in no actual space + * allocated for a delayed extent, for example, a data block in a certain AG is + * allocated but there is no additional block for the additional bmap btree + * block due to a split of the bmap btree of the file. The result of this may + * lead to an infinite loop when the file gets flushed to disk and all delayed + * extents need to be actually allocated. To get around this, we explicitly set + * aside a few blocks which will not be reserved in delayed allocation. + * + * The minimum number of needed freelist blocks is 4 fsbs _per AG_ when we are + * not using rmap btrees a potential split of file's bmap btree requires 1 fsb, + * so we set the number of set-aside blocks to 4 + 4*agcount when not using rmap + * btrees. + * + * When rmap btrees are active, we have to consider that using the last block in + * the AG can cause a full height rmap btree split and we need enough blocks on + * the AGFL to be able to handle this. That means we have, in addition to the + * above consideration, another (2 * mp->m_ag_levels) - 1 blocks required to be + * available to the free list. + */ +unsigned int +xfs_alloc_set_aside( + struct xfs_mount *mp) +{ + unsigned int blocks; + + blocks = 4 + (mp->m_sb.sb_agcount * XFS_ALLOC_AGFL_RESERVE); + if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) + return blocks; + return blocks + (mp->m_sb.sb_agcount * (2 * mp->m_ag_maxlevels) - 1); +} + +/* + * When deciding how much space to allocate out of an AG, we limit the + * allocation maximum size to the size the AG. However, we cannot use all the + * blocks in the AG - some are permanently used by metadata. These + * blocks are generally: + * - the AG superblock, AGF, AGI and AGFL + * - the AGF (bno and cnt) and AGI btree root blocks, and optionally + * the AGI free inode and rmap btree root blocks. + * - blocks on the AGFL according to xfs_alloc_set_aside() limits + * + * The AG headers are sector sized, so the amount of space they take up is + * dependent on filesystem geometry. The others are all single blocks. + */ +unsigned int +xfs_alloc_ag_max_usable(struct xfs_mount *mp) +{ + unsigned int blocks; + + blocks = XFS_BB_TO_FSB(mp, XFS_FSS_TO_BB(mp, 4)); /* ag headers */ + blocks += XFS_ALLOC_AGFL_RESERVE; + blocks += 3; /* AGF, AGI btree root blocks */ + if (xfs_sb_version_hasfinobt(&mp->m_sb)) + blocks++; /* finobt root block */ + if (xfs_sb_version_hasrmapbt(&mp->m_sb)) { + /* rmap root block + full tree split on full AG */ + blocks += 1 + (2 * mp->m_ag_maxlevels) - 1; + } + + return mp->m_sb.sb_agblocks - blocks; +} + +/* * Lookup the record equal to [bno, len] in the btree given by cur. */ STATIC int /* error */ @@ -1914,6 +1980,11 @@ xfs_alloc_min_freelist( /* space needed by-size freespace btree */ min_free += min_t(unsigned int, pag->pagf_levels[XFS_BTNUM_CNTi] + 1, mp->m_ag_maxlevels); + /* space needed reverse mapping used space btree */ + if (xfs_sb_version_hasrmapbt(&mp->m_sb)) + min_free += min_t(unsigned int, + pag->pagf_levels[XFS_BTNUM_RMAPi] + 1, + mp->m_ag_maxlevels); return min_free; } diff --git a/fs/xfs/libxfs/xfs_alloc.h b/fs/xfs/libxfs/xfs_alloc.h index 6d0f328..ea2868d 100644 --- a/fs/xfs/libxfs/xfs_alloc.h +++ b/fs/xfs/libxfs/xfs_alloc.h @@ -56,42 +56,6 @@ typedef unsigned int xfs_alloctype_t; #define XFS_ALLOC_FLAG_FREEING 0x00000002 /* indicate caller is freeing extents*/ /* - * In order to avoid ENOSPC-related deadlock caused by - * out-of-order locking of AGF buffer (PV 947395), we place - * constraints on the relationship among actual allocations for - * data blocks, freelist blocks, and potential file data bmap - * btree blocks. However, these restrictions may result in no - * actual space allocated for a delayed extent, for example, a data - * block in a certain AG is allocated but there is no additional - * block for the additional bmap btree block due to a split of the - * bmap btree of the file. The result of this may lead to an - * infinite loop in xfssyncd when the file gets flushed to disk and - * all delayed extents need to be actually allocated. To get around - * this, we explicitly set aside a few blocks which will not be - * reserved in delayed allocation. Considering the minimum number of - * needed freelist blocks is 4 fsbs _per AG_, a potential split of file's bmap - * btree requires 1 fsb, so we set the number of set-aside blocks - * to 4 + 4*agcount. - */ -#define XFS_ALLOC_SET_ASIDE(mp) (4 + ((mp)->m_sb.sb_agcount * 4)) - -/* - * When deciding how much space to allocate out of an AG, we limit the - * allocation maximum size to the size the AG. However, we cannot use all the - * blocks in the AG - some are permanently used by metadata. These - * blocks are generally: - * - the AG superblock, AGF, AGI and AGFL - * - the AGF (bno and cnt) and AGI btree root blocks - * - 4 blocks on the AGFL according to XFS_ALLOC_SET_ASIDE() limits - * - * The AG headers are sector sized, so the amount of space they take up is - * dependent on filesystem geometry. The others are all single blocks. - */ -#define XFS_ALLOC_AG_MAX_USABLE(mp) \ - ((mp)->m_sb.sb_agblocks - XFS_BB_TO_FSB(mp, XFS_FSS_TO_BB(mp, 4)) - 7) - - -/* * Argument structure for xfs_alloc routines. * This is turned into a structure to avoid having 20 arguments passed * down several levels of the stack. @@ -133,6 +97,11 @@ typedef struct xfs_alloc_arg { #define XFS_ALLOC_INITIAL_USER_DATA (1 << 1)/* special case start of file */ #define XFS_ALLOC_USERDATA_ZERO (1 << 2)/* zero extent on allocation */ +/* freespace limit calculations */ +#define XFS_ALLOC_AGFL_RESERVE 4 +unsigned int xfs_alloc_set_aside(struct xfs_mount *mp); +unsigned int xfs_alloc_ag_max_usable(struct xfs_mount *mp); + xfs_extlen_t xfs_alloc_longest_free_extent(struct xfs_mount *mp, struct xfs_perag *pag, xfs_extlen_t need); unsigned int xfs_alloc_min_freelist(struct xfs_mount *mp, diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 59d4fd1..f8d33c5 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -3724,7 +3724,7 @@ xfs_bmap_btalloc( args.fsbno = ap->blkno; /* Trim the allocation back to the maximum an AG can fit. */ - args.maxlen = MIN(ap->length, XFS_ALLOC_AG_MAX_USABLE(mp)); + args.maxlen = MIN(ap->length, mp->m_ag_max_usable); args.firstblock = *ap->firstblock; blen = 0; if (nullfb) { diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index fadf750..62217e1 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -744,6 +744,8 @@ xfs_sb_mount_common( mp->m_ialloc_min_blks = sbp->sb_spino_align; else mp->m_ialloc_min_blks = mp->m_ialloc_blks; + mp->m_alloc_set_aside = xfs_alloc_set_aside(mp); + mp->m_ag_max_usable = xfs_alloc_ag_max_usable(mp); } /* diff --git a/fs/xfs/xfs_discard.c b/fs/xfs/xfs_discard.c index 272c3f8..4ff499a 100644 --- a/fs/xfs/xfs_discard.c +++ b/fs/xfs/xfs_discard.c @@ -179,7 +179,7 @@ xfs_ioc_trim( * matter as trimming blocks is an advisory interface. */ if (range.start >= XFS_FSB_TO_B(mp, mp->m_sb.sb_dblocks) || - range.minlen > XFS_FSB_TO_B(mp, XFS_ALLOC_AG_MAX_USABLE(mp)) || + range.minlen > XFS_FSB_TO_B(mp, mp->m_ag_max_usable) || range.len < mp->m_sb.sb_blocksize) return -EINVAL; diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 042f215..19c43bf 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -586,6 +586,7 @@ xfs_growfs_data_private( } else mp->m_maxicount = 0; xfs_set_low_space_thresholds(mp); + mp->m_alloc_set_aside = xfs_alloc_set_aside(mp); /* update secondary superblocks. */ for (agno = 1; agno < nagcount; agno++) { @@ -723,7 +724,7 @@ xfs_fs_counts( cnt->allocino = percpu_counter_read_positive(&mp->m_icount); cnt->freeino = percpu_counter_read_positive(&mp->m_ifree); cnt->freedata = percpu_counter_read_positive(&mp->m_fdblocks) - - XFS_ALLOC_SET_ASIDE(mp); + mp->m_alloc_set_aside; spin_lock(&mp->m_sb_lock); cnt->freertx = mp->m_sb.sb_frextents; @@ -796,7 +797,7 @@ retry: __int64_t free; free = percpu_counter_sum(&mp->m_fdblocks) - - XFS_ALLOC_SET_ASIDE(mp); + mp->m_alloc_set_aside; if (!free) goto out; /* ENOSPC and fdblks_delta = 0 */ diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 7c9bc7c..4232f2d 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -5028,6 +5028,7 @@ xlog_do_recover( xfs_warn(mp, "Failed post-recovery per-ag init: %d", error); return error; } + mp->m_alloc_set_aside = xfs_alloc_set_aside(mp); xlog_recover_check_summary(log); diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index ef5de545..accd597 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1197,7 +1197,7 @@ xfs_mod_fdblocks( batch = XFS_FDBLOCKS_BATCH; __percpu_counter_add(&mp->m_fdblocks, delta, batch); - if (__percpu_counter_compare(&mp->m_fdblocks, XFS_ALLOC_SET_ASIDE(mp), + if (__percpu_counter_compare(&mp->m_fdblocks, mp->m_alloc_set_aside, XFS_FDBLOCKS_BATCH) >= 0) { /* we had space! */ return 0; diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index b409a2a..945cd2e 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -96,6 +96,8 @@ typedef struct xfs_mount { uint m_bm_maxlevels[2]; /* XFS_BM_MAXLEVELS */ uint m_in_maxlevels; /* max inobt btree levels. */ xfs_extlen_t m_ag_prealloc_blocks; /* reserved ag blocks */ + uint m_alloc_set_aside; /* space we can't use */ + uint m_ag_max_usable; /* max space per AG */ struct radix_tree_root m_perag_tree; /* per-ag accounting info */ spinlock_t m_perag_lock; /* lock for m_perag_tree */ struct mutex m_growlock; /* growfs mutex */ diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index d760934..da4398d 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1088,7 +1088,7 @@ xfs_fs_statfs( statp->f_blocks = sbp->sb_dblocks - lsize; spin_unlock(&mp->m_sb_lock); - statp->f_bfree = fdblocks - XFS_ALLOC_SET_ASIDE(mp); + statp->f_bfree = fdblocks - mp->m_alloc_set_aside; statp->f_bavail = statp->f_bfree; fakeinos = statp->f_bfree << sbp->sb_inopblog; -- 2.7.0 From dave@fromorbit.com Mon Mar 7 22:17:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2FFF829E28 for ; Mon, 7 Mar 2016 22:17:16 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B957AAC001 for ; Mon, 7 Mar 2016 20:17:15 -0800 (PST) X-ASG-Debug-ID: 1457410624-04bdf002ec2427c0005-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id mZ52KXywQ6ACXjzz for ; Mon, 07 Mar 2016 20:17:13 -0800 (PST) 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: A2ChCAC/Ud5WPFEqLHlcKAECgw+BP4Zmn30BAgEBAQaRRotQTQEBAQEBAQcBAQEBQUCEQgEFJy8zCEk5AwcUGYgjvniFT415BYdbj0+NcI54jlaCGAELQRmBXCguiX8BAQE Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl6.internode.on.net with ESMTP; 08 Mar 2016 14:46:35 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ad94T-0004AD-2q for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:33 +1100 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ad94G-0007uh-HJ for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:20 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 09/16] xfs: rmap btree transaction reservations Date: Tue, 8 Mar 2016 15:16:11 +1100 X-ASG-Orig-Subj: [PATCH 09/16] xfs: rmap btree transaction reservations Message-Id: <1457410578-30233-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1457410578-30233-1-git-send-email-david@fromorbit.com> References: <1457410578-30233-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1457410633 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27662 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- >From : Dave Chinner The rmap btrees will use the AGFL as the block allocation source, so we need to ensure that the transaction reservations reflect the fact this tree is modified by allocation and freeing. Hence we need to extend all the extent allocation/free reservations used in transactions to handle this. Note that this also gets rid of the unused XFS_ALLOCFREE_LOG_RES macro, as we now do buffer reservations based on the number of buffers logged via xfs_calc_buf_res(). Hence we only need the buffer count calculation now. Signed-off-by: Dave Chinner Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_trans_resv.c | 56 +++++++++++++++++++++++++++++------------- fs/xfs/libxfs/xfs_trans_resv.h | 10 -------- 2 files changed, 39 insertions(+), 27 deletions(-) diff --git a/fs/xfs/libxfs/xfs_trans_resv.c b/fs/xfs/libxfs/xfs_trans_resv.c index 68cb1e7..d495f82 100644 --- a/fs/xfs/libxfs/xfs_trans_resv.c +++ b/fs/xfs/libxfs/xfs_trans_resv.c @@ -64,6 +64,28 @@ xfs_calc_buf_res( } /* + * Per-extent log reservation for the allocation btree changes + * involved in freeing or allocating an extent. When rmap is not enabled, + * there are only two trees that will be modified (free space trees), and when + * rmap is enabled there will be three (freespace + rmap trees). The number of + * blocks reserved is based on the formula: + * + * num trees * ((2 blocks/level * max depth) - 1) + */ +static uint +xfs_allocfree_log_count( + struct xfs_mount *mp, + uint num_ops) +{ + uint num_trees = 2; + + if (xfs_sb_version_hasrmapbt(&mp->m_sb)) + num_trees++; + + return num_ops * num_trees * (2 * mp->m_ag_maxlevels - 1); +} + +/* * Logging inodes is really tricksy. They are logged in memory format, * which means that what we write into the log doesn't directly translate into * the amount of space they use on disk. @@ -126,7 +148,7 @@ xfs_calc_inode_res( */ STATIC uint xfs_calc_finobt_res( - struct xfs_mount *mp, + struct xfs_mount *mp, int alloc, int modify) { @@ -137,7 +159,7 @@ xfs_calc_finobt_res( res = xfs_calc_buf_res(mp->m_in_maxlevels, XFS_FSB_TO_B(mp, 1)); if (alloc) - res += xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + res += xfs_calc_buf_res(xfs_allocfree_log_count(mp, 1), XFS_FSB_TO_B(mp, 1)); if (modify) res += (uint)XFS_FSB_TO_B(mp, 1); @@ -188,10 +210,10 @@ xfs_calc_write_reservation( xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), XFS_FSB_TO_B(mp, 1)) + xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), + xfs_calc_buf_res(xfs_allocfree_log_count(mp, 2), XFS_FSB_TO_B(mp, 1))), (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), + xfs_calc_buf_res(xfs_allocfree_log_count(mp, 2), XFS_FSB_TO_B(mp, 1)))); } @@ -217,10 +239,10 @@ xfs_calc_itruncate_reservation( xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1, XFS_FSB_TO_B(mp, 1))), (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 4), + xfs_calc_buf_res(xfs_allocfree_log_count(mp, 4), XFS_FSB_TO_B(mp, 1)) + xfs_calc_buf_res(5, 0) + - xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + xfs_calc_buf_res(xfs_allocfree_log_count(mp, 1), XFS_FSB_TO_B(mp, 1)) + xfs_calc_buf_res(2 + mp->m_ialloc_blks + mp->m_in_maxlevels, 0))); @@ -247,7 +269,7 @@ xfs_calc_rename_reservation( xfs_calc_buf_res(2 * XFS_DIROP_LOG_COUNT(mp), XFS_FSB_TO_B(mp, 1))), (xfs_calc_buf_res(7, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 3), + xfs_calc_buf_res(xfs_allocfree_log_count(mp, 3), XFS_FSB_TO_B(mp, 1)))); } @@ -286,7 +308,7 @@ xfs_calc_link_reservation( xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), XFS_FSB_TO_B(mp, 1))), (xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + xfs_calc_buf_res(xfs_allocfree_log_count(mp, 1), XFS_FSB_TO_B(mp, 1)))); } @@ -324,7 +346,7 @@ xfs_calc_remove_reservation( xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), XFS_FSB_TO_B(mp, 1))), (xfs_calc_buf_res(4, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), + xfs_calc_buf_res(xfs_allocfree_log_count(mp, 2), XFS_FSB_TO_B(mp, 1)))); } @@ -371,7 +393,7 @@ xfs_calc_create_resv_alloc( mp->m_sb.sb_sectsize + xfs_calc_buf_res(mp->m_ialloc_blks, XFS_FSB_TO_B(mp, 1)) + xfs_calc_buf_res(mp->m_in_maxlevels, XFS_FSB_TO_B(mp, 1)) + - xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + xfs_calc_buf_res(xfs_allocfree_log_count(mp, 1), XFS_FSB_TO_B(mp, 1)); } @@ -399,7 +421,7 @@ xfs_calc_icreate_resv_alloc( return xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + mp->m_sb.sb_sectsize + xfs_calc_buf_res(mp->m_in_maxlevels, XFS_FSB_TO_B(mp, 1)) + - xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + xfs_calc_buf_res(xfs_allocfree_log_count(mp, 1), XFS_FSB_TO_B(mp, 1)) + xfs_calc_finobt_res(mp, 0, 0); } @@ -483,7 +505,7 @@ xfs_calc_ifree_reservation( xfs_calc_buf_res(1, 0) + xfs_calc_buf_res(2 + mp->m_ialloc_blks + mp->m_in_maxlevels, 0) + - xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + xfs_calc_buf_res(xfs_allocfree_log_count(mp, 1), XFS_FSB_TO_B(mp, 1)) + xfs_calc_finobt_res(mp, 0, 1); } @@ -513,7 +535,7 @@ xfs_calc_growdata_reservation( struct xfs_mount *mp) { return xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + xfs_calc_buf_res(xfs_allocfree_log_count(mp, 1), XFS_FSB_TO_B(mp, 1)); } @@ -535,7 +557,7 @@ xfs_calc_growrtalloc_reservation( xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), XFS_FSB_TO_B(mp, 1)) + xfs_calc_inode_res(mp, 1) + - xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + xfs_calc_buf_res(xfs_allocfree_log_count(mp, 1), XFS_FSB_TO_B(mp, 1)); } @@ -611,7 +633,7 @@ xfs_calc_addafork_reservation( xfs_calc_buf_res(1, mp->m_dir_geo->blksize) + xfs_calc_buf_res(XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1, XFS_FSB_TO_B(mp, 1)) + - xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + xfs_calc_buf_res(xfs_allocfree_log_count(mp, 1), XFS_FSB_TO_B(mp, 1)); } @@ -634,7 +656,7 @@ xfs_calc_attrinval_reservation( xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK), XFS_FSB_TO_B(mp, 1))), (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 4), + xfs_calc_buf_res(xfs_allocfree_log_count(mp, 4), XFS_FSB_TO_B(mp, 1)))); } @@ -701,7 +723,7 @@ xfs_calc_attrrm_reservation( XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), 0)), (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), + xfs_calc_buf_res(xfs_allocfree_log_count(mp, 2), XFS_FSB_TO_B(mp, 1)))); } diff --git a/fs/xfs/libxfs/xfs_trans_resv.h b/fs/xfs/libxfs/xfs_trans_resv.h index 7978150..0eb46ed 100644 --- a/fs/xfs/libxfs/xfs_trans_resv.h +++ b/fs/xfs/libxfs/xfs_trans_resv.h @@ -68,16 +68,6 @@ struct xfs_trans_resv { #define M_RES(mp) (&(mp)->m_resv) /* - * Per-extent log reservation for the allocation btree changes - * involved in freeing or allocating an extent. - * 2 trees * (2 blocks/level * max depth - 1) * block size - */ -#define XFS_ALLOCFREE_LOG_RES(mp,nx) \ - ((nx) * (2 * XFS_FSB_TO_B((mp), 2 * (mp)->m_ag_maxlevels - 1))) -#define XFS_ALLOCFREE_LOG_COUNT(mp,nx) \ - ((nx) * (2 * (2 * (mp)->m_ag_maxlevels - 1))) - -/* * Per-directory log reservation for any directory change. * dir blocks: (1 btree block per level + data block + free block) * dblock size * bmap btree: (levels + 2) * max depth * block size -- 2.7.0 From dave@fromorbit.com Mon Mar 7 22:17:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AD66829E3F for ; Mon, 7 Mar 2016 22:17:20 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 807268F804B for ; Mon, 7 Mar 2016 20:17:20 -0800 (PST) X-ASG-Debug-ID: 1457410623-04cb6c583320ed40006-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id pWEUVbZJTgi128Kt for ; Mon, 07 Mar 2016 20:17:13 -0800 (PST) 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: A2ChCAC/Ud5WPFEqLHlcKAECgw+BP4Zmn30BAgEBAQaRRotQTQEBAQEBAQcBAQEBQUCEQgEFGg0vMwgYMTkDBxQZiCO+eIVPjXkFlyqIU4UdgWGNF4V6iFyCGAELAUAZgVwoLol/AQEB Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl6.internode.on.net with ESMTP; 08 Mar 2016 14:46:34 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ad94T-0004AS-6W for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:33 +1100 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ad94G-0007vG-Ky for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:20 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 16/16] xfs: piggyback rmapbt update intents in the bmap free structure Date: Tue, 8 Mar 2016 15:16:18 +1100 X-ASG-Orig-Subj: [PATCH 16/16] xfs: piggyback rmapbt update intents in the bmap free structure Message-Id: <1457410578-30233-17-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1457410578-30233-1-git-send-email-david@fromorbit.com> References: <1457410578-30233-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1457410633 X-Barracuda-URL: https://192.48.176.15:443/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.27662 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words From: "Darrick J. Wong" Extend the xfs_bmap_free structure to track a list of rmapbt update intents. Record the changes being made in the new rmapbt intent list and add hooks to process the changes to xfs_bmap_finish(). Subsequent patches will implement the rmapbt updates recorded in the intents, allowing us to re-order the rmapbt changes to avoid deadlocks (e.g. AG ordering rules) and sanely log the changes without blowing out transaction reservation sizes. This patch is derived from a couple of original patches from Darrick, split and merged by me, with a minor change to use list_head for the linked list. Signed-off-by: Darrick J. Wong Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_bmap.c | 179 +++++++++++++++++++++++++++++++- fs/xfs/libxfs/xfs_bmap.h | 16 ++- fs/xfs/libxfs/xfs_rmap.c | 228 +++++++++++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_rmap_btree.h | 57 +++++++++++ fs/xfs/xfs_bmap_util.c | 6 ++ 5 files changed, 479 insertions(+), 7 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index f8d33c5..3ee3b8c 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -45,6 +45,7 @@ #include "xfs_symlink.h" #include "xfs_attr_leaf.h" #include "xfs_filestream.h" +#include "xfs_rmap_btree.h" kmem_zone_t *xfs_bmap_free_item_zone; @@ -648,6 +649,8 @@ xfs_bmap_cancel( xfs_bmap_free_item_t *free; /* free list item */ xfs_bmap_free_item_t *next; + xfs_rmap_cancel(&flist->xbf_rlist); + if (flist->xbf_count == 0) return; ASSERT(flist->xbf_first != NULL); @@ -1869,6 +1872,10 @@ xfs_bmap_add_extent_delay_real( if (error) goto done; } + error = xfs_rmap_combine(mp, bma->rlist, bma->ip->i_ino, + whichfork, &LEFT, &RIGHT, &PREV); + if (error) + goto done; break; case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: @@ -1901,6 +1908,10 @@ xfs_bmap_add_extent_delay_real( if (error) goto done; } + error = xfs_rmap_resize(mp, bma->rlist, bma->ip->i_ino, + whichfork, &LEFT, PREV.br_blockcount); + if (error) + goto done; break; case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: @@ -1932,6 +1943,10 @@ xfs_bmap_add_extent_delay_real( if (error) goto done; } + error = xfs_rmap_move(mp, bma->rlist, bma->ip->i_ino, + whichfork, &RIGHT, -PREV.br_blockcount); + if (error) + goto done; break; case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING: @@ -1961,6 +1976,10 @@ xfs_bmap_add_extent_delay_real( goto done; XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); } + error = xfs_rmap_insert(mp, bma->rlist, bma->ip->i_ino, + whichfork, new); + if (error) + goto done; break; case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG: @@ -1996,6 +2015,10 @@ xfs_bmap_add_extent_delay_real( if (error) goto done; } + error = xfs_rmap_resize(mp, bma->rlist, bma->ip->i_ino, + whichfork, &LEFT, new->br_blockcount); + if (error) + goto done; da_new = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(bma->ip, temp), startblockval(PREV.br_startblock)); xfs_bmbt_set_startblock(ep, nullstartblock(da_new)); @@ -2031,6 +2054,10 @@ xfs_bmap_add_extent_delay_real( goto done; XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); } + error = xfs_rmap_insert(mp, bma->rlist, bma->ip->i_ino, + whichfork, new); + if (error) + goto done; if (xfs_bmap_needs_btree(bma->ip, whichfork)) { error = xfs_bmap_extents_to_btree(bma->tp, bma->ip, @@ -2079,6 +2106,8 @@ xfs_bmap_add_extent_delay_real( if (error) goto done; } + error = xfs_rmap_move(mp, bma->rlist, bma->ip->i_ino, + whichfork, &RIGHT, -new->br_blockcount); da_new = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(bma->ip, temp), startblockval(PREV.br_startblock)); @@ -2115,6 +2144,10 @@ xfs_bmap_add_extent_delay_real( goto done; XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); } + error = xfs_rmap_insert(mp, bma->rlist, bma->ip->i_ino, + whichfork, new); + if (error) + goto done; if (xfs_bmap_needs_btree(bma->ip, whichfork)) { error = xfs_bmap_extents_to_btree(bma->tp, bma->ip, @@ -2184,6 +2217,10 @@ xfs_bmap_add_extent_delay_real( goto done; XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); } + error = xfs_rmap_insert(mp, bma->rlist, bma->ip->i_ino, + whichfork, new); + if (error) + goto done; if (xfs_bmap_needs_btree(bma->ip, whichfork)) { error = xfs_bmap_extents_to_btree(bma->tp, bma->ip, @@ -2425,6 +2462,10 @@ xfs_bmap_add_extent_unwritten_real( RIGHT.br_blockcount, LEFT.br_state))) goto done; } + error = xfs_rmap_combine(mp, &flist->xbf_rlist, ip->i_ino, + XFS_DATA_FORK, &LEFT, &RIGHT, &PREV); + if (error) + goto done; break; case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: @@ -2462,6 +2503,10 @@ xfs_bmap_add_extent_unwritten_real( LEFT.br_state))) goto done; } + error = xfs_rmap_lcombine(mp, &flist->xbf_rlist, ip->i_ino, + XFS_DATA_FORK, &LEFT, &PREV); + if (error) + goto done; break; case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: @@ -2497,6 +2542,10 @@ xfs_bmap_add_extent_unwritten_real( newext))) goto done; } + error = xfs_rmap_rcombine(mp, &flist->xbf_rlist, ip->i_ino, + XFS_DATA_FORK, &RIGHT, &PREV); + if (error) + goto done; break; case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING: @@ -2523,6 +2572,11 @@ xfs_bmap_add_extent_unwritten_real( newext))) goto done; } + + error = xfs_rmap_resize(mp, &flist->xbf_rlist, ip->i_ino, + XFS_DATA_FORK, new, 0); + if (error) + goto done; break; case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG: @@ -2570,6 +2624,14 @@ xfs_bmap_add_extent_unwritten_real( if (error) goto done; } + error = xfs_rmap_move(mp, &flist->xbf_rlist, ip->i_ino, + XFS_DATA_FORK, &PREV, new->br_blockcount); + if (error) + goto done; + error = xfs_rmap_resize(mp, &flist->xbf_rlist, ip->i_ino, + XFS_DATA_FORK, &LEFT, new->br_blockcount); + if (error) + goto done; break; case BMAP_LEFT_FILLING: @@ -2608,6 +2670,14 @@ xfs_bmap_add_extent_unwritten_real( goto done; XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); } + error = xfs_rmap_move(mp, &flist->xbf_rlist, ip->i_ino, + XFS_DATA_FORK, &PREV, new->br_blockcount); + if (error) + goto done; + error = xfs_rmap_insert(mp, &flist->xbf_rlist, ip->i_ino, + XFS_DATA_FORK, new); + if (error) + goto done; break; case BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: @@ -2650,6 +2720,14 @@ xfs_bmap_add_extent_unwritten_real( newext))) goto done; } + error = xfs_rmap_resize(mp, &flist->xbf_rlist, ip->i_ino, + XFS_DATA_FORK, &PREV, -new->br_blockcount); + if (error) + goto done; + error = xfs_rmap_move(mp, &flist->xbf_rlist, ip->i_ino, + XFS_DATA_FORK, &RIGHT, -new->br_blockcount); + if (error) + goto done; break; case BMAP_RIGHT_FILLING: @@ -2690,6 +2768,14 @@ xfs_bmap_add_extent_unwritten_real( goto done; XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); } + error = xfs_rmap_resize(mp, &flist->xbf_rlist, ip->i_ino, + XFS_DATA_FORK, &PREV, -new->br_blockcount); + if (error) + goto done; + error = xfs_rmap_insert(mp, &flist->xbf_rlist, ip->i_ino, + XFS_DATA_FORK, new); + if (error) + goto done; break; case 0: @@ -2751,6 +2837,19 @@ xfs_bmap_add_extent_unwritten_real( goto done; XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); } + error = xfs_rmap_resize(mp, &flist->xbf_rlist, ip->i_ino, + XFS_DATA_FORK, &PREV, new->br_startoff - + PREV.br_startoff - PREV.br_blockcount); + if (error) + goto done; + error = xfs_rmap_insert(mp, &flist->xbf_rlist, ip->i_ino, + XFS_DATA_FORK, new); + if (error) + goto done; + error = xfs_rmap_insert(mp, &flist->xbf_rlist, ip->i_ino, + XFS_DATA_FORK, &r[1]); + if (error) + goto done; break; case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: @@ -2954,6 +3053,7 @@ xfs_bmap_add_extent_hole_real( int rval=0; /* return value (logging flags) */ int state; /* state bits, accessed thru macros */ struct xfs_mount *mp; + struct xfs_bmbt_irec prev; /* fake previous extent entry */ mp = bma->ip->i_mount; ifp = XFS_IFORK_PTR(bma->ip, whichfork); @@ -3061,6 +3161,12 @@ xfs_bmap_add_extent_hole_real( if (error) goto done; } + prev = *new; + prev.br_startblock = nullstartblock(0); + error = xfs_rmap_combine(mp, bma->rlist, bma->ip->i_ino, + whichfork, &left, &right, &prev); + if (error) + goto done; break; case BMAP_LEFT_CONTIG: @@ -3093,6 +3199,10 @@ xfs_bmap_add_extent_hole_real( if (error) goto done; } + error = xfs_rmap_resize(mp, bma->rlist, bma->ip->i_ino, + whichfork, &left, new->br_blockcount); + if (error) + goto done; break; case BMAP_RIGHT_CONTIG: @@ -3127,6 +3237,10 @@ xfs_bmap_add_extent_hole_real( if (error) goto done; } + error = xfs_rmap_move(mp, bma->rlist, bma->ip->i_ino, + whichfork, &right, -new->br_blockcount); + if (error) + goto done; break; case 0: @@ -3155,6 +3269,10 @@ xfs_bmap_add_extent_hole_real( goto done; XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); } + error = xfs_rmap_insert(mp, bma->rlist, bma->ip->i_ino, + whichfork, new); + if (error) + goto done; break; } @@ -4289,7 +4407,6 @@ xfs_bmapi_delay( return 0; } - static int xfs_bmapi_allocate( struct xfs_bmalloca *bma) @@ -4603,6 +4720,7 @@ xfs_bmapi_write( bma.userdata = 0; bma.flist = flist; bma.firstblock = firstblock; + bma.rlist = &flist->xbf_rlist; while (bno < end && n < *nmap) { inhole = eof || bma.got.br_startoff > bno; @@ -4861,6 +4979,10 @@ xfs_bmap_del_extent( XFS_IFORK_NEXT_SET(ip, whichfork, XFS_IFORK_NEXTENTS(ip, whichfork) - 1); flags |= XFS_ILOG_CORE; + error = xfs_rmap_delete(mp, &flist->xbf_rlist, ip->i_ino, + whichfork, &got); + if (error) + goto done; if (!cur) { flags |= xfs_ilog_fext(whichfork); break; @@ -4888,6 +5010,10 @@ xfs_bmap_del_extent( } xfs_bmbt_set_startblock(ep, del_endblock); trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); + error = xfs_rmap_move(mp, &flist->xbf_rlist, ip->i_ino, + whichfork, &got, del->br_blockcount); + if (error) + goto done; if (!cur) { flags |= xfs_ilog_fext(whichfork); break; @@ -4914,6 +5040,10 @@ xfs_bmap_del_extent( break; } trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); + error = xfs_rmap_resize(mp, &flist->xbf_rlist, ip->i_ino, + whichfork, &got, -del->br_blockcount); + if (error) + goto done; if (!cur) { flags |= xfs_ilog_fext(whichfork); break; @@ -4939,6 +5069,15 @@ xfs_bmap_del_extent( if (!delay) { new.br_startblock = del_endblock; flags |= XFS_ILOG_CORE; + error = xfs_rmap_resize(mp, &flist->xbf_rlist, + ip->i_ino, whichfork, &got, + temp - got.br_blockcount); + if (error) + goto done; + error = xfs_rmap_insert(mp, &flist->xbf_rlist, + ip->i_ino, whichfork, &new); + if (error) + goto done; if (cur) { if ((error = xfs_bmbt_update(cur, got.br_startoff, @@ -5175,6 +5314,7 @@ xfs_bunmapi( got.br_startoff + got.br_blockcount - 1); if (bno < start) break; + /* * Then deal with the (possibly delayed) allocated space * we found. @@ -5477,7 +5617,8 @@ xfs_bmse_merge( 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 */ + int *logflags, /* output */ + struct xfs_rmap_list *rlist) /* rmap intent list */ { struct xfs_bmbt_irec got; struct xfs_bmbt_irec left; @@ -5508,6 +5649,13 @@ xfs_bmse_merge( XFS_IFORK_NEXT_SET(ip, whichfork, XFS_IFORK_NEXTENTS(ip, whichfork) - 1); *logflags |= XFS_ILOG_CORE; + error = xfs_rmap_resize(mp, rlist, ip->i_ino, whichfork, &left, + blockcount - left.br_blockcount); + if (error) + return error; + error = xfs_rmap_delete(mp, rlist, ip->i_ino, whichfork, &got); + if (error) + return error; if (!cur) { *logflags |= XFS_ILOG_DEXT; return 0; @@ -5550,7 +5698,8 @@ xfs_bmse_shift_one( struct xfs_bmbt_rec_host *gotp, struct xfs_btree_cur *cur, int *logflags, - enum shift_direction direction) + enum shift_direction direction, + struct xfs_rmap_list *rlist) { struct xfs_ifork *ifp; struct xfs_mount *mp; @@ -5600,7 +5749,7 @@ xfs_bmse_shift_one( offset_shift_fsb)) { return xfs_bmse_merge(ip, whichfork, offset_shift_fsb, *current_ext, gotp, adj_irecp, - cur, logflags); + cur, logflags, rlist); } } else { startoff = got.br_startoff + offset_shift_fsb; @@ -5637,6 +5786,10 @@ update_current_ext: (*current_ext)--; xfs_bmbt_set_startoff(gotp, startoff); *logflags |= XFS_ILOG_CORE; + error = xfs_rmap_slide(mp, rlist, ip->i_ino, whichfork, + &got, startoff - got.br_startoff); + if (error) + return error; if (!cur) { *logflags |= XFS_ILOG_DEXT; return 0; @@ -5776,9 +5929,11 @@ xfs_bmap_shift_extents( } while (nexts++ < num_exts) { + xfs_bmbt_get_all(gotp, &got); + error = xfs_bmse_shift_one(ip, whichfork, offset_shift_fsb, ¤t_ext, gotp, cur, &logflags, - direction); + direction, &flist->xbf_rlist); if (error) goto del_cursor; /* @@ -5831,6 +5986,7 @@ xfs_bmap_split_extent_at( int whichfork = XFS_DATA_FORK; struct xfs_btree_cur *cur = NULL; struct xfs_bmbt_rec_host *gotp; + struct xfs_bmbt_irec rgot; struct xfs_bmbt_irec got; struct xfs_bmbt_irec new; /* split extent */ struct xfs_mount *mp = ip->i_mount; @@ -5840,6 +5996,7 @@ xfs_bmap_split_extent_at( int error = 0; int logflags = 0; int i = 0; + long adj; if (unlikely(XFS_TEST_ERROR( (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && @@ -5879,6 +6036,7 @@ xfs_bmap_split_extent_at( if (got.br_startoff >= split_fsb) return 0; + rgot = got; gotblkcnt = split_fsb - got.br_startoff; new.br_startoff = split_fsb; new.br_startblock = got.br_startblock + gotblkcnt; @@ -5934,6 +6092,17 @@ xfs_bmap_split_extent_at( XFS_WANT_CORRUPTED_GOTO(mp, i == 1, del_cursor); } + /* update rmapbt */ + adj = -(long)rgot.br_blockcount + gotblkcnt; + error = xfs_rmap_resize(mp, &free_list->xbf_rlist, ip->i_ino, + whichfork, &rgot, adj); + if (error) + goto del_cursor; + error = xfs_rmap_insert(mp, &free_list->xbf_rlist, ip->i_ino, + whichfork, &new); + if (error) + goto del_cursor; + /* * Convert to a btree if necessary. */ diff --git a/fs/xfs/libxfs/xfs_bmap.h b/fs/xfs/libxfs/xfs_bmap.h index 06dbe08..38cd9b5 100644 --- a/fs/xfs/libxfs/xfs_bmap.h +++ b/fs/xfs/libxfs/xfs_bmap.h @@ -56,6 +56,7 @@ struct xfs_bmalloca { bool conv; /* overwriting unwritten extents */ char userdata;/* userdata mask */ int flags; + struct xfs_rmap_list *rlist; }; /* @@ -70,6 +71,11 @@ typedef struct xfs_bmap_free_item struct xfs_bmap_free_item *xbfi_next; /* link to next entry */ } xfs_bmap_free_item_t; +struct xfs_rmap_list { + struct list_head rl_list; + int rl_count; +}; + /* * Header for free extent list. * @@ -89,6 +95,7 @@ typedef struct xfs_bmap_free xfs_bmap_free_item_t *xbf_first; /* list of to-be-free extents */ int xbf_count; /* count of items on list */ int xbf_low; /* alloc in low mode */ + struct xfs_rmap_list xbf_rlist; /* rmap intent list */ } xfs_bmap_free_t; #define XFS_BMAP_MAX_NMAP 4 @@ -142,8 +149,13 @@ static inline int xfs_bmapi_aflag(int w) static inline void xfs_bmap_init(xfs_bmap_free_t *flp, xfs_fsblock_t *fbp) { - ((flp)->xbf_first = NULL, (flp)->xbf_count = 0, \ - (flp)->xbf_low = 0, *(fbp) = NULLFSBLOCK); + flp->xbf_first = NULL; + flp->xbf_count = 0; + flp->xbf_low = 0; + *fbp = NULLFSBLOCK; + + INIT_LIST_HEAD(&flp->xbf_rlist.rl_list); + flp->xbf_rlist.rl_count = 0; } /* diff --git a/fs/xfs/libxfs/xfs_rmap.c b/fs/xfs/libxfs/xfs_rmap.c index 479cb73..a7130c5 100644 --- a/fs/xfs/libxfs/xfs_rmap.c +++ b/fs/xfs/libxfs/xfs_rmap.c @@ -35,6 +35,7 @@ #include "xfs_trace.h" #include "xfs_error.h" #include "xfs_extent_busy.h" +#include "xfs_bmap.h" /* * Lookup the first record less than or equal to [bno, len, owner, offset] @@ -542,3 +543,230 @@ out_error: xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); return error; } + + +/* + * Free up any items left in the list. + */ +void +xfs_rmap_cancel( + struct xfs_rmap_list *rlist) /* list of bmap_free_items */ +{ + if (list_empty(&rlist->rl_list)) + return; + while (!list_empty(&rlist->rl_list)) { + struct xfs_rmap_intent *free; + + free = list_first_entry(&rlist->rl_list, struct xfs_rmap_intent, + ri_list); + list_del(&free->ri_list); + kmem_free(free); + } + rlist->rl_count = 0; +} + +/* + * Free up any items left in the intent list. + */ +int +xfs_rmap_finish( + struct xfs_mount *mp, + struct xfs_trans **tpp, + struct xfs_inode *ip, + struct xfs_rmap_list *rlist) +{ + /* Not yet implemented, just cancel until implemented */ + xfs_rmap_cancel(rlist); + return 0; +} + +/* + * Record a rmap intent; the list is kept sorted first by AG and then by + * increasing age. + */ +static int +__xfs_rmap_add( + struct xfs_mount *mp, + struct xfs_rmap_list *rlist, + struct xfs_rmap_intent *ri) +{ + struct xfs_rmap_intent *new; + + if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) + return 0; + + new = kmem_zalloc(sizeof(struct xfs_rmap_intent), KM_SLEEP | KM_NOFS); + *new = *ri; + INIT_LIST_HEAD(&new->ri_list); + + /* XXX: ordering will be needed */ + list_add(&new->ri_list, &rlist->rl_list); + rlist->rl_count++; + return 0; +} + +/* Combine two adjacent rmap extents */ +int +xfs_rmap_combine( + struct xfs_mount *mp, + struct xfs_rmap_list *rlist, + xfs_ino_t ino, + int whichfork, + struct xfs_bmbt_irec *left, + struct xfs_bmbt_irec *right, + struct xfs_bmbt_irec *prev) +{ + struct xfs_rmap_intent ri; + + ri.ri_type = XFS_RMAP_COMBINE; + ri.ri_ino = ino; + ri.ri_whichfork = whichfork; + ri.ri_prev = *prev; + ri.ri_u.a.left = *left; + ri.ri_u.a.right = *right; + + return __xfs_rmap_add(mp, rlist, &ri); +} + +/* Extend a left rmap extent */ +int +xfs_rmap_lcombine( + struct xfs_mount *mp, + struct xfs_rmap_list *rlist, + xfs_ino_t ino, + int whichfork, + struct xfs_bmbt_irec *LEFT, + struct xfs_bmbt_irec *PREV) +{ + struct xfs_rmap_intent ri; + + ri.ri_type = XFS_RMAP_LCOMBINE; + ri.ri_ino = ino; + ri.ri_whichfork = whichfork; + ri.ri_prev = *PREV; + ri.ri_u.a.left = *LEFT; + + return __xfs_rmap_add(mp, rlist, &ri); +} + +/* Extend a right rmap extent */ +int +xfs_rmap_rcombine( + struct xfs_mount *mp, + struct xfs_rmap_list *rlist, + xfs_ino_t ino, + int whichfork, + struct xfs_bmbt_irec *RIGHT, + struct xfs_bmbt_irec *PREV) +{ + struct xfs_rmap_intent ri; + + ri.ri_type = XFS_RMAP_RCOMBINE; + ri.ri_ino = ino; + ri.ri_whichfork = whichfork; + ri.ri_prev = *PREV; + ri.ri_u.a.right = *RIGHT; + + return __xfs_rmap_add(mp, rlist, &ri); +} + +/* Insert a rmap extent */ +int +xfs_rmap_insert( + struct xfs_mount *mp, + struct xfs_rmap_list *rlist, + xfs_ino_t ino, + int whichfork, + struct xfs_bmbt_irec *new) +{ + struct xfs_rmap_intent ri; + + ri.ri_type = XFS_RMAP_INSERT; + ri.ri_ino = ino; + ri.ri_whichfork = whichfork; + ri.ri_prev = *new; + + return __xfs_rmap_add(mp, rlist, &ri); +} + +/* Delete a rmap extent */ +int +xfs_rmap_delete( + struct xfs_mount *mp, + struct xfs_rmap_list *rlist, + xfs_ino_t ino, + int whichfork, + struct xfs_bmbt_irec *new) +{ + struct xfs_rmap_intent ri; + + ri.ri_type = XFS_RMAP_DELETE; + ri.ri_ino = ino; + ri.ri_whichfork = whichfork; + ri.ri_prev = *new; + + return __xfs_rmap_add(mp, rlist, &ri); +} + +/* Change the start of an rmap */ +int +xfs_rmap_move( + struct xfs_mount *mp, + struct xfs_rmap_list *rlist, + xfs_ino_t ino, + int whichfork, + struct xfs_bmbt_irec *PREV, + long start_adj) +{ + struct xfs_rmap_intent ri; + + ri.ri_type = XFS_RMAP_MOVE; + ri.ri_ino = ino; + ri.ri_whichfork = whichfork; + ri.ri_prev = *PREV; + ri.ri_u.b.adj = start_adj; + + return __xfs_rmap_add(mp, rlist, &ri); +} + +/* Change the logical offset of an rmap */ +int +xfs_rmap_slide( + struct xfs_mount *mp, + struct xfs_rmap_list *rlist, + xfs_ino_t ino, + int whichfork, + struct xfs_bmbt_irec *PREV, + long start_adj) +{ + struct xfs_rmap_intent ri; + + ri.ri_type = XFS_RMAP_SLIDE; + ri.ri_ino = ino; + ri.ri_whichfork = whichfork; + ri.ri_prev = *PREV; + ri.ri_u.b.adj = start_adj; + + return __xfs_rmap_add(mp, rlist, &ri); +} + +/* Change the size of an rmap */ +int +xfs_rmap_resize( + struct xfs_mount *mp, + struct xfs_rmap_list *rlist, + xfs_ino_t ino, + int whichfork, + struct xfs_bmbt_irec *PREV, + long size_adj) +{ + struct xfs_rmap_intent ri; + + ri.ri_type = XFS_RMAP_RESIZE; + ri.ri_ino = ino; + ri.ri_whichfork = whichfork; + ri.ri_prev = *PREV; + ri.ri_u.b.adj = size_adj; + + return __xfs_rmap_add(mp, rlist, &ri); +} diff --git a/fs/xfs/libxfs/xfs_rmap_btree.h b/fs/xfs/libxfs/xfs_rmap_btree.h index d7c9722..599fa3a 100644 --- a/fs/xfs/libxfs/xfs_rmap_btree.h +++ b/fs/xfs/libxfs/xfs_rmap_btree.h @@ -21,6 +21,7 @@ struct xfs_buf; struct xfs_btree_cur; struct xfs_mount; +struct xfs_rmap_list; /* rmaps only exist on crc enabled filesystems */ #define XFS_RMAP_BLOCK_LEN XFS_BTREE_SBLOCK_CRC_LEN @@ -68,4 +69,60 @@ int xfs_rmap_free(struct xfs_trans *tp, struct xfs_buf *agbp, xfs_agnumber_t agno, xfs_agblock_t bno, xfs_extlen_t len, struct xfs_owner_info *oinfo); +/* functions for updating the rmapbt based on bmbt map/unmap operations */ +int xfs_rmap_combine(struct xfs_mount *mp, struct xfs_rmap_list *rlist, + xfs_ino_t ino, int whichfork, struct xfs_bmbt_irec *LEFT, + struct xfs_bmbt_irec *RIGHT, struct xfs_bmbt_irec *PREV); +int xfs_rmap_lcombine(struct xfs_mount *mp, struct xfs_rmap_list *rlist, + xfs_ino_t ino, int whichfork, struct xfs_bmbt_irec *LEFT, + struct xfs_bmbt_irec *PREV); +int xfs_rmap_rcombine(struct xfs_mount *mp, struct xfs_rmap_list *rlist, + xfs_ino_t ino, int whichfork, struct xfs_bmbt_irec *RIGHT, + struct xfs_bmbt_irec *PREV); +int xfs_rmap_insert(struct xfs_mount *mp, struct xfs_rmap_list *rlist, + xfs_ino_t ino, int whichfork, struct xfs_bmbt_irec *rec); +int xfs_rmap_delete(struct xfs_mount *mp, struct xfs_rmap_list *rlist, + xfs_ino_t ino, int whichfork, struct xfs_bmbt_irec *rec); +int xfs_rmap_move(struct xfs_mount *mp, struct xfs_rmap_list *rlist, + xfs_ino_t ino, int whichfork, struct xfs_bmbt_irec *PREV, + long start_adj); +int xfs_rmap_slide(struct xfs_mount *mp, struct xfs_rmap_list *rlist, + xfs_ino_t ino, int whichfork, struct xfs_bmbt_irec *PREV, + long start_adj); +int xfs_rmap_resize(struct xfs_mount *mp, struct xfs_rmap_list *rlist, + xfs_ino_t ino, int whichfork, struct xfs_bmbt_irec *PREV, + long size_adj); + +enum xfs_rmap_intent_type { + XFS_RMAP_COMBINE, + XFS_RMAP_LCOMBINE, + XFS_RMAP_RCOMBINE, + XFS_RMAP_INSERT, + XFS_RMAP_DELETE, + XFS_RMAP_MOVE, + XFS_RMAP_SLIDE, + XFS_RMAP_RESIZE, +}; + +struct xfs_rmap_intent { + struct list_head ri_list; + enum xfs_rmap_intent_type ri_type; + xfs_ino_t ri_ino; + int ri_whichfork; + struct xfs_bmbt_irec ri_prev; + union { + struct { + struct xfs_bmbt_irec left; + struct xfs_bmbt_irec right; + } a; + struct { + long adj; + } b; + } ri_u; +}; + +void xfs_rmap_cancel(struct xfs_rmap_list *rlist); +int xfs_rmap_finish(struct xfs_mount *mp, struct xfs_trans **tpp, + struct xfs_inode *ip, struct xfs_rmap_list *rlist); + #endif /* __XFS_RMAP_BTREE_H__ */ diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 834639d..a9cf94e 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -40,6 +40,7 @@ #include "xfs_trace.h" #include "xfs_icache.h" #include "xfs_log.h" +#include "xfs_rmap_btree.h" /* Kernel only BMAP related definitions and functions */ @@ -109,6 +110,11 @@ xfs_bmap_finish( struct xfs_bmap_free_item *next; /* next item on free list */ ASSERT((*tp)->t_flags & XFS_TRANS_PERM_LOG_RES); + + error = xfs_rmap_finish((*tp)->t_mountp, tp, ip, &flist->xbf_rlist); + if (error) + return error; + if (flist->xbf_count == 0) return 0; -- 2.7.0 From dave@fromorbit.com Mon Mar 7 22:17:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6404E29E45 for ; Mon, 7 Mar 2016 22:17:21 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1A4AA8F8039 for ; Mon, 7 Mar 2016 20:17:21 -0800 (PST) X-ASG-Debug-ID: 1457410638-04bdf002ec2427d0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id jVU7JB4vAEeRKoKE for ; Mon, 07 Mar 2016 20:17:18 -0800 (PST) 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: A2ChCAC/Ud5WPFEqLHlcKAECgw+BP4Zmn30BAgEBAQaRRotQTQEBAQEBAQcBAQEBQUCEQgEFJy8zCBgxOQMHFBmII754hU+NeQWSZ4RDjXCBYYhhhDaFeohcghgBC4I2KC6JfwEBAQ Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl6.internode.on.net with ESMTP; 08 Mar 2016 14:47:03 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ad94T-0004AP-5e for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:33 +1100 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ad94G-0007v6-KF for xfs@oss.sgi.com; Tue, 08 Mar 2016 15:16:20 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 14/16] xfs: remove an extent from the rmap btree Date: Tue, 8 Mar 2016 15:16:16 +1100 X-ASG-Orig-Subj: [PATCH 14/16] xfs: remove an extent from the rmap btree Message-Id: <1457410578-30233-15-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1457410578-30233-1-git-send-email-david@fromorbit.com> References: <1457410578-30233-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1457410638 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27662 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Now that we have records in the rmap btree, we need to remove them when extents are freed. This needs to find the relevant record in the btree and remove/trim/split it accordingly. [darrick.wong@oracle.com: make rmap routines handle the enlarged keyspace] [dchinner: remove remaining unused debug printks] Signed-off-by: Dave Chinner Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_rmap.c | 158 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 156 insertions(+), 2 deletions(-) diff --git a/fs/xfs/libxfs/xfs_rmap.c b/fs/xfs/libxfs/xfs_rmap.c index 56627c1c..d2e01b2 100644 --- a/fs/xfs/libxfs/xfs_rmap.c +++ b/fs/xfs/libxfs/xfs_rmap.c @@ -118,6 +118,24 @@ xfs_rmap_get_rec( return 0; } +/* + * Find the extent in the rmap btree and remove it. + * + * The record we find should always be an exact match for the extent that we're + * looking for, since we insert them into the btree without modification. + * + * Special Case #1: when growing the filesystem, we "free" an extent when + * growing the last AG. This extent is new space and so it is not tracked as + * used space in the btree. The growfs code will pass in an owner of + * XFS_RMAP_OWN_NULL to indicate that it expected that there is no owner of this + * extent. We verify that - the extent lookup result in a record that does not + * overlap. + * + * Special Case #2: EFIs do not record the owner of the extent, so when + * recovering EFIs from the log we pass in XFS_RMAP_OWN_UNKNOWN to tell the rmap + * btree to ignore the owner (i.e. wildcard match) so we don't trigger + * corruption checks during log recovery. + */ int xfs_rmap_free( struct xfs_trans *tp, @@ -128,19 +146,156 @@ xfs_rmap_free( struct xfs_owner_info *oinfo) { struct xfs_mount *mp = tp->t_mountp; + struct xfs_btree_cur *cur; + struct xfs_rmap_irec ltrec; + uint64_t ltoff; int error = 0; + int i; + uint64_t owner; + uint64_t offset; if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) return 0; trace_xfs_rmap_free_extent(mp, agno, bno, len, oinfo); - if (1) + cur = xfs_rmapbt_init_cursor(mp, tp, agbp, agno); + + xfs_owner_info_unpack(oinfo, &owner, &offset); + + /* + * We should always have a left record because there's a static record + * for the AG headers at rm_startblock == 0 created by mkfs/growfs that + * will not ever be removed from the tree. + */ + error = xfs_rmap_lookup_le(cur, bno, len, owner, offset, &i); + if (error) goto out_error; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, out_error); + + error = xfs_rmap_get_rec(cur, <rec, &i); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, out_error); + ltoff = ltrec.rm_offset & ~XFS_RMAP_OFF_BMBT; + + /* + * For growfs, the incoming extent must be beyond the left record we + * just found as it is new space and won't be used by anyone. This is + * just a corruption check as we don't actually do anything with this + * extent. + */ + if (owner == XFS_RMAP_OWN_NULL) { + XFS_WANT_CORRUPTED_GOTO(mp, bno > ltrec.rm_startblock + + ltrec.rm_blockcount, out_error); + goto out_done; + } + + /* make sure the extent we found covers the entire freeing range. */ + XFS_WANT_CORRUPTED_GOTO(mp, !XFS_RMAP_IS_UNWRITTEN(ltrec.rm_blockcount), + out_error); + XFS_WANT_CORRUPTED_GOTO(mp, ltrec.rm_startblock <= bno && + ltrec.rm_startblock + XFS_RMAP_LEN(ltrec.rm_blockcount) >= + bno + len, out_error); + + /* make sure the owner matches what we expect to find in the tree */ + XFS_WANT_CORRUPTED_GOTO(mp, owner == ltrec.rm_owner || + XFS_RMAP_NON_INODE_OWNER(owner), out_error); + + /* check the offset, if necessary */ + if (!XFS_RMAP_NON_INODE_OWNER(owner)) { + if (XFS_RMAP_IS_BMBT(offset)) { + XFS_WANT_CORRUPTED_GOTO(mp, + XFS_RMAP_IS_BMBT(ltrec.rm_offset), + out_error); + } else { + XFS_WANT_CORRUPTED_GOTO(mp, + ltrec.rm_offset <= offset, out_error); + XFS_WANT_CORRUPTED_GOTO(mp, + offset <= ltoff + ltrec.rm_blockcount, + out_error); + } + } + + if (ltrec.rm_startblock == bno && ltrec.rm_blockcount == len) { + /* exact match, simply remove the record from rmap tree */ + error = xfs_btree_delete(cur, &i); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, out_error); + } else if (ltrec.rm_startblock == bno) { + /* + * overlap left hand side of extent: move the start, trim the + * length and update the current record. + * + * ltbno ltlen + * Orig: |oooooooooooooooooooo| + * Freeing: |fffffffff| + * Result: |rrrrrrrrrr| + * bno len + */ + ltrec.rm_startblock += len; + ltrec.rm_blockcount -= len; + error = xfs_rmap_update(cur, <rec); + if (error) + goto out_error; + } else if (ltrec.rm_startblock + ltrec.rm_blockcount == bno + len) { + /* + * overlap right hand side of extent: trim the length and update + * the current record. + * + * ltbno ltlen + * Orig: |oooooooooooooooooooo| + * Freeing: |fffffffff| + * Result: |rrrrrrrrrr| + * bno len + */ + ltrec.rm_blockcount -= len; + error = xfs_rmap_update(cur, <rec); + if (error) + goto out_error; + } else { + + /* + * overlap middle of extent: trim the length of the existing + * record to the length of the new left-extent size, increment + * the insertion position so we can insert a new record + * containing the remaining right-extent space. + * + * ltbno ltlen + * Orig: |oooooooooooooooooooo| + * Freeing: |fffffffff| + * Result: |rrrrr| |rrrr| + * bno len + */ + xfs_extlen_t orig_len = ltrec.rm_blockcount; + + ltrec.rm_blockcount = bno - ltrec.rm_startblock; + error = xfs_rmap_update(cur, <rec); + if (error) + goto out_error; + + error = xfs_btree_increment(cur, 0, &i); + if (error) + goto out_error; + + cur->bc_rec.r.rm_startblock = bno + len; + cur->bc_rec.r.rm_blockcount = orig_len - len - + ltrec.rm_blockcount; + cur->bc_rec.r.rm_owner = ltrec.rm_owner; + cur->bc_rec.r.rm_offset = offset; + error = xfs_btree_insert(cur, &i); + if (error) + goto out_error; + } + +out_done: trace_xfs_rmap_free_extent_done(mp, agno, bno, len, oinfo); + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); return 0; out_error: trace_xfs_rmap_free_extent_error(mp, agno, bno, len, oinfo); + xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); return error; } @@ -262,7 +417,6 @@ xfs_rmap_alloc( ltrec.rm_blockcount += len; if (gtrec.rm_owner == owner && bno + len == gtrec.rm_startblock) { - //printk("add middle\n"); /* * right edge also contiguous, delete right record * and merge into left record. -- 2.7.0 From BATV+3b6fa32ec7aff8d3c3f6+4580+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 8 01:01:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8F3D929E05 for ; Tue, 8 Mar 2016 01:01:58 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0DF5AAC001 for ; Mon, 7 Mar 2016 23:01:54 -0800 (PST) X-ASG-Debug-ID: 1457420511-04cb6c5830212290001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id rnagbEPznKnvMa44 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 07 Mar 2016 23:01:51 -0800 (PST) X-Barracuda-Envelope-From: BATV+3b6fa32ec7aff8d3c3f6+4580+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 1adBeP-0001Tf-LD; Tue, 08 Mar 2016 07:01:49 +0000 Date: Mon, 7 Mar 2016 23:01:49 -0800 From: Christoph Hellwig To: "Darrick J. Wong" Cc: Christoph Hellwig , Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 2/6] xfs: ioends require logically contiguous file offsets Message-ID: <20160308070149.GA30440@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/6] xfs: ioends require logically contiguous file offsets References: <1457300990-18300-1-git-send-email-david@fromorbit.com> <1457300990-18300-3-git-send-email-david@fromorbit.com> <20160307162644.GB19784@infradead.org> <20160308023311.GB27689@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160308023311.GB27689@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457420511 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27665 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Thanks Darrick, the explanation looks fine to me. I suspect it's still only really needed for COW, but together with my earlier direct I/O changes it makes the ioend rules sensible in general, so I'm all for it! From BATV+3b6fa32ec7aff8d3c3f6+4580+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 8 01:02:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DA8DD29E05 for ; Tue, 8 Mar 2016 01:02:13 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A978D8F8035 for ; Mon, 7 Mar 2016 23:02:10 -0800 (PST) X-ASG-Debug-ID: 1457420528-04cb6c58322122c0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id DjLp6OKqAzYccRTA (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 07 Mar 2016 23:02:09 -0800 (PST) X-Barracuda-Envelope-From: BATV+3b6fa32ec7aff8d3c3f6+4580+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 1adBei-0001jS-LD; Tue, 08 Mar 2016 07:02:08 +0000 Date: Mon, 7 Mar 2016 23:02:08 -0800 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 6/6] xfs: pad xfs_attr_leaf_name_remote to avoid tripping on m68k Message-ID: <20160308070208.GB30440@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 6/6] xfs: pad xfs_attr_leaf_name_remote to avoid tripping on m68k References: <1457300990-18300-1-git-send-email-david@fromorbit.com> <1457300990-18300-7-git-send-email-david@fromorbit.com> <20160307162858.GE19784@infradead.org> <20160308035648.GV30721@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160308035648.GV30721@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457420529 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27665 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Mar 08, 2016 at 02:56:48PM +1100, Dave Chinner wrote: > > I think using a small fixed size array as a variable sized array > > is not a good idea, especially with increasinly "smart" optimizing > > compilers. I'd rather take this structure out the size checking, > > and then move it to a C99 VLA instead of the size 1 hack in the long > > run. > > I don't have the time right now to do this, so I'm just going to > drop it - I'd guess the overlap between m68k and XFS users is so > close to zero that it just doesn't matter. I'll just drop this > patch for now. I'll send you a patch for it. From BATV+3b6fa32ec7aff8d3c3f6+4580+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 8 01:57:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3CD907CA0 for ; Tue, 8 Mar 2016 01:57:07 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B19F9AC002 for ; Mon, 7 Mar 2016 23:57:03 -0800 (PST) X-ASG-Debug-ID: 1457423821-04bdf002ed246dd0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id EPrgimsIyGYXdgcC (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 07 Mar 2016 23:57:02 -0800 (PST) X-Barracuda-Envelope-From: BATV+3b6fa32ec7aff8d3c3f6+4580+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 1adCVp-0008FX-5D; Tue, 08 Mar 2016 07:57:01 +0000 Date: Mon, 7 Mar 2016 23:57:01 -0800 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [NOPATCH v5]: XFS reverse-mapping, reflink, and dedupe support Message-ID: <20160308075701.GA24365@infradead.org> X-ASG-Orig-Subj: Re: [NOPATCH v5]: XFS reverse-mapping, reflink, and dedupe support References: <20160305011530.GG27973@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160305011530.GG27973@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457423822 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27666 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, Mar 04, 2016 at 05:15:30PM -0800, Darrick J. Wong wrote: > Soooo... stuff I'm hoping to get upstream for 4.6: > https://github.com/djwong/linux/tree/for-dave-for-4.6 > https://github.com/djwong/xfsprogs/tree/for-dave-for-4.6 > > Stuff I hope to get upstream: > https://github.com/djwong/xfs-documentation/tree/reflink-devel > https://github.com/djwong/xfstests/tree/reflink-dev > > Development branch, not for upstream: > https://github.com/djwong/linux/tree/rmap-reflink-devel > https://github.com/djwong/xfsprogs/tree/rmap-reflink-devel I've been testing or-dave-for-4.6 + the increased log reservation for rmap-reflink-devel for a couple days now and it's doing fine both on XFS itself, as well as NFS over XFS so far. Great work! From sales@marketing.powerpc.gr Tue Mar 8 09:48:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.3 required=5.0 tests=HTML_IMAGE_ONLY_28, 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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0E3BD7CA0 for ; Tue, 8 Mar 2016 09:48:09 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id AA14F30404E for ; Tue, 8 Mar 2016 07:48:08 -0800 (PST) X-ASG-Debug-ID: 1457452082-04bdf002ee25aa00001-NocioJ Received: from cpanel.mailpowerpc.gr (mail.marketing.powerpc.gr [5.172.194.87]) by cuda.sgi.com with ESMTP id lRMjobwssk3avVfU (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 08 Mar 2016 07:48:04 -0800 (PST) X-Barracuda-Envelope-From: sales@marketing.powerpc.gr X-Barracuda-Apparent-Source-IP: 5.172.194.87 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=marketing.powerpc.gr; s=default; h=Content-Type:MIME-Version:List-Owner: List-Subscribe:List-Unsubscribe:List-Help:Message-ID:From:Date:Subject:To; bh=bdl2TO70MPPQf93vs4q++ef/EEVvYZf2YVjrnUpYTkk=; b=dnxeYnfgkW7ZRGZCVknM4sgTM mcQDD3XDhFXOk+SV6bikFqqhU32n5iW9ayVak2j/J1fQXPDocIV3O305HTWlKuw5gl7aHB3ePK4L/ smwhhOt2V2ureIAyMBhnBmWRvHoBRlce1pIh2shkn2/m9FjKkrebgfXV2v5bTtLx2VYKZ6zW9/fY6 zcai26WTLKWM5u5XTiOjAnQubVLcLcbu91oCF4x3iygg8JgCZ4F1apiOg/CgBKSBZCBe6LS9DOZtp N1RELNo7vvL/TK4F+XXBSZYryno1EC4NKpqa4dp72IX0ooxWxlHFZd+rkzvE5EtqE5Wuay4FEq+o2 Ct05Zrpsg==; Received: from root by cpanel.mailpowerpc.gr with local (Exim 4.86_1) (envelope-from ) id 1adJrb-0005Ox-Gk for xfs@oss.sgi.com; Tue, 08 Mar 2016 17:47:59 +0200 To: xfs@oss.sgi.com Subject: =?UTF-8?B?zp/OmSDOms6RzpvOpc6kzpXOoc6VzqMgzqTOmc6czpXOoyDOpM6XzqMgzpHO?= =?UTF-8?B?k86fzqHOkc6jIM6jzpUgTEFQVE9QIFRBQkxFVCDOms6Zzp3Ol86kzpEgzpHO?= =?UTF-8?B?ms6fzqXOo86kzpnOms6R?= Date: Tue, 8 Mar 2016 09:47:59 -0600 X-ASG-Orig-Subj: =?UTF-8?B?zp/OmSDOms6RzpvOpc6kzpXOoc6VzqMgzqTOmc6czpXOoyDOpM6XzqMgzpHO?= =?UTF-8?B?k86fzqHOkc6jIM6jzpUgTEFQVE9QIFRBQkxFVCDOms6Zzp3Ol86kzpEgzpHO?= =?UTF-8?B?ms6fzqXOo86kzpnOms6R?= From: PowerPC Message-ID: <409588986b4d22d3bf68fbcc2d8d8fa4@marketing.powerpc.gr> X-Mailer: PHPMailer 5.2.14 (https://github.com/PHPMailer/PHPMailer) X-phpList-version: 3.2.4 X-MessageID: 6 X-ListMember: xfs@oss.sgi.com Precedence: bulk Bounces-To: sales@marketing.powerpc.gr List-Help: List-Unsubscribe: List-Subscribe: List-Owner: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_409588986b4d22d3bf68fbcc2d8d8fa4" X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - cpanel.mailpowerpc.gr X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [0 0] / [47 12] X-AntiAbuse: Sender Address Domain - marketing.powerpc.gr X-Get-Message-Sender-Via: cpanel.mailpowerpc.gr: sender_ident via received_protocol == local: root/only user confirmed/virtual account not confirmed X-Authenticated-Sender: cpanel.mailpowerpc.gr: root X-Source: /usr/bin/php X-Source-Args: /usr/bin/php /home/powerpc/public_html/marketing/lists/admin/index.php -pprocessqueue -c/home/powerpc/public_html/marketing/lists/config/config.php X-Source-Dir: powerpc.gr:/public_html/marketing/lists/admin X-Barracuda-Connect: mail.marketing.powerpc.gr[5.172.194.87] X-Barracuda-Start-Time: 1457452083 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.43 X-Barracuda-Spam-Status: No, SCORE=2.43 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA038b, BSF_SC0_SA347, DKIM_SIGNED, HTML_IMAGE_ONLY_28, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27673 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 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.20 BSF_SC0_SA038b Custom Rule SA038b 1.50 BSF_SC0_SA347 Custom Rule SA347 This is a multi-part message in MIME format. --b1_409588986b4d22d3bf68fbcc2d8d8fa4 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable =CE=93=CE=B9=CE=B1 =CE=BD=CE=B1 =CE=B4=CE=B9=CE=B1=CE=B3=CF=81=CE=B1=CF= =86=CE=B5=CE=AF=CF=84=CE=B5 =CE=B1=CF=80=CF=8C =CF=84=CE=B7=CE=BD =CE=BB= =CE=AF=CF=83=CF=84=CE=B1 =CE=B1=CE=BB=CE=BB=CE=B7=CE=BB=CE=BF=CE=B3=CF=81=CE=B1=CF=86=CE=AF=CE=B1= =CF=82, =CE=BA=CE=AC=CE=BD=CF=84=CE=B5 =CE=BA=CE=BB=CE=B9=CE=BA =CE=B5= =CE=B4=CF=8E=0A<[http://marketing.powerpc.gr/lists/lt.php?id=3DZkgBGFIYB1ZU= VwQO> [[tracking_beacon]] -- This message was sent to xfs@oss.sgi.com by sales@marketing.powerpc.gr 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 -- powered by phpList, www.phplist.com -- --b1_409588986b4d22d3bf68fbcc2d8d8fa4 Content-Type: multipart/related; boundary="b2_409588986b4d22d3bf68fbcc2d8d8fa4" --b2_409588986b4d22d3bf68fbcc2d8d8fa4 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable =0A =0A =09 =09=09 =09=09=09 =09=09 =09=09 =09=09=09 =09=09 =09
=09=09=09
 
=09=09=09  =09=09=09
Για να διαγρ&al= pha;φε=CE=AFτε απ=CF=8C την &la= mbda;=CE=AFστα αλληλ&omicron= ;γραφ=CE=AFας, κ=CE=ACντ&epsi= lon; Uns= ubscribe]" title=3D"One click unsubscribe">κλικ εδ=CF=8E
=09=09=09

[[tracking_beacon]]

=09=09=09

-- =20

This message was sent to xfs@oss.sgi.com by sales@marketing.powerp= c.gr

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.

=0A

3D"powered

3D"" --b2_409588986b4d22d3bf68fbcc2d8d8fa4 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_409588986b4d22d3bf68fbcc2d8d8fa4-- --b1_409588986b4d22d3bf68fbcc2d8d8fa4-- From BATV+3b6fa32ec7aff8d3c3f6+4580+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 8 11:18:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 16FF27CA0 for ; Tue, 8 Mar 2016 11:18:19 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CCBA4304032 for ; Tue, 8 Mar 2016 09:18:15 -0800 (PST) X-ASG-Debug-ID: 1457457491-04cbb00b71282090001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 440jeo0K2klSMkMB (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 08 Mar 2016 09:18:12 -0800 (PST) X-Barracuda-Envelope-From: BATV+3b6fa32ec7aff8d3c3f6+4580+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 1adLGt-0007Kr-Jr; Tue, 08 Mar 2016 17:18:11 +0000 Date: Tue, 8 Mar 2016 09:18:11 -0800 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 04/16] libxfs: rearrange xfs_bmap_add_free parameters Message-ID: <20160308171811.GA26418@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 04/16] libxfs: rearrange xfs_bmap_add_free parameters References: <1457410578-30233-1-git-send-email-david@fromorbit.com> <1457410578-30233-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1457410578-30233-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457457492 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/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=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27675 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+3b6fa32ec7aff8d3c3f6+4580+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 8 11:34:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 97BCC7CA0 for ; Tue, 8 Mar 2016 11:34:52 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 19F12AC002 for ; Tue, 8 Mar 2016 09:34:49 -0800 (PST) X-ASG-Debug-ID: 1457458484-04bdf002eb263680001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id fI8T4cnVv3onImjf (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 08 Mar 2016 09:34:44 -0800 (PST) X-Barracuda-Envelope-From: BATV+3b6fa32ec7aff8d3c3f6+4580+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 1adLWt-00073z-Jl; Tue, 08 Mar 2016 17:34:43 +0000 Date: Tue, 8 Mar 2016 09:34:43 -0800 From: Christoph Hellwig To: Dave Chinner , darrick.wong@oracle.com Cc: xfs@oss.sgi.com Subject: Re: [PATCH 6/6] xfs: pad xfs_attr_leaf_name_remote to avoid tripping on m68k Message-ID: <20160308173443.GA21965@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 6/6] xfs: pad xfs_attr_leaf_name_remote to avoid tripping on m68k References: <1457300990-18300-1-git-send-email-david@fromorbit.com> <1457300990-18300-7-git-send-email-david@fromorbit.com> <20160307162858.GE19784@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160307162858.GE19784@infradead.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457458484 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27675 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS So I looked into this, and it seems we really don't care about the size - xfs_attr_leaf_entsize_remote pad it to the next multiple of 4 anyway. So I think we really should simply remove the size check here. Assuming all architectures pad up a structure that isn't word aligned the same way just isn't a sensible assumption. From david@fromorbit.com Tue Mar 8 15:28:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 02B0F29E05 for ; Tue, 8 Mar 2016 15:28:57 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6E461AC004 for ; Tue, 8 Mar 2016 13:28:53 -0800 (PST) X-ASG-Debug-ID: 1457472529-04cbb00b702943f0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id tmrBGHAJl1FWMR8C for ; Tue, 08 Mar 2016 13:28:49 -0800 (PST) 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: A2DMFQArQ99WPFEqLHldKAECgw8iMG2CbYN5n20CHAaBD4pvhUqEChcChXAEgUpNAQEBAQEBBwEBAQFBQEEBBA2ESzskNAUlAwctiCOfU58aCBiFN4oQgXwLQIEnBYdbix+EMIVjiAGPAwKOVoIYCwEBAYI0KC6GVIECgikBAQE Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl6.internode.on.net with ESMTP; 09 Mar 2016 07:58:48 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1adPBP-0006Hk-D6 for xfs@oss.sgi.com; Wed, 09 Mar 2016 08:28:47 +1100 Date: Wed, 9 Mar 2016 08:28:47 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfs: for-next branch updated to ab9d1e4 Message-ID: <20160308212847.GW30721@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfs: for-next branch updated to ab9d1e4 MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="u65IjBhB3TIa72Vp" 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: 1457472529 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.20 X-Barracuda-Spam-Status: No, SCORE=0.20 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27680 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) --u65IjBhB3TIa72Vp Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The for-next branch of the xfs kernel repository at git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git has just been updated. The new head of the for-next branch is commit: ab9d1e4 Merge branch 'xfs-misc-fixes-4.6-3' into for-next New Commits: Darrick J. Wong (3): [49ca911] xfs: fix computation of inode btree maxlevels [5110cd8] xfs: use named array initializers for log item dumping [30cbc59] xfs: check sizes of XFS on-disk structures at compile time Dave Chinner (2): [a798011] xfs: reinitialise per-AG structures if geometry changes dur= ing recovery [ab9d1e4] Merge branch 'xfs-misc-fixes-4.6-3' into for-next Luis de Bethencourt (1): [a5fd276] xfs: remove impossible condition Code Diffstat: fs/xfs/libxfs/xfs_bmap.c | 5 +- fs/xfs/libxfs/xfs_ialloc.c | 4 +- fs/xfs/xfs_log.c | 132 ++++++++++++++++++++++++-----------------= ------ fs/xfs/xfs_log_recover.c | 22 ++++---- fs/xfs/xfs_ondisk.h | 117 +++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_super.c | 3 ++ 6 files changed, 204 insertions(+), 79 deletions(-) create mode 100644 fs/xfs/xfs_ondisk.h --=20 Dave Chinner david@fromorbit.com --u65IjBhB3TIa72Vp Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJW30QOAAoJEK3oKUf0dfod5D0QAJzURbu6zN/k5MgCUNeVD8CV OXuKsmxq06FvPM7KEqS/snOfmmGX0TfwAiwe8wPwPaxwlFhAnYy+bVJKJ7B13oKb dEX7D47xrjxwfbXeJwmaKWETYeQ5Xf/4SAiqyDsvCGb9k3KboPnnboO8oEqk6CX9 XJH8BM/jOdAXZ+SdsYS+wIQM8xJjxSJ4PxKyaVfeGgKpaGcpz/NiUuLqRF++ZoUZ cPwMZbgpuA/QxCb6tjCc9JOWmfFJYls73vaYqyaByaSLiv6qbZq9KOKjjYcNgilE oLdnwkyGANzXEuo4OX5rXgTbtpX+xPFTqAXJaLCfgMjgTYF2/XDdqw67eP+pCfBi l7hMk47d0GPdb/Rg2WTQWK5iL6pxt705e/jY18988b+RLCBtBtvZTdQoPupZQ1f8 qYTCrtl3kwGzEPgb6sWZV2sIfK9IyL4YZ3bNJL/tSFOPEwRwfWc+hYpPPktJpZYA eonbRXwjb8C1mplRsu9096V0e9J7km3S/HuRYrswI2CF7O3e5j/CKXudjCY1PlR0 KQ64UDtXQ77n7/aS/InugjOKMrUkjwXbhyL2fgARo/BGpxFvmod+TFUHyEBkm74I H2/+XbcNea4wTBbywcUbYfv2hbaM7+lwS3F47X8LcIbgtu7YD724ds92as7ZFMyQ ZUXn37M0cBDT3X1hIXJY =rsfB -----END PGP SIGNATURE----- --u65IjBhB3TIa72Vp-- From fengguang.wu@intel.com Tue Mar 8 17:01:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0E29D29E05 for ; Tue, 8 Mar 2016 17:01:05 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id CD2978F8040 for ; Tue, 8 Mar 2016 15:01:01 -0800 (PST) X-ASG-Debug-ID: 1457478060-04cb6c5830249850001-NocioJ Received: from mga14.intel.com ([192.55.52.115]) by cuda.sgi.com with ESMTP id 3T3BBLXI5s1XBnkC for ; Tue, 08 Mar 2016 15:01:00 -0800 (PST) X-Barracuda-Envelope-From: fengguang.wu@intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.115 X-ASG-Whitelist: Client Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga103.fm.intel.com with ESMTP; 08 Mar 2016 15:01:00 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.22,558,1449561600"; d="gz'50?scan'50,208,50";a="666102340" Received: from bee.sh.intel.com (HELO bee) ([10.239.97.14]) by FMSMGA003.fm.intel.com with ESMTP; 08 Mar 2016 15:00:57 -0800 Received: from kbuild by bee with local (Exim 4.83) (envelope-from ) id 1adQca-0006yx-8n; Wed, 09 Mar 2016 07:00:56 +0800 Date: Wed, 9 Mar 2016 07:00:02 +0800 From: kbuild test robot To: Dave Chinner Cc: kbuild-all@01.org, xfs@oss.sgi.com Subject: [xfs:for-next 12/12] fs/xfs/xfs_ondisk.h:79:2: error: call to '__compiletime_assert_79' declared with attribute error: XFS: sizeof(xfs_attr_shortform_t) is wrong, expected 8 Message-ID: <201603090700.OClw3lhw%fengguang.wu@intel.com> X-ASG-Orig-Subj: [xfs:for-next 12/12] fs/xfs/xfs_ondisk.h:79:2: error: call to '__compiletime_assert_79' declared with attribute error: XFS: sizeof(xfs_attr_shortform_t) is wrong, expected 8 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="zhXaljGHf11kAtnf" Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: fengguang.wu@intel.com X-SA-Exim-Scanned: No (on bee); SAEximRunCond expanded to false X-Barracuda-Connect: UNKNOWN[192.55.52.115] X-Barracuda-Start-Time: 1457478060 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 --zhXaljGHf11kAtnf Content-Type: text/plain; charset=us-ascii Content-Disposition: inline tree: https://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git for-next head: ab9d1e4f7b0217948a3b35a64178602ab30ff45d commit: ab9d1e4f7b0217948a3b35a64178602ab30ff45d [12/12] Merge branch 'xfs-misc-fixes-4.6-3' into for-next config: cris-allyesconfig (attached as .config) reproduce: wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross git checkout ab9d1e4f7b0217948a3b35a64178602ab30ff45d # save the attached .config to linux build tree make.cross ARCH=cris All errors (new ones prefixed by >>): In file included from fs/xfs/xfs_super.c:48:0: In function 'xfs_check_ondisk_structs', inlined from 'init_xfs_fs' at fs/xfs/xfs_super.c:1862:26: >> fs/xfs/xfs_ondisk.h:79:2: error: call to '__compiletime_assert_79' declared with attribute error: XFS: sizeof(xfs_attr_shortform_t) is wrong, expected 8 vim +/__compiletime_assert_79 +79 fs/xfs/xfs_ondisk.h 30cbc591c Darrick J. Wong 2016-03-09 73 * definitions are updated to use c99 VLA definitions. 30cbc591c Darrick J. Wong 2016-03-09 74 * 30cbc591c Darrick J. Wong 2016-03-09 75 XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_name_remote_t, 12); 30cbc591c Darrick J. Wong 2016-03-09 76 */ 30cbc591c Darrick J. Wong 2016-03-09 77 30cbc591c Darrick J. Wong 2016-03-09 78 XFS_CHECK_STRUCT_SIZE(xfs_attr_leafblock_t, 40); 30cbc591c Darrick J. Wong 2016-03-09 @79 XFS_CHECK_STRUCT_SIZE(xfs_attr_shortform_t, 8); 30cbc591c Darrick J. Wong 2016-03-09 80 XFS_CHECK_STRUCT_SIZE(xfs_da_blkinfo_t, 12); 30cbc591c Darrick J. Wong 2016-03-09 81 XFS_CHECK_STRUCT_SIZE(xfs_da_intnode_t, 16); 30cbc591c Darrick J. Wong 2016-03-09 82 XFS_CHECK_STRUCT_SIZE(xfs_da_node_entry_t, 8); :::::: The code at line 79 was first introduced by commit :::::: 30cbc591c34e680e8b5d6d675ea49effe42a0570 xfs: check sizes of XFS on-disk structures at compile time :::::: TO: Darrick J. Wong :::::: CC: Dave Chinner --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation --zhXaljGHf11kAtnf Content-Type: application/octet-stream Content-Disposition: attachment; filename=".config.gz" Content-Transfer-Encoding: base64 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 --zhXaljGHf11kAtnf-- From fengguang.wu@intel.com Tue Mar 8 17:13:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6AEEB29E05 for ; Tue, 8 Mar 2016 17:13:51 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 993BDAC006 for ; Tue, 8 Mar 2016 15:13:50 -0800 (PST) X-ASG-Debug-ID: 1457478828-04cb6c5832249cc0001-NocioJ Received: from mga01.intel.com ([192.55.52.88]) by cuda.sgi.com with ESMTP id OS7zHyshNqAUq363 for ; Tue, 08 Mar 2016 15:13:48 -0800 (PST) X-Barracuda-Envelope-From: fengguang.wu@intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.88 X-ASG-Whitelist: Client Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga101.fm.intel.com with ESMTP; 08 Mar 2016 15:13:28 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.22,558,1449561600"; d="gz'50?scan'50,208,50";a="666107996" Received: from bee.sh.intel.com (HELO bee) ([10.239.97.14]) by FMSMGA003.fm.intel.com with ESMTP; 08 Mar 2016 15:13:27 -0800 Received: from kbuild by bee with local (Exim 4.83) (envelope-from ) id 1adQog-000RFZ-IL; Wed, 09 Mar 2016 07:13:26 +0800 Date: Wed, 9 Mar 2016 07:12:30 +0800 From: kbuild test robot To: "Darrick J. Wong" Cc: kbuild-all@01.org, xfs@oss.sgi.com, Dave Chinner , Brian Foster Subject: [xfs:xfs-misc-fixes-4.6-3 10/11] fs/xfs/xfs_ondisk.h:79:24: error: 'xfs_attr_shortform_t' undeclared Message-ID: <201603090728.QORoqfO3%fengguang.wu@intel.com> X-ASG-Orig-Subj: [xfs:xfs-misc-fixes-4.6-3 10/11] fs/xfs/xfs_ondisk.h:79:24: error: 'xfs_attr_shortform_t' undeclared MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="xHFwDpU9dbj6ez1V" Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: fengguang.wu@intel.com X-SA-Exim-Scanned: No (on bee); SAEximRunCond expanded to false X-Barracuda-Connect: UNKNOWN[192.55.52.88] X-Barracuda-Start-Time: 1457478828 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 --xHFwDpU9dbj6ez1V Content-Type: text/plain; charset=us-ascii Content-Disposition: inline tree: https://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git xfs-misc-fixes-4.6-3 head: a5fd276bdc4fb71b06d100a6abc77ad682f77de4 commit: 30cbc591c34e680e8b5d6d675ea49effe42a0570 [10/11] xfs: check sizes of XFS on-disk structures at compile time config: sparc64-allmodconfig (attached as .config) reproduce: wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross git checkout 30cbc591c34e680e8b5d6d675ea49effe42a0570 # save the attached .config to linux build tree make.cross ARCH=sparc64 All errors (new ones prefixed by >>): In file included from include/uapi/linux/stddef.h:1:0, from include/linux/stddef.h:4, from include/uapi/linux/posix_types.h:4, from include/uapi/linux/types.h:13, from include/linux/types.h:5, from fs/xfs/xfs_linux.h:21, from fs/xfs/xfs.h:32, from fs/xfs/xfs_super.c:19: fs/xfs/xfs_ondisk.h: In function 'xfs_check_ondisk_structs': >> fs/xfs/xfs_ondisk.h:79:24: error: 'xfs_attr_shortform_t' undeclared (first use in this function) XFS_CHECK_STRUCT_SIZE(xfs_attr_shortform_t, 8); ^ include/linux/compiler.h:481:19: note: in definition of macro '__compiletime_assert' bool __cond = !(condition); \ ^ include/linux/compiler.h:501:2: note: in expansion of macro '_compiletime_assert' _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__) ^ include/linux/bug.h:50:37: note: in expansion of macro 'compiletime_assert' #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) ^ fs/xfs/xfs_ondisk.h:22:2: note: in expansion of macro 'BUILD_BUG_ON_MSG' BUILD_BUG_ON_MSG(sizeof(structname) != (size), "XFS: sizeof(" \ ^ fs/xfs/xfs_ondisk.h:79:2: note: in expansion of macro 'XFS_CHECK_STRUCT_SIZE' XFS_CHECK_STRUCT_SIZE(xfs_attr_shortform_t, 8); ^ fs/xfs/xfs_ondisk.h:79:24: note: each undeclared identifier is reported only once for each function it appears in XFS_CHECK_STRUCT_SIZE(xfs_attr_shortform_t, 8); ^ include/linux/compiler.h:481:19: note: in definition of macro '__compiletime_assert' bool __cond = !(condition); \ ^ include/linux/compiler.h:501:2: note: in expansion of macro '_compiletime_assert' _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__) ^ include/linux/bug.h:50:37: note: in expansion of macro 'compiletime_assert' #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) ^ fs/xfs/xfs_ondisk.h:22:2: note: in expansion of macro 'BUILD_BUG_ON_MSG' BUILD_BUG_ON_MSG(sizeof(structname) != (size), "XFS: sizeof(" \ ^ fs/xfs/xfs_ondisk.h:79:2: note: in expansion of macro 'XFS_CHECK_STRUCT_SIZE' XFS_CHECK_STRUCT_SIZE(xfs_attr_shortform_t, 8); ^ >> fs/xfs/xfs_ondisk.h:108:24: error: invalid application of 'sizeof' to incomplete type 'struct xfs_log_dinode' XFS_CHECK_STRUCT_SIZE(struct xfs_log_dinode, 176); ^ include/linux/compiler.h:481:19: note: in definition of macro '__compiletime_assert' bool __cond = !(condition); \ ^ include/linux/compiler.h:501:2: note: in expansion of macro '_compiletime_assert' _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__) ^ include/linux/bug.h:50:37: note: in expansion of macro 'compiletime_assert' #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) ^ fs/xfs/xfs_ondisk.h:22:2: note: in expansion of macro 'BUILD_BUG_ON_MSG' BUILD_BUG_ON_MSG(sizeof(structname) != (size), "XFS: sizeof(" \ ^ fs/xfs/xfs_ondisk.h:108:2: note: in expansion of macro 'XFS_CHECK_STRUCT_SIZE' XFS_CHECK_STRUCT_SIZE(struct xfs_log_dinode, 176); ^ vim +/xfs_attr_shortform_t +79 fs/xfs/xfs_ondisk.h 16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18 #ifndef __XFS_ONDISK_H 19 #define __XFS_ONDISK_H 20 21 #define XFS_CHECK_STRUCT_SIZE(structname, size) \ > 22 BUILD_BUG_ON_MSG(sizeof(structname) != (size), "XFS: sizeof(" \ 23 #structname ") is wrong, expected " #size) 24 25 static inline void __init 26 xfs_check_ondisk_structs(void) 27 { 28 /* ag/file structures */ 29 XFS_CHECK_STRUCT_SIZE(struct xfs_acl, 4); 30 XFS_CHECK_STRUCT_SIZE(struct xfs_acl_entry, 12); 31 XFS_CHECK_STRUCT_SIZE(struct xfs_agf, 224); 32 XFS_CHECK_STRUCT_SIZE(struct xfs_agfl, 36); 33 XFS_CHECK_STRUCT_SIZE(struct xfs_agi, 336); 34 XFS_CHECK_STRUCT_SIZE(struct xfs_bmbt_key, 8); 35 XFS_CHECK_STRUCT_SIZE(struct xfs_bmbt_rec, 16); 36 XFS_CHECK_STRUCT_SIZE(struct xfs_bmdr_block, 4); 37 XFS_CHECK_STRUCT_SIZE(struct xfs_btree_block, 72); 38 XFS_CHECK_STRUCT_SIZE(struct xfs_dinode, 176); 39 XFS_CHECK_STRUCT_SIZE(struct xfs_disk_dquot, 104); 40 XFS_CHECK_STRUCT_SIZE(struct xfs_dqblk, 136); 41 XFS_CHECK_STRUCT_SIZE(struct xfs_dsb, 264); 42 XFS_CHECK_STRUCT_SIZE(struct xfs_dsymlink_hdr, 56); 43 XFS_CHECK_STRUCT_SIZE(struct xfs_inobt_key, 4); 44 XFS_CHECK_STRUCT_SIZE(struct xfs_inobt_rec, 16); 45 XFS_CHECK_STRUCT_SIZE(struct xfs_timestamp, 8); 46 XFS_CHECK_STRUCT_SIZE(xfs_alloc_key_t, 8); 47 XFS_CHECK_STRUCT_SIZE(xfs_alloc_ptr_t, 4); 48 XFS_CHECK_STRUCT_SIZE(xfs_alloc_rec_t, 8); 49 XFS_CHECK_STRUCT_SIZE(xfs_inobt_ptr_t, 4); 50 51 /* dir/attr trees */ 52 XFS_CHECK_STRUCT_SIZE(struct xfs_attr3_leaf_hdr, 80); 53 XFS_CHECK_STRUCT_SIZE(struct xfs_attr3_leafblock, 88); 54 XFS_CHECK_STRUCT_SIZE(struct xfs_attr3_rmt_hdr, 56); 55 XFS_CHECK_STRUCT_SIZE(struct xfs_da3_blkinfo, 56); 56 XFS_CHECK_STRUCT_SIZE(struct xfs_da3_intnode, 64); 57 XFS_CHECK_STRUCT_SIZE(struct xfs_da3_node_hdr, 64); 58 XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_blk_hdr, 48); 59 XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_data_hdr, 64); 60 XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_free, 64); 61 XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_free_hdr, 64); 62 XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_leaf, 64); 63 XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_leaf_hdr, 64); 64 XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_entry_t, 8); 65 XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_hdr_t, 32); 66 XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_map_t, 4); 67 XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_name_local_t, 4); 68 69 /* 70 * m68k has problems with xfs_attr_leaf_name_remote_t, but we pad it to 71 * 4 bytes anyway so it's not obviously a problem. Hence for the moment 72 * we don't check this structure. This can be re-instated when the attr 73 * definitions are updated to use c99 VLA definitions. 74 * 75 XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_name_remote_t, 12); 76 */ 77 78 XFS_CHECK_STRUCT_SIZE(xfs_attr_leafblock_t, 40); > 79 XFS_CHECK_STRUCT_SIZE(xfs_attr_shortform_t, 8); 80 XFS_CHECK_STRUCT_SIZE(xfs_da_blkinfo_t, 12); 81 XFS_CHECK_STRUCT_SIZE(xfs_da_intnode_t, 16); 82 XFS_CHECK_STRUCT_SIZE(xfs_da_node_entry_t, 8); 83 XFS_CHECK_STRUCT_SIZE(xfs_da_node_hdr_t, 16); 84 XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_free_t, 4); 85 XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_hdr_t, 16); 86 XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_unused_t, 6); 87 XFS_CHECK_STRUCT_SIZE(xfs_dir2_free_hdr_t, 16); 88 XFS_CHECK_STRUCT_SIZE(xfs_dir2_free_t, 16); 89 XFS_CHECK_STRUCT_SIZE(xfs_dir2_ino4_t, 4); 90 XFS_CHECK_STRUCT_SIZE(xfs_dir2_ino8_t, 8); 91 XFS_CHECK_STRUCT_SIZE(xfs_dir2_inou_t, 8); 92 XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_entry_t, 8); 93 XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_hdr_t, 16); 94 XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_t, 16); 95 XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_tail_t, 4); 96 XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_entry_t, 3); 97 XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_hdr_t, 10); 98 XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_off_t, 2); 99 100 /* log structures */ 101 XFS_CHECK_STRUCT_SIZE(struct xfs_dq_logformat, 24); 102 XFS_CHECK_STRUCT_SIZE(struct xfs_efd_log_format_32, 28); 103 XFS_CHECK_STRUCT_SIZE(struct xfs_efd_log_format_64, 32); 104 XFS_CHECK_STRUCT_SIZE(struct xfs_efi_log_format_32, 28); 105 XFS_CHECK_STRUCT_SIZE(struct xfs_efi_log_format_64, 32); 106 XFS_CHECK_STRUCT_SIZE(struct xfs_extent_32, 12); 107 XFS_CHECK_STRUCT_SIZE(struct xfs_extent_64, 16); > 108 XFS_CHECK_STRUCT_SIZE(struct xfs_log_dinode, 176); 109 XFS_CHECK_STRUCT_SIZE(struct xfs_icreate_log, 28); 110 XFS_CHECK_STRUCT_SIZE(struct xfs_ictimestamp, 8); 111 XFS_CHECK_STRUCT_SIZE(struct xfs_inode_log_format_32, 52); --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation --xHFwDpU9dbj6ez1V Content-Type: application/octet-stream Content-Disposition: attachment; filename=".config.gz" Content-Transfer-Encoding: base64 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 --xHFwDpU9dbj6ez1V-- From weber@zbfmail.de Wed Mar 9 04:35:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 96A8D7CA0 for ; Wed, 9 Mar 2016 04:35:44 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 17311AC006 for ; Wed, 9 Mar 2016 02:35:40 -0800 (PST) X-ASG-Debug-ID: 1457519736-04bdf002ed28e170001-NocioJ Received: from mail.zbfmail.de (mail.zbfmail.de [176.9.84.12]) by cuda.sgi.com with ESMTP id I5B4UwcsxvWW69Yv (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 09 Mar 2016 02:35:37 -0800 (PST) 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 338A610C0BB for ; Wed, 9 Mar 2016 11:35:36 +0100 (CET) DKIM-Filter: OpenDKIM Filter v2.10.3 mail.zbfmail.de 338A610C0BB DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zbfmail.de; s=dkim; t=1457519736; bh=4s0jbo35B3Klf0XqqGkp+VvjKo9IlIDQW1g/q59kkrQ=; h=Date:From:To:Subject:Reply-To; b=k9d8kMgdHpXG6T8t/2VrwAoq60fX4AP10J8EYPZOKyPB0TVL1mkF8ddAS0UGEK5ln XFJeDpINvBYz/gJADs1x6YxOB4B8aVsWUfEPe2NBZH84DmstHeE6BMDbArUC4CyQiK SnYjcpBzz/PGmntlxPue1FyyiqxNxk2Oe8GANcew= MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit Date: Wed, 09 Mar 2016 11:35:36 +0100 From: Marko Weber | 8000 To: Xfs Subject: an mount option question and dunno if right here... Organization: zbf mail X-ASG-Orig-Subj: an mount option question and dunno if right here... Reply-To: weber@zbfmail.de Mail-Reply-To: weber@zbfmail.de Message-ID: <08297acdf77244b468e15458f3d78327@zbfmail.de> X-Sender: weber@zbfmail.de User-Agent: Roundcube zbfmail Webmail X-DCC-INFN-TO-Metrics: mailserver 1233; Body=1 Fuz1=1 Fuz2=1 X-Barracuda-Connect: mail.zbfmail.de[176.9.84.12] X-Barracuda-Start-Time: 1457519737 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27694 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature hello list, my drives are all xfs formatted. in fstab i set: lazytime,logbsize=256k,logbufs=8 when i call "mount" on console i get: rw,relatime,lazytime,attr2,inode64,logbufs=8,logbsize=256k,sunit=1024,swidth=3072,noquota Why is relatime listed? Or is lazytime override this setting? Even when i set "norelatime" in /etc/fstab i get "relatime" listed on 'mount' Or am i wrong here with this question? is this not xfs related? anyway, for any hints or suggestions i am thankful best regards marko -- zbfmail - Mittendrin statt nur Datei! OpenDKIM, SPF, DSPAM, Greylisting, POSTSCREEN, AMAVIS, Mailgateways Mailfiltering, SMTP Service, Spam Abwehr, MX-Backup, Mailserver Backup Redundante Mailgateways, HA Mailserver, Secure Mailserver From robin.listas@telefonica.net Wed Mar 9 05:01:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EF56D7CA0 for ; Wed, 9 Mar 2016 05:01:35 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id AD6C78F8039 for ; Wed, 9 Mar 2016 03:01:32 -0800 (PST) X-ASG-Debug-ID: 1457521288-04bdf002ec28ee70001-NocioJ Received: from smtp.movistar.es (smtp11.acens.net [86.109.99.135]) by cuda.sgi.com with ESMTP id HvH0NZZgTBTqVZ1g for ; Wed, 09 Mar 2016 03:01:28 -0800 (PST) X-Barracuda-Envelope-From: robin.listas@telefonica.net X-Barracuda-Apparent-Source-IP: 86.109.99.135 X-CTCH-RefID: str=0001.0A0B0202.56E00288.00F6,ss=1,re=0.000,recu=0.000,reip=0.000,cl=1,cld=1,fgs=0 X-CTCH-VOD: Unknown X-CTCH-Spam: Unknown Received: from Telcontar.valinor (88.1.245.4) by smtp.movistar.es (8.6.122.03) (authenticated as robin.listas2) id 56BC428E021F4D19 for xfs@oss.sgi.com; Wed, 9 Mar 2016 11:01:43 +0000 Received: from localhost (localhost [127.0.0.1]) by Telcontar.valinor (Postfix) with ESMTP id BE48260B8B for ; Wed, 9 Mar 2016 12:01:27 +0100 (CET) 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 oiPins9LMFUf for ; Wed, 9 Mar 2016 12:01:27 +0100 (CET) Received: from [127.0.0.1] (localhost [127.0.0.1]) by Telcontar.valinor (Postfix) with ESMTP id 979D860484 for ; Wed, 9 Mar 2016 12:01:27 +0100 (CET) Subject: Re: an mount option question and dunno if right here... To: XFS mail list X-ASG-Orig-Subj: Re: an mount option question and dunno if right here... References: <08297acdf77244b468e15458f3d78327@zbfmail.de> From: "Carlos E. R." Message-ID: <56E00287.8020001@telefonica.net> Date: Wed, 9 Mar 2016 12:01:27 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <08297acdf77244b468e15458f3d78327@zbfmail.de> Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="4A3F1t6TNsPFXvaRpk8M13Alxnj8mwall" X-Barracuda-Connect: smtp11.acens.net[86.109.99.135] X-Barracuda-Start-Time: 1457521288 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27695 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --4A3F1t6TNsPFXvaRpk8M13Alxnj8mwall Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable On 2016-03-09 11:35, Marko Weber | 8000 wrote: > Why is relatime listed? Or is lazytime override this setting? > Even when i set "norelatime" in /etc/fstab i get "relatime" listed on > 'mount' Because you get a number of default options. Probably depends on the distribution. I know that on openSUSE you get relatime set, for instance.= --=20 Cheers / Saludos, Carlos E. R. (from 13.1 x86_64 "Bottle" at Telcontar) --4A3F1t6TNsPFXvaRpk8M13Alxnj8mwall 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.0.22 (GNU/Linux) iEYEARECAAYFAlbgAocACgkQtTMYHG2NR9WxnACfXVwchWLTLBzlQroQble+KGeR BfcAn3YamDgQ5KctjFL7lTYypqbh3JSQ =xbps -----END PGP SIGNATURE----- --4A3F1t6TNsPFXvaRpk8M13Alxnj8mwall-- From agruenba@redhat.com Wed Mar 9 06:06:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3D29F7CA0 for ; Wed, 9 Mar 2016 06:06:47 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E5444304039 for ; Wed, 9 Mar 2016 04:06:43 -0800 (PST) X-ASG-Debug-ID: 1457525202-04bdf002ee292370001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Vps4OmIixXKPXewv (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 09 Mar 2016 04:06:42 -0800 (PST) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id A486B6315B for ; Wed, 9 Mar 2016 12:06:42 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-71.ams2.redhat.com [10.36.4.71]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u29C6ecO005918; Wed, 9 Mar 2016 07:06:41 -0500 From: Andreas Gruenbacher To: xfs@oss.sgi.com Cc: Andreas Gruenbacher Subject: [XFSTESTS v4 0/4] Richacl tests Date: Wed, 9 Mar 2016 13:06:34 +0100 X-ASG-Orig-Subj: [XFSTESTS v4 0/4] Richacl tests Message-Id: <1457525199-15355-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Wed, 09 Mar 2016 12:06:42 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1457525202 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hello, here is a new version of the richacl tests. According to feedback from the previous posting (http://oss.sgi.com/archives/xfs/2015-12/msg00316.html), each of the richacl tests is not run separately, on a new scratch filesystem. Thanks, Andreas Andreas Gruenbacher (4): Rename output file templates to match TEST.out* check: Add support for tests without *.out files xfs/191: Remove obsolete nfs4acl tests Add richacl tests .gitignore | 19 +++ Makefile | 2 +- check | 77 ++++++--- common/rc | 36 ++++ nfs4acl/Makefile | 29 ---- nfs4acl/apply-mask.test | 143 ---------------- nfs4acl/basic.test | 70 -------- nfs4acl/chmod.test | 31 ---- nfs4acl/chown.test | 63 ------- nfs4acl/computed-mode.test | 62 ------- nfs4acl/create.test | 35 ---- nfs4acl/ctime.test | 36 ---- nfs4acl/delete.test | 77 --------- nfs4acl/run | 298 --------------------------------- nfs4acl/unrepresentable.test | 20 --- nfs4acl/write-vs-append.test | 46 ----- richacl/Makefile | 23 +++ richacl/apply-masks | 163 ++++++++++++++++++ richacl/auto-inheritance | 191 +++++++++++++++++++++ richacl/basic | 97 +++++++++++ richacl/chmod | 40 +++++ richacl/chown | 42 +++++ richacl/create | 36 ++++ richacl/ctime | 35 ++++ richacl/delete | 89 ++++++++++ richacl/setrichacl-modify | 57 +++++++ richacl/test-lib.sh | 154 +++++++++++++++++ richacl/write-vs-append | 54 ++++++ tests/generic/338 | 67 ++++++++ tests/generic/339-apply-masks | 1 + tests/generic/340-auto-inheritance | 1 + tests/generic/341-basic | 1 + tests/generic/342-chmod | 1 + tests/generic/343-chown | 1 + tests/generic/344-create | 1 + tests/generic/345-ctime | 1 + tests/generic/346-delete | 1 + tests/generic/347-setrichacl-modify | 1 + tests/generic/348-write-vs-append | 1 + tests/generic/group | 10 ++ tests/xfs/096 | 4 +- tests/xfs/096.external | 50 ------ tests/xfs/096.internal | 51 ------ tests/xfs/096.out.external | 50 ++++++ tests/xfs/096.out.internal | 51 ++++++ tests/xfs/191 | 75 --------- tests/xfs/191.out | 324 ------------------------------------ tests/xfs/group | 1 - 48 files changed, 1277 insertions(+), 1441 deletions(-) delete mode 100644 nfs4acl/Makefile delete mode 100644 nfs4acl/apply-mask.test delete mode 100644 nfs4acl/basic.test delete mode 100644 nfs4acl/chmod.test delete mode 100644 nfs4acl/chown.test delete mode 100644 nfs4acl/computed-mode.test delete mode 100644 nfs4acl/create.test delete mode 100644 nfs4acl/ctime.test delete mode 100644 nfs4acl/delete.test delete mode 100755 nfs4acl/run delete mode 100644 nfs4acl/unrepresentable.test delete mode 100644 nfs4acl/write-vs-append.test create mode 100644 richacl/Makefile create mode 100755 richacl/apply-masks create mode 100755 richacl/auto-inheritance create mode 100755 richacl/basic create mode 100755 richacl/chmod create mode 100755 richacl/chown create mode 100755 richacl/create create mode 100755 richacl/ctime create mode 100755 richacl/delete create mode 100755 richacl/setrichacl-modify create mode 100644 richacl/test-lib.sh create mode 100755 richacl/write-vs-append create mode 100755 tests/generic/338 create mode 120000 tests/generic/339-apply-masks create mode 120000 tests/generic/340-auto-inheritance create mode 120000 tests/generic/341-basic create mode 120000 tests/generic/342-chmod create mode 120000 tests/generic/343-chown create mode 120000 tests/generic/344-create create mode 120000 tests/generic/345-ctime create mode 120000 tests/generic/346-delete create mode 120000 tests/generic/347-setrichacl-modify create mode 120000 tests/generic/348-write-vs-append delete mode 100644 tests/xfs/096.external delete mode 100644 tests/xfs/096.internal create mode 100644 tests/xfs/096.out.external create mode 100644 tests/xfs/096.out.internal delete mode 100755 tests/xfs/191 delete mode 100644 tests/xfs/191.out -- 2.5.0 From agruenba@redhat.com Wed Mar 9 06:06:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EF5E37CA6 for ; Wed, 9 Mar 2016 06:06:50 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 42A15AC004 for ; Wed, 9 Mar 2016 04:06:47 -0800 (PST) X-ASG-Debug-ID: 1457525205-04cb6c5832261070001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QlDoEiMOmUHKfTMr (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 09 Mar 2016 04:06:45 -0800 (PST) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id EB5C98E3CF for ; Wed, 9 Mar 2016 12:06:44 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-71.ams2.redhat.com [10.36.4.71]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u29C6ecP005918; Wed, 9 Mar 2016 07:06:43 -0500 From: Andreas Gruenbacher To: xfs@oss.sgi.com Cc: Andreas Gruenbacher Subject: [XFSTESTS v4 1/4] Rename output file templates to match TEST.out* Date: Wed, 9 Mar 2016 13:06:35 +0100 X-ASG-Orig-Subj: [XFSTESTS v4 1/4] Rename output file templates to match TEST.out* Message-Id: <1457525199-15355-2-git-send-email-agruenba@redhat.com> In-Reply-To: <1457525199-15355-1-git-send-email-agruenba@redhat.com> References: <1457525199-15355-1-git-send-email-agruenba@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: 1457525205 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Rename the expected output files so that they all match "$TEST_NAME.out*". That way, we can statically check if a test has any .out* files. Add $TEST_NAME.out and similar symlinks to .gitignore. Signed-off-by: Andreas Gruenbacher --- .gitignore | 19 +++++++++++++++++ tests/xfs/096 | 4 ++-- tests/xfs/096.external | 50 --------------------------------------------- tests/xfs/096.internal | 51 ---------------------------------------------- tests/xfs/096.out.external | 50 +++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/096.out.internal | 51 ++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 122 insertions(+), 103 deletions(-) delete mode 100644 tests/xfs/096.external delete mode 100644 tests/xfs/096.internal create mode 100644 tests/xfs/096.out.external create mode 100644 tests/xfs/096.out.internal diff --git a/.gitignore b/.gitignore index 28fa205..f9ea1fa 100644 --- a/.gitignore +++ b/.gitignore @@ -199,3 +199,22 @@ /dmapi/src/suite2/src/test_invis /dmapi/src/suite2/src/test_region /dmapi/src/suite2/src/test_rights + +# Symlinked files +/tests/generic/088.out +/tests/generic/097.out +/tests/xfs/018.op +/tests/xfs/022.out +/tests/xfs/023.out +/tests/xfs/030.out +/tests/xfs/031.out +/tests/xfs/033.out +/tests/xfs/035.out +/tests/xfs/036.out +/tests/xfs/039.out +/tests/xfs/043.out +/tests/xfs/055.out +/tests/xfs/071.out +/tests/xfs/082.op +/tests/xfs/096.out +/tests/xfs/146.out diff --git a/tests/xfs/096 b/tests/xfs/096 index c289c10..f949e83 100755 --- a/tests/xfs/096 +++ b/tests/xfs/096 @@ -109,9 +109,9 @@ _require_v2log # choose .out file based on internal/external log rm -f $seqfull.out if [ "$USE_EXTERNAL" = yes ]; then - ln -s $seq.external $seqfull.out + ln -s $seq.out.external $seqfull.out else - ln -s $seq.internal $seqfull.out + ln -s $seq.out.internal $seqfull.out fi # maximum log record size diff --git a/tests/xfs/096.external b/tests/xfs/096.external deleted file mode 100644 index 3122330..0000000 --- a/tests/xfs/096.external +++ /dev/null @@ -1,50 +0,0 @@ -QA output created by 096 - -# su too big but must be a multiple of fs block size too ---- mkfs=-l version=2,su=262656 --- -log stripe unit (262656) must be a multiple of the block size (4096) - - -# test log stripe greater than LR size ---- mkfs=-l version=2,su=266240 --- -meta-data=DEV isize=N agcount=N, agsize=N blks -data = bsize=4096 blocks=N, imaxpct=N - = sunit=0 swidth=0 blks, unwritten=1 -naming =version 2 bsize=4096 -log =LOG bsize=4096 blocks=N, version=N -realtime =REALTIME extsz=N, blocks=N, rtextents=N - - -# same test but get log stripe from data stripe ---- mkfs=-l version=2 -d su=266240,sw=1 --- -meta-data=DEV isize=N agcount=N, agsize=N blks -data = bsize=4096 blocks=N, imaxpct=N - = sunit=65 swidth=65 blks, unwritten=1 -naming =version 2 bsize=4096 -log =LOG bsize=4096 blocks=N, version=N - = sunit=N blks -realtime =REALTIME extsz=N, blocks=N, rtextents=N - - -# test out data stripe ---- mkfs=-m crc=0 -l version=1 -d su=266240,sw=1 --- -meta-data=DEV isize=N agcount=N, agsize=N blks -data = bsize=4096 blocks=N, imaxpct=N - = sunit=65 swidth=65 blks, unwritten=1 -naming =version 2 bsize=4096 -log =LOG bsize=4096 blocks=N, version=N - = sunit=N blks -realtime =REALTIME extsz=N, blocks=N, rtextents=N - - -# test out data stripe the same but using sunit & swidth ---- mkfs=-m crc=0 -l version=1 -d sunit=520,swidth=520 --- -meta-data=DEV isize=N agcount=N, agsize=N blks -data = bsize=4096 blocks=N, imaxpct=N - = sunit=65 swidth=65 blks, unwritten=1 -naming =version 2 bsize=4096 -log =LOG bsize=4096 blocks=N, version=N - = sunit=N blks -realtime =REALTIME extsz=N, blocks=N, rtextents=N - - diff --git a/tests/xfs/096.internal b/tests/xfs/096.internal deleted file mode 100644 index 80201d2..0000000 --- a/tests/xfs/096.internal +++ /dev/null @@ -1,51 +0,0 @@ -QA output created by 096 - -# su too big but must be a multiple of fs block size too ---- mkfs=-l version=2,su=262656 --- -log stripe unit (262656) must be a multiple of the block size (4096) - - -# test log stripe greater than LR size ---- mkfs=-l version=2,su=266240 --- -meta-data=DEV isize=N agcount=N, agsize=N blks -data = bsize=4096 blocks=N, imaxpct=N - = sunit=0 swidth=0 blks, unwritten=1 -naming =version 2 bsize=4096 -log =LOG bsize=4096 blocks=N, version=N - = sunit=N blks -realtime =REALTIME extsz=N, blocks=N, rtextents=N - - -# same test but get log stripe from data stripe ---- mkfs=-l version=2 -d su=266240,sw=1 --- -meta-data=DEV isize=N agcount=N, agsize=N blks -data = bsize=4096 blocks=N, imaxpct=N - = sunit=65 swidth=65 blks, unwritten=1 -naming =version 2 bsize=4096 -log =LOG bsize=4096 blocks=N, version=N - = sunit=N blks -realtime =REALTIME extsz=N, blocks=N, rtextents=N - - -# test out data stripe ---- mkfs=-m crc=0 -l version=1 -d su=266240,sw=1 --- -meta-data=DEV isize=N agcount=N, agsize=N blks -data = bsize=4096 blocks=N, imaxpct=N - = sunit=65 swidth=65 blks, unwritten=1 -naming =version 2 bsize=4096 -log =LOG bsize=4096 blocks=N, version=N - = sunit=N blks -realtime =REALTIME extsz=N, blocks=N, rtextents=N - - -# test out data stripe the same but using sunit & swidth ---- mkfs=-m crc=0 -l version=1 -d sunit=520,swidth=520 --- -meta-data=DEV isize=N agcount=N, agsize=N blks -data = bsize=4096 blocks=N, imaxpct=N - = sunit=65 swidth=65 blks, unwritten=1 -naming =version 2 bsize=4096 -log =LOG bsize=4096 blocks=N, version=N - = sunit=N blks -realtime =REALTIME extsz=N, blocks=N, rtextents=N - - diff --git a/tests/xfs/096.out.external b/tests/xfs/096.out.external new file mode 100644 index 0000000..3122330 --- /dev/null +++ b/tests/xfs/096.out.external @@ -0,0 +1,50 @@ +QA output created by 096 + +# su too big but must be a multiple of fs block size too +--- mkfs=-l version=2,su=262656 --- +log stripe unit (262656) must be a multiple of the block size (4096) + + +# test log stripe greater than LR size +--- mkfs=-l version=2,su=266240 --- +meta-data=DEV isize=N agcount=N, agsize=N blks +data = bsize=4096 blocks=N, imaxpct=N + = sunit=0 swidth=0 blks, unwritten=1 +naming =version 2 bsize=4096 +log =LOG bsize=4096 blocks=N, version=N +realtime =REALTIME extsz=N, blocks=N, rtextents=N + + +# same test but get log stripe from data stripe +--- mkfs=-l version=2 -d su=266240,sw=1 --- +meta-data=DEV isize=N agcount=N, agsize=N blks +data = bsize=4096 blocks=N, imaxpct=N + = sunit=65 swidth=65 blks, unwritten=1 +naming =version 2 bsize=4096 +log =LOG bsize=4096 blocks=N, version=N + = sunit=N blks +realtime =REALTIME extsz=N, blocks=N, rtextents=N + + +# test out data stripe +--- mkfs=-m crc=0 -l version=1 -d su=266240,sw=1 --- +meta-data=DEV isize=N agcount=N, agsize=N blks +data = bsize=4096 blocks=N, imaxpct=N + = sunit=65 swidth=65 blks, unwritten=1 +naming =version 2 bsize=4096 +log =LOG bsize=4096 blocks=N, version=N + = sunit=N blks +realtime =REALTIME extsz=N, blocks=N, rtextents=N + + +# test out data stripe the same but using sunit & swidth +--- mkfs=-m crc=0 -l version=1 -d sunit=520,swidth=520 --- +meta-data=DEV isize=N agcount=N, agsize=N blks +data = bsize=4096 blocks=N, imaxpct=N + = sunit=65 swidth=65 blks, unwritten=1 +naming =version 2 bsize=4096 +log =LOG bsize=4096 blocks=N, version=N + = sunit=N blks +realtime =REALTIME extsz=N, blocks=N, rtextents=N + + diff --git a/tests/xfs/096.out.internal b/tests/xfs/096.out.internal new file mode 100644 index 0000000..80201d2 --- /dev/null +++ b/tests/xfs/096.out.internal @@ -0,0 +1,51 @@ +QA output created by 096 + +# su too big but must be a multiple of fs block size too +--- mkfs=-l version=2,su=262656 --- +log stripe unit (262656) must be a multiple of the block size (4096) + + +# test log stripe greater than LR size +--- mkfs=-l version=2,su=266240 --- +meta-data=DEV isize=N agcount=N, agsize=N blks +data = bsize=4096 blocks=N, imaxpct=N + = sunit=0 swidth=0 blks, unwritten=1 +naming =version 2 bsize=4096 +log =LOG bsize=4096 blocks=N, version=N + = sunit=N blks +realtime =REALTIME extsz=N, blocks=N, rtextents=N + + +# same test but get log stripe from data stripe +--- mkfs=-l version=2 -d su=266240,sw=1 --- +meta-data=DEV isize=N agcount=N, agsize=N blks +data = bsize=4096 blocks=N, imaxpct=N + = sunit=65 swidth=65 blks, unwritten=1 +naming =version 2 bsize=4096 +log =LOG bsize=4096 blocks=N, version=N + = sunit=N blks +realtime =REALTIME extsz=N, blocks=N, rtextents=N + + +# test out data stripe +--- mkfs=-m crc=0 -l version=1 -d su=266240,sw=1 --- +meta-data=DEV isize=N agcount=N, agsize=N blks +data = bsize=4096 blocks=N, imaxpct=N + = sunit=65 swidth=65 blks, unwritten=1 +naming =version 2 bsize=4096 +log =LOG bsize=4096 blocks=N, version=N + = sunit=N blks +realtime =REALTIME extsz=N, blocks=N, rtextents=N + + +# test out data stripe the same but using sunit & swidth +--- mkfs=-m crc=0 -l version=1 -d sunit=520,swidth=520 --- +meta-data=DEV isize=N agcount=N, agsize=N blks +data = bsize=4096 blocks=N, imaxpct=N + = sunit=65 swidth=65 blks, unwritten=1 +naming =version 2 bsize=4096 +log =LOG bsize=4096 blocks=N, version=N + = sunit=N blks +realtime =REALTIME extsz=N, blocks=N, rtextents=N + + -- 2.5.0 From agruenba@redhat.com Wed Mar 9 06:06:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A893F7CA7 for ; Wed, 9 Mar 2016 06:06:51 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 788428F804B for ; Wed, 9 Mar 2016 04:06:48 -0800 (PST) X-ASG-Debug-ID: 1457525206-04cb6c5830261070001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id DFsZHVAuGzEl6N7X (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 09 Mar 2016 04:06:47 -0800 (PST) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id D8781627F3 for ; Wed, 9 Mar 2016 12:06:46 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-71.ams2.redhat.com [10.36.4.71]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u29C6ecQ005918; Wed, 9 Mar 2016 07:06:45 -0500 From: Andreas Gruenbacher To: xfs@oss.sgi.com Cc: Andreas Gruenbacher Subject: [XFSTESTS v4 2/4] check: Add support for tests without *.out files Date: Wed, 9 Mar 2016 13:06:36 +0100 X-ASG-Orig-Subj: [XFSTESTS v4 2/4] check: Add support for tests without *.out files Message-Id: <1457525199-15355-3-git-send-email-agruenba@redhat.com> In-Reply-To: <1457525199-15355-1-git-send-email-agruenba@redhat.com> References: <1457525199-15355-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Wed, 09 Mar 2016 12:06:46 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1457525207 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add support for tests which report their status through their exit code instead of producing output that is compared with the expected output. When such a test returns with exit code 77, it is assumed to have been skipped; all other non-zero exit codes are treated as test failures. Signed-off-by: Andreas Gruenbacher --- check | 77 +++++++++++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 50 insertions(+), 27 deletions(-) diff --git a/check b/check index 2986d84..1327e1c 100755 --- a/check +++ b/check @@ -203,6 +203,13 @@ _prepare_test_list() fi } +# Check if a test has any .out* files +has_out_files() +{ + set -- "$1".out* + [ $# -gt 0 -a -e "$1" ] +} + # Process command arguments first. while [ $# -gt 0 ]; do case "$1" in @@ -635,6 +642,13 @@ for section in $HOST_OPTIONS_SECTIONS; do err=true fi + if ! has_out_files $seq; then + if [ $sts -eq 77 ]; then + cat $tmp.out > $seqres.notrun + sts=0 + fi + fi + if [ -f $seqres.notrun ] then $timestamp || echo -n " [not run] " @@ -647,41 +661,50 @@ for section in $HOST_OPTIONS_SECTIONS; do echo -n " [failed, exit status $sts]" err=true fi - if [ ! -f $seq.out ] - then - echo " - no qualified output" - err=true - else - # coreutils 8.16+ changed quote formats in error messages from - # `foo' to 'foo'. Filter old versions to match the new version. - sed -i "s/\`/\'/g" $tmp.out - if diff $seq.out $tmp.out >/dev/null 2>&1 + if has_out_files $seq; then + if [ ! -f $seq.out ] then - if $err + echo " - no qualified output" + err=true + else + # coreutils 8.16+ changed quote formats in error messages from + # `foo' to 'foo'. Filter old versions to match the new version. + sed -i "s/\`/\'/g" $tmp.out + + if ! diff $seq.out $tmp.out >/dev/null 2>&1 then - : - else - echo "$seqnum `expr $stop - $start`" >>$tmp.time - echo -n " `expr $stop - $start`s" + echo " - output mismatch (see $seqres.out.bad)" + mv $tmp.out $seqres.out.bad + $diff $seq.out $seqres.out.bad | { + if test "$DIFF_LENGTH" -le 0; then + cat + else + head -n "$DIFF_LENGTH" + echo "..." + echo "(Run '$diff $seq.out $seqres.out.bad'" \ + " to see the entire diff)" + fi; } | \ + sed -e 's/^\(.\)/ \1/' + err=true fi - echo "" + fi + else + if ! $err; then + mv $tmp.out $seqres.out.good else - echo " - output mismatch (see $seqres.out.bad)" mv $tmp.out $seqres.out.bad - $diff $seq.out $seqres.out.bad | { - if test "$DIFF_LENGTH" -le 0; then - cat - else - head -n "$DIFF_LENGTH" - echo "..." - echo "(Run '$diff $seq.out $seqres.out.bad'" \ - " to see the entire diff)" - fi; } | \ - sed -e 's/^\(.\)/ \1/' - err=true + echo " - output (see $seqres.out.bad)" + cat $seqres.out.bad fi fi + + if ! $err; then + echo "$seqnum `expr $stop - $start`" >>$tmp.time + echo -n " `expr $stop - $start`s" + echo "" + fi + try="$try $seqnum" n_try=`expr $n_try + 1` _check_filesystems -- 2.5.0 From agruenba@redhat.com Wed Mar 9 06:06:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=3.0 required=5.0 tests=TVD_SUBJ_NUM_OBFU_MINFP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AB2C07CB4 for ; Wed, 9 Mar 2016 06:06:54 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 29621AC007 for ; Wed, 9 Mar 2016 04:06:53 -0800 (PST) X-ASG-Debug-ID: 1457525209-04bdf002ed292390001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ZGxA6FxzgH3U55mW (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 09 Mar 2016 04:06:49 -0800 (PST) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 2B0DB7F083 for ; Wed, 9 Mar 2016 12:06:49 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-71.ams2.redhat.com [10.36.4.71]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u29C6ecR005918; Wed, 9 Mar 2016 07:06:47 -0500 From: Andreas Gruenbacher To: xfs@oss.sgi.com Cc: Andreas Gruenbacher Subject: [XFSTESTS v4 3/4] xfs/191: Remove obsolete nfs4acl tests Date: Wed, 9 Mar 2016 13:06:37 +0100 X-ASG-Orig-Subj: [XFSTESTS v4 3/4] xfs/191: Remove obsolete nfs4acl tests Message-Id: <1457525199-15355-4-git-send-email-agruenba@redhat.com> In-Reply-To: <1457525199-15355-1-git-send-email-agruenba@redhat.com> References: <1457525199-15355-1-git-send-email-agruenba@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: 1457525209 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com The nfs4acl tests don't make sense anymore as they have been obsoleted by richacls. Signed-off-by: Andreas Gruenbacher --- nfs4acl/Makefile | 29 ---- nfs4acl/apply-mask.test | 143 ------------------- nfs4acl/basic.test | 70 ---------- nfs4acl/chmod.test | 31 ----- nfs4acl/chown.test | 63 --------- nfs4acl/computed-mode.test | 62 --------- nfs4acl/create.test | 35 ----- nfs4acl/ctime.test | 36 ----- nfs4acl/delete.test | 77 ---------- nfs4acl/run | 298 --------------------------------------- nfs4acl/unrepresentable.test | 20 --- nfs4acl/write-vs-append.test | 46 ------ tests/xfs/191 | 75 ---------- tests/xfs/191.out | 324 ------------------------------------------- tests/xfs/group | 1 - 15 files changed, 1310 deletions(-) delete mode 100644 nfs4acl/Makefile delete mode 100644 nfs4acl/apply-mask.test delete mode 100644 nfs4acl/basic.test delete mode 100644 nfs4acl/chmod.test delete mode 100644 nfs4acl/chown.test delete mode 100644 nfs4acl/computed-mode.test delete mode 100644 nfs4acl/create.test delete mode 100644 nfs4acl/ctime.test delete mode 100644 nfs4acl/delete.test delete mode 100755 nfs4acl/run delete mode 100644 nfs4acl/unrepresentable.test delete mode 100644 nfs4acl/write-vs-append.test delete mode 100755 tests/xfs/191 delete mode 100644 tests/xfs/191.out diff --git a/nfs4acl/Makefile b/nfs4acl/Makefile deleted file mode 100644 index 42313f3..0000000 --- a/nfs4acl/Makefile +++ /dev/null @@ -1,29 +0,0 @@ -#----------------------------------------------------------------------- -# Copyright (c) 2008 Silicon Graphics, Inc. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it would be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# -#----------------------------------------------------------------------- - -TOPDIR = .. -include $(TOPDIR)/include/builddefs - -LSRCFILES = run \ - apply-mask.test chmod.test computed-mode.test ctime.test \ - unrepresentable.test basic.test chown.test create.test \ - delete.test write-vs-append.test - -include $(BUILDRULES) - -default install install-dev install-lib: diff --git a/nfs4acl/apply-mask.test b/nfs4acl/apply-mask.test deleted file mode 100644 index 9b9483a..0000000 --- a/nfs4acl/apply-mask.test +++ /dev/null @@ -1,143 +0,0 @@ -$ rm -rf d -$ mkdir d -$ cd d - -$ touch x - -$ nfs4acl --set 'owner@:rw::allow group@:rw::allow everyone@:r::allow' x -$ nfs4acl --get x -> x: -> owner@:rw::allow -> group@:rw::allow -> everyone@:r::allow -> - -$ nfs4acl --set 'everyone@:w::allow owner@:r::allow group@:r::allow' x -$ chmod 664 x -$ nfs4acl --get x -> x: -> owner@:rw::allow -> group@:rw::allow -> - -$ nfs4acl --set 'everyone@:w::deny owner@:rw::allow group@:rw::allow' x -$ chmod 664 x -$ nfs4acl --get x -> x: -> owner@:r::allow -> group@:r::allow -> - -$ nfs4acl --set 'owner@:rwmo::allow' x -$ nfs4acl --get x -> x: -> owner@:rwmo::allow -> - -$ chmod 644 x -$ nfs4acl --get x -> x: -> owner@:rw::allow -> - -$ nfs4acl --set 'root:rw::allow' x -$ chmod 664 x -$ nfs4acl --get x -> x: -> root:rw::allow -> - -$ chmod 644 x -$ nfs4acl --get x -> x: -> root:r::allow -> - -$ chmod 664 x -$ nfs4acl --get x -> x: -> root:rw::allow -> - -$ nfs4acl --set 'root:rw::allow everyone@:r::allow' x -$ chmod 664 x -$ nfs4acl --get x -> x: -> root:rw::allow -> everyone@:r::allow -> - -$ nfs4acl --set 'root:r::allow everyone@:rw::allow' x -$ chmod 664 x -$ nfs4acl --get x -> x: -> root:rw::allow -> owner@:rw::allow -> group@:rw::allow -> everyone@:r::allow -> - -$ nfs4acl --set 'root:w::deny everyone@:rw::allow' x -$ chmod 664 x -$ nfs4acl --get x -> x: -> root:w::deny -> owner@:rw::allow -> group@:rw::allow -> root:r::allow -> everyone@:r::allow -> - -$ nfs4acl --set 'root:rw::allow root:w::deny everyone@:rw::allow' x -$ chmod 664 x -$ nfs4acl --get x -> x: -> root:rw::allow -> root:w::deny -> owner@:rw::allow -> group@:rw::allow -> everyone@:r::allow -> - -$ nfs4acl --set 'everyone@:rw::allow' x -$ chmod 066 x -$ nfs4acl --get x -> x: -> owner@:rw::deny -> everyone@:rw::allow -> - -$ chmod 006 x -$ nfs4acl --get x -> x: -> owner@:rw::deny -> group@:rw::deny -> everyone@:rw::allow -> - -$ chmod 606 x -$ nfs4acl --get x -> x: -> group@:rw::deny -> everyone@:rw::allow -> - -$ nfs4acl --set 'root:rw::allow everyone@:rw::allow' x -$ chmod 606 x -$ nfs4acl --get x -> x: -> group@:rw::deny -> everyone@:rw::allow -> - -$ chmod 646 x -$ nfs4acl --get x -> x: -> root:r::allow -> group@:w::deny -> root:w::deny -> everyone@:rw::allow -> - -$ cd .. -$ rm -rf d diff --git a/nfs4acl/basic.test b/nfs4acl/basic.test deleted file mode 100644 index 1ae2896..0000000 --- a/nfs4acl/basic.test +++ /dev/null @@ -1,70 +0,0 @@ -$ rm -rf d -$ mkdir d -$ cd d - -$ chown bin . -$ su bin - -$ touch x -$ nfs4acl --set 'everyone@:rw::allow' x -$ ls -l x | cut -d ' ' -f 1 -> -rw-rw-rw- - -$ nfs4acl --get x -> x: -> everyone@:rw::allow -> - -$ chmod 664 x -$ ls -l x | cut -d ' ' -f 1 -> -rw-rw-r-- - -$ nfs4acl --get x -> x: -> owner@:rw::allow -> group@:rw::allow -> everyone@:r::allow -> - -$ mkdir sub -$ nfs4acl --set 'everyone@:rwax:fd:allow' sub -$ ls -dl sub | cut -d ' ' -f 1 -> drwxrwxrwx - -$ nfs4acl --get sub -> sub: -> everyone@:rwax:fd:allow -> - -$ chmod 775 sub -$ ls -dl sub | cut -d ' ' -f 1 -> drwxrwxr-x -$ nfs4acl --get sub -> sub: -> owner@:rwax::allow -> group@:rwax::allow -> everyone@:rwax:fdi:allow -> everyone@:rx::allow -> - -$ touch sub/f -$ ls -l sub/f | cut -d ' ' -f 1 -> -rw-rw-rw- - -$ nfs4acl --get sub/f -> sub/f: -> everyone@:rwa::allow -> - -$ mkdir sub/sub2 -$ ls -dl sub/sub2 | cut -d ' ' -f 1 -> drwxrwxrwx - -$ nfs4acl --get sub/sub2 -> sub/sub2: -> everyone@:rwax:fd:allow -> - -$ su -$ cd .. -$ rm -rf d diff --git a/nfs4acl/chmod.test b/nfs4acl/chmod.test deleted file mode 100644 index f4238b0..0000000 --- a/nfs4acl/chmod.test +++ /dev/null @@ -1,31 +0,0 @@ -$ mkdir d -$ cd d - -$ whoami -> root - -$ touch a - -Neet to have write_acl permission to chmod or set the acl: - $ su bin - $ chmod 666 a - > chmod: changing permissions of `a': Operation not permitted - $ nfs4acl --set 'bin:rwM::allow' a - > a: Operation not permitted - -$ su -$ nfs4acl --set 'bin:rwm::allow' a - -Can set the acl now: - $ su bin - $ nfs4acl --set 'bin:rwm::allow' a - -A chmod limits the permissions to the specified mode, which always disables -write_acl: - $ chmod 666 a - $ nfs4acl --set 'bin:rwm::allow' a - > a: Operation not permitted - -$ su -$ cd .. -$ rm -rf d diff --git a/nfs4acl/chown.test b/nfs4acl/chown.test deleted file mode 100644 index df29bf4..0000000 --- a/nfs4acl/chown.test +++ /dev/null @@ -1,63 +0,0 @@ -$ mkdir d -$ cd d - -$ whoami -> root - -$ id -Gn daemon -> daemon bin - -$ touch a - -Chown and chgrp with no take ownership permission fails: - $ su daemon - $ chown daemon a - > chown: changing ownership of `a': Operation not permitted - $ chgrp daemon a - > chgrp: changing group of `a': Operation not permitted - $ nfs4acl --set 'daemon:rwo::allow' a - > a: Operation not permitted - -Add the take_ownership permission. This is reflected in the file masks; the -file mode cannot show this though: - $ su - $ nfs4acl --set 'daemon:rwo::allow' a - -Chown and chgrp to an arbitrary other user or group fails: - $ su daemon - $ chown root a - > chown: changing ownership of `a': Operation not permitted - $ chgrp root a - > chgrp: changing group of `a': Operation not permitted - -Changing the mode makes that an upper bound of the permissions granted, even -when the file mode stays the same: - $ su - $ ls -l a | cut -d ' ' -f1 - > -rw-rw---- - $ chmod 660 a - -Chown and chgrp to the same user or a group the process is in now fails -because the masks now do not grant change_ownership access: - $ su daemon - $ chown daemon a - > chown: changing ownership of `a': Operation not permitted - $ chgrp daemon a - > chgrp: changing group of `a': Operation not permitted - $ chgrp bin a - > chgrp: changing group of `a': Operation not permitted - -Add back change_ownership: - $ su - $ nfs4acl --set 'daemon:rwo::allow' a - -Now, chgrp to one of the groups the process is in and chown to the same user -succeeds: - $ su daemon - $ chgrp daemon a - $ chgrp bin a - $ chown daemon a - -$ su -$ cd .. -$ rm -rf d diff --git a/nfs4acl/computed-mode.test b/nfs4acl/computed-mode.test deleted file mode 100644 index baa68d6..0000000 --- a/nfs4acl/computed-mode.test +++ /dev/null @@ -1,62 +0,0 @@ -$ rm -rf d -$ mkdir d -$ cd d - -$ mkdir e - -$ nfs4acl --set 'owner@:rwx:f:allow' e -$ touch e/f -$ ls -l e/f | cut -d ' ' -f 1 -> -rw------- -$ rm e/f - -$ nfs4acl --set 'group@:rwx:f:allow' e -$ touch e/f -$ ls -l e/f | cut -d ' ' -f 1 -> -rw-rw---- -$ rm e/f - -$ nfs4acl --set 'everyone@:rwx:f:allow' e -$ touch e/f -$ ls -l e/f | cut -d ' ' -f 1 -> -rw-rw-rw- -$ rm e/f - -$ nfs4acl --set 'owner@:rwx:f:allow root:rx:f:deny root:rx:f:allow' e -$ touch e/f -$ ls -l e/f | cut -d ' ' -f 1 -> -rw------- -$ rm e/f - -$ nfs4acl --set 'owner@:rwx::allow everyone@:w:fi:deny everyone@:rwx:fi:allow' e -$ touch e/f -$ ls -l e/f | cut -d ' ' -f 1 -> -r--r--r-- -$ rm e/f - -$ nfs4acl --set 'owner@:rwx::allow root:rx:fi:deny root:rx:fi:allow' e -$ touch e/f -$ ls -l e/f | cut -d ' ' -f 1 -> ---------- -$ rm e/f - -$ nfs4acl --set 'owner@:rx:fi:allow group@:rwx:fi:deny everyone@:rwx:f:allow' e -$ touch e/f -$ ls -l e/f | cut -d ' ' -f 1 -> -rw----rw- -$ rm e/f - -$ nfs4acl --set 'owner@:rx:fi:allow root:rwx:fi:deny everyone@:rwx:f:allow' e -$ touch e/f -$ ls -l e/f | cut -d ' ' -f 1 -> -rw-rw-rw- -$ rm e/f - -$ nfs4acl --set 'everyone@:w:fi:deny root:rx:fi:allow everyone@:rwx:f:allow' e -$ touch e/f -$ ls -l e/f | cut -d ' ' -f 1 -> -r--r--r-- -$ rm e/f - -$ cd .. -$ rm -rf d diff --git a/nfs4acl/create.test b/nfs4acl/create.test deleted file mode 100644 index e140f4b..0000000 --- a/nfs4acl/create.test +++ /dev/null @@ -1,35 +0,0 @@ -$ mkdir d -$ cd d - -$ whoami -> root - -$ mkdir d1 d2 d3 d4 -$ nfs4acl --set 'daemon:wx::allow' d2 -$ nfs4acl --set 'daemon:ax::allow' d3 -$ nfs4acl --set 'daemon:wax::allow' d4 - -$ su daemon - -Cannot create files or directories without permissions: - $ touch d1/f - > touch: cannot touch `d1/f': Permission denied - $ mkdir d1/d - > mkdir: cannot create directory `d1/d': Permission denied - -Can create files with add_file (w) permission: - $ touch d2/f - $ mkdir d2/d - > mkdir: cannot create directory `d2/d': Permission denied - -Can create directories with add_subdirectory (p) permission: - $ touch d3/f - > touch: cannot touch `d3/f': Permission denied - $ mkdir d3/d - -Both permissions at the same time: - $ touch d4/f - $ mkdir d4/d -$ su -$ cd .. -$ rm -rf d diff --git a/nfs4acl/ctime.test b/nfs4acl/ctime.test deleted file mode 100644 index 614d79b..0000000 --- a/nfs4acl/ctime.test +++ /dev/null @@ -1,36 +0,0 @@ -$ mkdir d -$ cd d - -$ whoami -> root - -$ touch a b -$ sleep 1 - -Without write access, the ctime cannot be changed. - $ su bin - $ touch a - > touch: cannot touch `a': Permission denied - -With write access, the ctime can be set to the current time, but not to -any other time: - $ su - $ nfs4acl --set 'bin:rw::allow' a - - $ su bin - $ touch a - $ [ b -ot a ] || echo 'b should be older than a' - $ touch -r b a - > touch: setting times of `a': Operation not permitted - -With set_attributes access, the ctime can be set to an arbitrary time: - $ su - $ nfs4acl --set 'bin:rwt::allow' a - - $ su bin - $ touch -r b a - $ [ b -ot a -o a -ot b ] && echo 'a should be as old as b' - -$ su -$ cd .. -$ rm -rf d diff --git a/nfs4acl/delete.test b/nfs4acl/delete.test deleted file mode 100644 index 9c5f24f..0000000 --- a/nfs4acl/delete.test +++ /dev/null @@ -1,77 +0,0 @@ -$ mkdir d -$ cd d - -$ whoami -> root - -$ id -Gn daemon -> daemon bin - -$ mkdir n1 -$ touch n1/f - -$ mkdir d2 d3 d4 d5 d6 d7 -$ touch d2/f d3/f d4/f d5/f d6/f d7/f d7/g -$ chown daemon d2 -$ chgrp bin d3 -$ chmod g+w d3 -$ nfs4acl --set 'daemon:wx::allow' d4 -$ nfs4acl --set 'daemon:d::allow' d5 -$ nfs4acl --set 'daemon:xd::allow' d6 -$ nfs4acl --set 'daemon:D::allow' d7/f d7/g -$ chmod 664 d7/g - -$ mkdir s2 s3 s4 s5 s6 s7 -$ chmod +t s2 s3 s4 s5 s6 s7 -$ touch s2/f s3/f s4/f s5/f s6/f s7/f s7/g -$ chown daemon s2 -$ chgrp bin s3 -$ chmod g+w s3 -$ nfs4acl --set 'daemon:wx::allow' s4 -$ nfs4acl --set 'daemon:d::allow' s5 -$ nfs4acl --set 'daemon:xd::allow' s6 -$ nfs4acl --set 'daemon:D::allow' s7/f -$ nfs4acl --set 'daemon:D::allow' s7/g s7/g -$ chmod 664 s7/g - -$ su daemon - -Cannot delete files without permissions: - $ rm n1/f - > rm: cannot remove `n1/f': Permission denied - -Can delete files we own: - $ rm d2/f s2/f - -Cannot delete files where we are in the owning group in a non-sticky directory, -but not in a sticky one: - $ rm d3/f s3/f - > rm: cannot remove `s3/f': Operation not permitted - -"Write_data/execute" access does not include delete_child access, and so this -is not enough for deleting: - $ rm d4/f s4/f - > rm: cannot remove `d4/f': Permission denied - > rm: cannot remove `s4/f': Permission denied - -"Delete_child" access alone also is not sufficient: - $ rm d5/f s5/f - > rm: cannot remove `d5/f': Permission denied - > rm: cannot remove `s5/f': Permission denied - -"Execute/delete_child" on the directory does allow that, though, but only in -a non-sticky directory: - $ rm d6/f s6/f - > rm: cannot remove `s6/f': Operation not permitted - -"Delete" on the child itself overrides the sticky check as well: - $ rm d7/f s7/f - -But Delete is not a subset of POSIX read/write, so chmod turns it off: - $ rm d7/g s7/g - > rm: cannot remove `d7/g': Permission denied - > rm: cannot remove `s7/g': Permission denied - -$ su -$ cd .. -$ rm -rf d diff --git a/nfs4acl/run b/nfs4acl/run deleted file mode 100755 index 360739e..0000000 --- a/nfs4acl/run +++ /dev/null @@ -1,298 +0,0 @@ -#!/usr/bin/perl -w -U - -# -# Possible improvements: -# -# - distinguish stdout and stderr output -# - add environment variable like assignments -# - run up to a specific line -# - resume at a specific line -# - -use strict; -use FileHandle; -use Getopt::Std; -use POSIX qw(isatty setuid getcwd); -use vars qw($opt_l $opt_v); - -no warnings qw(taint); - -$opt_l = ~0; # a really huge number -getopts('l:v'); - -my ($OK, $FAILED) = ("ok", "failed"); -if (isatty(fileno(STDOUT))) { - $OK = "\033[32m" . $OK . "\033[m"; - $FAILED = "\033[31m\033[1m" . $FAILED . "\033[m"; -} - -sub exec_test($$); -sub process_test($$$$); - -my ($prog, $in, $out) = ([], [], []); -my $prog_line = 0; -my ($tests, $failed) = (0,0); -my $lineno; -my $width = ($ENV{COLUMNS} || 80) >> 1; - -for (;;) { - my $line = <>; $lineno++; - if (defined $line) { - # Substitute %VAR and %{VAR} with environment variables. - $line =~ s[%(\w+)][$ENV{$1}]eg; - $line =~ s[%{(\w+)}][$ENV{$1}]eg; - } - if (defined $line) { - if ($line =~ s/^\s*< ?//) { - push @$in, $line; - } elsif ($line =~ s/^\s*> ?//) { - push @$out, $line; - } else { - process_test($prog, $prog_line, $in, $out); - last if $prog_line >= $opt_l; - - $prog = []; - $prog_line = 0; - } - if ($line =~ s/^\s*\$ ?//) { - $line =~ s/\s+#.*//; # remove comments here... - $prog = [ map { s/\\(.)/$1/g; $_ } split /(? @$result) ? @$out : @$result; - for (my $n=0; $n < $nmax; $n++) { - my $use_re; - if (defined $out->[$n] && $out->[$n] =~ /^~ /) { - $use_re = 1; - $out->[$n] =~ s/^~ //g; - } - - if (!defined($out->[$n]) || !defined($result->[$n]) || - (!$use_re && $result->[$n] ne $out->[$n]) || - ( $use_re && $result->[$n] !~ /^$out->[$n]/)) { - push @good, ($use_re ? '!~' : '!='); - } - else { - push @good, ($use_re ? '=~' : '=='); - } - } - my $good = !(grep /!/, @good); - $tests++; - $failed++ unless $good; - print $good ? $OK : $FAILED, "\n"; - if (!$good || $opt_v) { - for (my $n=0; $n < $nmax; $n++) { - my $l = defined($out->[$n]) ? $out->[$n] : "~"; - chomp $l; - my $r = defined($result->[$n]) ? $result->[$n] : "~"; - chomp $r; - print sprintf("%-" . ($width-3) . "s %s %s\n", - $r, $good[$n], $l); - } - } -} - - -sub su($) { - my ($user) = @_; - - $user ||= "root"; - - my ($login, $pass, $uid, $gid) = getpwnam($user) - or return [ "su: user $user does not exist\n" ]; - my @groups = (); - my $fh = new FileHandle("/etc/group") - or return [ "opening /etc/group: $!\n" ]; - while (<$fh>) { - chomp; - my ($group, $passwd, $gid, $users) = split /:/; - foreach my $u (split /,/, $users) { - push @groups, $gid - if ($user eq $u); - } - } - $fh->close; - - my $groups = join(" ", ($gid, $gid, @groups)); - #print STDERR "[[$groups]]\n"; - $! = 0; # reset errno - $> = 0; - $( = $gid; - $) = $groups; - if ($!) { - return [ "su: $!\n" ]; - } - if ($uid != 0) { - $> = $uid; - #$< = $uid; - if ($!) { - return [ "su: $prog->[1]: $!\n" ]; - } - } - #print STDERR "[($>,$<)($(,$))]"; - return []; -} - - -sub sg($) { - my ($group) = @_; - - my $gid = getgrnam($group) - or return [ "sg: group $group does not exist\n" ]; - my %groups = map { $_ eq $gid ? () : ($_ => 1) } (split /\s/, $)); - - #print STDERR "<<", join("/", keys %groups), ">>\n"; - my $groups = join(" ", ($gid, $gid, keys %groups)); - #print STDERR "[[$groups]]\n"; - $! = 0; # reset errno - if ($> != 0) { - my $uid = $>; - $> = 0; - $( = $gid; - $) = $groups; - $> = $uid; - } else { - $( = $gid; - $) = $groups; - } - if ($!) { - return [ "sg: $!\n" ]; - } - print STDERR "[($>,$<)($(,$))]"; - return []; -} - - -sub exec_test($$) { - my ($prog, $in) = @_; - local (*IN, *IN_DUP, *IN2, *OUT_DUP, *OUT, *OUT2); - my $needs_shell = (join('', @$prog) =~ /[][|<>"'`\$\*\?]/); - - if ($prog->[0] eq "umask") { - umask oct $prog->[1]; - return []; - } elsif ($prog->[0] eq "cd") { - if (!chdir $prog->[1]) { - return [ "chdir: $prog->[1]: $!\n" ]; - } - $ENV{PWD} = getcwd; - return []; - } elsif ($prog->[0] eq "su") { - return su($prog->[1]); - } elsif ($prog->[0] eq "sg") { - return sg($prog->[1]); - } elsif ($prog->[0] eq "export") { - my ($name, $value) = split /=/, $prog->[1]; - # FIXME: need to evaluate $value, so that things like this will work: - # export dir=$PWD/dir - $ENV{$name} = $value; - return []; - } elsif ($prog->[0] eq "unset") { - delete $ENV{$prog->[1]}; - return []; - } - - pipe *IN2, *OUT - or die "Can't create pipe for reading: $!"; - open *IN_DUP, "<&STDIN" - or *IN_DUP = undef; - open *STDIN, "<&IN2" - or die "Can't duplicate pipe for reading: $!"; - close *IN2; - - open *OUT_DUP, ">&STDOUT" - or die "Can't duplicate STDOUT: $!"; - pipe *IN, *OUT2 - or die "Can't create pipe for writing: $!"; - open *STDOUT, ">&OUT2" - or die "Can't duplicate pipe for writing: $!"; - close *OUT2; - - *STDOUT->autoflush(); - *OUT->autoflush(); - - if (fork()) { - # Server - if (*IN_DUP) { - open *STDIN, "<&IN_DUP" - or die "Can't duplicate STDIN: $!"; - close *IN_DUP - or die "Can't close STDIN duplicate: $!"; - } - open *STDOUT, ">&OUT_DUP" - or die "Can't duplicate STDOUT: $!"; - close *OUT_DUP - or die "Can't close STDOUT duplicate: $!"; - - foreach my $line (@$in) { - #print "> $line"; - print OUT $line; - } - close *OUT - or die "Can't close pipe for writing: $!"; - - my $result = []; - while () { - #print "< $_"; - if ($needs_shell) { - s#^/bin/sh: line \d+: ##; - } - push @$result, $_; - } - return $result; - } else { - # Client - $< = $>; - close IN - or die "Can't close read end for input pipe: $!"; - close OUT - or die "Can't close write end for output pipe: $!"; - close OUT_DUP - or die "Can't close STDOUT duplicate: $!"; - local *ERR_DUP; - open ERR_DUP, ">&STDERR" - or die "Can't duplicate STDERR: $!"; - open STDERR, ">&STDOUT" - or die "Can't join STDOUT and STDERR: $!"; - - if ($needs_shell) { - exec ('/bin/sh', '-c', join(" ", @$prog)); - } else { - exec @$prog; - } - print STDERR $prog->[0], ": $!\n"; - exit; - } -} - diff --git a/nfs4acl/unrepresentable.test b/nfs4acl/unrepresentable.test deleted file mode 100644 index 17fe5d4..0000000 --- a/nfs4acl/unrepresentable.test +++ /dev/null @@ -1,20 +0,0 @@ -Test cases for (acl, masks) pairs that cannot be represented as -pure ACLs - -$ rm -rf d -$ mkdir d -$ cd d - -$ touch x - -$ nfs4acl --set 'group@:rw::allow' x -$ chmod 600 x -$ ls -l x | cut -d ' ' -f 1 -> -rw------- -$ nfs4acl --get x -> x: -> -$ rm -f x - -$ cd .. -$ rm -rf d diff --git a/nfs4acl/write-vs-append.test b/nfs4acl/write-vs-append.test deleted file mode 100644 index f1f940a..0000000 --- a/nfs4acl/write-vs-append.test +++ /dev/null @@ -1,46 +0,0 @@ -$ mkdir d -$ cd d - -$ whoami -> root - -$ touch a b c d e f -$ nfs4acl --set 'owner@:*::allow' a -$ nfs4acl --set 'owner@:*::allow bin:w::allow' b -$ nfs4acl --set 'owner@:*::allow bin:a::allow' c -$ nfs4acl --set 'owner@:*::allow bin:wa::allow' d -$ nfs4acl --set 'bin:a::deny owner@:*::allow bin:w::allow' e -$ nfs4acl --set 'bin:w::deny owner@:*::allow bin:a::allow' f - -$ su bin -$ echo a > a -> /bin/sh: a: Permission denied -$ echo b > b -$ echo c > c -> /bin/sh: c: Permission denied -$ echo d > d -$ echo e > e -$ echo f > f -> /bin/sh: f: Permission denied - -$ echo A >> a -> /bin/sh: a: Permission denied -$ echo B >> b -> /bin/sh: b: Permission denied -$ echo C >> c -$ echo D >> d -$ echo E >> e -> /bin/sh: e: Permission denied -$ echo F >> f - -$ su -$ cat a b c d e f -> b -> C -> d -> D -> e -> F - -$ cd .. -$ rm -rf d diff --git a/tests/xfs/191 b/tests/xfs/191 deleted file mode 100755 index e9aef20..0000000 --- a/tests/xfs/191 +++ /dev/null @@ -1,75 +0,0 @@ -#!/bin/bash -# FS QA Test No. 191 -# -# To call into the nfs4acl qa suite of Andreas Gruenbacher. -# -#----------------------------------------------------------------------- -# Copyright (c) 2008 Silicon Graphics, Inc. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it would be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# -#----------------------------------------------------------------------- -# - -seq=`basename $0` -seqres=$RESULT_DIR/$seq -echo "QA output created by $seq" - -here=`pwd` -tmp=/tmp/$$ -status=1 # failure is the default! -trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 - -# get standard environment, filters and checks -. ./common/rc -. ./common/filter - -# real QA test starts here - -# Modify as appropriate. -_supported_fs xfs -_supported_os Linux - -_require_scratch -_scratch_mkfs_xfs -i nfs4acl 1>$tmp.mkfs 2>$seqres.full -if [ $? -ne 0 ] -then - _notrun "no mkfs support for NFS v4 ACLs" -fi - -_scratch_mount 2>/dev/null -if [ $? -ne 0 ] -then - _notrun "no kernel mount support for NFS v4 ACLs" -fi - -set_prog_path nfs4acl >>$seqres.full -if [ $? -ne 0 ] -then - _notrun "no nfs4acl utility found" -fi - -cd $SCRATCH_MNT -for file in $here/nfs4acl/*.test -do - print_file=`echo $file | sed 's/.*nfs4acl/nfs4acl/'` - echo "" - echo "*** $print_file ***" - echo "" - $here/nfs4acl/run $file -done - -# success, all done -status=0 -exit diff --git a/tests/xfs/191.out b/tests/xfs/191.out deleted file mode 100644 index 7a37ec8..0000000 --- a/tests/xfs/191.out +++ /dev/null @@ -1,324 +0,0 @@ -QA output created by 191 - -*** nfs4acl/apply-mask.test *** - -[1] $ rm -rf d -- ok -[2] $ mkdir d -- ok -[3] $ cd d -- ok -[5] $ touch x -- ok -[7] $ nfs4acl --set 'owner@:rw::allow group@:rw::allow everyone@:r::allow' x -- ok -[8] $ nfs4acl --get x -- ok -[15] $ nfs4acl --set 'everyone@:w::allow owner@:r::allow group@:r::allow' x -- ok -[16] $ chmod 664 x -- ok -[17] $ nfs4acl --get x -- ok -[23] $ nfs4acl --set 'everyone@:w::deny owner@:rw::allow group@:rw::allow' x -- ok -[24] $ chmod 664 x -- ok -[25] $ nfs4acl --get x -- ok -[31] $ nfs4acl --set 'owner@:rwmo::allow' x -- ok -[32] $ nfs4acl --get x -- ok -[37] $ chmod 644 x -- ok -[38] $ nfs4acl --get x -- ok -[43] $ nfs4acl --set 'root:rw::allow' x -- ok -[44] $ chmod 664 x -- ok -[45] $ nfs4acl --get x -- ok -[50] $ chmod 644 x -- ok -[51] $ nfs4acl --get x -- ok -[56] $ chmod 664 x -- ok -[57] $ nfs4acl --get x -- ok -[62] $ nfs4acl --set 'root:rw::allow everyone@:r::allow' x -- ok -[63] $ chmod 664 x -- ok -[64] $ nfs4acl --get x -- ok -[70] $ nfs4acl --set 'root:r::allow everyone@:rw::allow' x -- ok -[71] $ chmod 664 x -- ok -[72] $ nfs4acl --get x -- ok -[80] $ nfs4acl --set 'root:w::deny everyone@:rw::allow' x -- ok -[81] $ chmod 664 x -- ok -[82] $ nfs4acl --get x -- ok -[91] $ nfs4acl --set 'root:rw::allow root:w::deny everyone@:rw::allow' x -- ok -[92] $ chmod 664 x -- ok -[93] $ nfs4acl --get x -- ok -[102] $ nfs4acl --set 'everyone@:rw::allow' x -- ok -[103] $ chmod 066 x -- ok -[104] $ nfs4acl --get x -- ok -[110] $ chmod 006 x -- ok -[111] $ nfs4acl --get x -- ok -[118] $ chmod 606 x -- ok -[119] $ nfs4acl --get x -- ok -[125] $ nfs4acl --set 'root:rw::allow everyone@:rw::allow' x -- ok -[126] $ chmod 606 x -- ok -[127] $ nfs4acl --get x -- ok -[133] $ chmod 646 x -- ok -[134] $ nfs4acl --get x -- ok -[142] $ cd .. -- ok -[143] $ rm -rf d -- ok -49 commands (49 passed, 0 failed) - -*** nfs4acl/basic.test *** - -[1] $ rm -rf d -- ok -[2] $ mkdir d -- ok -[3] $ cd d -- ok -[5] $ chown bin . -- ok -[6] $ su bin -- ok -[8] $ touch x -- ok -[9] $ nfs4acl --set 'everyone@:rw::allow' x -- ok -[10] $ ls -l x | cut -d ' ' -f 1 -- ok -[13] $ nfs4acl --get x -- ok -[18] $ chmod 664 x -- ok -[19] $ ls -l x | cut -d ' ' -f 1 -- ok -[22] $ nfs4acl --get x -- ok -[29] $ mkdir sub -- ok -[30] $ nfs4acl --set 'everyone@:rwax:fd:allow' sub -- ok -[31] $ ls -dl sub | cut -d ' ' -f 1 -- ok -[34] $ nfs4acl --get sub -- ok -[39] $ chmod 775 sub -- ok -[40] $ ls -dl sub | cut -d ' ' -f 1 -- ok -[42] $ nfs4acl --get sub -- ok -[50] $ touch sub/f -- ok -[51] $ ls -l sub/f | cut -d ' ' -f 1 -- ok -[54] $ nfs4acl --get sub/f -- ok -[59] $ mkdir sub/sub2 -- ok -[60] $ ls -dl sub/sub2 | cut -d ' ' -f 1 -- ok -[63] $ nfs4acl --get sub/sub2 -- ok -[68] $ su -- ok -[69] $ cd .. -- ok -[70] $ rm -rf d -- ok -28 commands (28 passed, 0 failed) - -*** nfs4acl/chmod.test *** - -[1] $ mkdir d -- ok -[2] $ cd d -- ok -[4] $ whoami -- ok -[7] $ touch a -- ok -[10] $ su bin -- ok -[11] $ chmod 666 a -- ok -[13] $ nfs4acl --set 'bin:rwM::allow' a -- ok -[16] $ su -- ok -[17] $ nfs4acl --set 'bin:rwm::allow' a -- ok -[20] $ su bin -- ok -[21] $ nfs4acl --set 'bin:rwm::allow' a -- ok -[25] $ chmod 666 a -- ok -[26] $ nfs4acl --set 'bin:rwm::allow' a -- ok -[29] $ su -- ok -[30] $ cd .. -- ok -[31] $ rm -rf d -- ok -16 commands (16 passed, 0 failed) - -*** nfs4acl/chown.test *** - -[1] $ mkdir d -- ok -[2] $ cd d -- ok -[4] $ whoami -- ok -[7] $ id -Gn daemon -- ok -[10] $ touch a -- ok -[13] $ su daemon -- ok -[14] $ chown daemon a -- ok -[16] $ chgrp daemon a -- ok -[18] $ nfs4acl --set 'daemon:rwo::allow' a -- ok -[23] $ su -- ok -[24] $ nfs4acl --set 'daemon:rwo::allow' a -- ok -[27] $ su daemon -- ok -[28] $ chown root a -- ok -[30] $ chgrp root a -- ok -[35] $ su -- ok -[36] $ ls -l a | cut -d ' ' -f1 -- ok -[38] $ chmod 660 a -- ok -[42] $ su daemon -- ok -[43] $ chown daemon a -- ok -[45] $ chgrp daemon a -- ok -[47] $ chgrp bin a -- ok -[51] $ su -- ok -[52] $ nfs4acl --set 'daemon:rwo::allow' a -- ok -[56] $ su daemon -- ok -[57] $ chgrp daemon a -- ok -[58] $ chgrp bin a -- ok -[59] $ chown daemon a -- ok -[61] $ su -- ok -[62] $ cd .. -- ok -[63] $ rm -rf d -- ok -30 commands (30 passed, 0 failed) - -*** nfs4acl/computed-mode.test *** - -[1] $ rm -rf d -- ok -[2] $ mkdir d -- ok -[3] $ cd d -- ok -[5] $ mkdir e -- ok -[7] $ nfs4acl --set 'owner@:rwx:f:allow' e -- ok -[8] $ touch e/f -- ok -[9] $ ls -l e/f | cut -d ' ' -f 1 -- ok -[11] $ rm e/f -- ok -[13] $ nfs4acl --set 'group@:rwx:f:allow' e -- ok -[14] $ touch e/f -- ok -[15] $ ls -l e/f | cut -d ' ' -f 1 -- ok -[17] $ rm e/f -- ok -[19] $ nfs4acl --set 'everyone@:rwx:f:allow' e -- ok -[20] $ touch e/f -- ok -[21] $ ls -l e/f | cut -d ' ' -f 1 -- ok -[23] $ rm e/f -- ok -[25] $ nfs4acl --set 'owner@:rwx:f:allow root:rx:f:deny root:rx:f:allow' e -- ok -[26] $ touch e/f -- ok -[27] $ ls -l e/f | cut -d ' ' -f 1 -- ok -[29] $ rm e/f -- ok -[31] $ nfs4acl --set 'owner@:rwx::allow everyone@:w:fi:deny everyone@:rwx:fi:allow' e -- ok -[32] $ touch e/f -- ok -[33] $ ls -l e/f | cut -d ' ' -f 1 -- ok -[35] $ rm e/f -- ok -[37] $ nfs4acl --set 'owner@:rwx::allow root:rx:fi:deny root:rx:fi:allow' e -- ok -[38] $ touch e/f -- ok -[39] $ ls -l e/f | cut -d ' ' -f 1 -- ok -[41] $ rm e/f -- ok -[43] $ nfs4acl --set 'owner@:rx:fi:allow group@:rwx:fi:deny everyone@:rwx:f:allow' e -- ok -[44] $ touch e/f -- ok -[45] $ ls -l e/f | cut -d ' ' -f 1 -- ok -[47] $ rm e/f -- ok -[49] $ nfs4acl --set 'owner@:rx:fi:allow root:rwx:fi:deny everyone@:rwx:f:allow' e -- ok -[50] $ touch e/f -- ok -[51] $ ls -l e/f | cut -d ' ' -f 1 -- ok -[53] $ rm e/f -- ok -[55] $ nfs4acl --set 'everyone@:w:fi:deny root:rx:fi:allow everyone@:rwx:f:allow' e -- ok -[56] $ touch e/f -- ok -[57] $ ls -l e/f | cut -d ' ' -f 1 -- ok -[59] $ rm e/f -- ok -[61] $ cd .. -- ok -[62] $ rm -rf d -- ok -42 commands (42 passed, 0 failed) - -*** nfs4acl/create.test *** - -[1] $ mkdir d -- ok -[2] $ cd d -- ok -[4] $ whoami -- ok -[7] $ mkdir d1 d2 d3 d4 -- ok -[8] $ nfs4acl --set 'daemon:wx::allow' d2 -- ok -[9] $ nfs4acl --set 'daemon:ax::allow' d3 -- ok -[10] $ nfs4acl --set 'daemon:wax::allow' d4 -- ok -[12] $ su daemon -- ok -[15] $ touch d1/f -- ok -[17] $ mkdir d1/d -- ok -[21] $ touch d2/f -- ok -[22] $ mkdir d2/d -- ok -[26] $ touch d3/f -- ok -[28] $ mkdir d3/d -- ok -[31] $ touch d4/f -- ok -[32] $ mkdir d4/d -- ok -[33] $ su -- ok -[34] $ cd .. -- ok -[35] $ rm -rf d -- ok -19 commands (19 passed, 0 failed) - -*** nfs4acl/ctime.test *** - -[1] $ mkdir d -- ok -[2] $ cd d -- ok -[4] $ whoami -- ok -[7] $ touch a b -- ok -[8] $ sleep 1 -- ok -[11] $ su bin -- ok -[12] $ touch a -- ok -[17] $ su -- ok -[18] $ nfs4acl --set 'bin:rw::allow' a -- ok -[20] $ su bin -- ok -[21] $ touch a -- ok -[22] $ [ b -ot a ] || echo 'b should be older than a' -- ok -[23] $ touch -r b a -- ok -[27] $ su -- ok -[28] $ nfs4acl --set 'bin:rwt::allow' a -- ok -[30] $ su bin -- ok -[31] $ touch -r b a -- ok -[32] $ [ b -ot a -o a -ot b ] && echo 'a should be as old as b' -- ok -[34] $ su -- ok -[35] $ cd .. -- ok -[36] $ rm -rf d -- ok -21 commands (21 passed, 0 failed) - -*** nfs4acl/delete.test *** - -[1] $ mkdir d -- ok -[2] $ cd d -- ok -[4] $ whoami -- ok -[7] $ id -Gn daemon -- ok -[10] $ mkdir n1 -- ok -[11] $ touch n1/f -- ok -[13] $ mkdir d2 d3 d4 d5 d6 d7 -- ok -[14] $ touch d2/f d3/f d4/f d5/f d6/f d7/f d7/g -- ok -[15] $ chown daemon d2 -- ok -[16] $ chgrp bin d3 -- ok -[17] $ chmod g+w d3 -- ok -[18] $ nfs4acl --set 'daemon:wx::allow' d4 -- ok -[19] $ nfs4acl --set 'daemon:d::allow' d5 -- ok -[20] $ nfs4acl --set 'daemon:xd::allow' d6 -- ok -[21] $ nfs4acl --set 'daemon:D::allow' d7/f d7/g -- ok -[22] $ chmod 664 d7/g -- ok -[24] $ mkdir s2 s3 s4 s5 s6 s7 -- ok -[25] $ chmod +t s2 s3 s4 s5 s6 s7 -- ok -[26] $ touch s2/f s3/f s4/f s5/f s6/f s7/f s7/g -- ok -[27] $ chown daemon s2 -- ok -[28] $ chgrp bin s3 -- ok -[29] $ chmod g+w s3 -- ok -[30] $ nfs4acl --set 'daemon:wx::allow' s4 -- ok -[31] $ nfs4acl --set 'daemon:d::allow' s5 -- ok -[32] $ nfs4acl --set 'daemon:xd::allow' s6 -- ok -[33] $ nfs4acl --set 'daemon:D::allow' s7/f -- ok -[34] $ nfs4acl --set 'daemon:D::allow' s7/g s7/g -- ok -[35] $ chmod 664 s7/g -- ok -[37] $ su daemon -- ok -[40] $ rm n1/f -- ok -[44] $ rm d2/f s2/f -- ok -[48] $ rm d3/f s3/f -- ok -[53] $ rm d4/f s4/f -- ok -[58] $ rm d5/f s5/f -- ok -[64] $ rm d6/f s6/f -- ok -[68] $ rm d7/f s7/f -- ok -[71] $ rm d7/g s7/g -- ok -[75] $ su -- ok -[76] $ cd .. -- ok -[77] $ rm -rf d -- ok -40 commands (40 passed, 0 failed) - -*** nfs4acl/unrepresentable.test *** - -[4] $ rm -rf d -- ok -[5] $ mkdir d -- ok -[6] $ cd d -- ok -[8] $ touch x -- ok -[10] $ nfs4acl --set 'group@:rw::allow' x -- ok -[11] $ chmod 600 x -- ok -[12] $ ls -l x | cut -d ' ' -f 1 -- ok -[14] $ nfs4acl --get x -- ok -[17] $ rm -f x -- ok -[19] $ cd .. -- ok -[20] $ rm -rf d -- ok -11 commands (11 passed, 0 failed) - -*** nfs4acl/write-vs-append.test *** - -[1] $ mkdir d -- ok -[2] $ cd d -- ok -[4] $ whoami -- ok -[7] $ touch a b c d e f -- ok -[8] $ nfs4acl --set 'owner@:*::allow' a -- ok -[9] $ nfs4acl --set 'owner@:*::allow bin:w::allow' b -- ok -[10] $ nfs4acl --set 'owner@:*::allow bin:a::allow' c -- ok -[11] $ nfs4acl --set 'owner@:*::allow bin:wa::allow' d -- ok -[12] $ nfs4acl --set 'bin:a::deny owner@:*::allow bin:w::allow' e -- ok -[13] $ nfs4acl --set 'bin:w::deny owner@:*::allow bin:a::allow' f -- ok -[15] $ su bin -- ok -[16] $ echo a > a -- ok -[18] $ echo b > b -- ok -[19] $ echo c > c -- ok -[21] $ echo d > d -- ok -[22] $ echo e > e -- ok -[23] $ echo f > f -- ok -[26] $ echo A >> a -- ok -[28] $ echo B >> b -- ok -[30] $ echo C >> c -- ok -[31] $ echo D >> d -- ok -[32] $ echo E >> e -- ok -[34] $ echo F >> f -- ok -[36] $ su -- ok -[37] $ cat a b c d e f -- ok -[45] $ cd .. -- ok -[46] $ rm -rf d -- ok -27 commands (27 passed, 0 failed) diff --git a/tests/xfs/group b/tests/xfs/group index e0c4553..2bc2db4 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -188,7 +188,6 @@ 188 ci dir auto 189 mount auto quick 190 rw auto quick -191 nfs4acl auto 192 auto quick clone 193 auto quick clone 194 rw auto -- 2.5.0 From agruenba@redhat.com Wed Mar 9 06:06:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EDEFC7CA0 for ; Wed, 9 Mar 2016 06:06:56 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 860728F8035 for ; Wed, 9 Mar 2016 04:06:56 -0800 (PST) X-ASG-Debug-ID: 1457525211-04bdf002eb292390001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ktTuHgWknEF7bX5l (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 09 Mar 2016 04:06:51 -0800 (PST) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 6C888A2028 for ; Wed, 9 Mar 2016 12:06:51 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-71.ams2.redhat.com [10.36.4.71]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u29C6ecS005918; Wed, 9 Mar 2016 07:06:49 -0500 From: Andreas Gruenbacher To: xfs@oss.sgi.com Cc: Andreas Gruenbacher Subject: [XFSTESTS v4 4/4] Add richacl tests Date: Wed, 9 Mar 2016 13:06:38 +0100 X-ASG-Orig-Subj: [XFSTESTS v4 4/4] Add richacl tests Message-Id: <1457525199-15355-5-git-send-email-agruenba@redhat.com> In-Reply-To: <1457525199-15355-1-git-send-email-agruenba@redhat.com> References: <1457525199-15355-1-git-send-email-agruenba@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: 1457525211 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add the Rich Access Control List tests from the richacl package. The tests requires SCRATCH_DEV and SCRATCH_MNT to be set. They try to create and mount a scratch filesystem with richacl support; if that fails, the tests will be skipped. Signed-off-by: Andreas Gruenbacher --- Makefile | 2 +- common/rc | 36 +++++++ richacl/Makefile | 23 +++++ richacl/apply-masks | 163 ++++++++++++++++++++++++++++++ richacl/auto-inheritance | 191 ++++++++++++++++++++++++++++++++++++ richacl/basic | 97 ++++++++++++++++++ richacl/chmod | 40 ++++++++ richacl/chown | 42 ++++++++ richacl/create | 36 +++++++ richacl/ctime | 35 +++++++ richacl/delete | 89 +++++++++++++++++ richacl/setrichacl-modify | 57 +++++++++++ richacl/test-lib.sh | 154 +++++++++++++++++++++++++++++ richacl/write-vs-append | 54 ++++++++++ tests/generic/338 | 67 +++++++++++++ tests/generic/339-apply-masks | 1 + tests/generic/340-auto-inheritance | 1 + tests/generic/341-basic | 1 + tests/generic/342-chmod | 1 + tests/generic/343-chown | 1 + tests/generic/344-create | 1 + tests/generic/345-ctime | 1 + tests/generic/346-delete | 1 + tests/generic/347-setrichacl-modify | 1 + tests/generic/348-write-vs-append | 1 + tests/generic/group | 10 ++ 26 files changed, 1105 insertions(+), 1 deletion(-) create mode 100644 richacl/Makefile create mode 100755 richacl/apply-masks create mode 100755 richacl/auto-inheritance create mode 100755 richacl/basic create mode 100755 richacl/chmod create mode 100755 richacl/chown create mode 100755 richacl/create create mode 100755 richacl/ctime create mode 100755 richacl/delete create mode 100755 richacl/setrichacl-modify create mode 100644 richacl/test-lib.sh create mode 100755 richacl/write-vs-append create mode 100755 tests/generic/338 create mode 120000 tests/generic/339-apply-masks create mode 120000 tests/generic/340-auto-inheritance create mode 120000 tests/generic/341-basic create mode 120000 tests/generic/342-chmod create mode 120000 tests/generic/343-chown create mode 120000 tests/generic/344-create create mode 120000 tests/generic/345-ctime create mode 120000 tests/generic/346-delete create mode 120000 tests/generic/347-setrichacl-modify create mode 120000 tests/generic/348-write-vs-append diff --git a/Makefile b/Makefile index 30d8747..3eec26f 100644 --- a/Makefile +++ b/Makefile @@ -57,7 +57,7 @@ TOOL_SUBDIRS += dmapi endif export TESTS_DIR = tests -SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) $(TESTS_DIR) +SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) $(TESTS_DIR) richacl default: include/builddefs $(DMAPI_MAKEFILE) ifeq ($(HAVE_BUILDDEFS), no) diff --git a/common/rc b/common/rc index 16f5a43..155e8b2 100644 --- a/common/rc +++ b/common/rc @@ -1908,6 +1908,42 @@ _require_xfs_db_command() _notrun "xfs_db $command support is missing" } +_setup_scratch_richacl_xfs() +{ + _scratch_mkfs_xfs_supported -m richacl=1 >/dev/null 2>&1 \ + || _notrun "mkfs.xfs doesn't have richacl feature" + + _scratch_mkfs_xfs -m richacl=1 >/dev/null 2>&1 + _scratch_mount >/dev/null 2>&1 \ + || _notrun "kernel doesn't support richacl feature" +} + +__setup_scratch_richacl() +{ + _scratch_mkfs -O richacl >/dev/null 2>&1 \ + || _notrun "can't mkfs $FSTYP with option -O richacl" + _scratch_mount >/dev/null 2>&1 \ + || _notrun "kernel doesn't support richacl feature on $FSTYP" +} + +_setup_scratch_richacl() +{ + GETRICHACL_PROG=`set_prog_path getrichacl` + _require_command "$GETRICHACL_PROG" getrichacl + SETRICHACL_PROG=`set_prog_path setrichacl` + _require_command "$SETRICHACL_PROG" setrichacl + + _require_scratch + case "$FSTYP" in + xfs) _setup_scratch_richacl_xfs + ;; + ext4) __setup_scratch_richacl + ;; + *) _notrun "this test requires richacl support on \$SCRATCH_DEV" + ;; + esac +} + # check that kernel and filesystem support direct I/O _require_odirect() { diff --git a/richacl/Makefile b/richacl/Makefile new file mode 100644 index 0000000..6c25d18 --- /dev/null +++ b/richacl/Makefile @@ -0,0 +1,23 @@ +# +# Copyright (C) 2016 Red Hat, Inc. +# + +TESTS = apply-masks basic chmod chown create delete setrichacl-modify \ + write-vs-append ctime auto-inheritance + +LSRCFILES = test-lib.sh $(TESTS) + +TOPDIR = .. +include $(TOPDIR)/include/builddefs + +TARGET_DIR = $(PKG_LIB_DIR)/richacl + +include $(BUILDRULES) + +install: + $(INSTALL) -m 755 -d $(TARGET_DIR) + $(INSTALL) -m 755 $(TESTS) $(TARGET_DIR) + $(INSTALL) -m 644 test-lib.sh $(TARGET_DIR) + +# Nothing. +install-dev install-lib: diff --git a/richacl/apply-masks b/richacl/apply-masks new file mode 100755 index 0000000..8d3493d --- /dev/null +++ b/richacl/apply-masks @@ -0,0 +1,163 @@ +#! /bin/bash + +. ${0%/*}/test-lib.sh + +require_richacls +use_testdir + +ncheck "touch x" +ncheck "setrichacl --set 'owner@:rwp::allow group@:rwp::allow everyone@:r::allow' x" +check "getrichacl x" < acl.txt" +check "cat acl.txt" </dev/null + rm -rf "$testdir" || exit 2 + fi + mkdir "$testdir" || exit 2 + cd "$testdir" +} + +require_runas() { + if ! $here/src/runas -u 99 -g 99 true ; then + echo "This test must be run as root" >&2 + exit 77 + fi +} + +require_richacls() { + if [ -e $here/src/require-richacls ]; then + $here/src/require-richacls || exit $? + fi + if ! type -f getrichacl setrichacl > /dev/null; then + echo "This test requires the getrichacl and setrichacl utilities" >&2 + exit 77 + fi +} + +require_getfattr() { + if ! type -f getfattr > /dev/null ; then + echo "This test requires the getfattr utility" >&2 + exit 77 + fi +} + +_RUNAS= +runas() { + _start_test -1 runas "$*" + if [ $# = 0 ]; then + _RUNAS= + else + _RUNAS="$here/src/runas $* --" + fi + echo "ok" +} + +if diff -u -L expected -L got /dev/null /dev/null 2> /dev/null; then + eval '_compare() { + diff -u -L expected -L got "$1" "$2" + }' +else + eval '_compare() { + echo "expected:" + cat "$1" + echo "got:" + cat "$2" + }' +fi + +_check() { + local frame=$1 + shift + _start_test "$frame" "$*" + expected=`cat` + if got=`set +x; eval "$_RUNAS $*" 3>&2 &1` && \ + test "$expected" = "$got" ; then + echo "ok" + checks_succeeded="$checks_succeeded + 1" + else + echo "FAILED" + if test "$expected" != "$got" ; then + echo "$expected" > expected~ + echo "$got" > got~ + _compare expected~ got~ + rm -f expected~ got~ + fi + checks_failed="$checks_failed + 1" + fi +} + +check() { + _check 0 "$@" +} + +ncheck() { + _check 0 "$@" < /dev/null +} + +parent_check() { + _check 1 "$@" +} + +parent_ncheck() { + _check 1 "$@" < /dev/null +} + +cleanup() { + status=$? + checks_succeeded=`expr $checks_succeeded` + checks_failed=`expr $checks_failed` + checks_total=`expr $checks_succeeded + $checks_failed` + if test $checks_total -gt 0 ; then + if test $checks_failed -gt 0 && test $status -eq 0 ; then + status=1 + fi + echo "$checks_total tests ($checks_succeeded passed," \ + "$checks_failed failed)" + fi + if test $status = 0 -a -n "$testdir"; then + chmod -R u+rwx "$testdir" 2>/dev/null + cd / && rm -rf "$testdir" + fi + exit $status +} + +if test -z "`echo -n`"; then + if eval 'test -n "${BASH_LINENO[0]}" 2>/dev/null'; then + eval ' + _start_test() { + local frame=$1 + shift + printf "[${BASH_LINENO[2+frame]}] $* -- " + }' + else + eval ' + _start_test() { + shift + printf "* $* -- " + }' + fi +else + eval ' + _start_test() { + shift + printf "* $*\\n" + }' +fi + +if ! type cat > /dev/null 2> /dev/null; then + echo "This test requires the cat utility" >&2 + exit 77 +fi + +export PATH=$here/src:$PATH + +checks_succeeded=0 +checks_failed=0 +trap cleanup 0 diff --git a/richacl/write-vs-append b/richacl/write-vs-append new file mode 100755 index 0000000..3e8c156 --- /dev/null +++ b/richacl/write-vs-append @@ -0,0 +1,54 @@ +#! /bin/bash + +. ${0%/*}/test-lib.sh + +require_runas +require_richacls +use_testdir + +export LC_ALL=C + +ncheck "touch a b c d e f" +ncheck "setrichacl --set 'owner@:rwp::allow' a" +ncheck "setrichacl --set 'owner@:rwp::allow u:99:w::allow' b" +ncheck "setrichacl --set 'owner@:rwp::allow u:99:p::allow' c" +ncheck "setrichacl --set 'owner@:rwp::allow u:99:wp::allow' d" +ncheck "setrichacl --set 'u:99:a::deny owner@:rwp::allow u:99:w::allow' e" +ncheck "setrichacl --set 'u:99:w::deny owner@:rwp::allow u:99:p::allow' f" + +runas -u 99 -g 99 +check "sh -c 'echo a > a' || :" < b' || :" +check "sh -c 'echo c > c' || :" < d' || :" +ncheck "sh -c 'echo e > e' || :" +check "sh -c 'echo f > f' || :" <> a' || :" <> b' || :" <> c' || :" +ncheck "sh -c 'echo D >> d' || :" +check "sh -c 'echo E >> e' || :" <> f' || :" + +runas +check "cat a b c d e f" <$tmp.${file##*/} +if [ ${PIPESTATUS[0]} -eq 0 ]; then + status=0 +else + cat $tmp.${file##*/} +fi diff --git a/tests/generic/339-apply-masks b/tests/generic/339-apply-masks new file mode 120000 index 0000000..4b74f22 --- /dev/null +++ b/tests/generic/339-apply-masks @@ -0,0 +1 @@ +338 \ No newline at end of file diff --git a/tests/generic/340-auto-inheritance b/tests/generic/340-auto-inheritance new file mode 120000 index 0000000..4b74f22 --- /dev/null +++ b/tests/generic/340-auto-inheritance @@ -0,0 +1 @@ +338 \ No newline at end of file diff --git a/tests/generic/341-basic b/tests/generic/341-basic new file mode 120000 index 0000000..4b74f22 --- /dev/null +++ b/tests/generic/341-basic @@ -0,0 +1 @@ +338 \ No newline at end of file diff --git a/tests/generic/342-chmod b/tests/generic/342-chmod new file mode 120000 index 0000000..4b74f22 --- /dev/null +++ b/tests/generic/342-chmod @@ -0,0 +1 @@ +338 \ No newline at end of file diff --git a/tests/generic/343-chown b/tests/generic/343-chown new file mode 120000 index 0000000..4b74f22 --- /dev/null +++ b/tests/generic/343-chown @@ -0,0 +1 @@ +338 \ No newline at end of file diff --git a/tests/generic/344-create b/tests/generic/344-create new file mode 120000 index 0000000..4b74f22 --- /dev/null +++ b/tests/generic/344-create @@ -0,0 +1 @@ +338 \ No newline at end of file diff --git a/tests/generic/345-ctime b/tests/generic/345-ctime new file mode 120000 index 0000000..4b74f22 --- /dev/null +++ b/tests/generic/345-ctime @@ -0,0 +1 @@ +338 \ No newline at end of file diff --git a/tests/generic/346-delete b/tests/generic/346-delete new file mode 120000 index 0000000..4b74f22 --- /dev/null +++ b/tests/generic/346-delete @@ -0,0 +1 @@ +338 \ No newline at end of file diff --git a/tests/generic/347-setrichacl-modify b/tests/generic/347-setrichacl-modify new file mode 120000 index 0000000..4b74f22 --- /dev/null +++ b/tests/generic/347-setrichacl-modify @@ -0,0 +1 @@ +338 \ No newline at end of file diff --git a/tests/generic/348-write-vs-append b/tests/generic/348-write-vs-append new file mode 120000 index 0000000..4b74f22 --- /dev/null +++ b/tests/generic/348-write-vs-append @@ -0,0 +1 @@ +338 \ No newline at end of file diff --git a/tests/generic/group b/tests/generic/group index 727648c..d65341f 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -340,3 +340,13 @@ 335 auto quick metadata 336 auto quick metadata 337 auto quick metadata +339-apply-masks richacl auto +340-auto-inheritance richacl auto +341-basic richacl auto +342-chmod richacl auto +343-chown richacl auto +344-create richacl auto +345-ctime richacl auto +346-delete richacl auto +347-setrichacl-modify richacl auto +348-write-vs-append richacl auto -- 2.5.0 From agruenba@redhat.com Wed Mar 9 06:06:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6BA877CBA for ; Wed, 9 Mar 2016 06:06:59 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3D483304039 for ; Wed, 9 Mar 2016 04:06:59 -0800 (PST) X-ASG-Debug-ID: 1457525213-04cbb00b702b0470001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8bAiV7rUicAl6wsJ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 09 Mar 2016 04:06:54 -0800 (PST) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 5D62864D26 for ; Wed, 9 Mar 2016 12:06:53 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-71.ams2.redhat.com [10.36.4.71]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u29C6ecT005918; Wed, 9 Mar 2016 07:06:52 -0500 From: Andreas Gruenbacher To: xfs@oss.sgi.com Cc: Andreas Gruenbacher Subject: [XFSTESTS v4 4/4] generic/338: Add richacl tests Date: Wed, 9 Mar 2016 13:06:39 +0100 X-ASG-Orig-Subj: [XFSTESTS v4 4/4] generic/338: Add richacl tests Message-Id: <1457525199-15355-6-git-send-email-agruenba@redhat.com> In-Reply-To: <1457525199-15355-1-git-send-email-agruenba@redhat.com> References: <1457525199-15355-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Wed, 09 Mar 2016 12:06:53 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1457525214 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add the Rich Access Control List tests from the richacl package as generic/338. The new test requires SCRATCH_DEV and SCRATCH_MNT to be set. It tries to create and mount a scratch filesystem with richacl support before running the tests; if that fails, the richacl tests will be skipped. Signed-off-by: Andreas Gruenbacher --- Makefile | 2 +- common/rc | 32 ++++++++ richacl/Makefile | 23 ++++++ richacl/apply-masks | 163 +++++++++++++++++++++++++++++++++++++++ richacl/auto-inheritance | 191 ++++++++++++++++++++++++++++++++++++++++++++++ richacl/basic | 97 +++++++++++++++++++++++ richacl/chmod | 40 ++++++++++ richacl/chown | 42 ++++++++++ richacl/create | 36 +++++++++ richacl/ctime | 35 +++++++++ richacl/delete | 89 +++++++++++++++++++++ richacl/setrichacl-modify | 57 ++++++++++++++ richacl/test-lib.sh | 154 +++++++++++++++++++++++++++++++++++++ richacl/write-vs-append | 54 +++++++++++++ tests/generic/338 | 78 +++++++++++++++++++ tests/generic/group | 1 + 16 files changed, 1093 insertions(+), 1 deletion(-) create mode 100644 richacl/Makefile create mode 100755 richacl/apply-masks create mode 100755 richacl/auto-inheritance create mode 100755 richacl/basic create mode 100755 richacl/chmod create mode 100755 richacl/chown create mode 100755 richacl/create create mode 100755 richacl/ctime create mode 100755 richacl/delete create mode 100755 richacl/setrichacl-modify create mode 100644 richacl/test-lib.sh create mode 100755 richacl/write-vs-append create mode 100755 tests/generic/338 diff --git a/Makefile b/Makefile index 30d8747..3eec26f 100644 --- a/Makefile +++ b/Makefile @@ -57,7 +57,7 @@ TOOL_SUBDIRS += dmapi endif export TESTS_DIR = tests -SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) $(TESTS_DIR) +SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) $(TESTS_DIR) richacl default: include/builddefs $(DMAPI_MAKEFILE) ifeq ($(HAVE_BUILDDEFS), no) diff --git a/common/rc b/common/rc index 16f5a43..61e85ad 100644 --- a/common/rc +++ b/common/rc @@ -1908,6 +1908,38 @@ _require_xfs_db_command() _notrun "xfs_db $command support is missing" } +_require_scratch_richacl_xfs() +{ + _scratch_mkfs_xfs_supported -m richacl=1 >/dev/null 2>&1 \ + || _notrun "mkfs.xfs doesn't have richacl feature" + + _scratch_mkfs_xfs -m richacl=1 >/dev/null 2>&1 + _scratch_mount >/dev/null 2>&1 \ + || _notrun "kernel doesn't support richacl feature" + _scratch_unmount +} + +__require_scratch_richacl() +{ + _scratch_mkfs -O richacl >/dev/null 2>&1 \ + || _notrun "can't mkfs $FSTYP with option -O richacl" + _scratch_mount >/dev/null 2>&1 \ + || _notrun "kernel doesn't support richacl feature on $FSTYP" + _scratch_unmount +} + +_require_scratch_richacl() +{ + case "$FSTYP" in + xfs) _require_scratch_richacl_xfs + ;; + ext4) __require_scratch_richacl + ;; + *) _notrun "this test requires richacl support on \$SCRATCH_DEV" + ;; + esac +} + # check that kernel and filesystem support direct I/O _require_odirect() { diff --git a/richacl/Makefile b/richacl/Makefile new file mode 100644 index 0000000..8d19d1a --- /dev/null +++ b/richacl/Makefile @@ -0,0 +1,23 @@ +# +# Copyright (C) 2015 Red Hat, Inc. +# + +TESTS = apply-masks basic chmod chown create delete setrichacl-modify \ + write-vs-append ctime auto-inheritance + +LSRCFILES = test-lib.sh $(TESTS) + +TOPDIR = .. +include $(TOPDIR)/include/builddefs + +TARGET_DIR = $(PKG_LIB_DIR)/richacl + +include $(BUILDRULES) + +install: + $(INSTALL) -m 755 -d $(TARGET_DIR) + $(INSTALL) -m 755 $(TESTS) $(TARGET_DIR) + $(INSTALL) -m 644 test-lib.sh $(TARGET_DIR) + +# Nothing. +install-dev install-lib: diff --git a/richacl/apply-masks b/richacl/apply-masks new file mode 100755 index 0000000..8d3493d --- /dev/null +++ b/richacl/apply-masks @@ -0,0 +1,163 @@ +#! /bin/bash + +. ${0%/*}/test-lib.sh + +require_richacls +use_testdir + +ncheck "touch x" +ncheck "setrichacl --set 'owner@:rwp::allow group@:rwp::allow everyone@:r::allow' x" +check "getrichacl x" < acl.txt" +check "cat acl.txt" </dev/null + rm -rf "$testdir" || exit 2 + fi + mkdir "$testdir" || exit 2 + cd "$testdir" +} + +require_runas() { + if ! $here/src/runas -u 99 -g 99 true ; then + echo "This test must be run as root" >&2 + exit 77 + fi +} + +require_richacls() { + if [ -e $here/src/require-richacls ]; then + $here/src/require-richacls || exit $? + fi + if ! type -f getrichacl setrichacl > /dev/null; then + echo "This test requires the getrichacl and setrichacl utilities" >&2 + exit 77 + fi +} + +require_getfattr() { + if ! type -f getfattr > /dev/null ; then + echo "This test requires the getfattr utility" >&2 + exit 77 + fi +} + +_RUNAS= +runas() { + _start_test -1 runas "$*" + if [ $# = 0 ]; then + _RUNAS= + else + _RUNAS="$here/src/runas $* --" + fi + echo "ok" +} + +if diff -u -L expected -L got /dev/null /dev/null 2> /dev/null; then + eval '_compare() { + diff -u -L expected -L got "$1" "$2" + }' +else + eval '_compare() { + echo "expected:" + cat "$1" + echo "got:" + cat "$2" + }' +fi + +_check() { + local frame=$1 + shift + _start_test "$frame" "$*" + expected=`cat` + if got=`set +x; eval "$_RUNAS $*" 3>&2 &1` && \ + test "$expected" = "$got" ; then + echo "ok" + checks_succeeded="$checks_succeeded + 1" + else + echo "FAILED" + if test "$expected" != "$got" ; then + echo "$expected" > expected~ + echo "$got" > got~ + _compare expected~ got~ + rm -f expected~ got~ + fi + checks_failed="$checks_failed + 1" + fi +} + +check() { + _check 0 "$@" +} + +ncheck() { + _check 0 "$@" < /dev/null +} + +parent_check() { + _check 1 "$@" +} + +parent_ncheck() { + _check 1 "$@" < /dev/null +} + +cleanup() { + status=$? + checks_succeeded=`expr $checks_succeeded` + checks_failed=`expr $checks_failed` + checks_total=`expr $checks_succeeded + $checks_failed` + if test $checks_total -gt 0 ; then + if test $checks_failed -gt 0 && test $status -eq 0 ; then + status=1 + fi + echo "$checks_total tests ($checks_succeeded passed," \ + "$checks_failed failed)" + fi + if test $status = 0 -a -n "$testdir"; then + chmod -R u+rwx "$testdir" 2>/dev/null + cd / && rm -rf "$testdir" + fi + exit $status +} + +if test -z "`echo -n`"; then + if eval 'test -n "${BASH_LINENO[0]}" 2>/dev/null'; then + eval ' + _start_test() { + local frame=$1 + shift + printf "[${BASH_LINENO[2+frame]}] $* -- " + }' + else + eval ' + _start_test() { + shift + printf "* $* -- " + }' + fi +else + eval ' + _start_test() { + shift + printf "* $*\\n" + }' +fi + +if ! type cat > /dev/null 2> /dev/null; then + echo "This test requires the cat utility" >&2 + exit 77 +fi + +export PATH=$here/src:$PATH + +checks_succeeded=0 +checks_failed=0 +trap cleanup 0 diff --git a/richacl/write-vs-append b/richacl/write-vs-append new file mode 100755 index 0000000..3e8c156 --- /dev/null +++ b/richacl/write-vs-append @@ -0,0 +1,54 @@ +#! /bin/bash + +. ${0%/*}/test-lib.sh + +require_runas +require_richacls +use_testdir + +export LC_ALL=C + +ncheck "touch a b c d e f" +ncheck "setrichacl --set 'owner@:rwp::allow' a" +ncheck "setrichacl --set 'owner@:rwp::allow u:99:w::allow' b" +ncheck "setrichacl --set 'owner@:rwp::allow u:99:p::allow' c" +ncheck "setrichacl --set 'owner@:rwp::allow u:99:wp::allow' d" +ncheck "setrichacl --set 'u:99:a::deny owner@:rwp::allow u:99:w::allow' e" +ncheck "setrichacl --set 'u:99:w::deny owner@:rwp::allow u:99:p::allow' f" + +runas -u 99 -g 99 +check "sh -c 'echo a > a' || :" < b' || :" +check "sh -c 'echo c > c' || :" < d' || :" +ncheck "sh -c 'echo e > e' || :" +check "sh -c 'echo f > f' || :" <> a' || :" <> b' || :" <> c' || :" +ncheck "sh -c 'echo D >> d' || :" +check "sh -c 'echo E >> e' || :" <> f' || :" + +runas +check "cat a b c d e f" <$tmp.${file##*/} + if [ ${PIPESTATUS[0]} -ne 0 ]; then + cat $tmp.${file##*/} + failure=true + fi + _scratch_unmount +done + +$failure || status=0 diff --git a/tests/generic/group b/tests/generic/group index 727648c..0388b44 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -340,3 +340,4 @@ 335 auto quick metadata 336 auto quick metadata 337 auto quick metadata +338 richacl auto -- 2.5.0 From jonas.soya05@gmail.com Wed Mar 9 09:52:37 2016 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 A75E97CA0 for ; Wed, 9 Mar 2016 09:52:35 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1F348AC002 for ; Wed, 9 Mar 2016 07:52:31 -0800 (PST) X-ASG-Debug-ID: 1457538747-04cb6c5830274800001-NocioJ Received: from mail-yw0-f195.google.com (mail-yw0-f195.google.com [209.85.161.195]) by cuda.sgi.com with ESMTP id iKg4amknotBtpu7w (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 09 Mar 2016 07:52:27 -0800 (PST) X-Barracuda-Envelope-From: jonas.soya05@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.161.195 Received: by mail-yw0-f195.google.com with SMTP id p65so2853760ywb.3 for ; Wed, 09 Mar 2016 07:52:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:reply-to:date:message-id:subject:from:to; bh=dneSSbAIYigXr994P3XiOh150tBtxDnL6Yc6jh3q5wY=; b=fa7uR3gCA4URRnlLYC+gOsIKOhvcbdopCzAxq9jyVlONCkC8qdZx2fllU2mIDcKjDa 7xWK9piMC1lvoC4WrXJ5XP2RW6zHQg/AOUXieN4z3rhqUS4xHpPJ1ZB5VRnjMtn5dLQi CsqOPTTC1rubfF1Yzhthg9YPBo053tqDsjkZuLsuQUj9fVJD4L7sLMoMD5oSMphDUmJg gGPpWvM6HMeDY0QH363T+Kswm5mBwFLXjIXJAbynmcMpT4A6P9K8YK0cffDbfHW42eqY rkl9KUFO74ek1zZi71l9ventWg2qIKKG+g8WomeFYL+zEVOs8yh0UMzAwHDiziK+i1TO L1fg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:reply-to:date:message-id:subject :from:to; bh=dneSSbAIYigXr994P3XiOh150tBtxDnL6Yc6jh3q5wY=; b=YxVJEQ6Fih4ISHW33nZecv8rq4CJarOG5zxFKMAlPcyeQDCFmN2HMFgoHzO89z3zdQ dxrpTtB66OK8it3bfmS+A1XkbCUtx5j4NL5FfOWaF6wFzpEf/tNLPdt+Dpe/sYgL8scU bVnYLQJ0svOK4hhxvi4ZuqHho4U95yjaoNnpFaQbq8zP/kzGTFk5AU9hDAdvyoXDYyek LkUwcaBr0nY2/qPtz8dSb5rtn3dy9hpGgjbmrfM+ZAV9MjxSL0qOvFGBtYHP3K9Q+his +GGx0JUKfBrTD8Xy/ZvrrjH43vRo5s63B2JYrLsJsc9O2NwUEnbP1EZFhPuMGpwkOf7o tjrw== X-Gm-Message-State: AD7BkJL0W9MffQVHbnHi+LJRLdPOvGKLcjzCA0P0hu8QggaY5cTRbkgYpNSFNR3DTQ0rrnYToJzkl33VwacgHw== MIME-Version: 1.0 X-Received: by 10.129.72.78 with SMTP id v75mr20499940ywa.78.1457538746928; Wed, 09 Mar 2016 07:52:26 -0800 (PST) Received: by 10.37.98.22 with HTTP; Wed, 9 Mar 2016 07:52:26 -0800 (PST) Reply-To: jonas.soya1@gmail.com Date: Wed, 9 Mar 2016 23:52:26 +0800 Message-ID: Subject: ASSISTANT From: Jonas Soya X-ASG-Orig-Subj: ASSISTANT To: undisclosed-recipients:; Content-Type: multipart/mixed; boundary=001a114dcb02420ec1052d9fafb7 X-Barracuda-Connect: mail-yw0-f195.google.com[209.85.161.195] X-Barracuda-Start-Time: 1457538747 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/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 --001a114dcb02420ec1052d9fafb7 Content-Type: multipart/alternative; boundary=001a114dcb02420ebb052d9fafb5 --001a114dcb02420ebb052d9fafb5 Content-Type: text/plain; charset=UTF-8 --001a114dcb02420ebb052d9fafb5 Content-Type: text/html; charset=UTF-8

--001a114dcb02420ebb052d9fafb5-- --001a114dcb02420ec1052d9fafb7 Content-Type: image/jpeg; name="Jonas Soya.jpg" Content-Disposition: attachment; filename="Jonas Soya.jpg" Content-Transfer-Encoding: base64 X-Attachment-Id: f_ijwendub0 /9j/4AAQSkZJRgABAgEBLAEsAAD/4RAPRXhpZgAATU0AKgAAAAgACAESAAMAAAABAAEAAAEaAAUA AAABAAAAbgEbAAUAAAABAAAAdgEoAAMAAAABAAIAAAExAAIAAAAcAAAAfgEyAAIAAAAUAAAAmgE7 AAIAAAAFAAAArodpAAQAAAABAAAAtAAAAOAALcbAAAAnEAAtxsAAACcQQWRvYmUgUGhvdG9zaG9w IENTNCBXaW5kb3dzADIwMTU6MTE6MDUgMTI6MTI6NTcAVXNlcgAAAAOgAQADAAAAAQABAACgAgAE AAAAAQAAB/ygAwAEAAAAAQAABJcAAAAAAAAABgEDAAMAAAABAAYAAAEaAAUAAAABAAABLgEbAAUA AAABAAABNgEoAAMAAAABAAIAAAIBAAQAAAABAAABPgICAAQAAAABAAAOyQAAAAAAAABIAAAAAQAA AEgAAAAB/9j/4AAQSkZJRgABAgAASABIAAD/7QAMQWRvYmVfQ00AAf/uAA5BZG9iZQBkgAAAAAH/ 2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgTExUTExgRDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwM DAwMDAwMDAwMDAwBDQsLDQ4NEA4OEBQODg4UFA4ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwMDAwM DAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIAFwAoAMBIgACEQEDEQH/3QAEAAr/xAE/AAABBQEBAQEB AQAAAAAAAAADAAECBAUGBwgJCgsBAAEFAQEBAQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAQQBAwIE AgUHBggFAwwzAQACEQMEIRIxBUFRYRMicYEyBhSRobFCIyQVUsFiMzRygtFDByWSU/Dh8WNzNRai soMmRJNUZEXCo3Q2F9JV4mXys4TD03Xj80YnlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vY3R1dn d4eXp7fH1+f3EQACAgECBAQDBAUGBwcGBTUBAAIRAyExEgRBUWFxIhMFMoGRFKGxQiPBUtHwMyRi 4XKCkkNTFWNzNPElBhaisoMHJjXC0kSTVKMXZEVVNnRl4vKzhMPTdePzRpSkhbSVxNTk9KW1xdXl 9VZmdoaWprbG1ub2JzdHV2d3h5ent8f/2gAMAwEAAhEDEQA/APR879qi5rsLYawwy10QX7m/zn5+ 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 6jdzSA5siQXfRB/rJvXp936RvtEu1GgADtx/svYqzui9LfkNyXYzDe2z1hZrO+d2/n95QZ0HpNbi 5mM0SyysiXRttLX3N2btvv2M/sfo/wCbSU3mWVvEscHA8EEFSVXE6ZhYVtluLWKnXBjXgcQzds9v /XHq0kp//9P1Ta3dugboie8J1Wy+o4eG9jMmz0/UEtcWu2gB1dXvta306/0l9Tf0j1B/WOlsfsfl 1BwLgRvGhYLH2b/3NjaLfpf6NJTcSSSSUpM5rXNLXAFpEEHUEFOkkpSYgEEESDoQU6SSli0OEOAI 8CmaxjZLWhu4y6BEnxKkkkpSYgGJExqE6SSlJJJJKUkkkkpSSSSSlJJJJKf/1PTr/sRexuQKy9wI rFm2SCWbg3f/AMJ6P/gaqmjoFdBs9PFbRU1124Nr2tYW7rbtPzHVO97/APRqPV/2HvZ+1ds7HbN+ 7bs09f6Ps2fR+0f8H/Pfo1Xp/wCbP2q30I+0w/f6fqbo2v8AU2bPzdvqfzX+E/4VJTqUvw6qxVU9 jGMIYGbvok/Rrh30XfyEdc43/mbuq2ent2j0437Y9XG9L/rf2j7P6X+C/n/+7S6NJSkkkklKSSSS UpJJJJSkkkklKSSSSUpJJJJSkkkklKSSSSU//9n/7RUAUGhvdG9zaG9wIDMuMAA4QklNBAQAAAAA ABAcAgAAAgBhHAJQAARVc2VyOEJJTQQlAAAAAAAQWx+JwNbv/fnv6U/L7CsYBzhCSU0D7QAAAAAA EAEsAAAAAQABASwAAAABAAE4QklNBCYAAAAAAA4AAAAAAAAAAAAAP4AAADhCSU0EDQAAAAAABAAA AHg4QklNBBkAAAAAAAQAAAAeOEJJTQPzAAAAAAAJAAAAAAAAAAABADhCSU0nEAAAAAAACgABAAAA AAAAAAI4QklNA/UAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAA AAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA/gAAAAAAHAAAP////////////// //////////////8D6AAAAAD/////////////////////////////A+gAAAAA//////////////// /////////////wPoAAAAAP////////////////////////////8D6AAAOEJJTQQAAAAAAAACAAA4 QklNBAIAAAAAAAIAADhCSU0EMAAAAAAAAQEAOEJJTQQtAAAAAAAGAAEAAAACOEJJTQQIAAAAAAAQ AAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAA2EAAAAGAAAAAAAAAAAA AASXAAAH/AAAABYAQwBvAG0AcABsAGkAbQBlAG4AdABzACAAbwBmACAAdABoAGUAIABkAGEAeQAA AAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAH/AAABJcAAAAAAAAAAAAAAAAAAAAAAQAA AAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAA AAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAA BJcAAAAAUmdodGxvbmcAAAf8AAAABnNsaWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAA ABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAAB2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAA DEVTbGljZU9yaWdpbgAAAA1hdXRvR2VuZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUA AAAASW1nIAAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAA AABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAASXAAAAAFJnaHRsb25nAAAH/AAAAAN1cmxURVhU AAAAAQAAAAAAAG51bGxURVhUAAAAAQAAAAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRhZ1RFWFQA AAABAAAAAAAOY2VsbFRleHRJc0hUTUxib29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAAAAAJaG9y ekFsaWduZW51bQAAAA9FU2xpY2VIb3J6QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxpZ25lbnVt AAAAD0VTbGljZVZlcnRBbGlnbgAAAAdkZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAAABFFU2xp Y2VCR0NvbG9yVHlwZQAAAABOb25lAAAACXRvcE91dHNldGxvbmcAAAAAAAAACmxlZnRPdXRzZXRs b25nAAAAAAAAAAxib3R0b21PdXRzZXRsb25nAAAAAAAAAAtyaWdodE91dHNldGxvbmcAAAAAADhC SU0EKAAAAAAADAAAAAI/8AAAAAAAADhCSU0EFAAAAAAABAAAAAI4QklNBAwAAAAADuUAAAABAAAA oAAAAFwAAAHgAACsgAAADskAGAAB/9j/4AAQSkZJRgABAgAASABIAAD/7QAMQWRvYmVfQ00AAf/u AA5BZG9iZQBkgAAAAAH/2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgTExUTExgRDAwMDAwMEQwM DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBDQsLDQ4NEA4OEBQODg4UFA4ODg4UEQwMDAwMEREM DAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIAFwAoAMBIgACEQEDEQH/3QAE AAr/xAE/AAABBQEBAQEBAQAAAAAAAAADAAECBAUGBwgJCgsBAAEFAQEBAQEBAAAAAAAAAAEAAgME BQYHCAkKCxAAAQQBAwIEAgUHBggFAwwzAQACEQMEIRIxBUFRYRMicYEyBhSRobFCIyQVUsFiMzRy gtFDByWSU/Dh8WNzNRaisoMmRJNUZEXCo3Q2F9JV4mXys4TD03Xj80YnlKSFtJXE1OT0pbXF1eX1 VmZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3EQACAgECBAQDBAUGBwcGBTUBAAIRAyExEgRBUWFxIhMF MoGRFKGxQiPBUtHwMyRi4XKCkkNTFWNzNPElBhaisoMHJjXC0kSTVKMXZEVVNnRl4vKzhMPTdePz RpSkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2JzdHV2d3h5ent8f/2gAMAwEAAhEDEQA/APR879qi 5rsLYawwy10QX7m/zn5+30t/pelZV+l/nf0arPP1nO1gGLLwSbGbgGRt9n6Rz9/52yz0f69dC10k lOXP1llojDhx9xiz26cbd/6T+v8Ao/8Ai/0nqVIO+sYrcNmM63cNhO4Ngm3cI3f4Nv2b3/8AHfov 9LqJJKcgs+s1Y/R2Y9xaxjR6jS3c7bX6tx9It93qtv8A0X6Kv9JX/N7FK5/1kZkWmmvHsoL4rDiQ Q32tae3u9/q2f8V6Vf8ApbNVJJTFhLmhxaWEgEtMSP5J2lzVJJJJSkkkklKSSSSUpJJJJSkkkklK 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 gEEESDoQU6SSli0OEOAI8CmaxjZLWhu4y6BEnxKkkkpSYgGJExqE6SSlJJJJKUkkkkpSSSSSlJJJ JKf/1PTr/sRexuQKy9wIrFm2SCWbg3f/AMJ6P/gaqmjoFdBs9PFbRU1124Nr2tYW7rbtPzHVO97/ APRqPV/2HvZ+1ds7HbN+7bs09f6Ps2fR+0f8H/Pfo1Xp/wCbP2q30I+0w/f6fqbo2v8AU2bPzdvq fzX+E/4VJTqUvw6qxVU9jGMIYGbvok/Rrh30XfyEdc43/mbuq2ent2j0437Y9XG9L/rf2j7P6X+C /n/+7S6NJSkkkklKSSSSUpJJJJSkkkklKSSSSUpJJJJSkkkklKSSSSU//9kAOEJJTQQhAAAAAABV AAAAAQEAAAAPAEEAZABvAGIAZQAgAFAAaABvAHQAbwBzAGgAbwBwAAAAEwBBAGQAbwBiAGUAIABQ AGgAbwB0AG8AcwBoAG8AcAAgAEMAUwA0AAAAAQA4QklNBAYAAAAAAAcACAAAAAEBAP/hE1dodHRw Oi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1w Q2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8i IHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDQuMi4yLWMwNjMgNTMuMzUyNjI0LCAyMDA4LzA3LzMw LTE4OjEyOjE4ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3Jn LzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0i IiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnBkZj0iaHR0 cDovL25zLmFkb2JlLmNvbS9wZGYvMS4zLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9l bGVtZW50cy8xLjEvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21t LyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJj ZUV2ZW50IyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9S ZXNvdXJjZVJlZiMiIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3No b3AvMS4wLyIgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iIHhtbG5z OmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIiB4bXA6Q3JlYXRlRGF0ZT0iMjAx NS0xMS0wNVQwNDoxMToyNVoiIHhtcDpDcmVhdG9yVG9vbD0iTWljcm9zb2Z0wq4gT2ZmaWNlIFdv cmQgMjAwNyIgeG1wOk1vZGlmeURhdGU9IjIwMTUtMTEtMDVUMTI6MTI6NTcrMDg6MDAiIHhtcDpN ZXRhZGF0YURhdGU9IjIwMTUtMTEtMDVUMTI6MTI6NTcrMDg6MDAiIHBkZjpQcm9kdWNlcj0iTWlj cm9zb2Z0wq4gT2ZmaWNlIFdvcmQgMjAwNyIgZGM6Zm9ybWF0PSJpbWFnZS9qcGVnIiB4bXBNTTpJ bnN0YW5jZUlEPSJ4bXAuaWlkOkUzRTQ5QTdFNzM4M0U1MTE5RDI2QjY4MTRCODRFRTEzIiB4bXBN TTpEb2N1bWVudElEPSJ4bXAuZGlkOkUyRTQ5QTdFNzM4M0U1MTE5RDI2QjY4MTRCODRFRTEzIiB4 bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6RTJFNDlBN0U3MzgzRTUxMTlEMjZCNjgx NEI4NEVFMTMiIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJz UkdCIElFQzYxOTY2LTIuMSIgdGlmZjpPcmllbnRhdGlvbj0iMSIgdGlmZjpYUmVzb2x1dGlvbj0i MzAwMDAwMC8xMDAwMCIgdGlmZjpZUmVzb2x1dGlvbj0iMzAwMDAwMC8xMDAwMCIgdGlmZjpSZXNv bHV0aW9uVW5pdD0iMiIgdGlmZjpOYXRpdmVEaWdlc3Q9IjI1NiwyNTcsMjU4LDI1OSwyNjIsMjc0 LDI3NywyODQsNTMwLDUzMSwyODIsMjgzLDI5NiwzMDEsMzE4LDMxOSw1MjksNTMyLDMwNiwyNzAs MjcxLDI3MiwzMDUsMzE1LDMzNDMyOzExNzAwMjgzMUIxMTVBRUJBQzg1MENENTQ0NDQ5MzI2IiBl eGlmOlBpeGVsWERpbWVuc2lvbj0iMjA0NCIgZXhpZjpQaXhlbFlEaW1lbnNpb249IjExNzUiIGV4 aWY6Q29sb3JTcGFjZT0iMSIgZXhpZjpOYXRpdmVEaWdlc3Q9IjM2ODY0LDQwOTYwLDQwOTYxLDM3 MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQwOTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3 LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3 MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3 LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQxNzI4LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQx OTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2 LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwy MywyNCwyNSwyNiwyNywyOCwzMDtBOUIyQzRFNTVCNDI0NDIyQTJGNzdENkRGREU4MzUwRiI+IDxk YzpjcmVhdG9yPiA8cmRmOlNlcT4gPHJkZjpsaT5Vc2VyPC9yZGY6bGk+IDwvcmRmOlNlcT4gPC9k YzpjcmVhdG9yPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9u PSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpFMkU0OUE3RTczODNFNTExOUQyNkI2 ODE0Qjg0RUUxMyIgc3RFdnQ6d2hlbj0iMjAxNS0xMS0wNVQxMjoxMjo1NyswODowMCIgc3RFdnQ6 c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNCBXaW5kb3dzIiBzdEV2dDpjaGFuZ2Vk PSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJj b252ZXJ0ZWQgZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL2pw ZWciLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAu aWlkOkUzRTQ5QTdFNzM4M0U1MTE5RDI2QjY4MTRCODRFRTEzIiBzdEV2dDp3aGVuPSIyMDE1LTEx LTA1VDEyOjEyOjU3KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3Ag Q1M0IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rv cnk+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkUyRTQ5QTdF NzM4M0U1MTE5RDI2QjY4MTRCODRFRTEzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkUyRTQ5 QTdFNzM4M0U1MTE5RDI2QjY4MTRCODRFRTEzIiBzdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ9Inht cC5kaWQ6RTJFNDlBN0U3MzgzRTUxMTlEMjZCNjgxNEI4NEVFMTMiLz4gPC9yZGY6RGVzY3JpcHRp b24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg 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 ICAgICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0IGVuZD0idyI/Pv/iDFhJQ0NfUFJPRklM RQABAQAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEAAGFjc3BNU0ZUAAAAAElFQyBz UkdCAAAAAAAAAAAAAAABAAD21gABAAAAANMtSFAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAA FGJrcHQAAAIEAAAAFHJYWVoAAAIYAAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJU AAAAcGRtZGQAAALEAAAAiHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMA AAQMAAAAJHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRl eHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55AABkZXNjAAAA AAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81EA AQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAA YpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbPZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cu aWVjLmNoAAAAAAAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVm YXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVm YXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAA AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAA AAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3MAAQTCwADXJ4AAAABWFlaIAAA AAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAACjwAAAAJzaWcgAAAA AENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBe AGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA 8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGp AbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqIC rAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APs A/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcF hgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdh B3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8J pAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwq DEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkP JQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJk EoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMW JhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoq GlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQe vh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOU I8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQp Bik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63 Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1 EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuq O+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC 90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9 SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxS x1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtF W5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBk lGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4S bmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4 bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0 g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+O Zo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8 mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqm i6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4 s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/er/1wHDA 7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62 zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDd lt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG 7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8 mP0p/br+S/7c/23////uAA5BZG9iZQBkQAAAAAH/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQECAQEBAQEBAgICAgICAgICAgICAgIDAwMDAwMDAwMDAwMDAwMBAQEBAQEBAgEBAgMCAgID AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA//AABEIBJcH /AMBEQACEQEDEQH/3QAEAQD/xAGiAAAABgIDAQAAAAAAAAAAAAAHCAYFBAkDCgIBAAsBAAAGAwEB AQAAAAAAAAAAAAYFBAMHAggBCQAKCxAAAgEDBAEDAwIDAwMCBgl1AQIDBBEFEgYhBxMiAAgxFEEy IxUJUUIWYSQzF1JxgRhikSVDobHwJjRyChnB0TUn4VM2gvGSokRUc0VGN0djKFVWVxqywtLi8mSD dJOEZaOzw9PjKThm83UqOTpISUpYWVpnaGlqdnd4eXqFhoeIiYqUlZaXmJmapKWmp6ipqrS1tre4 ubrExcbHyMnK1NXW19jZ2uTl5ufo6er09fb3+Pn6EQACAQMCBAQDBQQEBAYGBW0BAgMRBCESBTEG ACITQVEHMmEUcQhCgSORFVKhYhYzCbEkwdFDcvAX4YI0JZJTGGNE8aKyJjUZVDZFZCcKc4OTRnTC 0uLyVWV1VjeEhaOzw9Pj8ykalKS0xNTk9JWltcXV5fUoR1dmOHaGlqa2xtbm9md3h5ent8fX5/dI WGh4iJiouMjY6Pg5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6vr/2gAMAwEAAhEDEQA/AN/j37r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3X//0N/j37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3X//0d/j37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3X//0t/j37r3Xvfuvde9+691737r3Xvfuvde9+691737r3VSHyI/ nwfyifixumu2T3J85+o6LdmKqHo8xgOvaTfHeOSwdfDL4Z8bnoOjsTuP7GqibialqzHLHzrRbH37 r3Sk+NH87L+VP8vdyYnZnQvzd6b3HvTcFZHjtubL3dU7i6g3luXJzMUhxe2tp9yY/b+QyNU9iUpq KmllYAsEIF/fuvdWl+/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917rXp/n0/zxs/8AyZKX4sjbnxzw/ftd8kajuoyyZvsyt6+pdo0vTse1A6Rw 0GEyz1smQfdSEMZIBAKVhpmMwMXuvdXc/H3tZO9+heke8I8E2107l6i627WTbL5IZl9up2Jsyi3e uCbLrBSirNIKz7c1IpofLo1+KPVoHuvdVSYf/hQT/Lmzn8waq/lr0O7eyj35S9tZjoc7gl2A0fVE 3cWBrpcJk9gQ7r+8NZ93HlIJ8QJ3xa0rVaGNagoUkb3XuruPfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvdaon84D/hUh1R/Ls75zfxI+P/AEXN8ovkBtFcfRdj ZCu3nJs/rXrrc2aoVrsZs5JMTQZPIbgzMUctM2RoKUUcNOZlg+9esjqKaD3Xulj/ACYP+FBnb/8A Mg+U+7Ph78jPhTkPjL2Vhum9w9z4PcVLn91/YZTE7d3PicBU4bKbH3xh6GvovImXimp8jHkJ45Gi aMwx61Ye691tFe/de697917r3v3Xuve/de61jO9P+FDmd6b/AJ322v5RUXxWxOf27lu1egOqK7vG Tt2sx2ajre+OtNv7/g3BSbFXbs0Aixb7igpmpHyhapFNI4ngM6rD7r3Wzn7917r3v3Xuve/de697 917r3v3Xuve/de697917r3v3Xuve/de697917qg3+e9/OrzX8mvY/wAdtx7f+PWL78yXfe6OwcGI cz2TV9e0O1aXr/F4rITz6aLC5eStkrGy0aINUAiETE+UuAnuvdW6/FHvNPk/8W/jX8lo9sNslPkP 0D053mmzHzI3E+0U7a67x2/l2w24FpaEV5oBkPtDWCip/N4/J4ItXjX3Xuh99+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvdf/T3+Pfuvde9+691737r3Xvfuvd e9+691737r3Xz6/+FNf84X5Bdx/Jum/k5fArMbkiafObX6375yfXGQam3l3J272J4KXEfHnA5ehk QwYeiSupafPolQjVmQmmx9X4abH1CVnuvdHP+An/AAjg+H+xerNubg/mA7p353p3lnMXSV+6di9f b1r+vuntg1lXRa5ts4fJbbSHO5qoo5ZCs2XkyVNBO0a+KgiQM03uvdKD5k/8Iz/g12Ts/MZH4Ydl dofGztOmx8jbcwm99yVPbHTWXr4lMkNJuGnzUL7movuGAiavpMzULApMgx9SV8be691fJ/Ju6E+X Xxg/l5dHdC/N/dsO9e/es6rsfbeRzsW85+wml2PS9lZY9Z053hVIk1XFHgTQCiE/70FJ9vTTLFLC 8EXuvdWg+/de6TtLu/addmJ9vUW6Nu1m4KVp0qcHS5vG1GYp3pTapWfGQymdDGf84GQafzb37r3S i9+691737r3XvfuvdMsW5Nuz5qo21Dn8LNuKjhWoq8BFlKGTNUtO0ccyz1GKSQzohSWJwzRgWdTe zC/uvdPXv3XumWXcm3YM1T7amz+Fh3FWQtUUmAlylDHmqqnWOSZp6fFPIJ3QJFK5ZYyLIxvZTb3X unr37r3Xvfuvde9+690x0O59tZPJ12Exu4cHkMzi/J/E8RQ5agq8njvFKIJfvqCnkaWHS5CN5EFm IB5Pv3Xunz37r3WgH/wuc/7pd/8Al7P/AMyP37r3W57/AC9v+yBfg9/4qB8af/fMYX37r3VbGE/4 Tn/y9sD/ADHKv+ZxRVXfDd2VfdGb+Qv+juo7A20/SUHce4MpNuTJb0gwKYBdweRsxPNmFpJNzNSL UuVEH2wWnX3Xur5vfuvde9+690yxbk27PmqjbUOfws24qOFairwEWUoZM1S07RxzLPUYpJDOiFJY nDNGBZ1N7ML+6909e/de6ZZdybdgzVPtqbP4WHcVZC1RSYCXKUMeaqqdY5Jmnp8U8gndAkUrlljI sjG9lNvde6evfuvde9+691DyGRx+JoqjJZWuo8Zj6OMzVdfkKmGjoqWIGxlqKqpZURbkDUzAe/de 6j4fOYXcNEuSwGYxecx7SSQrX4fIUmTomliNpYlqqJ3Qsp4ZdVx+ffuvdOnv3Xuve/de6b8rlsVg 6CfK5vJ4/D4yl8X3ORytbTY+gp/PMtPD56yrZI01yOka6mF2YKOSB7917rNRV1Fk6OmyGNrKXIUF ZDHUUddRVEVXR1VPKuqKemqYCyOjDlWViCPoffuvdSvfuvdaCP8AMk/mI/OPrL/hUT8cPi7198o+ 4tn/AB0y/wAkf5eOxMx0rgd2VlB1vmNqdrZbaUPYmJzG1YrUtUMquWr1qZqiN5bSDRIvih8fuvdb 93v3Xuve/de6Y59z7apczTbcqdw4On3DWRiajwM+WoIczVRMrsJabFySCd1IjkIZUIsrf0Nvde6f Pfuvde9+691737r3XvfuvdJ1d37TfOHa6bo26+5QzodvLm8a2cDx0prZFOJEv3F1hBmI8fCAufTz 7917pRe/de697917r5lf/CfnBYr5C/8AClz5L9p9p0FHuTde1twfN3vPCzVsH3dLQdh5TtYbVXMU 0Fc0pVqWm3DX/ZFmZoX8ToweNWHuvdfTMakpXqoa56aneupqeppKesaGNqqClrZIZqymhqCNaxzP TwPKikBjHGWBKLb3XupHv3XugZ+Ru4s1tD49d8bs21kJsTuLa/TPaG4sBlacRtUYzNYTZFdksVkI FmVkLwzxRyKHUi4FwRx7917rTd/4SC/PD5k/MLf/AM6sJ8pfkn2337jNkbT6JzOz6btLduQ3d/dj I7gzW6KTNTYObKl5KZaqOlp1miidY28aErdQffuvdbxHv3XuvmifOH/uNH2V/wCLf/y9v/gcutPf uvdfSnzGcwu3qJsln8xi8Hj1kjhavzGQpMZRLLKbRRNVVrogZjwq6rn8e/de6nU9RT1lPBV0k8NV S1UMVRTVNPKk9PUU86CWGeCaIlXR1IZWUkEEEG3v3Xus3v3Xuve/de6T9HuzauQy9Vt+g3Nt+uz1 D5/vcJR5nHVOXo/tnEVT91jYZGmj8bMqvrQaSQDYn37r3Sg9+691737r3Xvfuvde9+690xvufbUe bh2zJuHBx7kqIzNBt98tQLm54lgaqMsOJaTzsoiR5CyxkaVZvoCffuvdaL//AAuL/wCZV/y7f/Eg fI7/AN5zZ/v3Xutr3+U7/wBusv5af/igHw3/APgddue/de6P/wC/de6TtDu/aeUy1XgcbujbuRzt A1SldhaHN42ry1G9FN9vWLV46nlaaMwyHxyh0GlvS1jx7917pRe/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu ve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697 917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3X uve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69 7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de6/9Tf49+691737r3Xvfuvde9+691737r3SZ3ruvF7D2bu3fGc do8JszbOe3XmJE0h0xe3cVLl8g6lyFuIYXIuQP6n37r3XzAv+ErWxa75mfzvOwPk927FHuTdXXvX ffvyty2Urkeanq+3+zN60GyjkHR9QaoL7wy2Rp2kvokgEoYSxoffuvdfUj9+691737r3THufcuB2 ZtvcO8N1ZWjwW19qYPLbl3JnMhL4cfhsDgqCTKZjK103OiGnp4pJpWtwqk+/de6+aR2982/5mv8A wp5+d24viT8M997k+O/wv23Hk8vNg03Bm9obUxXUeEyyYyTtn5FZLaaiuz+YzM0tKMXtPXNR087w U9PGvgyOaf3Xujl7y/4RB7jwmwpMx1F/MUp8n3ThaOPJ4Oi3b8f6vZmx8tuOkAnpKQbp27u7LZTC RiYKyZCPH5CRNIIprtdPde6Qv8j/APnDfOH4L/zC4/5QP8zjd+6t67cyvZydBbXznZ+4Kjdm9ekO 4aqRcf13RYXsGvaarzWzt0yy46hx8dVUTQQR1ePr8dLT0Zqoqn3Xutwv+dHV1VD/ACl/5i9VRVNR R1UXxA7y8VTSzSU88evY1XG/jmhIYXUlTY8gkfQ+/de6+ct/Ju7o/mr/ACa+PWV/k9/y18pVdQUG /u8t9/In5E/J2l3FlNvVmwuqd07I2h11BtiXeGPges23jI6zB1NZP/AC+XzFRWJSUwgpYcgKz3Xu j1/zEf8AhKB358E/jVvf5t/H/wCaGa757B6Hwtd212ph/wDRzmOqN9RYbBj+L727H673lidy5uol qcTD9zlqyCsMExpYKidKt6hUp5fde6TvxH/nv/zmPn/8ceof5VvxSGY3P81d07g3di91/M/Ibgio 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 NuOmq6uoOyO9Pjjmos3tquopXbRRxZDEVmNlpKONQsk2OyM51GWS3uvdb8vw8+SW0/mF8WPj/wDK HZJhTb3efVOzuxIaGGR5v4Hk87iI5txbXnkkAJnxORFXjKjj/OwPYkWJ917rV5/4WXfMuo6c+C3U fxI2tnJsduv5adnS5XeFNQ17wzz9M9LRU2dzeOyFPTEOsVfuPIbbMRlIjmSkqowkmlzH7r3VtP8A wnl+I2V+Gn8pT4p7A3P/ABCPfPZG16r5Cb5ocg9Qr4XM93VA3riNuJjqnmjkxuEmxNBW0w4+8hqZ SFaVlHuvdXXe/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r//V3+Pfuvde9+691737r3Xvfuvde9+690FPe+0c n2B0f3LsPChTmd7dU9ibRxIe2g5Pcm0KzDUAbUVFvLMl7sP9ce/de6+bB/wi539h9r/zNe8dhZmS GiyXYvw+3vS7dapqRBPV53aPau0c9U4KmonS8kr44ZCtYhwUSkf0sGJT3Xuvp6+/de697917qnn/ AIUAb+z3Wv8AJq/mCbk23VVFFkq3ouo2NLPS1H20ww3aO68Z1nuSEShX9MuOy9XE6gAsrFQyk6h7 r3VBX/CInrrb2P8Ait82e2oaaH+9e7vkDsjrrJVhgH3H93uu+uU3LhaYVJYnR9zujIOUCjmxJbgL 7r3W737917r5e3/CvChi6K/nRdP9w7ESHG7yz3xi+Pnd9ZX00clJPLvjZHbG7tj4PJVNTDJreWOi 2niollUoypEiAXQMfde63yv51v8A26P/AJjX/ioHeH/vE1Xv3Xutbv8A4RCU9Ovxh+ctWsEK1U3f PWtPNUrEgqJael69qJKaCWYDUyRtNKyKTZS7kAFjf3Xutvn5f0VJkviX8osdkKaGsoK/4692UVbS VEay09VSVXWmTgqaaeJ+GR0ZlZTwQSPfuvdaI/8Awh2p6du2/wCYbVtBC1VB1z8eKeGpaJDUQ09V ubdktTBFMRqVJGhiaRQbMUQkEqtvde6+iF7917r5n3/CPanp8f8AzlPmBjaCCGhx1J8Ou/aeloKO JKaipqej+U/WdPSQU9LCFjRIo/RGqqAq8KAPfuvdbIf/AAry/wC3Nu9P/FgOif8A3eVXv3Xulx/w k5pKWm/kn/H2anpqeCav7I+QtXXSwwxxSVtUncuXoUqat0AMkggghhDuSQkaJfSqge691sZZzC4n cuFzG3M9QU+VwefxeQwuZxlWnkpcjicrSPQ5GgqU41RzQyPG4vyCffuvdfMe/wCEfFZkdgfzhe9+ usZWNVYOv+K3d+1sj90JFaqj2l3Js6txWUWGB1jWpVqUoGZXVY5plUAsGX3Xuj8/8LnP+6Xf/l7P /wAyP37r3W57/L2/7IF+D3/ioHxp/wDfMYX37r3WgF1p/wBxo2S/8XA7Z/8AgdMz7917rd9/nW/9 uj/5jX/ioHeH/vE1Xv3Xutbv/hEJT06/GH5y1awQrVTd89a081SsSColp6Xr2okpoJZgNTJG00rI pNlLuQAWN/de62+fl/RUmS+Jfyix2Qpoaygr/jr3ZRVtJURrLT1VJVdaZOCppp4n4ZHRmVlPBBI9 +691oj/8Idqenbtv+YbVtBC1VB1z8eKeGpaJDUQ09VubdktTBFMRqVJGhiaRQbMUQkEqtvde6+iF 7917r5n3/CPanp8f/OU+YGNoIIaHHUnw679p6Wgo4kpqKmp6P5T9Z09JBT0sIWNEij9EaqoCrwoA 9+690ff/AIXH74zmP6+/lxda087Ltvdm8vk9vjLUwYBJs517hNi4Db87Jbkxwbnyag6hbWeDfj3X ugn+D382b/hQN0h8OPi51P8AHn+TDDv7o7Y3QvVuF6r7Dg6X+RuVTsfZCbOpKjBdjtlMPnI6Opfc EMi5mSejjSnkepZ4USIoo917pbfJn+aH/wAKQPlJ8c++PjXvj+SHkMZtHv3p/sbp3cWXw/QXyNmz eDxXY20avadVn8CuXzFRSjIUC1f3lBJPBIiVEcblG029+690e3/hIf8ADD5i/Dzoj5jUPyr6Q7F6 Ix/YPa3WeR652z2bhW2vn8rU7f2pkqLeucp9u1+mujpmWoxECVM8SxTNG6wljDLb3XuqPP5+NPT1 n/CoT4t0lXBDVUtVvr+XvT1NNURJPT1FPP2Pj4poJ4ZQVdHUlWVgQQSCLe/de6+mF7917r5/P/C5 mio463+WFkkpoVr6ul+ZtFU1ixqKiejx8vVU9DTSy/UpE9TUNGp4Bkcj9R9+691ul/y/Jpaj4F/C OeeWSeef4ifGyaaaZ2klmlk6awrySyyOSWZiSWYm5PJ9+6918/8A/mvf9xgXxg/8W/8A5V//ALu9 ge/de6+l37917rVm/wCFLn8jzsv+aPsDq3vT4vSYOp+UXx9w+4NsRbAz+Rxu3aPuXrPPV0eaXbNB urLNHS0WYxGQWepxK19RBRzJW1qTzwv4G9+691SN8WP+FQn8wn+W3ltsfFD+bt8R+xt9vselotvn sHOY7LdY/Jn+7GLm/hyZ/LQbxT+A79KQxrHS5SKpxrV2n7ipytZNI9Q/uvdbwfwT+f8A8XP5j3R2 P7++KnYMe9NoSVi4Xc2EyNG+E3x13u1KKKvrNmb/ANrzs0lDkII5o2BR5aaoQiejqKmndJm917o5 /v3Xuq+P5s2/891d/LB/mCb82tVVGP3Nt/4efIWbb+UpJ/tqzD5mt6vyWMxubo5tL2moppkq4gVs XjAJANx7r3WoZ/wh166286fzEe26imhn3XSt8dOusTWPABUYrb1eN3bm3DTU9TquUyFTTYxpk0ix o4jc3sPde63+vfuvdfNQ/wCFr+xsNt/52/Ezs7Ewx0G5d5/GCfBZqroo2paiqPX3aeWq8Hkqiohc a6hFzMkCzFBII4YkMjJHEsfuvdfRV6C3XlN+dE9K74zjrJm959S9cbrzEiaij5TcWzqPL5B1LktY zTORck/1Pv3XuvnO/wDCYz/uIW+XP/iP/mR/7/vA+/de6+l57917r3v3Xui//LL/ALJY+S//AIr/ ANy/++6yXv3XutEP/hDp/wAzU/mJf+I/+OP/AL0e8PfuvdfQ89+6918z750U9PVf8LQtmQVUENTC 3zB/l5O0M8STRF4fjt1nNExjkBF1dVZTbggEcj37r3X0wffuvdfN5/4W7UVJH8tPhPkUpoVr6r46 73oqmrWNRUT0lB2W89FTSyjkpE9TUNGp4Bkcj9R9+691ue/zGt/bh6+/k2/MHfmBrJotz4v+X92t NjMq0parosvlOj6rGw5pJZA+qemkqPuo9YIaRBquCffuvdfOc/4T/fM7+Zj8N8b8osp/Lr/l/Q/M uTsWu6koO2NytsDtffFRsJNpU+4qjZmCil67yNFFRpkDk8nUSLOheYwIbkQqF917rYw/4e7/AOFN P/ejb/2BHye/+v3v3Xuq2fgZ8UP5uHyD/wCFBvTX8xDvr+X/ANrfGXH7p7mn7H7cy0nW259gdVbQ wNL1LPsfcxpcnv2SSR5cpToytCamapqKqqkMYJa6+6919KL37r3XvfuvdfL82/SU3yG/4WPVdP2H DHlYMJ/MD3XLRxVSiqjEnxo2bWVPWzFX0j/Jn2pimQc6PGP1aefde6+oH7917rQ9/wCFxdPTnrP+ XXVmCE1S76+SFOtSYk+4WnfAbOleBZraghZVYrexIBtcD37r3W2H/Kd/7dZfy0//ABQD4b//AAOu 3PfuvdVYfzT/APhTb8Of5b3aOY+OW0Njbw+WnyY294aXc/XvXOdxW2NkbHz9WivR7P3x2ZVwZN4c w4kiMmPxGEyUlPqMdWIKgCA+691WZD/wo7/ngbuii3J13/wn/wC+8hsvLRpU4Cth6f8Al1vKKppQ oikli3Ng9n0dJVqZVk0yQ0yAD0G5Usfde6qp/wCEbeRyGX/m+fKbLZbHyYjKZT4Sd35HJYqaOaGX GZCt+T3V9TWY+WKpCyK0MjNGyyKGBWzAG/v3Xutw/wD4UW/CdPnB/Kj+Rm1sNiVynZvR+JX5MdTB KcVNadzdP0VTltzYjGwpG8slTltry5/EUkMJUvU1MFyVUq3uvdVLf8Ix/mce1vhV3H8Mtz5r7rdH xV7IbduwsfO8iyRdN92zVOe+xoEkuJFod1024aipeNrR/wASpkZF1K0nuvdU7/zFIaj+db/wqF2J 8SKCeq3F0X0Rv7a3x/3JDRVLzY+m626Caq7I+U08giPgpKupy43JgI6slmd46BH1ssUC+6919LWG GKniiggijgggjSGGGFFjihijUJHFFGgAVVAAVQLAcD37r3WT37r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvdf/W 3+Pfuvde9+691737r3Xvfuvde9+691737r3XynP5k3S3en/Cev8Ank7c+XPU+05JenN0dubl+Q/x +mX7jH7S3p1tvepmo+7vj7U5SKOaOkqMZT5nI7cmiHlngoKrGZMxg1UK+/de6+hl8G/5vXwB/mBd aba350b8iOuaXcuWxNNWbk6X33u7bmz+6dgZU0pmyeE3RsDMVUdYwpZI54lydCtRj6kRPLSVc8I1 +/de6UHy8/mwfy9Pg3tDK7q+Q3yo6l2/X4+hkrKDrnbm7cNvbtzcziNHgpNs9Y7XnqcvUmUywr9w 1MlLF5EeoqIYiZB7r3RJsB3rtb/hQl/Jk+VFb1F1zuDrCm772n39071ft7svJ4WpyD722JM79Ybl z1Vh2akpY6jLwYupqoYp5lpGEsa1E4iEz+691qXf8JQP5lHV/wABPkB8l/g38xdwUfRGO7o3Jgqn a+5ezaiHZuC2B3v1hPkNobt677Ar84YY8TUZanmigimyDwxQVeM+0kYTVcY9+6919GXsXvXpXqLr mv7f7R7Z656/6rxmNny9b2Hu7eW38Ds6PHU9O1VJVR7gyNRHTSAojFFikZntZAxsPfuvdfMu7L3Z Uf8ACir/AIUebHr+kMTnMr8a9obs61xkW46vE1NFJjPip8eMlFnt+b7zcdZFG9Cu5cnPlDhYq+FJ Y58xjqKePz6lPuvdb9H863/t0f8AzGv/ABUDvD/3iar37r3WuD/wiG/7JZ+cP/if+u//AH3Unv3X utv35Zf9ksfJf/xX/uX/AN91kvfuvdaIf/CHT/man8xL/wAR/wDHH/3o94e/de6+h57917r5on/C QL/t9D8x/wDxUD5C/wDwVvWfv3Xutj3/AIV5f9ubd6f+LAdE/wDu8qvfuvdVc/8ACT7+c58Xdk/H jAfyz/kBubb/AEl2TtLem8M70jvfeGahxOx+36Lsbc9Ruqv2fLnsl46XG7io8hVTRUdLUzJHkIJI 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 17o2fv3Xuve/de6+W5/ORi3j/Ke/4Up4f5nVO06yt663J3B0/wDL7aqUkEEf9+dj5empNv8Aeu38 dUt+xFknydJuihTyNri81JVyppnj1+6919Jnqz5cfGTuroXG/KDrXvTrHcfx/wAlt2HdL9rDd2Hx m0MHiZKdKio/vdk8xLTrhamk1iLIUWWFPUUkwaGpiilRkHuvdfNW/wCFTH83vo7+Y/2/1L0h8X4P 769MfEvMb9TJd+wPUNgOzuwuxKbG0ldQ7Fi0qpweOhwciU2UmN8nM08tIgoaeGqrfde6+hp/Kd/7 dZfy0/8AxQD4b/8AwOu3PfuvdfPf/wCEu+d6hh/nZ9r1/wA3p9v0/wAjsrtPugdX1vZ8+Oh0fLCt 7Txkm9IsbLmJB/v7JqE7jTG/qdr1ixn7pqe/uvdfRU+cnz6+Lv8ALt6R3D3t8oOysPsvb+Lx9fLt rakdZQVHYfZ2epYQ9Ls7rPaM00VRlclUSNHHpj0wU6t9xWz01JHLPH7r3Xz8/wDhG3nItz/zfPlN uSCCSlg3D8JO785DTTMry08WW+T3V9fHBK6cFkEgViOCRx7917r6ac0MVRFLBPFHPBPG8M0MyLJF NFIpSSKWNwQysCQykWI4Pv3XuvlYbV7iyX/Ca/8AnzfLWggwGQqelk2f3pgdr7TpYDVJufqntfZD dyfGnFUeiRY2+y3JTbVxNfWal8SwZBWMR8gX3Xurb/8AhGN8V87vvdnzQ/mY9peTcG6Nzbgl6E2P ujKxJNksnufcNZTdud/bldpI1VZqiSo2vDHVUxGryV8J0rqU+691vye/de6oj6g/4UQ/Afu3+Y5l P5Y+y8N37/ptx/Z3afT9N2HkNi7MHR+b351DBlJd043Dbmxe5arNvBI+Hr4aGul27HTTMiv5UhkS Vvde6vc9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691//9ff49+691737r3Xvfuvde9+691737r3XvfuvdFm+Wvw6+Nv zm6bzvQvyl6q272v1tnG+6XG5mOamyu3s1HTyU1FujZu5Mc8NfiMrTJLIsGQx9RFMqu8ZZopJEb3 XutQruz/AIRDfHfcu4avIfH350dtdRbeqa6Spi272h09tbvKfH0kpkf+HUWb29ndjOUjLRrDJUQy yBEIkaV28g917oR/jX/wip+GPXm4cbnfk18nu5vknRY6aGok2dtLbGG+P+0c4YyDJR596DI7lzZp pBcFcbm6KYcaZxbn3Xutu/o/orp3409WbQ6S6D642n1N1RsPHtjdqbF2VioMRgsTBNUPW1s4hh9c 9VV1MstXXVtQ8lRVVEktRUSyzySSN7r3VH/80f8A4TY/A/8Ambb7yneVfUby+OXyPzcMCbl7W6kX EVGJ7Cno6ZaOgruzeu85G1FkauCJRH/EcfPj66ZVjSqqqiOGFI/de6pL2r/whw2BR7njq97/AMx/ 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 uve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69 7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv e/de697917r3v3Xuv//Q3+Pfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3XvfuvdUU/8KL/AIWfI/57/wAs/eHQ HxV2FT9l9vVXbHVG78ds+fd2zNkNksNtjNSy5t6bP7/yGLxSSQxSiUR1FdEXVWCan0o3uvdLD/hP v8QfkB8F/wCVx0f8c/k9sqn677l2vujuHN7k2dT7p2nvP+DUu7+1MruTBRz7h2NXZLFTSS0VRBMw pK6YJrCMwkVlX3Xurpvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691of7k/kkfzJvm5/woVyvzZ+ZnSGD2h8MNqfIyj3nt7cFf2/1Hu2l3V0z0FEtJ0P s/DbB2ll6zMxLnziMPLmqXI4qiVBWZGSdzUMRN7r3W+B7917quT+ah8Bsx/Mw+I24fiPSfIHcnx1 21vneG0Mx2Huba2z6HeeQ3ds3adZJnP7gT0FdkMaIKeqysWLr5qlJ2JFGIGieKeQe/de6Hb4V/D/ AKb+Bnxk6n+KnQ+ImxnXnVG3Y8VT12QNPLuDdufq5myO6t9bsrKWOKOfK5nIS1GQrnjjSJXl8VPF DTxxQx+690aX37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3X/9Hf49+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691//9Lf49+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691//9Pf49+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691//9Tf49+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691//9Xf49+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691//9bf49+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691//9ff49+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691//9Df49+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691//9Hf49+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691//9Lf49+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691/ /9Pf49+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691//9Tf49+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691//9Xf49+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691//9bf49+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691//9ff49+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691//9Df49+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691//9Hf 49+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691//9Lf49+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691//9Pf49+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691//9Tf49+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691//9Xf49+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691//9bf49+691737r3Xvfuv de9+691737r3XvfuvdaZ3cH/AAoE+bGw/wDhQlhP5YeF2h8fJfjXVfJPpLo2prMhsnes/Zs23+y9 qYLK5zPHdUO5I6QZKGpy87UbLixTLHHCklPKRI8vuvdbmPv3XugK+UfaOd6P+M3yK7p2vRYnJbl6 g6K7c7R27js9FWVGCyGd2B1/kN2YmizUGPnpqh6SWopI46lIKmKQxlgkiNZh7r3Wtz/wmv8A52fy 7/m0bs+Wu1/lFt3pHFQdJ4HqbcWzK7qbZ+6dp1ssm/MlnsdmcdnBns9mIaiCJcXTPSGKKKVGabyS TK0Yi917ra79+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+690Xj5XfKnpD4TfH/sP5P8AyO3ZUbH6Z6up9vz7x3LSbe3Duqqom3Xuyg2LtumpsBtWlrK6 okq8tlKCiQQ07KhlEkrRwpJInuvdIn4R/Ov4z/zEOkx8g/ijvmu391iu7s/sSryuT2luzZWQoN17 aipqrK4mqw28KOiqbrBWUlQk0SPEyTKBJrWRE917o3vv3Xuvm8/8Jpuy+x9yf8KBvmFitxb/AN7Z /F1uxfl9UVmNzW6s7laCrqKHvvB/ZT1NHXTyRyPDqbxM6kpc6SLn37r3X0hvfuvde9+690Sz+Y1v 75GdWfBP5W9i/Efb+Q3P8k9m9Kb1z3T2Gw+2Id75uXd1DjWkp6zA7LqI50zGQo4vNWUGLalqRV1E UdP9rVeT7eX3XuqB/wDhLz8yf5rfyyxfy2/4cTbtHcuxtlVXVH+h3ffa3T+K6syT7mza5wb92tgq 7G4fCDLwQ01NiKqpUwVBonlivLEKxEf3Xutsv37r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3XvfuvdIvsjIbvxHXe/cr19iafP 79xmy905DZGCqyopc1u+iwc9TtrE1JeWAeOprVhhe88YsxvIn6h7r3WmR/wnD+e/87j5P/OfvDr7 5/0/dOc6Kw3T279wZyftf474bp7Hdb9vUO/sRjtuYDC5fH7dwDwVdRBUZmnbAO8p8VPJKKdBRvIn uvdHM/4WCbp3PtP+UtiKra2489tqqyPyx6bxmQqcBl8hhp67Gnau6cicfWTY6SNpYDUU9PP4nJTy RRvbUike690bn/hMfuHP7p/kd/B/NbnzmY3HmZ6f5FUk+Wz2Trcvk5qXE/LPfmIxVNLX5B5JWjpq SCClp0L2jijSNAERVHuvdXze/de697917r5v/wDPA+XHzU/mk/znsb/J7+L/AHBnOr+ntr78wHSF PgcTuXcO0tp7x39HtWPevcPZvb6baJqsrS7eVa+kpMfIJ4YqfFmelp0q62dn917q4n+VJ/wmn+Rf 8qz5wdMfInZ/8waHtTpPG4Xsig746dpeut4dQxb3bdfWOU21trHRYei3NuPF5mDH56bDZgVGTFI6 GgjeOLyKgHuvdFX3n/MH/nz0P/CiPE/GrD4LuL/ZN5fmDs3YI69g+PGEqOqKr4jV+4qWj3H2c3ZB wTVTCLbT1u45M0M/qiq42gOmOI0A917ref8Afuvde9+691737r3Xvfuvde9+691737r3QE/KSurc Z8ZfkXksbWVWPyOP6J7drqCvoaiWkraGtpOv8hUUtZR1VOVkilikVXjkRgysAQQR7917rRp/4RL9 h7/3h2T/ADDaHdu+N4bpoafZ/wAe8tBR7j3Nms3Sw5Wuz27Ya3JxU+TnlRaiZERJZgA7hVDEgD37 r3X0DPfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691r1/8KS/kt/MQ+Lfwb2Pvz+XTS76pt+ZTvnbO2+0t4db9aUHae69 n9Z1W0c1XrUx4PI47LpRUlZmafGUdTljjz4meKmE0LVaiT3XujE/yHO8fmv8if5avTfaXz7xm6KP vvMZzf8ARrl977DpOtN4bw6+xe6Z6PY27Nw7OoaPHRwSVFKpip6kY6m+9pYoK7TN9z91Ue691cX7 917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3X uve/de697917r3v3Xuve/de697917r5v3wp7Q7Lrv+FlW/Nr1vYm+qzbVV8pfnntup29Vbtz9Rg6 jbuB+PnYNbg8DPiZag070VFNQ0U1JStGYoXp4HjVWijK+6919IH37r3XvfuvdfN6/wCFofZfY2zf nl8R6TaG/wDe21aWh+K0eeoqbbe6s7g6ejzkvcm4YpM1Sw4ueJY6tlpKVWqUAkIhiBa0aW917r6Q vv3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuvm8/8KWey+x9t/8ACgb4 e4rbu/8Ae2AxdFsX4g1FHjcLurO4qgpKiu77zn3s9NR0M8ccbzaV8rIoL2Gomw9+6919Ib37r3VX WL/nKfy98z87p/5beO7ly03y1p9zZbZb7GbrHs2LBtu3B7Tl3tlcAm+5cSMP5YsfBNJ5TWCBnQwp K0pRG917q0X37r3Xz7/+Fte/d87U7J/l50O1t6bs21Q1Oy/kRkaijwG48xhqWfIU+e2jDT101Pjp o0aaNGZElYFlBIBAPv3Xut5r4t11bk/jL8dMlkqyqyGRyHRPUVdX19dUS1dbXVtX1/j6iqrKyqqC 0ksssjM8kjsWZiSSSffuvdDt7917r3v3XutOT+ZjiP8AhSx81/nv3j8W/g1kK74e/Crq+bZOE258 gDloul8P2CNx9fYndeR3We6aKmym88tLBX19fQPF1/SCmoft/tMhF/EYJJH917qszuL+R/8A8KcP ixtzKd8dMfzJOxvkPu/blLWZjN7F6s+XXyVqux8/Cki5DIR4va/atPQ4jcYYo08mOqKsz1MiIsFJ Uzsie/de6s9/4Tcf8KDe1vn9vTcHwg+b5w9T8nNsbXyW6usO18Vt+l2nN2/g9q6V3rtjfe1sRFDj 6Pc2LjJr46jG0tLTVlGlQr0tPU0Rlr/de63Effuvde9+691pnf8ACiX/AIUCfNj+VP8ANvpr4+fG 3aHx8zuw9x/GzZneW5Ju19k713Ln8vuDcfbe79k1mB/iG3tyYiOnxqUe2KUxLT061IkqKlmqGHgW H3XutzH37r3Xvfuvde9+691737r3Xvfuvde9+691737r3TTn58vTYLNVOAooclnqfE5GfCY6olSG nr8vFRvJjaKeaR4lRJZgiMzSIACSWUcj3XutIz/hPl/MA/nofJP+Y92b1j88sd3Pkeh6LrTsXL9g Y3sv454fqfbXUu/sVuGlg2fj9v5+j2/hpqWskqJKvGw4aSsqDUUwqJ2p5TQmqpvde6uj/wCFOG4c /tb+R384M1tjOZjbmZgp/jrSQZbA5OtxGThpct8s9h4jK00Vfj3jlWOppJ56WoQPaSKR43BR2U+6 90Ub/hH3unc+7P5S2Xqt07jz25arHfLHuTGY+pz+XyGZnocaNq7WyIx9HNkZJGigFRUVE/iQhPJL I9tTsT7r3VKX/C1nsPf+0vk78HqHau+N4bZoR0f2FlhR7f3NmsNSjKjsGCEZMU+NnjT7jRHGnmtr sii9lFvde6+gl1fUVFZ1n13V1c81VVVWxdo1FTU1Erz1FRUT4CnlmnnmlJZ3diWZmJJJJJv7917p de/de6SO/wDfe1Ordh727N35llwGx+uto7k33vPOvR5DIJhdqbRw024NxZZqDExT1U4pqOnmmMNN BJK+nTHG7kKfde6It/L9/ms/CP8Ame0vatT8Oez8x2E/StRsuDsejzfXm/dhVWCXsOPKSbOqYxvT H0SVUdacJlVBpJJGjNO3mWMSQmT3XurF/fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 0Fvd3c/XPx06f7M757fz7bW6t6g2TuLsPf8AuJMXl83JhtqbWxsmWzVfFhsBBVVtU8cMTFKekp5J ZGsqIzED37r3RXvgR/Mt+H38zDY++OwfiB2PlOwdvdcbopNn7ybM7F3tsSuw+byGLXM4+L7LedBR NPHNTsXSWm8igqyuVYWPuvdHz9+691737r3Xvfuvde9+691737r3XvfuvdakX/CzXdm6to/yuOkq nam5dwbYqMr87+rMTk59vZnI4WbI4o9Cdm5Q4yvlxskTTU/3VLS1PhkJTywxSW1xoR7r3Vmv/Cdj PZ3c38lz4G5ncmay24MvUdc70p58rm8jWZbJT0+N7i3JjMdBNXV7ySslPTQw08KsxCRIkagKqge6 91dR7917r3v3Xuve/de697917r3v3Xuve/de697917rWd/4Vp7n3LtT+Txvuu2vuHObbrqrvTo7H VNZgMtX4eqqMfPuCeaahnqMdJG7wu8cbtExKkqpIuot7r3S+/wCEru5Nxbq/ksfHDJ7nz+a3Hkk3 t3/QpkM9lK7MVyUVH3Zm4qSjWryEkkgiiX0xxhtKjhQB7917rYk9+691737r3Xvfuvde9+69005+ fL02CzVTgKKHJZ6nxORnwmOqJUhp6/LxUbyY2inmkeJUSWYIjM0iAAkllHI917rSM/4T5fzAP56H yT/mPdm9Y/PLHdz5Hoei607Fy/YGN7L+OeH6n211Lv7FbhpYNn4/b+fo9v4aalrJKiSrxsOGkrKg 1FMKidqeU0Jqqb3Xut4n37r3Xvfuvde9+691737r3Wtn/wAKgv5lvbP8uz4D4Ki+PO5qrZHe/wAm +xv9E+2t+4w+LP8AXuxsbt6p3H2NvHaVadQp8voTHYeiqQvkphkJKymeKrpoJF917rWQ+D3/AAlw +YXz3+MXWv8AMD3z/MGqOru6+7ttx9odYYncm09/dl7wrNvZ6WWfbW4d891tujH5HGVWUpnOQUUO MyTJBURl5DK8sUfuvdfRM+MmwexOqvjb8fOr+399Sdo9s9b9H9T7B7Q7Mmq8nkJexexNn7DoNvb2 31LX5oCsnbL5Knqcg01WPM5l1S+st7917ob/AH7r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3VDf/AApt3JuLaX8jz5w5zauezW2c1DS/HihhzG38pXYbKRUWa+WGxMLmKOPI Y6SOVYqujqKikqYw+mWGWSJwyOyn3Xuijf8ACP3dm6t3/wApjL1m7Ny7g3RV475X9w4nH1W4szkc 3UUGKi2ltWtixlFPkpJWip1mnnmWFCEDySMBqdifde62nffuvde9+69183r/AIRedl9jby+eXy4p N37/AN7bqpa74rSZ6tptybqzucp6zORdybeijzVVDlJ5Vkq1WrqlWpcGQCaUBrSPf3XuvpC+/de6 97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917oAP ljubt/ZXxY+S28vj5t+Tdnfm0vj/ANybm6Q2rDixnJdy9v4HrrJZXrXb8WFJX7xq3NRUVMtLqHlL +O41e/de61X/APhMf84f5xHyt7r+UG3v5hbdvbo6c2r17hsxtXd3a/RmE6nbb3bc+7IaFtobfymH wOBFUKvFNXVNXjzHOtL9rA6il8xFR7r3W4/7917r3v3Xuve/de697917r3v3Xuve/de697917rTO +YP/AAoE+bHQ3/ChDY38sLZm0Pj5VfG7KfJP4T9G5Suz2yd61vZdbt/5L7a2Plt6Z7+9FHuSnpI8 lQy7uq/4S0eMFMi01KKinqT9wZ/de63Mffuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X//19/j37r3Xvfuvde9+691737r 3Xvfuvde9+6918wT5K/9xkm3P/F//if/AO8Ns337r3X0+/fuvdFA/mE/9kC/OH/xUD5Lf++YzXv3 XutIL/hDp/zNT+Yl/wCI/wDjj/70e8PfuvdfQ2qKino6eerq54aWlpYZaipqaiVIKenp4EMs0880 pCoiKCzMxAABJNvfuvdaonzT/wCFfX8uf4075znWvRu0uzPmNuHblRU0OV3f1vUYDZ/TDZOkZ4J8 dhuw9zPLV5TxzLpauxmCqMfIhElLWVKn37r3Re+h/wDhaz8KN77rx2B79+L3e/Q+CyWQSjbe+3M9 tfufB4KnlCAZbceMoocFlVp4yZDMuMx9dOFVTHDKzFV917rbx6S7v6k+SHVeyu7+iuwNt9o9UdiY ePO7N3xtOuFfhszj3lanmCsQssFRTzxy01ZR1McdRTVEctPURRTxyRr7r3Van84L+cH1Z/J86t6k 7L7N6j7A7fXuDfmW2Pg8NsTKbdwpxkuEwBz1fkctkNwSCylTHHDHDA5YlizIFGv3Xui8fN//AIUk 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 uve/de6KV8z/AJzfFv8Al+dO1nenyx7XwvVmw0rv4LhTVw12W3JvPc8lFNkKTaeyNq4aKevymRmi glkENNAyxRo89Q8NPHJKnuvdapHav/C3D4l4DclVjumvhj352XtqmqJ4I9yb53zsTqeqr0hfQlZQ 4HFRbpYQy2Lx/cVEUugqZIkcsi+691Zp/LH/AOFN3wK/mQ9oYL4/nE7++NHf+62kp9l7L7dk27Vb R7Dyq6pI9t7C7FwNS0M+VeNS0OPylDj5ah7Q0Qqpjo9+691sce/de617/jB/wov+JHyH+WvzU+MW 6dl7u+Pm3/hFs3uff3YvfHbe5tmUXXdbtrpHuPD9Lbjn8GOqJKmlnrMjm6OXF037z1AvCtql4YZf de6rE7y/4WtfDHZHY1Ztjoz4td3d67BxtdJRTdnZjc+3uoYc1HDUCM5baWz8tR5XITUkkeqSD+L/ AMMqTZVlpoSTp917q9r+XH/Ow+C38y/pvsLtnqXfdV1nXdK4E7l73677tbCbJ3T1JtyKnqKmbeee yKVlTiKnbxSkqZVzdFkZIYkUCuWinb7ce691Sr8rP+Fm3wb6b7Iy2w/jr0R2t8qsLt+unxuR7Qp9 x4fqHYOaqKd2SWo2Kc7RZXLZGkDAKtVW4ugWQ6nhEsPjll917q4P+VF/PK+Gn827H7mwnS826utu 7diYmDO7z6I7SjwtFvKLb0tStBLu7Z1dhaqqpM5hoamSKmqaumaOemklgFbS0v3NMZvde6uY9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691//9Df49+691737r3Xvfuvde9+691737r3XvfuvdfJa/m87z74 67/4Uw9576+Lu26reHyL2l8muis90ptai23JvCs3B2RjeqdpVO1cVTbWi9WQeaqWNFpF5kJ0/n37 r3VtP/Don/CwL/vBrsD/ANIZzPv3Xugl78/mTf8ACrrdXRXdO1+5PhhvrA9Q7k6l7GwPaucqPhfl 8DT4brfMbPrMfvnKz5x/TRJT4uSqmarPEIUyH9Pv3Xuha/4Q6f8AM1P5iX/iP/jj/wC9HvD37r3V qv8AwsK+c+9PjT8D+sfjV1tuDJbW3T8099bo25u7L4qqmoq2p6O6sxFFkuyts09XSlJYxlsjm9t0 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 LTLYDBZ5KWPOYXE5pKGqSuoky2Oo8ilHWxArHWUq1iOI5VBIWRLML8H37r3Tt7917plo9t7dx+Ur s5QYDC0ObyalMlmKPF0NNlMghZXK12QhjWaUFlU2kc8gH8D37r3T17917plXbe3VzT7lXAYVdxSQ inkz64uhGaenEYhED5UR+cpoVU0mS1gBaw9+6909e/de6Zanbe3azMUe4avAYWq3Bj4RT0GcqcXQ z5ihpwZCIKPJyxmeJLyy+lHA9b8eo3917p69+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691//1N/j37r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3XvfuvdV4 fzE/5XfxL/mjbC2B138sdu7wzeD6y3ZW7y2fUbK3tl9l5PH5fJ4lsLkVnnx+uKohmgK6kmhYqyKY 2S76vde6Nn0H0f158aOk+qvj71LjKzDdZ9NbD211xsXF5HK1+cyFHtnamLjxGKirsvk3knqZvFGD LNI92YkgAWA917oXPfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3VYn8xf+UR8M/wCaZL1DL8t8D2JuAdJSbubY9Ns3svcuysfGm+GxrbkjyeMx jmnmaf8AhNEoqFiSoVVKCbTYD3Xuj59PdR9ddBdU9c9I9RbYo9mdX9TbL2519sHatBLV1NPgtqbV xcWHwtB97kZJqmpkWCJPNVVU0k88haaeWSV3dvde6Ej37r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3XvfuvdB32v1H1b3tsDcf VXdPXey+1utd3UYoNzbE7A23id2bVzdKsizwrkMJmopoHaKVUmgkKa4pFWSNldVYe691QT2P/wAJ SP5K+/8ANz5zG/HzfnWUlVUT1VXjeuO8e0KPCTTVDa38GL3XkMvHSxhrmOCiEMSA6UQIFUe690PP xh/4TmfyfvilujE772P8SsDvzfeDqqSuxG6u8tz7t7jbG1+PnSroMlj9p71rKjb1PVwTos8FZBhk njcBkkWy2917q79ESNFjjVURFVERFCoiKNKqqrwABwAPfuvdcvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3XvfuvdU+b I/kWfy7tjfPHO/zH6XrrfG4fk5muyN39uw5jeXaO8NzbQwPY29hUjLblwe0MhOadWg+8qP4VS1DT UuOJiNDBTmlpDT+691cH7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu v//V3+Pfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvdf//W3+Pfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvdf//X3+Pfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3XvfuvdV/d0fzUv5enx2+RG3fif3X8rOsevPkHuiba9NjOt 85PmjXU9TvVkG06XcGZoaObGYmXILJDJTR5Wup2eOWGUDxzRM/uvdWA+/de697917r3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6on+e/8AP++Kn8vb5s9SfBrt fqrv7d3YXa2J63zUW7+vsN19V7K2/Rdqbyq9kbaWrfcW4cdXzyxVNFNNXrFRBY4TGYXqJC0Se691 eNmczidu4fK7gz2SocNgsFja7M5rMZOqhocbisTjKVq3I5LIVtQVjhgghR5ZZZGCoilmIAJ9+690 SL4k/wAzn4FfO3dO99kfEn5Ndf8Adm7uusfHmN37d22m4cflcfhJMiMQM9R0u5aGhavx4qmjgevx /np1eWENIPNFr917o9/v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917qiP+Zd/P/wDiz/K8 +VPT3xN7n6m753zvPtzYOzOy4NydZ4vYFXtjb+1t8djZjrXFirbc+extXPWx1eByM89PHTiMReDT M7yOsXuvdXue/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuve/de697917r3v3Xuve/de697917r3v3Xuq/q/+al/L0xnyvp/g7X/ACs6xpvlRVbiotnw9SST 5r+JHeORpVq6DZ0m4Vozhky8wdI4sW+SFU0rpAIjM6xn3XurAffuvde9+691737r3XvfuvdUR/zW f5//AMWf5R3cvVHSnevU3fPYWf7R2D/pLjyvVOL2BWYjA7WbdVVtOMVB3bnsVNPWmagrJDTxxLGE WL94tIwj917q9z37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3SN7E7D2P1JsLeXaPZm6cLsfrzr3bOa3lvbeG462L HYLbO19u4+TK5vN5aumIWOCmp4pJZG+thYAmw9+691qHdqf8LUP5fm0t+1W3Osvjx8me29lY/JNR T9irTbE2HS5ekjnVHzG1dr7hyT5CaB4y7wJlUxs5IVZIodRK+691s7fB/wCY3U3z/wDit1D8vejo N1UfWPcuJzmR2/jt8Yqiwu7sRV7W3dkNh7nwm4MdjaqupUqaHLYqupHalrZ4JPH5IZpI3Vz7r3Rr ffuvdEG+Vv8ANG/l/fB3f+zOrPlf8o+uelewd/4mm3Btna25jn6rIz7ercvLgaPcWWOAoqyPF46W rgqYI6/KSU9OxgqCJCsExT3Xuj40lXS19LTV1DU09bQ1tPDV0dZSTR1NLV0tTGJqeppqiEskkciM HR0JDAggkH37r3Uj37r3Xvfuvde9+690HPcPZ23+kupO0u5t202WrNq9R9c737O3NR4GnpazO1W3 9g7Zqt1ZmmwtJXT00EtW9NSSLTRzVMSNIVV5Y1JYe691Vf8Ayiv52Px5/nFUvf0nRfV/cnWVZ8d6 jrBN30vbFJsuGLLU3bMe4G21Pt2q2hl8n5GibbWRWtjqI4dAanMbS+RxF7r3Vy3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de6S+997bR612ZuzsTf+48Ps/YuxNt5veG8t2bhroMZgds7W 23jZMxns/mcjUlY4KWkpYZZ55XIVEUseB7917op3w9/mOfCL5+Lvo/D/AOROye75+tJsTFvnH7eg 3DiMvt1M8J/4LW1eF3ZRY+rekqjTVCQ1sMDwM8UkYk1oyj3Xujs+/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu uLukaNJIyoiKzu7sFREUamZmbgADkk+/de61Mvlz/wALB/5dfx37T3H1T1J153L8p6nZ2arMFuDs Pr87Q2v1PV1+OnlosjHszdG5K1q7MJDURaBWw4mOhqEImo6yphKu3uvdXPfysP5p3QP82noDcPfn Qm2+xtk0Oy+wq/rDemze0MZg8fuLC7poMBj9zCWkqdt1+SoqygqKTJU701SlQshYSJLBEyWPuvdW Y+/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3XuidfP75rda/wAuz4i9wfMft7bm 9t29f9OUuz5Mztzrujwddu/LVm/OwsR1jtymxcG467G0YT+J5qjarlmrFMVMJpUSaREhk917oMf5 YP8AMo6e/mqfGZ/k/wBJ7M7I2FtWl7E3R1jkdudo0W2qPcNPuPalDQZStnpjtXJZSmmo5IMlStDK ZkkL+RWiUKrP7r3Vifv3Xuve/de6oj/lTfz/AP4s/wA3HuXtfpTorqbvnr3P9XbB/wBJcmV7Wxew KPEZ7ay7qpdpyCnO0s9lZoK0TV9HIKeSJoyjS/vBo1EnuvdXue/de697917r3v3Xuve/de6K58yP mX8efgT0Huz5J/J3fdPsLrDaclDQPVLSVGVzu49xZeRocHtHaG3qENU5HKVrq/hpoF9MaS1EzRU0 E80fuvdastN/wtj+Bku+xiaj4q/K+k66fICnXejDqabc0dA0wjGRqNhxZ4wiykyPDHm3YAWUs3Hv 3XutxvaG6sLvrae1977aqWrdu7x27hN1YCseGSnerwu4cbFl8VUtTzAOhkgmjco4BW9iLj37r3Si 9+691737r3XvfuvdVofzVf5onTP8pX457Y+SHd+xezOw9t7x7g230rg9vdWUu2KnO/3o3JtHPb3p 67IvuzJYynhoYqHbuQDyRyySmZoEERR3ki917owXwd+XewPnn8UumPlz1dgN3bW2L3Vt2vz+D29v umxFJuvEHEbjrdqZSiy0OBrK+kJWtx9R4ZIapxJF43IjZmjT3XujW+/de697917r3v3Xuve/de69 7917r3v3XuqI/jp/P/8Aiz8lP5nPZX8rbaPU3fOE7e6339331pVdhbixewI+t8tun461eSpN8Glf G56oykdFUNh8gcZUSUHklAg80NP5X8PuvdXue/de697917pj3Pubb2y9t7h3ju7N4vbW09p4PLbm 3PuPOVtPjcLt/b2BoJMpms3l8jVssVPS0lNFLPUTysESNWZiACffuvdE2+IX8yz4K/PbJb3wvxD+ SOxe7c11xDQ1e88Nt6HcWKy+Gx+SqHpKHLHF7qoaCeoopJUaIVtLHLBrshkDMoPuvdHl9+691737 r3Xvfuvde9+691737r3XvfuvdVpfzU/5ofS38pX45ba+SHeWx+zuwtubw7e230tgNvdVUW16vONu vcm1M7vaCtykm7cpi6eCgix+3cjrljkmlM5p4hDokkmh917owXwg+XfXvzz+KvTfy46qwW8Ns7B7 q2/kc9gMBv6jw9Du7FLh9yVu08lSZim2/W5GjDLWY+o8TwVkgeLQ50MxjX3XujV+/de6SPYG9MT1 vsPe3Ymeirp8FsLaO5N6ZqDGQw1GSmxO1sNNnMjFj6eokhjedoYHESSSorPYM6gkj3Xuqf8A+Uj/ ADy/jf8Azg813lt/ozqvuzrPJdEY/Y+Y3AO2aHY0FLmsZv2rylFipMLPs/NZVvNDJip/uoqiONQH iMckpLhPde6uu9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3X//Q3+Pfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691pU/wDCeL+dd8+/5h/8 yz5P/G/5P7+2TunqbY3QvbvZ2zMFt7rPaOz63bm4Nn9+bP2HhKamzmBgiq6mkXG5+thkjyE1Q7sk Mhk1q7Se691ure/de697917r3v3Xuve/de697917r3v3Xuve/de697917rSp/wCE8X86759/zD/5 lnyf+N/yf39sndPU2xuhe3eztmYLb3We0dn1u3NwbP782fsPCU1NnMDBFV1NIuNz9bDJHkJqh3ZI ZDJrV2k917rdW9+691qxfzB/+EvnWXz5/mS1P8wHMfLLeHW2N3dmOns32j0zQdT4vc9TuOq6j2ni NiU8e0OyptwUAwkdfisFj45BU7fyRin88ysyyJDF7r3W077917r3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r5of/AApz/wC4hb4jf+I/+G//AL/vPe/d e6+jp3H1jg+7Ooe1Omdz1OQottdudb746x3DWYmSGHK0mD37tiq2rlqnGS1CSRrUR09XI0LPGyhw CVIuD7r3Wvj/ACWf+E5Wzv5PvyH7a+RkHyp3B8hdy9hdT5TpnbuGn6joeq8VtPZ2d3xht9ZmfLPH uPcUmWyD1G38VFDURfYxRoKi8EhmTw+691sre/de697917r3v3Xuve/de697917r3v3Xuve/de69 7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuvmif8ACv3/ALfQ/Dj/AMVA+PX/AMFb2Z7917r6Xfv3Xuve/de697917r3v3Xuve/de697917rS o2V/Ov8An3m/+FLtf/LfyG/dkyfEqPvrfnWEWwk6z2lFmI9v7e6WyG7MdUrvhIBmDVjIUsdQ8jVp RrtH4hEQg917rdX9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3QU977xzHXfR/cvYG3 jSjcGxuqexN44M10BqqIZjbO0KzNYw1lMGUyReeBPImoaluLi9/fuvdaqn/CXb+b984/5ne9PmPt z5gb92nvuh6i2303nthy4DrraOw6rE1G8stuOgztNM+0aakSphkTH0pQVKO6FTpcBmB917rcB9+6 91qxbk/4S+dZbi/m6UX80ZvllvCkw1N8n9s/LSb4+L1Pi5q2bs3bO7KbsSmx8fcB3Aqx4eTPUsVQ 9KdrPOKUvSip1kVK+691tO+/de697917r3v3Xuve/de6+aJ/wto/7L6+KP8A4qBT/wDv590e/de6 +l37917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3XuqmP55ny27p+C38rH5T/K b48ZjD7f7j6yp+nIdm5vPbfxu6cZjJN+/ILafWmbq5cDmFelqJFxuZrPtxURuiy6HZHC6T7r3Rdv +E4nz4+SX8xr+XlXd+fKncuB3f2jivkD2V1uufwG08HsuCt21t7BYLN4hazC7bigovPE+UqIvLDB HqjWPWGcNI/uvdX4e/de697917r3v3Xuve/de697917r3v3XutYn/hXR2fuTr3+TjvfAbfqaikp+ 4e+OlOsNzS01U9LI+20yVb2VUUzGNSzxz1W26SGaIMgdGYMWTVG/uvdBV/wln+APxJqf5Q/Unee9 OgOneyeyvktubu/M7/3Z2J1ts/e2cqcHs7uHPdO4PZceR3PR1UiYiKk2+KkY9GEBnqqiUoXldj7r 3W0L1N1B1V0L1/geqOkuudk9SdYbWbLttjr3rnbWI2dsvbv8fztTubMpgttYGKCjpEqchW1dZLHB CimWWR7XY+/de6Eb37r3Wsb/ADj/APhNdsn+bb8p9hfKGb5Ybk6AymA6z2z1ZvTadN1Dj+z6PdeC 2rufJZ7H5Hb+Vn3HgXw1c8WVqaWV56fIQnRBKsClZVm917rZG2Fs3Edc7G2X17t9qx8DsTae3Nm4 R8jMlTkHxG18PDhMa1dURJGskxhgQyusahmuQqg2HuvdKz37r3Xvfuvde9+690UD+YT/ANkC/OH/ AMVA+S3/AL5jNe/de60wv+EMf/dUT/yyb/5rnv3Xut/z37r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3XvfuvdF9+WHx5238tfjL338Yt35nLbc21351LvrqjMbiwS00ma2/Sb229PgjnMXDWBoZJ6 NplqI4pgY3KBH9LH37r3VMv8kP8AkBbW/k2bs7538vyZzXyO3f3TgdrbQpp36ppOosFtPa23MlPm p6ZsOu4dzTZCtqqqWJjVmtp4444tAp2ZzIPde6Nr/PM+W3dPwW/lY/Kf5TfHjMYfb/cfWVP05Ds3 N57b+N3TjMZJv35BbT60zdXLgcwr0tRIuNzNZ9uKiN0WXQ7I4XSfde6Lt/wnE+fHyS/mNfy8q7vz 5U7lwO7+0cV8geyut1z+A2ng9lwVu2tvYLBZvELWYXbcUFF54nylRF5YYI9Uax6wzhpH917q/D37 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3VZH86Ds/cnTn8qP8AmAb/ANoVNRQ7lx3xg7PwuIyVHVNRVuIqt6YN9k/xqgq41Zo6 iiXItVQMoB8ka2ZDZh7r3WqR/wAIzPhR8bu0Okvll8m+2Ooeue1OxqDuHb/Tmzsh2Lsvb28/7i7b w2w4N15yTake4qeoSiny8ucjhr54FWSSKkii1CMur+691vGdO/Hnob48UG68T0H0x1b0piN87qm3 xu/D9U7E2z1/h9xbxqcTSYOq3NlMVtWmpaeWtlpaGlilqDHrfxhmJcsx917oYvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3VAP8AwqO/7cUfOb/y2b/4MPr737r3RQP+Ebf/AG6P 3H/4t/3L/wC8TtD37r3W177917r3v3Xuvmif8Il/+y+vld/4qBUf+/n2v7917r6Xfv3Xuve/de69 7917r3v3XutAv/hcR2fuSGl/l59L0tTUU+0cjUfITs/OUa1TGly+5MNHtXam1amaiChRJjqWvzKx Sl2JFdIoCaSZPde62cvgb/K4+BGzf5evxl6bzPxK+Om/8Nlvj/1XlewMlvvpjr3deY7H3ruHYtDl t2b33blM9j56iqyFdXTzVCzSSk06mOGm8MMEMcfuvdJ3+e58t+4/5dH8rDtnvr4pVu2dh9iddZbp XZux6mt2nhdw4LbOC3D2PiNm1dNj9r5WN6AiLHTSU9MksDxxAgql1Uj3XumH/hPR84vkJ/MK/lub R+RPye3Dg91dr1fanamzchn8BtfD7PpchiNq5mKHDNPhNvxw0aTJHMYmeCCMOFUspfUze691eF79 17r3v3XutQL/AIWrf9usug//ABf/AKs/+B17V9+691Z//wAJvf8AtyV8CP8AxH/YP/v790e/de6u +9+691737r3Xvfuvde9+691737r3XvfuvdfNE/lQ/wDcYF8n/wDxb/8Amof+7vf/AL917r6Xfv3X uve/de6Bv5FdK7e+Sfx971+Ou7shlMRtPvzpvs7pXc+VwbU6ZrGbe7T2TXbGzWQxD1aSRCqhpq+W SnMsbIJAupSLj37r3VFP8kz/AITzbT/k6dsd0dyL8os58it2dq7Do+tMXTv1LR9S4Xam003LTbqy P3dGm49yy5KunqaGiVKlZ6SOONJF8DmUNH7r3Wx17917r3v3Xuve/de697917r3v3Xuve/de61Av +Fq3/brLoP8A8X/6s/8Agde1ffuvdWf/APCb3/tyV8CP/Ef9g/8Av790e/de6u+9+690X/5Zf9ks fJf/AMV/7l/991kvfuvdaIf/AAh0/wCZqfzEv/Ef/HH/AN6PeHv3Xuvoee/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r//R3+Pfuvde9+691737r3Xvfuvde9+691737r3WgP8AzcP59Pzy+Vnzxqv5V38m+rzGDyON7AyX Tmc7T66gxlR2f2x2Tt8VVP2DBtDeWT8lLtnaO3mgqmq9wUpgnK0FTkjk4MZZX917pLz/AMh3/hT5 1RgU7s68/mlZjfHclLRtmsj1rj/mv8l6jP56qltXy7cbMdn0FPtfL1DzJCs8Gcq4ce8ilmqHREd/ de62RP5A3zF+evyt+M3b22/5jnVma2D8kfjN3jX9G57cmd2HJ1xlew6Sg2ZityR5jcG3IUix7ZWG SucVFfhKaDG1dNLRT00N2kll917qmf8Ansf8KHvkZsz5O/8ADX38qTH1GU+RH96Md1h2Z23g9s0G 9t4R9o7mkhoqPpvo/A5GOpoRlKVqgUuZzNXSzPT1bPS0iUtRRyVfv3Xuip4v+QF/wpo7K2/Sds79 /mtZTZXblbHBmqXYmf8Am58sKrObZqopVrqbEVu5uv8AG12Fx9VTzNKYocHPVUUTBDFUgOxi917o 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 vuntPrPs/cHcXZ+3t642fq+HdP8AB8NisBtYYJaeuq910dBPJUTSu7lI6bQiqv7jliE917rWR/nZ dm7o/ne/zyukf5SHVeL6/wBg7S6L7I3H1VV90V21Mdluxq7M4rZj9ifIXMy59VNYMTt6gxGTpsRt qCpgp6uvpHqq2UNPTnH+691enV/8I7/5QlVisVQRn5R46toKeCKtzeO7pxZyGbmiplhlqshT5PAV VJG0rgzMtJTQqGJChUso917rV9/nj/yjYP5AnavxZ+W3wF+TXcmBpt7703TQ7VTdWZwi9q9Yb32Z Q0mc+4xe7tqUeLpczgcjS1ctJUY+uxA0RR/bV0mSirXCe6919HL4Ed+bh+VHwj+JXyS3diocJu3v P47dQdo7qxlLAaegpdzby2LRZvcAxULEkUT1c00lFqNzA0ZPJI9+690bX37r3VGv863+Rx0r/OH6 82ZLld61nSnyK6jp8rTdWdy43AU+5qCXB5iZKzKbA7E2w09HLksPNPGKikkp66Cox9Sz1EDSxS1d HV+691rt7E/4TZ/z/MBtSD42y/zg8Lsr4lRUsu3o9sbK+QXy0yj0Gz54Vpp9vY3qSfD4fFxY6SMy iTCRbljomu2oEyyH37r3Qod8f8I4MNjsZ8O8L8P+8tm4jJdUbi3BuT5Ndqd40m5jvbt7L5bcGAyG Iq9obd2bS1ePoKDEUuNr4MZhJKmIJ59U9dUzzVFU3uvdbz3v3Xuve/de614f53P8hHAfzZtx9U95 bC+Qe5Pjj8mukNrzbS2XupMVU7j2VncBHuGXdmJocvRYyroMliq6iyFRVTUmaxlUzoJmEtJUlIDD 7r3VHOd/4Tvf8KM+zttzdI9vfzjcHn/j5k6cYbO4ms+UHzC3nW5rbegxHFZ7Zea23Q02TpdDsP4d X556c6Ih/Yj8fuvdbGn8mn+SD8e/5PXX27o9m7ny3cnf/a1LiKXtjvPcmGo9vyV2KwjvUY3ZfX+1 Kaar/geCjqJGq56d6+rqayp0S1dVLHT0MFH7r3R+fnN8Kukf5hHxj7K+KvyBxNZX7A7Fx9OI8rh5 oaPdGy904ioXI7W3ztDIzxypBksZVok8JkjeGVPJTVMU1LPNDJ7r3WkJiP8AhJn/ADb/AIv9hboX 4G/zOtk9Z9c7sqvsM1ubEdsfJj40dhZzbEdSRRU26NrdN4zNUGRlhgkl/ZlzgiZ7hTGsh0e691YD tH/hI717tT4dfKTBbq71o/kB/MN+RGzxicN8le3sPnDsDrDL1G98du/N1G18G0+Wy5yGVhopcZk9 1VlRU17wzy/b09LDPVUtR7r3V338kb+XZ2J/K7+B21/ip2nv3ZfY29MX2J2LvnJbh6/gzkW10i3n lkqqLHUMm4oKWrlaKKJTLJJTRDWxVVIUO3uvdVz/AM3f+QX2l/Mr/mcfEL5n4vtDpXE9K9J7J6T2 D211V2Xgty5vNb02/wBZd97i7X3LQ4zG0VFU4uvpsxjc++LejyM8CBkfyF45bL7r3RCPk1/wlF+R 3T3dG7e6f5Lvzy3F8Q6bfdVK2Q6r3J2j3X1K20cfUzNPUYLbnd3SaZPM5DERGadaDGZfDyTQR2SX IVTM0g917pn+E/8AwkH3nW9/UfyN/mx/KvG/J3K0WeoNz5rrHYeZ7D3vB2vnKGaOohPbPdvbEGOz dbjD4hDWY2nw8c9XGwX+I06I0c3uvdbq3YXVmy+zept8dJ7kxnh677B673N1ZnsNg5P4J4tl7r21 PtLKYzDy0AX7TTQ1EkVO0KjxekoBpHv3XutHmt/4Sy/zR/h9vHck/wDKq/muV3WnXW466Wsfbe+e we7OhMsYZAIYKXdv+hOh3FhtwVMEXC5GTD0eplUpTQWFvde6WXRX/CS75F97984Lvr+cZ8+sx8oJ cPUUU2X2JsbeXavYOZ3tQY+q+9pNoZHu/t2PG5LE4ENqhmx+HwUcpp3aOiqsdIEmX3Xut4LA4HCb VwWF2xtnEY3b+3NuYnHYHb+Bw1FT43EYTCYejTH4rEYrHUipFT01NBHHDBDEioiKqqAAB7917rVC /nof8Jn6v+Zd3xD8xfi73TtXpX5H5TA7bwHY2C7KpdwDrzsKo2VjosLs3eUG6toU9dlcLl6LHU9J jJ2TG1sNRBTUhRKWWCV6r3Xusn8ov+SL/NL+LvzJ2N8rv5h38xyu+R+M6m2DvnZ+wurcX3Z8ie9c dUvvXBTbZWGuzPeFNho8ZQUEM7VsVNRY6fXUpELxKhdvde6N7/PA/kAdP/zf6XZXZWI7Ck6E+UvW e35tobe7PG3E3Ztbe2w2yMuapNi9kbdino6p46GsnrJ8Rk6GsSSjNZWeanrkkijg917qi3av/CbL +ffujaVJ8bO5P5xGPwvxHWjpts1e09n99/K7shm2PSotBBtj/RTuXF7axc+NjpBpiwk+4fsUKRqq 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 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv/1d/j37r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691ra/wDCjz+Svv7+bV0n1DuXoDcG18J8kPjZkN8VO0MFvKslw+2+zNl7/pMe+6NlVG4YUkWh ySVWHx1Th6qrQ0oY1ME7wJUmph917qkn43/zJ/8AhT1/Lv6x2h8aO4/5UHZHyrwHVm38XsTZG7sZ 0z2n2BvGh2/tmkGIwmHy/ZfxxqM7gMzS0dJBDTU1Y1H9zIqB562pZw/v3Xum35Ndr/8ACnz+dtsC r+KtB8Cl+DXx17AmoqTtLI752zunpGoz23YsotUMfv8A3Z3jVfx+bERzw08s+O2jtta2oVWSdKqk keD37r3W1n/Ju/lZ7E/lK/D7EfHvA7ij392PuncFT2T3n2XHRPj6Xd/ZOVxlNip6fb1FOWmp8Liq Okpsfi4Zm1uElq5Ejnq5o1917q1/37r3XvfuvdaBv/Cpj4//AMyD+Yf8+fjN8Vvjp8S/kbvboHqn ZOM/hfamF6q3vVdHVvbfdGYV957m3H2rj6Z9v0lFhMRjsLRO+Tq4paOVcjYBKpPL7r3W8J8auhtm fFz49dJfHDryNk2V0b1bsfqzbkssSQ1Vfjtk7ep8CmXyKoW1Vda0DVdZIWZnmkkdmZmLH3Xuhu9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691qBf8KTv5DfyJ/mE9i9WfNj4RZHB13yI6o6/oevN0dWZXcdFsfK77wm1N01u8dhbk 683hl5abGU2ex1Xk6+GaPLVlLFNB9sY6uKSlEU/uvdFA64/nTf8ACm7497axvWnf/wDJu7M+R27N vUdPjV7O2z8ce/myu4UooUhkyO68t0vFm9s1lZK3qafFU1DE31EJIZj7r3QD/JPqX/hSp/woLbZv S3d3xm238CviLjN0YjdGfxu98JmOpcLJlKGJv4duLe2C31XZLfu466iimqjj8bjsXS4xZjGayOCo jiq4/de63Z/5ffwh6s/l1fEfp/4jdQ1FdldsdXYWqTJ7ry8EFNnN9bz3Bkptwb13vmYKcusUuRyV TUTRUyyOtLB4aSN2jgQ+/de6Ob7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de60Mf5un8jL+ZP0t/Msy/wDNt/lLtS773Rnd9DuPI7Ew eR2rj+z+teyazAHDdh1NBtvfkkOM3VgNxq9ZLVUNPNJWP/EKqhfHy06rUSe690usR/Pr/wCFHe38 cm0t5/yI+xNz7/p448e+7dt/Gj5f4/ZdTX1FKi0VfPBQx5ajaMSMJKswZ1Ih6k10+klfde6LTk/5 U/8APD/n/fJvqrub+axgsT8OPix101V/AtgUlPits7gwGz8tkKWr3btfqXqRq7NZ2mzubNLSx1ue 31UoYo4kkT7qOjpsa3uvdb/nX+xNp9W7D2T1lsLC0u3NjddbR23sTZe3qHX9lgdp7Rw0O39uYWj8 hZvFS0dPDBHqYnSouSffuvdK737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691863+bN8Gfn9/N2/wCFAG2dgbl+KnyZ2v8ACnrTd3VfRVD3 RnOq987b6ioug9q10G6+7OxMB2bWwRberKvLVmRz8mIejyBqaqMY6lZRLTlYvde6+iJjMZjsLjcf hsRQ0uMxOJoaTGYvG0MEdNRY/HUFOtLRUNHTRAJHFFEixxooAVQABYe/de6ne/de697917r3v3Xu ve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv/9bf49+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691//9ff49+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691/ /9Df49+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691//9Hf49+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+690UD+YT2jvno/4C/OHurrDNf3a7K6g+IHyW7R683H/D8Zlv 4Bvnr/pfNbs2lmv4Vm4amiqfta+kp5/t6unlhk06JY3Qsp917rXb/wCEnv8AMY+Z/wDMD6z+aFZ8 w+78t3bX9Vb66apdh5DNbZ2NgK3A0e8sBuCXcNGs+zMXjTPFM+Mo3VKryCJlcxaPLJq917rbj9+6 91737r3Xvfuvde9+690D03yH6Apu0Y+j6jvPp6DumVoki6gm7N2VF2jK8+N/jMCx7AetGWYvRkVa gUnMP7o9Hq9+690MPv3Xuve/de697917r3v3Xuve/de697917pvy2VxuBxWTzmZrafG4jDY+tyuV yNXIIqWgxuOpmrK6tqZW4WOKJGkdj9ACffuvdfN/yn84v+ep/O4+ZvZ3Tf8AKg3DWdIdJbK/jG4d u4fbo672VXYjq7F5uPC4HsHuTtjfNPPXrlMtK8DfwXDTqiGZqeGkqlpaisb3Xutp7+RlhP51Wx8Z 8m+s/wCcHXU+7Y9n5TqST4z9l/xnqDcddu/EZWh3DB2dRyZ7q4xVVVT0MlHgJYZNyUcWQ8lXPd5I tCxe691fl7917r3v3Xuve/de6D/srtjqzpnbg3j3B2X1/wBUbROQpcSN1dlby25sXbhytcjyUWMG c3RU0tL9xMsUjRQ+XW4RioOk2917p+2lu/ae/ttYbeexN0bd3rs/cdDFk9vbr2lm8buPbWexs9/D kMNncPLNS1UD2OmWCVkNuD7917oFPmJv/dfVHxG+U3aWw8muF3x1r8cu79/7MzD0OPyaYndezus8 nuLbuTbG5aKelqBBWU0MpgqYZIpNOmRHQlT7r3Wrv/wkv/mVfNz+YRS/Pek+Y3e+Y7vTpyo+L9T1 xNm9r7CwFVttuyI+wot4xx1Wy8VjXqI6sbfxREdW0qxGJjCIzNNr917rcV9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691//9Lf 49+691737r3Xvfuvde9+691737r3XvfuvdV/dKfzS/gZ8iflf2z8H+mu/qHenyi6Om37TdodYQ7B 7Vwv926nrDdUGyd/UsW9NyYKj29kJcZlamKjnixmWqGLa2QOkcjJ7r3RQvkJ/wAKNf5Ofxo7HyPV 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 2BBXRs8eiHdmD21UQVcDOqqtfQCekIdX+48Qd0917q6zp/ufqX5Bdd7b7b6O7I2X2z1lu+j++23v nYG4cZufbWWhVjHOlPk8VJJGJoJA0NTTuVlglV4pkSRGQe690Jnv3Xuq0Pmf/OH/AJbP8v3NHaXy o+Vew9idgfZrW/6MMDRbo7M7Np4qikFZjWzGxOsaDL5HFR1qFTR1OXgpaeUHUs2gMy+690Xr45/8 KKv5O3yf3njeu+v/AJkbV23vfNZKnxWDwfcG0ewumabN1ta6QY6mxe6uyMVjsHLPUzOKempBkxUy S2RYTrj1+691dp7917qv75HfzS/gZ8Sfkd078SfkL39Q9d/ITvyHZ1T1T15NsHtXckm5KbsDfFT1 vs6qqtzbOwWRw2Lirs3R1dDFLl8jSqrRSSOUhUye/de6Bn5qfzxv5YX8v/sKHqP5K/JrD4HtXx0t RlOvdlbS312juba1FWQmop6reVN15jclFiGdPHJHSZCaKqkjkjlip3hbyD3Xuj8/HH5HdJ/LjpTY nyK+Om/sb2f0x2ZQ5LIbJ3xiqHM4ykzNPhs7VbYzEbYvcVNR19LPSZGhrKGqpaykimhnhkjkjVlI 9+690N3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu ve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697 917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3X uve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69 7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv//T3+Pfuvde9+691737r3Xvfuvde9+6 91737r3XyG831F8ufkp/P5/mLfE/4Z74quu+w/lZ8zfnd0hv/dcGThwlLjOicl8jszvLt2ozeYXT VxYyLG4U1GTpsY4q6+mjlxsSzisemm917reD6o/4Sbfyg9k/Hun6f7C6p3p292VV4NqbcnyQyvZW /tp9kVG5Z4bvuHam39s5RNu4mGmmJbH418VVxCNUjr2yLeSWX3XutDzrvYv8xH+XV/M3+U/8sX4I 9s7ixHcXde9s58MY8xicjR7Vm3xsjO7mp85sffArsqyU2AypwpSsTOwMKrFQVuQFBUo0vmb3Xut5 /wCI3/CTf+V30/0TRbN+T/XmU+WveWfozVdjdy7g372lsGFc3VprqaHrjbWwc7jo8Zj6aQkwT1bV NfO2qSpqSjJTQ+691qn9K7A3f/IU/wCFMXXPx36431uqu6V3Z3j1P1NJV5eeSP8Av38cPlX/AAyh xNJvenoUhhyU+16rLwyS1MVOiyZPC/dQQoCsI917rc1/4Ux/CgfM/wDlPd5HBYdsp2b8Z2pflB1x 9rSvUZGU9aUFUnY+Ip1p1M8oq9pVmc8VJHcS1cVISjNGhX3Xuq7P+EafzMPcXwQ7S+IO4sks+6fi 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 lm/y3+0+9Nh1ENL3RvjNYPovoirqaeOqpcZ2d2DR1tau5JYJw8bvhcHjM3nKaKWN45aijihlUxyN b3XutZX/AITv/wAgDof5p9Ex/wAy7+ZFRbm+Re4e/d5b4zfWHXu8N5bnGJyuMw26qvbu4O1+1snj ayDLZrL5bOUmTNNSVtZ9r9tGlVPHVtWR/be691YL/OZ/4TL/AAE3Z8M+8O6Phj0jR/Hf5HdH9b7o 7T2zSde5rc8uze0MbsDEPuXOde7g2Lm62roUqq/HUtZBia7GpRzrXyU7VctRTB4T7r3T9/wkI/mC djfLH4TdpfHDt/c2S3lvP4W7q2Vt3aW5c3VVFdmqjpHs7F5Gq662/k8jWM8tU+GrcFncfSyM58WP WgpQAkCFvde6ob/4WE763b1f/OW+IPZmwan7LffXfw46A31sqs+yhyX2m7do/Kjs3P7cqf4dUK8d R46ynhbwOjK9tJUgke/de6tW/lq/8JS+me0ukqr5Hfzba7tztv5afJGSt7Q3VtFeydxbWm6rq98T NuGSXeGcw0i5HNb0qpamSsz9RX1clHDUSGkWllkp5ayq917ra4+C/wAMepv5fHxY6v8AiF0bkd7Z bq3qRt8ttav7Fy+Kz28Zh2B2PmO0MymXy2EoMXTSiPIZuripvHQxlYFiRzJIrSv7r3Rtffuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvdf/1N/j37r3Xvfuvde9+691737r3Xvfuvde9+69180T+VD/ ANxgXyf/APFv/wCah/7u9/8Av3Xuvpd+/de6+aH2X/3GjY3/AMXA6m/+B0w3v3Xuvpee/de6+aH/ AD6P+4oz4qf+JA/l5/8Avysd7917r6WGRx2Py+PrsTlqGjymLylHU47JY3I00Nbj8jj62Fqasoa6 jqVaOaGaNmjlikUqykqwIJHv3XuvmTfy0Zq3+SP/AMKbN6/EXcE9diOnO2+xtzfF/FS5KslMVf1n 3vW0G/fivuCod18NRVmtO1KKrqQR4DPXxiQWlRvde6NP/wAK8e7N5/Kz55/Bz+V10y02c3DhlwOb yWAodcsOT7s+Sm6KbY/XODykMIeUT4vEUcVZGyR2WDNuSXPEfuvdb5Xxi6E2f8WPjp0d8btgQxw7 P6N6r2P1fg5EgWnkyFNs3b0GEkzNagLFqqvlikrauV2Z5J5ZJHZnZmPuvdDp7917ogH82L/t1l/M s/8AFAPmR/8AA67j9+691qhf8IdP+ZV/zEv/ABIHxx/95zeHv3Xurrv59v8APO21/KB6w2TtvYez cP2p8r+7KPMV/WGzNyy18Oxdn7Vwc6UOU7H7F/hEsFZUUv3Ui0eNxVJU08lbKtQfuoI6WQv7r3VJ HVXUX/Cwb+YZszDd41Pyz6s+GOxd8Y+h3hsLY+7qjbfT1edu5GmE2Ien2/1Fsbdm5KeGoiqGqI4N 2VwqioVpVAWnHv3XutZ7+fV8cP5lfxp+RnTu1P5nXye2X8pu2s90pHuHYG8Nk7s3bu7H7e66O+sv jU23V1u79r7UnimGTgr6rxRUcyaZVbzaiUT3XuvsTe/de6+aH2X/ANxo2N/8XA6m/wDgdMN7917r 6Xnv3Xuvluf8KrMdvXL/AM9nZGJxm5v7l5fKdUfF3Hdd7xyNdJjKDab1u5a+moNzLkqYGSnp6DMN V1Uk6gtGySMo4Hv3Xurp/wDhkT/hTT/3vJ/9jv8AJ7/6w+/de6Bvvb/hN9/P2+T+wKjqr5EfzcNh 90db1eUxubqdj9j9qfI3dO2Z8vhpGmxWSlxOU27JEZqd2ZoZCt1JNvfuvdbUf8nX4C7n/lm/y/um viHvff2B7K3nsWu7A3BujdW1cfkMbtifL7/37kd6S43AQ5fTVSU1FHWx0i1NRHE87RtMYYA4hT3X urPffuvdFA/mE/8AZAvzh/8AFQPkt/75jNe/de60wv8AhDH/AN1RP/LJv/mue/de63pu9O6uuvjh 012j3525nV211j09sXcvYm+c2YJauWh23tXFSZbJNR0NODLU1LpEYqWlhBknmZIo1Z3UH3XutEPZ 385H+f1/O87t7N2d/KU2Tsn4ufHzrvJUcGT35nsV19XZbb+3sxUzQbdl7W7Q7PpM3SnM5BYpKsYf ZWF+6p4kZV+7iglrJvde6D3+Y3/Lm/4Ur9XfB35K9lfLn+Zz0x258cdrdb1ua7i6uwHavamYzO79 pjIU6VWDx+HynV2HoZpDM8TCOTKU8dlNpBYA+691Yv8A8Il/+yBfld/4t/Uf++Y2v7917oQP+Fq3 /brLoP8A8X/6s/8Agde1ffuvdWf/APCb3/tyV8CP/Ef9g/8Av790e/de6P8A/wAwn/sgX5w/+Kgf Jb/3zGa9+691phf8IY/+6on/AJZN/wDNc9+691v+e/de6+aH/IX/AO4oz5V/+JA/mGf+/KyPv3Xu rV/+Fuf8Z/2Tr4Y+D7j+73+zL7n/AIpp0/a/xn/RbW/wHzfnyeD+I+K3FvJf8e/de6IT/La/lRfz 6++vgx8bO3fi1/N8p+megN7dfrkesuqqbufvzEx7BwdLm6zFT7ZbF7Tw9TjqaSmq6epSWClnZUfU pIcMB7r3Ry85/Iq/4UpblwuY25uD+dvR5nA7gxeQwmbxGR7w+TVVj8riMrSPQZLG11NLgCskM8Mj xSxsLMrEHg+/de6sk/4TzfyLO5f5PeS+UG6e7e6ese0M/wB8UPV+38DiOq6DdX8IwGI6/qM1kavJ ZfMbtpcfNLU1k2XWKOmhogkSQF2mlaYRw+691rYf8K/f+30Pw4/8VA+PX/wVvZnv3Xuvpd+/de69 7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu ve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697 917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv/9Xf49+691737r3Xvfuvde9+691737r3 XvfuvdfNE/lQ/wDcYF8n/wDxb/8Amof+7vf/AL917r6Xfv3Xuvmh9l/9xo2N/wDFwOpv/gdMN791 7r6Xnv3Xuvmh/wA+j/uKM+Kn/iQP5ef/AL8rHe/de6+l57917rQB/wCFoXxEzGz94fET+ZN1tHVY XLUtcnx67E3Hhr0Vfid1bdqKvtDovcqVVM/k+50x7kpzVlAY/taGPyEmJF917oq3/Cd/A9k/zdP5 7HeH8zTv/D0dUvSmHrO5cvFQp9xtzFdnbxwg6d6C2WkdZqkMeKwNHlK/HTDQVmwcLgILJ7917r6U /v3Xuve/de6IB/Ni/wC3WX8yz/xQD5kf/A67j9+691qhf8IdP+ZV/wAxL/xIHxx/95zeHv3Xuis/ 8LTeg+09tfLX4e/NCHbk2c6crOlcX0S1fV0E+R2piOzeueztydpRYHc4icJEc7jNwg0sMhjNVFjq wRs328nj917rYg63/wCFWP8AJw3b0ViO1969/wC4OtN9Ntumr9z9D5fqXtjN9jYXdRo1kq9pYus2 5hanCZK85MVLkafKijZSr1E1KRKsXuvdaDP897+Yn2L/ADVvkLsf5ir0buLp/wCMEeJ3f8e/i9lN yUMi5bfmJ6lzNNu7f+R3DmIZZaGozMNVu/HzV9Ji3emx8VVSUfmqpopquf3XuvsUe/de6+Xx/OQ3 fuD+Wf8A8KgsX8zd+bTzmb62n7M+OPyXwcNBTxJk949XR7Aw/XnZlPtuTIeGkeupq3E7joKNWnCe WGAzSR620e691up/GH/hQp/K7+ZvyT6V+KPxl7i3t2h273hQ7yq8JRRdN9mbMwW1ajYvXmS7NzuM 3jm+xcdh41nGNxNcsLYpa6F5kCeUK6ufde6ot/4WGfywe0+69tdRfzHOiNsZreGY6C2TWdWfIPCb bp563cOH6koc9V732N2hj6CjAmeiwGSyOahzssIklhgraWrKR0dFWTxe690Zf+Wb/wAKzPgT2x0D 19tj549j5b43/Jjae2cVtvfmZzmw987s627SzmExgp6vfu1dx9eY7Lfw45NYTWVeOzUFH9vUyPTU 0tYgilk917oxvyR/4Vm/yfekNv1lV1x2j2J8o93pT3odn9NdW7vxED1c0YakXJ7x7bptt4qKnuVN RLRz1k0S6rU8ki+I+691e38R/kDS/K/4u/H35NUOz8xsCh786g2B23R7Kz9THW5bbNLvzbdPuOnx FXXwxwpU+JKgCOpSGMTJplEaB9I917ow/v3XuigfzCf+yBfnD/4qB8lv/fMZr37r3WmF/wAIY/8A uqJ/5ZN/81z37r3W1/8AzoPjz2R8q/5WnzY6I6gx1dm+zd59M19bsvbmLRpcruzNbJzdFv8Ag2Zi YUZfJV5lcU2LpYywDy1CK3pJ9+691pX/APCW3+dZ8LP5eXTPfnxG+aO567o2bdfd1X3TsrtSs2Pu /c+DyeQy2yMJ19uLrzdx2ZR5DI42egO36asx0lRj/tW+5rVmqIJUhjn917o5P88D/hRD0l80+gOz v5d/8sLae7PlNuPunZ+4I+3u3odh7xwWztn9U7Ix8m+ewpdkYXctPjcrW1VLRYueoyOcrqGHFUNB HNUxS1mtZaf3XujD/wDCJf8A7IF+V3/i39R/75ja/v3XujUf8K/+j95dv/yiZNz7RxtZlYPj18l+ p+8N409BBLVVMGzV2xubqDI5I08CO5hpKnd9JVVUgssUEck8jLHG59+691Wx/Ia/4Uc/y5fih/LE 6r+Mvy77H3Z1T278c5Owdv4vE0HVfYu+6XtXbGf37lOwNtZHamU2Fi8hQ0dRDDlhiamDN1VFeamM 4kaKYFPde62k++u+9h/KX+UT3/8AI/q/+NDrzvD+X13V2ds1Nx45MTuCHb+8OgMrmsdTZzGRSzpB VxJKI6iOOeVA6tolkTS7e691qWf8IY/+6on/AJZN/wDNc9+691v+e/de6+aH/IX/AO4oz5V/+JA/ mGf+/KyPv3XutxD+f/8Ay59y/wAzL+W92V0t1rSw13eHXO4sF310Vi6iqpqKDcXYewcfX42p2a1Z WNHDHLnMDlM1iKGSeaKCOtqKWWokSCORh7r3Wqj/AMJ9P+FCvUf8urp/K/y4/wCZPiuxuncL0zvr eyda9kz7C3buCo63TNbhqM5vfqTtfr7CUtRuSjnoc9PkauiqKLF1Tg1UtJUwUy0sUk3uvdbLHZn/ AAqD/kn9cbbqM7S/LqTsrIJHM1DtHrPp/uXNbkyskChmp6eXM4LHYunZrgI2RyVMjG9nOlre690a v+Ut/Nb62/m59O9t96dS9SdkdU7F637rynUOGHZc+Blze7osfs3D7vG4JKfbU1VR0UwXLrBUY+Kv qxCUR/uXEoVPde60m/8AhX7/ANvofhx/4qB8ev8A4K3sz37r3X0u/fuvdBL352pT9F9Fd0921eIm z9L051L2N2pU4GnqUo6jN0/Xuzqzds2Igq5FZYnqVozCsjKQpYMQQLe/de61MP5Cf/CkX5TfzSfm 5u34t/IPo7ojZ22anqTe3ZexdydK4bs7G5nBVez89jYBh97y7vz2fpaynqKOvdBXQxY5Vqo41EbG pSJPde63Kffuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X//1t/j37r3Xvfuvde9+691737r3Xvfuvde 9+690Qbrb+V18BOn/lRuz5tdbfGjZO1PlLvfNb83Juft2hyG7p8xkdwdoTTVHYObjw9fkpsVTVeW epqWrKiloI3fzTeoeaTV7r3R+ffuvdEGyH8rr4CZT5cw/PDIfGjZNT8tafNY/ckXcr5DdozC7gxW 249o47ONgUyIw7VcOPijp0qGxxcaVk1eUB/fuvdH59+690Qbub+V18BPkL8kNmfLvub40bJ378jO v6rZdbtPs/KZDdtNk8dWddZQZnZNTUYjF5GnxlY+OqQskDVtFMfSqtqRFUe690fn37r3WqN/wsD+ VGyOmf5XtP8AHvJ4zb+d7E+W/am1dt7NocxQ09dX7b2z1JmaLsvfvYmAFSCsVRRyQ4bBGdP3EXNX S3LL7r3Qmf8ACTz4Xr8XP5V20e18/ivsexvmTuzJ975maohliyEHXcSf3S6exDl7K9LJi6SXcVIy re2Ze7EaQvuvdbNvv3Xuve/de6R/YWwNm9r7A3x1b2Nt7H7u697K2fubYG+9qZZJJMVufZu8sLPt 3dG3snHEyM1PW0NTPTTBWBKOQCDz7917os3w7/l8/Df4A4Le22/h90TtnpHEdjZbE5ve8GAye6s1 UbjyWCo5aDDTV+R3fkMjU6KWKedYIUmWJDLKwQNI7N7r3Rie0uqOsO8Nhbj6s7l692X2r1ru+jSg 3TsLsLbWI3dtHP0kVQlZBFlcBnYZ6abxTxxTws8ZaOVEkQq6Kw917qnvH/8ACbX+SPjN6/3+pvgV sWTO/dfefYZDsnvfLbK8uhU0f6Nsruqbbniso/Y/hXjvc6Lkk+690cv5Gfyt/wCX18sttdKbL79+ KnVu+Nl/HKHOUnR+zKahymy9odbY7c38N/j2H27tfYNVi6BaCqGHxgloJad6cinRREBqDe690fn3 7r3RSPl38Dvh/wDPPZuI2H8u+gdh94be29WVVftptz0tfQ7i2tV18SwZGXam9NuVFFmcX90kcS1S 0FfCs3ji8ofxR6fde6Lv8Pf5MP8ALG+BPYI7Y+KfxN2f1r2bFj8niqHfuS3Z2d2duzDUGapTQ5eD buc7bzmdqMb91Tl6adqB4WeF5IWJjkkVvde6s9dEkRo5FV0dWR0dQyOjDSysrcEEcEH37r3VQfff 8gv+T38ltz1+8+1fgh1GdzZWsfI5bK9aV+/uiZctkZiWqcjloOi8xtuKqqJ3JkqJ543eaQmSVncl j7r3Tr0L/Il/lEfGrNY7cfVPwN6Riz+HmWpxGa7EpNy935TFVkcnmgyGNru7sjuKSCpib1Q1MTLL GQNDrYW917q2dESNFjjVURFVERFCoiKNKqqrwABwAPfuvdcvfuvdJ3d+0ttb+2nujYm88NQ7j2fv Xbub2luvb2Ti8+Nz22tx42XD53DZCG41wVVLNLBKtxdGI9+690Ur4b/y5/hT/L8pewaP4ddA7X6O h7VqNs1PYT4DK7tzVVumTZkdfFtZchXbwyORnEdCMpkTTxRSIimombTqcn37r3R1/fuvdVTfKX+R 9/Kk+Z++sn2f8iPhd1rursXO10uU3JvfaeY7A6d3RuzKz2E+W3jmul8xt6fMVbgAPVZN55WAALmw 9+690MXx2/lc/wAvv4ndb7/6o+PXxT6r602d2rs/Mdf9mHG47I5Xd2/tkZ/GticvtXd3ZG5Kmt3H kKGaB3Bp6nKuqszSIFkYufde6Er4i/B34pfA3YOd6w+I/TG3elNjbn3VPvbcOD2/X7jy38Y3TU4u mwsuXrsluqtr6x3+1o6aBENRoRUGhVJYn3XujN5nDYjcWIyu39wYrG53AZ3G12GzeEzNDS5PEZnE ZOlaiyWKyuNrVeGopqiF3hngmRkkRmR1Kkj37r3VKOa/4TdfySc9vaXsCu+BGwYM7LVS1jUGF7E7 y23skSzGQukXWe3d00u20iHkbRAmKEaWUKg0Jp917q3peoer4upT0PTbB2rQdMDr1+p4usMZh6PF 7KpetH26do/3GocBjliggxi4w/YJSQoqJDZFAAHv3Xui3fDf+XP8Kf5flL2DR/DroHa/R0PatRtm p7CfAZXduaqt0ybMjr4trLkK7eGRyM4joRlMiaeKKREU1EzadTk+/de6Ov7917og3TP8rr4CfHr5 Ibz+XfTPxo2TsL5GdgVW9K3dnZ+LyG7anJ5Gs7FyhzO9qmnxGUyNRjKN8jUlpJ2oqKE+plXSjsp9 17o/Pv3Xuq/vln/Ks/l3fObItnvlP8R+oe1d2vSpQy7/AJsNWbQ7MqKCKIQ01DVdm7AqMVuCWCBR anhkyTJDdjEqFmJ917oonXf/AAm//kl9X5iPOba+A/XuTrYpoZ1g7E393b29hy8BJRZNvds7nzeP dDf1xvTFH/tq1vfuvdXHbE6/2H1btPC7C6y2TtHrrY23KX7Hb2y9ibbw20dp4Gi1mT7PC7c2/DT0 dLFqZm8cEKrck2uffuvdE0+T/wDK6+AnzP7b2J3t8n/jRsnt/tnrTC4XbezN5bhyG7qOtxe39u7m qt44TCVNFgclR0ldSU+Srq2qjp8hTzpqnmUqUkdT7r3R+ffuvdQcnjMbm8bkMNmcfQ5fD5ehq8Zl sTk6Snr8bk8bX07Uldj8hQ1avFNBNE7xyxSIyOjFWBBI9+690RL4ofytv5fnwb37u3tH4ofFrrfp fsLfGHrNubi3bttc9XZmbbeRy1Pna/bWLqNxVtb/AA3GzVlJSVEuPxogp2angvGRDEE917o/fv3X uve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69 7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu ve/de697917r3v3Xuve/de697917r//X3+Pfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Wtj/OR/4T0S/wA4P5MdO9170+am5Omut+p+t6PryLprC9JYzes9 UZt21u5N2bmwG/Kzc+MTHV2ViqKKjkNTg69IxRQOFcXj9+691sRbC2RtjrLY2y+ttk4qnwWzOvtp 7d2RtHCUihKXDbY2nh4cDgMVTILAR09JTxQoAOAo9+690rPfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691//Q3+Pfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvdf//R3+Pfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvdf//S 3+Pfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvdf//T3+Pfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvdf//U3+Pfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvdf//V3+Pfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvdf//W3+Pfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvdf//X3+Pfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvdf//Q3+Pf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvdf//R3+Pfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvdf//S3+Pfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvdf//T3+Pfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvdf//U3+Pfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvdf//V3+Pfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvdf//W3+Pfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd f//X3+Pfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvdf//Q3+Pfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvdf//R3+Pfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvdf//S3+Pfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvdf//T3+Pfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvdf//U3+Pfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3XvfuvdF8+T3yr+Pfwy6lynenye7QwfUXVGGymGwmQ3hn6bMV1LHl9wVYocNjY Mft+mrKyeaeS4WOCmcgBnayKzD3Xup3xt+TPRPy+6g21358beyML2v1FvCbM023d64GDK0lDX1O3 sxPt/N0rUOcp6SsglpqymmgkiqKaNgVuAVKk+690Ovv3Xuve/de697917r3v3Xuqkfkz/Pd/lJfE DsLMdUd9fNbrvb/Yu3MhPiNzbS2Ztrs7ubK7WzNI7x1uE3UnSuC3CmMrqd0aOpoq94p4XsksaMQD 7r3R6fjD8sPjl8z+qqLu34udu7R7p6vrstksAu6to1VS8VDuDELFJk9v5zF5KKnrsdXwxz0870Vf TQzCGaGbR4ponf3XujC+/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69 7917r3v3Xuve/de697917pppc/gq7J1+Fos1iavM4pY3yeJpcjR1GTxyTANE1fQROZYQwYFTIgvc W+vv3Xunb37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3XvfuvdEQ+X38zf4IfAjP7G2t8vPkds/pLcPZOPyGW2Xi dwYvd+WqszisVWx46vyZXamNyApqeOeVY/NVmJCdWknQ+n3Xujy0NbR5Oio8lj6mGsoMhS09bQ1l PIstPVUdXEJ6apglXhkdGVlYcEEH37r3Ur37r3XvfuvdNM+fwVNl6LAVOaxNPnslDLUY7CT5Gjiy 9fTwo8k09FjZHE0qIsUjMyIQAjEmym3uvdO3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917ovnye+ Vfx7+GXUuU70+T3aGD6i6ow2Uw2EyG8M/TZiupY8vuCrFDhsbBj9v01ZWTzTyXCxwUzkAM7WRWYe 691O+NvyZ6J+X3UG2u/Pjb2Rhe1+ot4TZmm27vXAwZWkoa+p29mJ9v5ulahzlPSVkEtNWU00EkVR TRsCtwCpUn3Xuh19+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3RBu5v5ov wE+PXyQ2Z8RO5vkvsnYXyM7Aqtl0W0+sMpj921OTyNZ2LlBhtk01Rl8XjqjGUb5GpKxwLW1sJ9Ss 2lHVj7r3R+ffuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvdf//V3+Pf uvde9+691737r3Xvfuvde9+691737r3Xzj/kN8wPlnif+Fbe2+mcX8nvkHjenl+afxm2GvU2P7l7 Eo+shsncGxtrHPbRGwafIrif4bXNWVclZRfaeKaSeaSRGeV2b3Xuvo4e/de697917r3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3XutYH/hXl/25t3p/4sB0T/7vKr37r3Qg f8JP/wDtyV8cv/EgfIj/AN/fm/fuvdbH3v3Xuve/de697917qtb+cR8j93/En+WD82O/+vclVYPf +yejdxUGxdw0EkkOQ2xvPfdTT9d7W3XjZYgStTi6/LU+Qp2IKiSFdfpv7917rSN/4S+/yQfhn/Mf 6N+Qvyt+buytydz43Ad2VHSWxNjL2RvvYeEhzOF2PiOwd57uz+R64yWJzdZWTDcmLipQ+SSnUJO0 kU7yAw+691vXfy+v5c3xn/lkdRb26N+KmI3dget99du7i7pyGH3hu2t3nU43de5drYTZtZRYjLZN RVCgjodv49IIqmWaUMJHeZy/HuvdHt9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Wl L/ws0+Q/f3Q3VPwNTo7vDt3pkbs7C73bdJ6p7I3j14+4zgNt7ZGDGdk2jWUbVYo/vqz7YTlhH55S gGtr+691sg/yhN6bw7F/lc/APfXYG6txb43tur4pdL5ndG8N3ZnI7j3RuTM1my6V63MZ/P5eSaqr KudvXPU1MrySMSzszEk+691Yz7917r3v3Xuve/de697917rR2/lNf8J8v5jvwz/nNVXzY7u7N6zy nSeC3B8jcxnd2YDsTcGc3h3zRdtbXze39uUOW21UUsdRFJ/EsrQbiyK5eZo4qjHgRvUSiCY+691v E+/de697917r3v3Xuve/de6r4/mpfOSq/lt/Anvz5pUPW9P25XdM0/XIo+vqvdEmzKXPVXY3buA6 np3qdxw0GTeCOjfOivdUonMwgMAaIyeVPde6Br+S1/M5yX82b4b1HyjzPT1D0jlcd27vjqmt2fjN 61G+8fUvtPG4vNQZ2ly9VjMVJGJoctHC9M8D6XiZxKVkCR+691bZ7917r3v3XuvnM/8ACmzvH53/ AMub+bz038n+n/kh8gcP1F2rtXqvuDYvXEHbPY+M6VXeHR9VR7I7I6qfYlDkY8TNjK+noMRlM/Qr S+Kp/j05nR2qJC/uvdfQW6R7c2f3/wBNdT96de1n8Q2J3J1vsntHZ1aSpeo2zvzbdNujCvMF/TJ9 vVRiRDyrAqQCCPfuvdCh7917rQJ/4VwfzB/khivll8TPgR8Re4u1evtzUW0Yt+78xnSXYm6diZ/e nYnc26F2d1VsbcNVtWto3lloaXGS1tHSTSaCMykrgnxFPde63evit1Vuvoz4z/H/AKZ35vzcHaW+ urem+uNh727J3Vm8ruTcG/N4bX2lSYjc+7cpnM48lZUyV9dFPUiSpkZ9LgMSR7917ofPfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvdaxn847/hQ5nf5VXzd6F+I2L+K2J7qx3a3VXXfa+d3xX9u1 mxa3FUW/O3NxdZHb+JwVPt3KxtLSx7cmrBVzVRWRqlI/AghZ5fde62c/fuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3XvfuvdaFf/AAsM+cXzG+M/efw16++N 3yg74+Pe1twdT9h7y3HRdHdp706mqtybgG8KfCU9VuLL7BrMfV10cFNEEpqaqneGItI8cavI7H3X ugf2R/JH/wCFRXYXW20OztufzlcxLid8bHwG/MDhqv8AmMfzAaXPyY7cuBh3Bi8ZUxttc0cdYY50 icGt8KyXHn0Dye/de6L1i/5yX8+L+RV8n9vdK/zNYM98jerc+sGZfb/aGXwW7azeexY65sfkN5dE fInb6PUvWxkJ5aHOS1iQErDWY2innEye6919F/obu/rj5K9LdW/IDqHOruTrHuLYu2+w9kZnxGnn qtv7oxkeUokr6JyXpquESGCspJP3IJ0khkAdGA917oWvfuvde9+691737r3Xvfuvde9+691737r3 WsX8/wD/AIUO534S/wA1zpb+W7Q/FbE9iYLsvPfHfA5ntmq7erNtZbFv31uuHbr1mM2hDt2thkGK jqEmEUuQH3TKya6cMHX3XutnT37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3XvfuvdfOD/4W8/9lT/B/wD8V/7C/wDfip7917r6HnU3/Mq+tP8AxH+z f/ecpvfuvdCB7917r3v3XutHb+YB/wAJ8v5j3yT/AJ6GO+eXWPZvWlF0Pke5/jn2XjewMv2LuHFb +6l211Ph9v0ef2/j9nwUslRJWUs2GrJMNDjasU1QainaeooTLVGm917reJ9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3XvfuvdVXfzvN/wC+ urf5Tfzt7A6z3nurrzfe2Ois1Xba3rsjcGV2ruzbtdJlaOkavwW4sHLBV0c/ikkQTU8yOAxswv79 17qjH/hG98ge+e+vi/8AMGo7z7r7a7nqdqd67Kodr1Xa/Yu7+xKvblDlNhtWZGgwdVu+srJKSCeZ FmlhgZUaT1ldRJPuvdbj/v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu ve/de697917r3v3Xuve/de61jP5x3/ChzO/yqvm70L8RsX8VsT3Vju1uquu+187viv7drNi1uKot +dubi6yO38TgqfbuVjaWlj25NWCrmqisjVKR+BBCzy+691s5+/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3XutYz+Tj/woczv81X5u99f EbKfFbE9K47qnqrsTtfBb4oO3azfVblaLYfbm3esht/LYKo27io1lqo9xw1hq4aoLG1M8fgcTK8X uvdbOfv3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917rWB/ 4V5f9ubd6f8AiwHRP/u8qvfuvdCB/wAJP/8AtyV8cv8AxIHyI/8Af35v37r3Wx97917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6+bz/wpe+bH8wba384zbnxf +N3zQ+RXQWz8v1z8f9s7Q2n1V3h2X05sql3N2dXSQVWc3NT9X1VJJWPJWVKNPW1UFVURwqIorxxx xD3Xuh+r/wCRB/wqnwdJLmMd/ONrNx12N8dZSYOg/mMfPWWryc0MqulLFDura1Jjnuf1JW1CRMt1 ckGx917otXx2/n4/zd/5P/zFxfxK/m/U+6u2+s6Oq29Tb2o+w6bbWc7V2jsbcVWYKTuHqjuDZkch 3fRIizTNT5GryKVX289DFPj61JjF7r3X0h8DncLunBYXc+3MpQ5zb248Tjs7gc1jKiOsxuXwuXo0 yGLymPq4SUlgqIJI5YpEJDIwYGx9+6907e/de697917r3v3Xuve/de697917r3v3Xuve/de6+aH/ AD6P+4oz4qf+JA/l5/8Avysd7917r6Xnv3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuv/W3+Pfuvde9+691737r3Xvfuvde9+691737r3XzBPkr/3GSbc/8X/+J/8A7w2z ffuvdfT79+691737r3VFP887+dnsT+Tv01sitx+x6PuD5Hd21G4aLp/rKuzT4XbuPxu2Yqcbi7F7 CrqFZKtMTQy1tJDT0VMsc+SqHNPDPTJFVVdN7r3Wvbtb5nf8LMe4to435I7B+LOz8T1RncWu6sNs Nuufjnteqr8DWwfxChag617O3MOx5I5IJ4mpU5nlRUKmQ6y3uvdbFv8AI9/mTfJv+Yf033fD8xvj VJ8Z/kd8au2KLqXsfbMO396bNx2Zr8htKl3VS1y7G7B8uVwlZHHUAVWPqK2qUo9PUxTBKgRR+690 MH83D+bh8ff5Rfx9o+2e2aOs352Rvysym3+jujtv5Skxe5uz9zYukjqsnUVGTqo5xi8DixPStm82 1LOKYT08UVPU1dTTU03uvdaq3Xn8zj/hWh/MR27J8gfhZ8Udj9b9B5iSrq9kvQ7G6X2xhtw4GE+K nrdvbi+WeejrtzL6WSTJ4KIUs1QJVhii0GCP3Xuhu+F//Cnj5c/H/wCV+G+E/wDPC+OeN6Jz+dy2 CwUHc+L2rkOsshsSbc1WlBt/dPZu08vW1WIyW1qqVneXdG3qmCClhRpRT1kayvF7r3W8ojpIiyRs ro6q6OjBkdGGpWVl4II5BHv3XutST+cP/wAKX6/4nfIKX4E/y7el8f8AKr5jwZzH7N3Xkq3Hbl3j sbZPYGXaOOk6s2vsXr+WDLbt3UnlEddSUlfTQY6p0UkpraxK2io/de6ru3F8xP8AhZ31NteTv7ev xbwO4et8fQybirthUfVnxx3lk4sTBAayoir+s+qc+/YcQSONzJFoSoW5DWOm3uvdXhfyLP5//XX8 3DG7o6m7A2Pjej/l91pt2Lc+6NgYzKy12yexdqJXLislvXq58tI2RhShqZaaLK4euM0tH9xTslXW I8rw+690Fv8Awry/7c270/8AFgOif/d5Ve/de6ED/hJ//wBuSvjl/wCJA+RH/v7837917qrr+Zn/ AMKT/lNu/wCdm0f5fn8lHaOze697UG6qvr7dfYtZs9ewouxu1YKyWly+1+sYairpsZDtrb0UE8uY 3ZWM1LMUqKiKWnxVD9/kPde63HfjtR96Y/onqSj+Tma2LuL5CwbB22O5cx1lia7C7Aq+w2xqPuYb SoMnLLP9lFUl4Ypn8fnC+cU9Ksgpovde6Gb37r3Wgn/wpU+Z385uGT53fF2P4jU8H8sNsf1fjT8h 6fpje2T8m1JqXau7pM1P3BTZhsNHI+6iceynHL4eKN086tIfde6pw/kqfOr+eZ8Yvixv7YX8sv4c /wCzC9D5f5Abp3fu3en+y9dids/wztyv662rhs9tf+8e0cvj6aHw4bH4Cr+yeFpU+58pcrMir7r3 X0lPgl3d8gN7/A7pvvj57bMwfx671qOt87vHv3bGSoJ9h4Hr1MBlsjJJls1jdx1tXJh4f4LS02Ur Y62sP23kkEvj0FE917rUe+WH/CqX5efJX5KZD4qfySfi9H3I9JkMrRYvtPcHX27+zt89kUGDcR5P eWyersRLQU+39vxN+4MnuM1LPTMk1TBjHYxL7r3Rf+y/5rH/AArT+Cm3Ze8flX8Z8XuPp7B/bVm5 6zeHx/69z+x8FjAW81Vu7PfG7I0ddhad7hGrMjWwRI/jXUGcJJ7r3W0B/JV/nj9Gfzguutz02K20 3TXyW6roaCt7W6OyGcXPxNga6VaGk7G673A0FK2TwU9URTVCyU6VOOqGjp6tWjnoqut917ocf53H zD7g+A38r/5QfLHoNtrx9t9WU/UMO0Zt5YR9x7dppOwe/Nq9X5irrMKk9MJ5Icfm6uWlDy6FqFie RJY1aJ/de61QIf8AhWf8pct8G/jH11011vs75FfzS++c12Pj91UWzeu9y5XbnXGHouz8htvrKgx/ Ue0XmqM9u3O42BZaTFUlTGkEKQVlTTzishhl917q0H+Qx8/v53He/wAw+1fjb/NR6L3psTZeM+N+ f7k2VvfffxlynR+Tfd2I7L2rtDG7bxe4sbRY3B5Clq6HM5aoenWnkqRLRkrKqwzp7917rbV9+691 737r3WiH/wALi/8AmVf8u3/xIHyO/wDec2f7917rZ9/kpf8Abo/+XL/4qB0f/wC8TS+/de6JF/O9 /wCFBHSf8pDGYjq/a21qHvr5e71wq57BdS/x2TC7Y682tWGSmx2+e2c5QxTzxRVEqOcbhKRFq65Y 5GaahgMVU/uvda+O1v5jX/Cwj5K7Zoe9+nPiwu1Ors/Q0+4dv4bDfHXrLbGKzOCq4xkKCv23hO9s jV7qr6KqgZWpamnnmE8TI8Mj61c+690YH+Xn/wAKwe5du/Iug+H/APOM6Iw/Qe6JNyU2xsh3Ti9p bt6pyPWe6ap0gx8HfnUm8pKl6SjqJZFFTnMbLSQ0UZjllxzUxmrIfde63p0dJEWSNldHVXR0YMjo w1KysvBBHII9+691pn/ytP55nzm+XH88L5B/A/t6p6km+P2yt0fLLCbWxm3OvZMJufEUvS+96jD7 OkTc338s08hp6ZY6w1SyiXW7KqNoKe691sD/AM4T5V9qfCL+Wv8AKz5S9JHba9qdS7L29kdmy7tw 8mfwFLkdw9hYfZ09bW4eOen87QU+Rmmp0eXx+ZYzKksYaN/de61ROnP+Fb/ds3wi6g2njencL8uf 5qfcnYW/tsbd642BsXc+K2BtfbkO4fsevMnu7aOy5ZclnczktUkNDtvbs1LLNTxfc1VVRE0/3/uv dAD3z/ON/wCFVXwdx2O+Snyw+OW29q9D1uYxMVTht3/H/Zs/V+HbN1caYvBbmz3W2T/vLg2qnX7O n/jObhlaWURXadol9+691t//AMnP+bB1d/Nz+K/+nPZ+3G647J2TuJthd39R1GYTOTbH3mlBHlKC uw2WMVNJXYTL0ki1WMrpKWIl0qqRw01HMx917rU4/wCFKvzO/nN5bC/PP4ubz+I1PgP5YcW8OqMb R/ISm6Y3tJHPtTDb/wBo7w2Hmm7kGYmw3kyW6oMdRTL9iNLztQaIpx6Pde6rQ/k2/Pb+fH8a/iPk uu/5bvwv/wBPvx6m7g3luOt3z/sunY/ani7FyWEw9LuTA/3m2pmKClX7elpsdJ9qYNaeXUzEOoHu vdfRM/lW9yfMzv34QdT9pfPvp+n6L+T+4Mh2FBvfryn2pl9ifYYvDdhZPDbNyE+zNwVuQrsdJWYm CjnaKpqSZNQqERIpo1HuvdWH+/de61a/+FcPwzPyT/ld1/d23satXv8A+GO/sR27SyQ0yT5Kr6v3 S8ewu18PTSsR4oIo6rF7jrHv/msOQASQPfuvdRv+EinzC/2Yn+V1T9HZ7K/e77+G3ZGe6smgqar7 nJy9Y7zlk7E6vytQCbpTxmszGAokPCxYkKOB7917raXqKino6eerq54aWlpYZaipqaiVIKenp4EM s0880pCoiKCzMxAABJNvfuvdfM2/lb4+T+c//wAKce0PmPuGkqNw9O9Pdib1+T2JbIRKkVPsnpqp o+sfiVi5GlBjSspqpdqZNoFUtKKCrZQAJJE917r6Wu5Nx7f2dt3Pbu3bnMTtnau1cLlNx7m3Jnsh S4nBbf2/g6GTJ5nOZrK1zpBTUlJTRST1NRM6pHGjO7BQT7917rRd75/4U1/zAPnN8kNwfF/+RV8T v9I+MwElb/xmTeOyK/eG8dy4fHVyUJ3/AAbezFVjNubJ27POwhpqnd8lRLOstOZRjaqU0Se690Ev Z/8ANv8A+FTn8sODGdxfzBfijsXsHoYZbF0e6K/I7N6myO28ZTZKpFHT0U/aXxQzNXSbdq6qS0FF U56GeIzvGn287OkTe691uF/yyP5kvRH80z4u7f8Akv0aMhg0bKVu0ex+tdw1WPqd3dWdhYiGKoym 1M8+OYxTRvBPT12NrkVFqqOeGYxwymWnh917qhn+ft/O4+W38tH5/wDwt6J6azXUe3uj+y9l7L7A 7jr9/wCyG3DXz4zK91VmztyiXOvWwGhoabEY5nVqSOOVGkmkaZrRCL3Xuitd4/8ACh7+aD/MG7e7 B6i/kLfDzLb56q60rpcXnfkrvDr8bkzGfqQzpj8xj4d7VWN2ltSirwks2Mx24/vMpWwRpUNDQOKi ij917orfRf8AwqA/mf8AwP8AlRivjp/Oc+P9LJtmrqsG+9cknWUXVfdWwtsbgrnjpex9rUm0z/d3 dOGhj8xNLR0CtV/btHT5JJ4pY5fde63c/mR3D3XtX4P9294/CbaeH717ro+mK/fvx+21RUVRu/Dd hZWuxkWT25U4rF4WrpJctHNSS/e0dLSVSvVkRxRF2kVW917r5Nn83/5MfzK/kZ80Om+zf5inx+/0 EfJbbXT/AF5tzrfr7/RTuzq/+P8AXWH7W3NuDZ+e/upumvrquq+6z9dm6L7qKoVJft/Cqq8Ts3uv dbZ3xl/mnf8ACpjfHyP6C2X3J/LZp9vdQ7u7n6w2x2ruCq+KHbezYMB1vnt60WL3znJN25jchpMZ 9njJaqoFfVK0MBQSyo6KyN7r3V7v/CgD55d9fy4/5dG7fkn8bptn0vaFH2h1fsmgrt7bcO6sRQ4r dmYkhy9RDh2qKeN6gxwiON5i6KGY+MtpZfde6Vn8iP5td2/zCv5afTHyh+Q8m06jtbd+5O2cDn6v ZeAbbGErafZPZuU2th6lcN56hIpjSUsImMTKjMCwRST7917o7nzo7k3d8dPhJ8xfkH1/Hh5t+dE/ Fj5CdybJh3DRT5HAS7u6w6ky+9ttx5zH001PJPRtWUMIqYY6iJnj1KsiEhh7r3VDv/CZL+bP8uP5 qPXfy2y/yyruu8rluld6dT47ZmR2JspNlytjt+YPN1OXosvT0tTNBOsUuJhemdYUkUyTB3kUxrF7 r3Xv+FNv82f5cfyruu/iTl/ibXdd4rLd1b07Yx288jvvZSb0lXHbDweEqcRRYinqqmGCBZZctM9S 7QvIxjhCPGokWX3Xuqqvl1/wpn+fvyZ7M2x8Yf5MHRk3b2+Nrde7Yz3dPcewen8/3ZkMzvc4Gin3 3R9Z7Hmp6zH4va2HyklRjDn8utcmQkKGikigEFTX+691sCfyBvmF/MI+X3xj7hyP8yPqrMdYd7dQ 9+ZHq2kXcPTe4ej9wbh23T9fYHdCV2f2fmYqenasjqslUK1TjaSnp3haACAMpll917ojn853/hSn T/CDusfB34LdQ4/5S/NGWsw2B3EKyl3DubYXXW79yiM4Hr2k2hsSSLMbr3VMs0Blw+PrKWOkeaGG SeerE9DD7r3VaWZ+Xf8AwtD2Rtcd/wCf+LWFyfXUFKm4J+uaHqv43bkzoxiwGaSiq+p9k56XsqM6 Y3aWn8S1SE2OnUg9+691c1/Ir/4UKbK/muVm5ege5OvsT0L8ytg4Gt3NkNn4avq2697T2zjK5KHN 5nreDcU0mUoa/FSSxDK7erpqqaKEisgq6mJatKH3XutlD37r3XvfuvdfOD/4W8/9lT/B/wD8V/7C /wDfip7917rf8+Jv/ZLHxo/8V/6a/wDfdY337r3Wp9/wtpoNgyfAr4nZPIpjz2jSfLtKDZ0knj/i q7ByPTW5qjslKO/r+3bI0u1DU6TbWINXOn37r3VmP/CWhd2D+R/8QDul6poGyXyAbaa1oT7iPaf+ zGbrWhQcCTxfcCram8xJ8Jj8Z8HiA917qpr5A/8ACi3+Zx8svkX238ZP5L3wCyHYVB1DvTcXX+6u 7OwtoZrfVU+T2xmKrC1mcNPSV+I2ptKlqp6e+NG5crWS1EI1NDBNJ4IPde6KR3t/M1/4Vvfy6dvf 6ffmJ8fev8z0rhaygO5ajMdc9Cdgde4enyFd/DaRd3bi+Km4P4lhYZqiWKnhqq/IwIZmgTUzSqkn uvdbXv8AJs/mz9Y/zdvi5N3VtTa9R1t2dsDcEWw+8eqarIrmI9o7xfGR5Wgym281oieuweWpnM+O qZoIpVeOppZEZ6VpZPde6J5/wpT/AJnHyf8A5XXxM6Q7W+KtXsPHb17H+QdJ1xnsjvvaI3jT0+2V 67zm6ZYsXjp6mCCOaSpoKcPNIkhCAqgUsW9+691SH8hf+FQvzj78238W/jH/ACq+mKXu/wCXO7Pj N0p2P8nOydhdT7h7WfC9x7k6txe6O29hdRdSU8VXT0tFtnKVU1Nmc1mWrqaCTy0SxRmlNbN7r3R3 fhV/Ms/n37//AJc38xrdfa3xLzG4Pnt8YN0dDYj4+bD3p8Z949d53sqh7C3nDj+0JK3r6ilwkOcb B4GOrzFE2EWASAxlhUI8Sye691pbfPT5MfzK+2v5o3VPfHyw+P3+jP517f3B8eazYPTX+indmzP4 3l9nblp67p6l/wBHear6nI1P8VrUhh0RVimp1aIihIPv3Xutw34LfzN/+FNPavzA+O3XPye/l20+ xPjzvLtDbuB7l3tU/F3tXr+PaPXtdMU3JuRd35/cUtHRyUVPqqImnikEjosQjkaRUb3XurG/+FKf 8zj5P/yuviZ0h2t8VavYeO3r2P8AIOk64z2R33tEbxp6fbK9d5zdMsWLx09TBBHNJU0FOHmkSQhA VQKWLe/de6qZ39/wqF+WvyC2b8ZvjN/Kw+MdP8qvnHvL439Ob6+S/YNHsPdOc62687T3D1his12z trr7rrF1dM/hwebrp6Otz2fy0WLx88X2fiyQcVCe690Sbe3/AAoE/wCFEP8ALB7Y2Kf5mPxu2zuL r3elVLPBtbe/WW1eu6fdeJofFLmsd1n3R0u02IiytKksRkWrhyppxIpqKI60I917rfU+GXy26k+d Xxi6e+V3R2Qqq7rjuPasW4MXS5JIIs5tzLUtXLht1bM3JT0sksUeTwuVpqzFZBIZZIvPA7QyywlJ H917ooP83D+bh8ff5Rfx9o+2e2aOs352Rvysym3+jujtv5Skxe5uz9zYukjqsnUVGTqo5xi8DixP Stm821LOKYT08UVPU1dTTU03uvdaq3Xn8zj/AIVofzEduyfIH4WfFHY/W/QeYkq6vZL0Oxul9sYb cOBhPip63b24vlnno67cy+lkkyeCiFLNUCVYYotBgj917obvhf8A8KePlz8f/lfhvhP/ADwvjnje ic/nctgsFB3Pi9q5DrLIbEm3NVpQbf3T2btPL1tViMltaqlZ3l3Rt6pggpYUaUU9ZGsrxe691vKI 6SIskbK6OqujowZHRhqVlZeCCOQR7917r58PxS/4Vzd37If54bo+b9L1fv5+u6ehxfxP6X642tN1 5n96dk1++8lijt2r3MkuVkgwNDiofu8tlchTVDwJBDHHJJWVcMFV7r3XH4vfzqv+FJ3ZXyQ+MPZ3 ZHxP3VSfDj5Cd7dP7Nqaak+F298d1XSdc9nb/wAbtufMba7KFO+bhBoKqWbE5bIZuellkKy6KmK0 Z917rZy/nefzmOvP5PPQG1N4z7Nh7Z767ly2a270h1TPmv4Diq59u0sFTuzfm88pCktTFhMKKyhS aKkhaerqaqlpI3p0lmraX3XutcHZfze/4WRfIzaGJ+S3UPxd2TgOnN1YmDdu19op1/8AHPaMWX2x kozlMTXYfZfdO5hv6qpqmlmhejljZmqIRFJEZNZd/de62FP5Gn8zH5ZfzBdifIjZ3ze+MEnxm+SH xa3xszZe+MXDtjfGw8duiPe2ErMxi6sdf9hNUZLE1lPHQlqpDkKmCdKinqKfxRyCMe691qu/8Lef +yp/g/8A+K/9hf8AvxU9+690dTsr/hQr/MY+Z+5P9lp/kMfEjMds7f6p2XtHDb3+Te6+v6nOyTZW DBw0MtRgMPvGbGba23RtUxyx4+TdctTVZBI3ljoaUI49+690V3q7/hTf/Np/l7fJ/B9F/wA4z460 uV2nkJsXVbujPWuN6o7k29tLL1z0i7/65yO0ZF2vuWgpQJm+1jpClY9O1NHk6SUSSe/de6+hFsje u1Oydl7Q7F2HncfunY+/tr4DeuzdzYmUz4rce1N04mLO7dzuMnIGunrKOeGohewujg29+691p7fO 7+eZ85vj3/woR6J/lx9eVXUkXxn3p3n8JerNyYvM9eyZPeGQwXyHyW3KXfeRG7TXpNDXRJnaj+HP BGkMRhpzJBNabz+691uE73zdVtrZe79x0MdPLXbf2vn83RxVaSSUstVisTNX08dSkLxu0bPGA4R1 JF7MDz7917rQJ+Av/CwHsXB9E/L/AH7/ADAqLZvaHbW2cl03j/iH0103sqTr3MdhZneNNu1uxId0 7jeavo6LAYRsZt1p8hJBJWRfelIoa+WaOOL3Xuo+/v5pX/Ct/f2yqz5WbD+GVd1L8f4aWXddBs7b vxpwGayDbLhYZOnyFXs/smqye/q2meiKvLkqKjgimhLVMCwx2Ke691b3/IF/4UdUn80fdGQ+LfyY 2RtHqr5b4jbOQ3XtLJ7DfKU3W3eG3cApm3J/AcHnZ6yrw+dxtMUrKrGtkKqKqp1qaymanjgkpYvd e62q/fuvde9+691Ux/Nz/m/fHb+UV0TQ9kdrU9Rv7tbfsmTxfR/QuAytPitz9mZnEpC2Wr6zKzw1 K4jA4z7inbLZmWmmEXlihggqaqaGB/de61LNg/zgv+FUn8xDH1Xcvwj+KGB2X0hWV1ZHtav2f0rs 5dpZahoqlqQx43sH5K5GaPPzwsRFW1WGZIfOkgWCn0vCnuvdKTpD/hU1/Mh+EPyDw3QH85z4kNjM HWNiWzm58N1tmenO7NsYHI1Bpn7Axu26maXbm7sUuh9EGJgx4kZZjFXyvGKY+691vudY9mbB7o66 2P231ZurE74627K2rg97bG3hgp2qMRuTa25MfHlcLl6GR1Vwk0EqPokRXQkpIqurKPde607vmP8A 8KJu9Phb/P3358Pu5t3dXbP/AJevUVLtOp33VN1tXZjsV8XuD4dY/ut5aTcFDVvV1GVqdz5OKhxl NS06xyKaamaJmaSWT3Xui0bk/nmf8KCP5lFfu3sL+UZ8FslsD4sbXy2UoNudg5vr3a++d5bxGHqW grEyO9e06yn2nVV+kRPUbf2xQVdRQSO0EldW/tzH3Xult/Kr/wCFQvyeqfmJt/4B/wA2zqjb/X++ d0dgU3UFB2zR7QyHUu7uu+2MnXJicDtbu7rvIOaFaPI10sNEmWx8NAtE0sMtRBPSSS1dN7r3W9Z7 917r3v3XuqgP5/H/AG5t/mE/+IAy/wD7vaD37r3VAP8AwiG/7JZ+cP8A4n/rv/33Unv3Xuj6f8Kb f5s/y4/lXdd/EnL/ABNruu8Vlu6t6dsY7eeR33spN6Srjth4PCVOIosRT1VTDBAssuWmepdoXkYx whHjUSLL7r3RCe9v+FL/AM0vlbvPbHxY/kp/FZfkf3Rj+vdq5fu3vSbY24Nz7LwW663B0sm74ut9 pzVlHQ43DY7KyPjo90bvyb0dTLqgpqSaM0uQqfde6IpP/wAKMf57/wDLF722bs/+ax8bMLuvZW8F lykm2tz9cbb6p3Vm9r0lVDRZjI9QdpdWFtt1lTj5ChniqaTIKDMsUxpvPBNH7r3W/d0h31sn5X/H Dr/5D/Hbc+Pymzu6+s6HfXV+4s1jpaimpG3DiDPi4t1YGjqIpUqMdVk0uYxgqo5Yp4Z6ZpEkQsPd e61Hv5Fv8/n5s/J/+ZP2b/L0/mIr1hj94HD9qbc2FFs3Y9PszMYPvPo/Myz732BXNBWPHU08mHod wVBZonmSXHRhTollI917rdd9+691pZfzj/57nzq6X/m1dQfy0P5d1Z1J/GslJ0f13vebffXzb4rK 3vHvfPwVeIwtRVGriWmxePwWT2/UzGmVJFeprDLLaKMRe691uB9x9wda/H7qvf8A3b3Hu/E7C6u6 u2rl96b53fm5Xjx+D29hKVqutqXSFXlmlYARU1LTxvPUTNHBBHJNIiN7r3WjHub/AIUZ/wA3/wDm b94bv6k/kkfDOGDr3aU2h+xN67Uwm798fZVby0uFz+/N175yVB17s5K/RJLR4nIyVUrNE+mumVJo 1917pH70/nf/APCj/wDlT7o2nuT+aZ8QNo9gdIblz2PxWQy822ev8JTu1QBXPgdo94/G7I5PamPz MtNHO9PSZqirXcJIRT/tuye691uy/CD5odIfzAvjN1p8qvj7marJ9e9kY2eUYzLpR0u6tmbkxdU2 O3LsbeuLoZ6hKTK4yqjeGoiSaSORfHUU8k1LPBNJ7r3WvP8Azr/+FEHaHw8+S+3/AOXV/L06Rxfy D+aO4o9rUO48hmcbm94YfY25uwaSGu2T13tbrnac1PXZ3c1XQ1VNlJPPWQ0lFFPSB4q9p6iOj917 qvDMfNT/AIWWfHXEyd69rfEDafaHWtFfN5Lr2i626G7Cq6fDyXqJaaXZHxs3N/f2COCJxreQGWER 6pydMur3XutlHZ/z1+TnyT/kyN8+PjX8d/H8rd5/HzdW+Ou/j1kafLb0ifsvbmcrNq1OLosbC2Ir 8pDJLQVGRxtCpiqKiMw048krWf3XuvmWfzf/AJMfzK/kZ80Om+zf5inx+/0EfJbbXT/Xm3Ot+vv9 FO7Or/4/11h+1tzbg2fnv7qbpr66rqvus/XZui+6iqFSX7fwqqvE7N7r3W2d8Zf5p3/CpjfHyP6C 2X3J/LZp9vdQ7u7n6w2x2ruCq+KHbezYMB1vnt60WL3znJN25jchpMZ9njJaqoFfVK0MBQSyo6Ky N7r3V2X/AAoi/mE/Ib+Wj/L+ovkJ8ZJ9l0fZeW77646yOQ3xtn+9uModvbjwmczmVmosQ9RBEap3 xUECyTiRFikltGJDHJH7r3VE0/8Awqa+VHcvRnxQ+N/wK+O+N+WX8zDtfqXBZzvHO4LY+5Kvq3rX d1QswymKwHX2GqYJK/IwUgpsll8hPlabCYlpNExqCKilovde6Jzvn/hQX/wof/li9x7LT+ZZ8cds 5zYO9Ko1VPs7fXVm2uu6DdGDoJIqjcGO6p7r6caXFDK0sVRAs33YzH2nkiNVREyLq917q4z5m/8A CqPrT+4vx963/ladSZT5h/M/5R7L21uPbPWsuHzecxfSOQ3PQGpj2f2NtnZEv8QzW7KaSOeOfbuK roIoIY3r6rIx0/28dZ7r3VPXdP8APH/4U2/y4dzbN7T+ePx42jR9Qb1zy4/H7a350xs/E9fZCeaF 8lJtPFdldO1xqsZl/s455KOnyuTnnCxPLJS1KRTKfde63kf5dPz16g/mU/EvrT5ZdMQ5LE4De0Nf i9y7Nzjwy7g687A27Ufw/eGx81PThY5no6iz01XGiLVUklPVqkaziNfde6Cf+ax/NU+Pf8pj45N3 l3WlduzdO6MlU7W6Z6Y23X0dFvDtjekFF97PRUdVVrKmOxGPiMc+czk0EsVFHJEixVNbVUVFVe69 1qZdc/zUP+FW/wDMnxFX3p8EviXsXrboGtqq07NqqLZnT+CwefxNHWSUnlxO+flpnKY7nlicGnq6 /b1PHTNPDIiU8DJJEvuvdCt8VP8AhTn83fif8pcF8Pv55fxpo+oZc9WYKgHcuE2dWdcbj2TS7irh jsbv3eG3XrKvAbh2qZRJ9zmdsSU4pkiqHjjr5ImgX3Xut6ikq6WvpaauoamnraGtp4aujrKSaOpp aulqYxNT1NNUQlkkjkRg6OhIYEEEg+/de60Nulv+FV/aXT3zw/mNbI+eWQ2PXfHD490fyHwvx769 6r66/hPZu9+1+v8A5HYfrbrTr3Gbkq66WKT7rAT5muylVk2CRx0clUrgxCmn917pAbh/m7f8Kovl 1taq+UfxC+DdR1J8YJqefcex8NtrpPBb/wA7urZTyGpxlfTVfbsjZ3dzPANIyW0sBSU9UPXT0yXF vde6sX/kG/8AClLc38wvuM/Cf5p7C2f1t8nqrD7hyXWO+9j02T27tLtis2dSSZLdOxM3sfOT1VRh 9zUmPp6rKI1PVvR1kVNWoIMdNTwQ1vuvdHr/AJ5HzC/nCfFjK/HCm/lb/FCn+RuF3rj+0J+5ct/o f3l3DVbWymBqcFHsjH/ZbNy2OfGx1UVXk5PLVRSCpMemJ0NPKG917r52f8oD5MfzK/jn80O5Ozf5 dfx+/wBO/wAlty9P9h7c7I6+/wBFO7O0P4B11mO1ts7g3hnv7qbWr6Grpftc/Q4Si+6lqGSL7jws rPKjL7r3X0LP5H3zO/nN/KXf/fuH/mg/Ean+O2x9pbP2XkurNxt0xvbp6qz268lmq2lzmFhi3jmK /wDiUYo40nlamgH2xSMSOPuI1b3Xuti737r3SD7S7M2R0t1p2B2/2Zn6PavXfVuy9zdg763LkGK0 WB2ls/DTZ/cGWqNILFYKWnlk0qCzW0qCxA9+691ohp/P7/no/wA1ntrsjbf8mP4hYPbPTvXWQjpv 717kwmwNxbwjoa2qkfAVnY3Yvc2Ux+xMTkMpTUss8O36WKWaFWnRKyvEK1Q917o2fw2/mwfz+Pj5 81fjZ8Tf5svwqx9Z138l+0Nu9TYbu/buzMRh32zubdLGjxtZTdm9LZDM7AyUdKY3rK/C+GGtNOJJ kqI44wje691sjfzUfkp2P8Pf5eHy1+TPUI2//pM6d6ky27NltunFy5vAQ5tK2nx9PU5HEwz05qFi E7SJGZQpdV1h01I3uvdVmf8ACaz+Zx8n/wCaL8TO7+1vlVV7DyO9euPkHV9cYHI7E2iNnU9Rtluu 8HumKLKY6Cpngkmjqa+oCTRpGShCuGKhvfuvdbGXv3XutM7/AITYfzzPnN/NJ+VnyI6j+U9V1JVb O2X0Y3ae1INgdeybPyGFzsXY+K2z/Doq4V9S09C1LlJAyVYmm1RQsJx+75fde62kvmV8v+kfgh8c OzPlJ8hdxSbe606xw611dHQxQ1m4dzZquqFx+3Nl7Qxc0kIrMtla2SGjooGlSMO/knlhp45po/de 60Xsb/woQ/n9/wA0Hsje9L/Km+IeH2j1bszILA1RguvMN2hmMHT1EctZi6Ps3uHtqWm2hBkq2CGS WnoKXH0UjKGWIVBTyt7r3Q7dBf8ACiX+bl8I/kr1R8eP50Pw3mxeyO2N3YHZWO7YoOvJOqt3Y6fL 5aHCVW7dv5vDVFRsfd9BQyTxSV9FiPtJI0LOKu4SB/de6tM/4V5f9ubd6f8AiwHRP/u8qvfuvda6 X8sT+fX2J8Rf5ZPxW/l6/wAvr435z5X/AMwDdW8O867IbeqdqbxzmzetaDc3auWz+3JP7ubW+3r9 x101BMuQnWmrqSgx9NaesrGKy0ye690ue4v54f8Awpw/lvZ/aHZ/zy+PG1V6i3jno6OiwnYHS2zs TsSueZZK+TaWN7J6VrVmxeValEjUcGVr55wITI9NULFOre691u7/AMs7+YZ1D/M++IuwPlf0/R1m 3aXcNRktr7+69y1fT5TOdXdnbbEQ3VsTL5KkjhjqvCs9NW0FasEJqqCqpKpoKdpzBH7r3R+/fuvd e9+691pyfPj/AIUOfOrN/M3uL+Xr/KK+CmW727d6O3Vldg9m9p7z2ruffdDi9x4WsfFZ6rxGzNoV eOoMPiqSrjenptw7ozi09RICDQxqIzN7r3RCO5/np/wsT+Hezst8jvkB8etm1vTW2aWr3RunHw9b /Gzsrbm2dtUhTKV9Zu3GfHzP1G68XjKOnutVWVtVB4IRI886vG0qe691sYfyKf53Gy/5w3Tu+HzW yKPqX5K9ISYCDuHrvFV1Tkdo5PFbparj2z2B11X5FjVtjat6Kpgq6GrMk+PqFWKSaoimpqmf3Xuj Q/zb/wCaN1P/ACmPidk/kb2Jt+q7B3Tm9xUXX/T3U2MzNNgcl2N2HlKCoylPQ1OZniqjj8VRUlJU VuWyYo5/BEixxwzVNRTwy+691qgdX/zG/wDhXV88NpUXya+Jvxe672l0DuGSfM7Mx9FsvoPaGE3N tqOZjSTYA/JrcqblzlLIkDouSxJ8VQzM1OVDQonuvdXkfyPP5o/z/wDl/wBnfIf4m/zIvia3x4+Q vx02bsfe53LSbO3h11Sb125u/NVu3qaXJ7M3VLWwiWWSiaoosvhsi+Pr4xUfbwQrT3l917rY49+6 91737r3XzA/+FIP/AHEcdP8A/lkv/vUU/v3Xuvp+e/de6+ap/wALVOzupt7fNX4qdX7JrMPnO4er ej9x03bC4WWHIZXD0e+93QZnrPZmdFIWaGsjijyWUhoZLSrBkoJ9GipjZvde639vgJ19vTqT4JfC rqnsiGup+xOsviV8cevt+wZMztkoN6bM6dw23N0w5BqktIZ1rqadZTIxbWDqJNz7917qlz+eJ/wo l65/lY5zFfHHpTYON+Q/zU3Xhcfmk2PXZCuj2B1HitwArtXIdmDbzDI1+Tyh0TY7a2PmpqmWkZay orKKKeg++917qnGn+XX/AAtE3ftqPvvCfFXC4Lr2rh/j8HWrdVfHLC7gXGy/5SmNHUu9s+3ZakJI qCnki+8soBJcOT7r3Vlv8kj/AIUiT/Pbuar+D3za6kxfxx+aOP8A7yUW3ziKXN7Z2R2RndlRu+7N iVOyt8VE2Z23uyiigq6iTEVFTVRzpTVWl6WaJKST3Xutg75wfLjYXwQ+KHdvy47Owu5Nx7K6S2nH uTK7e2jDRT7jztTkMzS7awWHxn8Smgp42qchXUsLzzShIUZpWDBNJ917rTWwP84X/hTp/MrpJt// AMuX+X/tfpnorJyPPsnd+c25tKefPYxJBUeel7e+UGWwG18+ulDA1Rg8FFEGLxj94Lp917oG63/h RD/PV/lad57H2F/N2+K+29zbA3dWSS1bHZe1Nk7wzO3sbkY4NyZPpztPqLIT7IzFVjo6mJpqJ4Kh HJpo5aii+4FSfde634OiO7Ou/kj0v1Z391Jmv7w9Z9x7D2x2NsfMNC1LUVe3N14mLL44V9FIS9NV RpL4qulk9cEyyROA6MB7r3Xzm/59H/cUZ8VP/Egfy8//AH5WO9+6919Lz37r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3X/19/j37r3Xvfuvde9+691737r3Xvfuvde9+69 18wT5K/9xkm3P/F//if/AO8Ns337r3X0+/fuvde9+691oH/8LQviN3dkN4/FD55bM2zkN49Qda7L runuy5KXFTZrFdbZ6DfL7y2Xn94UKq6R4vPPkajGtVSqIFnpYaad1kq6VJfde6uy/lv/APCnX+XH 839sbJ212t2Xg/iR8ksrR4zHbj6w7krjt/YmR3XMBTVK9ddwZBUwdZR1FQVWgpspV0ORcyLEKR2G tvde62NqSrpa+lpq6hqaetoa2nhq6OspJo6mlq6WpjE1PU01RCWSSORGDo6EhgQQSD7917r5c3/C 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 +4v54vxy+fv8undGWzOMjy3xi7C7Dzc2y9z9a1Ff3x112dUYnMU8mI3NSUc88VbtrG7bStqBC0NS Zp0kMjeYH3Xuvq6bq2ntXfW3cvtDe+2tv7y2nuCjfH57a+6sNjtw7dzePlIaShy+Ey8c1NUwsQC0 U0TKbC49+691XV8lv5xn8rj4Z5qt2T3780ekdkbt28tTS5fYG3Mpkeyt7bafGRkSYzObE6mpM3lM dOqrpipKqjilfhY0Y2Hv3XutQj/hTb/OE/lV/wAxj4D7A6u+KvyFp+4u8tjfJPZPYGHxR6Y+QGwa zFbQj2NuTbe76yLcXZe1MLj2hdq+hWaiFYZJXEUixP4NSe691sff8JhMrkMz/Ix+CtXk6qSsqYcf 8g8VHLLpDJj8F8rt94TEUo0ADTBSU8MCcX0oLkm5PuvdamP8+j/uKM+Kn/iQP5ef/vysd7917r6X nv3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv/0N/j37r3Xvfuvde9 +691737r3Xvfuvde9+6918wT5K/9xkm3P/F//if/AO8Ns337r3X0+/fuvde9+69025nDYfcWJyWB 3BisbncFmaGqxmYwuZoaXJ4nK42uhNPW4/JY6tV4Z4Jo2aOWKVGR1JVgQSPfuvdasn8zH/hKR8A/ lNs3sDf3xP2rT/ED5Hti8tndsx7FrJaToLde6IopKylw28esqvzUmFoat9NN91tb7BKO61DUlWI3 p5vde6rK/wCEX3zr723/AJP5F/BXsTdme3x1P1j1rge4+mhuGvqcpL1ekW6afZe6tj4CtrHeSHEV /wDEKCtpMYhEFLNT1MkCI1VNq917qrL+dnsbrj4+f8Kfsdvr5N7Tw+4/jP2d3R8N+5d8YrflDQ5b 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 yu7er+uu5Ots1T7j697V2PtbsTZGepXjeDL7U3lhINw4DIRmJmUeWlqInKhjpJIPI9+6918sT+QT 8cPjBtP+d52n8HPnf051v2ljJcP8jvjntLZvd+3cFufCY7vLrLf1FmsXXxw5lEpVyk2N2xnMbRTx RgzNWGCBSalQfde6+h5/wyl/KP8A+9cvxA/9Efsn/wCpffuvdKLaP8n7+VlsLdO3d7bP/l9/ErAb s2lmsbuPbOeoOkNirkMHn8NVpX4jM46WSjYR1NLPHHPTzKNUcirIhDqCPde6rw/4VE/ODuH4Nfyt 81uLoncWW2T2N393Nsv42UPYG36k0W4tjYPeGz9x783ZmtvZFGWSkrajF7Zq8TBW0/79M1Z9xTtF PHHNH7r3VPv/AAnb/wCE9XwD+QHwW6m+c3zB2LN8luyu+q7e24tvbT3FuzdWM6467wO1OxMnsaip JcHtSuof43k6yTEz1mSkzMlRTp51po6VXgeon917ph/4VLfy0P5bvwr/AJdGzt//ABt+NPTHRnce 5fkv19tXF5ja5qMduvO7UbZ+48nunF42jyNbK9RTo8FDNVmGJvHaMsVDC/uvdXnf8Jcf+3FHwZ/8 uZ/+DD7B9+691qg/z6P+4oz4qf8AiQP5ef8A78rHe/de6+l57917r3v3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu ve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697 917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3X uve/de697917r3v3Xuve/de697917r//0d/j37r3Xvfuvde9+691737r3Xvfuvde9+691oX95/yg P5i+7P8AhTvt/wCcW3vjdlMl8Uovln8fO3pe5E371VBhIthbF2btyj3TlZsLVZ2PLpNS1GMrYBQN jhVSsimGGRJYnf3Xut9D37r3Xvfuvdam38474L/zw8R826b+YV/KM7+yGQXJdUbK62318cG3ztvD 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 n/4Vcfycdv5f4t9A/GzC93dJvuLM5bZlKaXYPdfWWKyWYq1nzW4di5zFZ3DZ7C01fUSfcyY/OrSx eYzVP2McklRJJ7r3Uz5Y/wAiT+eZ/MQ6J7y+a38wTeVV2J8utr7Z2lhfiZ8Ldkbv6uiGGizPb2Ag 7AfJPiKqn2PgsdSbTbM18OPxWVnyeSq4aaTIVn3FMtJW+691twfyCvjN3f8ADz+Un8Sfjr8jtjVH Wvc2wKfu2p3jsirzG3s9VYJd7/I7eHYe246nJ7Vq66heSbE5agqXjhqnaIyGKUJMkka+691rxfze f5S38wj5Ifz/AP42fLjpX465bfHxz25u74aZfcfaNLvbrLF4nA4/qvf1Lkt/T5PFZ7NUuTU4+mp5 JzGlCzzLpFMszsqn3Xut6P37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3X/9Lf49+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 0H/bP/Mq+y//ABH+8v8A3nKn37r3Xzw/+EQ3/ZU/zg/8V/69/wDfiv7917r6Pnv3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu ve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697 917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3X uve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69 7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv/9Pf49+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3SD2Z1Z1j1x Llp+vOuNh7Dnz0kM2dm2ZtDb+15c1LTtI9PLlpMHTwGpZDLKUaYsVLsRbUb+690vPfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvdf/1N/j37r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3X//1d/j37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3X//1t/j37r3Xvfuvde9+691737r3Xvfuvde9+691Sr8t/8AhQh/Kr+EffG8PjX3 73/nMN2/1/Hhv77bc2x1H2rvSl23W5/Dw7gx2Jrs9tvET0L1RoamlqZYqeok8YmRJCsokjT3Xui1 /wDQWB/JK/7yN7A/9J37v/8ArJ7917ozHxB/4UEfyuPnR8gNlfGH4594bo3R3L2JT7pqNnbbzfT3 am0KXM/3M2nXb53DBHndyYqnoopIcVja6rCzTprELKhaQqre691dN7917r3v3Xuve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917qLXV1FjKKs yWSrKXH47H0tRXV9fXVEVJRUNFSRGoqqysqqgrHFFFGrPJI7BVUEkgD37r3Xz6/5N3yy+Xn82X/h Qv3d8isV8hvkDi/hv07N252fj+qKbsrf2J6pl6sEcvUPx764ymwaSuGFjqa772k3JXUj0emqqKDI 1BBmLSe/de6+g97917qm35s/z9f5WfwI3PlOu+6fkni9xdtYSoakzXUnTOFyvbG9sBWRG1Tj91yb XR8ThKyK6l6DNZSkqirKywstyPde6JB1f/wrm/k29hZ6LCbi3/3n01TzyRxRbi7Q6QztRgTJL6UE svVtTueqiXVZWkmpURb6mZUDMPde62H+mu7+nfkT15ge2uh+z9i9v9Z7nhM2D3x13ubE7s23XmOw qaVcnh5ZY46mnY+OqpJSs0EgaKaNJFZR7r3Qpe/de697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3Xuk3vLdmE2FtDdW+tzVMlHtvZe285uzcFZDTT1ktLhNuYyXMZapipKVWll ZIIZGWONSzEaVBJA9+691QL/ACov+FGvxi/mw/JDffxo606V7n6k3btzr/P9obUyvYj7QyOK3ftL bW46DAZOnrRtWtqmxeUVcpRVSUrGop2QVCCs8kUS1HuvdbD3v3Xuve/de697917r3v3XutRraP8A woA+WO4P+FB1b/Khq+qfjvF8c4O6N6dVQ7xpsD2SvdYpds9R12+aXMSbll3O+CaSSvpFWSEbbUfb sYwwkHm9+691ty+/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/ de61vcB/wph+I+4P5pFZ/LBp+nu64Nz03yD3B8Wo+5potrnZ8vcu2twT7JyFA+2kqzkkxLZ6lnxk OTGpmHjqWpkp3Z4/de62Qvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv dBz3D2tsfofqTtLvHs3KTYPrbpnrne/a3YObp8bkcxUYfY/Xe2ard+7MpBiMRFNV1T09BR1Ey01L DJNKVCRozsqn3XuiIfy4f5uPwx/mp0Xb1V8R90b2zc/RtVsen7Exu99g5vZNbjIux4stJs6uopMg HpqqKrOCy0ZEFQ0kTU580caywNL7r3R5+6u4evvj31D2b3p2xnodr9Z9Q7F3P2LvrPzRvP8AwzbG 0cPLm8vPBSQ3kqJzDCyU1LCrSzylIolaR1U+691oQzf8Kk/5xPzZ7Z33jP5Xv8vPb+7esNjVC1r4 tenu4PkR2Vj9v1M00GEyPZm4NgZbGYXFSZNaeSWDHwUIZJBLTw1td4jM3uvdbbP8nX5pfJz52fDu HuD5gfHOs+MHfm3+0N8dYbz67n2b2D19R1su0oqGqg3Ph9mdoNNmsdTz/etSPTVdZVFZ6acCduUT 3XurU/fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvda8P813 /hRr8Yv5T3yQ2J8aOy+le5+2927j6/wHaG68r12+0MditobS3LuOvwGMp6IbqraVsplGXF1tU9Kp p6dUNOhrPJLKtP7r3V/Wzd2YTfu0Nq762zUyVm296bbwe7Nv1k1NPRy1WE3HjIsxiamWkqlWWJng mjZo5FDKTpYAgj37r3Sk9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvdaj3zW/4UAfKz41/z4Okv5XmzOpvj5meg+wO5/h/1XufeG58L2PUdvrS/ JKt2/R5/MYHPYrctJhaaTHfxwtRxVGAqQ/htIx8l0917rbh9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Wo18J/wCf/wDLH5J/z4e7P5Xu9eqfjvh+gev+6PmL1Xtrd+1sB2TS9wPS/G/I Z+k2zmM7n8tueswtRJXrg710VPt+nAM/7TII7Se691ty+/de697917r3v3Xuve/de697917r3v3X uve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69 7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xutb35yf8KYfiP8Ev5gX+yCdhdPd17r3B t7KdV4Xs7s7a8W1121sjIdtbexm8MIcfg8jVpXZiGkxOaxdZXyQeJgZJYYI55YdL+691she/de69 7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de6//19/j37r3Xvfuvde9+691737r3Xvfuvde9+6918r7 559S9d99f8K1M30v25til3p1h2h81fjPsnfm0q2qyNDR7i2tuDrrZ9BmMRU1mImp6qNJ4XZGennj cA3Vgeffuvdbwf8A0De/ySv+8COv/wD0YPd//wBlHv3Xuh3+NX8lf+V58Pu49sfIH44fEPY/WXce y6fP021N9UO5eyc7k8BHunb9VtTcDY2m3Zm6+ljkqsbW1dE8op9YimkRWAdr+691aP7917opXYvz 7+CXUG75uvu2vmr8Surt+01c+MqNkdi/I7p3ZO74MlHIkL4+bbW5czTVqzq8iIYmhDgsotcj37r3 Rkdo7y2h2Bt3F7v2Hurbe9tp5unFXhd0bRzmM3Jt3L0rEqKnF5vDSzU1RGSCA8UrD/H37r3Wuf8A 8Kgvkxgtjfym/kltrq75A4nZ3dVFvbovGT4DYPa1Ht7tGkoqjt3CTZrHy4rbtfDlo4noyXqojGFM JJkBQ+/de6C3/hLl8vNl1P8AKd2QnyF+T+16jf8AR90dzUiJ3L3XiZd4Uu3xnoZ8VTIu98ma1KMG SV6dBaO7OUHJ9+691tGbd3Jt3d+Fx+5dp5/C7o27loTUYrP7dylDm8Lk6dZGhafH5XGySwTIHVkL RyEXBF7g+/de6R/aPc3T/R+3hu7urtfrXqDahm+3G5+0d9bX6/28ajTq8AzW7KqkptdudPlvb8e/ de6Bzqj54fB3vnccOzujfmZ8Uu593VLaKfa3VHyI6h7F3HO/jaXTDg9oZisqWOlWayxHgE/QH37r 3Rrffuvdamn/AArR+UeM2r/LPXbXSnyKodt9p0vyt6vwO7MB1b25T4fsCnxGOwG5ps1hdxYraeQj yKU0FfT0b1VNUxhEqIoTIokRLe690ZX/AITm/Lzrat/kz/DSbvf5QbHq+00p++6TccvbfdeBn3+l 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 c88SNPVQUkWLhSoGQloqv3Xut0z4ef8ACQja3xB+SHxC+UeA+cG5N2b3+Pna+xO0t/7WyfS+OoNr 76l2rWxZSrwe0MhRbg+7w8ck0bRLNWrkC8TepI2BB917o3//AAp1/nCb6/lofGbY3U3x0zse3/lP 8pKjceO21vCOGGqrupeq9rQwRb37AxUNRHLCuYqqitosTg2njshkra2I+egjVvde6qj/AJcX/CST ZHyK6U218o/5ofenyFzneXfeFxvZk3XWyN2YjF5ralFu+hTL0Ddt7933jdwZTM7jnp5YaiujiNIt HMz00rVbo0g917ohn82j+T13N/wnd3T0/wDzFf5a3ya7ig68j39S9fZ2Tdk+An3513uLM0k+ZweL 3dW7cpaDE7p2ln46KqoauiyGBiiiliggqfuzWxNF7r3W/J/LV+aOF/mF/Br45fMDD4ql29UdxbFF buvbNDPJU0W1+xNsZiq2V2TtzHz1BMz0lHnsbkIaGWe0klMIZXAZ7e/de6+eb8JOlt3f8Kn/AOan 8i97fMHv7szZXR/WW19x9j7N672XlsQdxbQ63ye+qPa3X/U3WFHuOnrcThaeCjeGfPZtcRUyVVVC slRDJU1xqYfde6vK+Q//AAjN+OFLicZvT4D/ACw7/wDj93rs+ogzW1Mp2lnMRvfak2exlSK3D1lJ ntg4zb24Nv1iSDjK0dTW+LTG8VFrV2k917q9b+a3/KP2J/No+NPUXx67f7n351zN1T2JgOzE3vsn E4TKVm4s9i9iZPZOQhyeIz14hHUjJyVSyJIHjddI1K7e/de6+ah0D/KW687i/nsZ7+Ujku296Ybr vEd1/JXqyPtyhwmDn3pNj+jOsN1b9xOVfB1DfYiavm29DT1CBtKJM7J6lX37r3W+V/Kt/wCE0PQ/ 8rL5V03ys2P8le3e19yUHXu8dhUW1d1ba2ht/BiPeX2sVXk6yowvknmMMVO6xQAqut1kLft6W917 oo3/AAqh/nFdz/EXEdV/AH4b7kzm1fkh8jdvjdfYe+9mNUrv3ZHVWazc+zNn7U66qqFWmpc9uvKU 2Ri+/pnWsoaWjtTKJ8jT1VN7r3QLfDP/AIRo/HrJdQ4Xev8AMJ7y753d8jt942Hcu99tdQ7u2jtr aGwc9nlGTyeDqtx7iw2eyG4srTTOyVuYNTBTTTGXx00qhKiT3XuqiP5hnwZ+Tn/CWf5WdDfLj4Lf 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 Ve4dyVWz927Oo6zctHt6g3M1Rg6beNHQ1VTRPT5GERVJgTUyv6dGh3917o7vv3Xuve/de6+e3/ws 4+LGe6u7u+HP8yfrF6jbmWyfg6N3hubDj7Osw3ZnWtfUdo9KbmjqI0IfIT0RzkKzu+pYsRTIoZU9 PuvdEU6W7azn/Ci//hQ38Vexdx7brKTqHrPYfSO895bRyCTVeP2zsL467Mo+yuzNr1qx8fw3PdlV +SxEMkYS8OVgJbVdz7r3X1D/AH7r3XzQ/wCfR/3FGfFT/wASB/Lz/wDflY737r3W8X/OZ2l2Lvr+ VJ/ME2p1VBXVm9sv8Vu3I6LHYzyNksxhqXa81dvDA4+CFXeeevw0VfRxUsal53lEKeqQe/de61Cv +EafzF+F/SWy/lp0j292R1j038hewewtjbx2zneyty4PZS9odc4vbUuGotnbZ3BuGaCmqKvA5Nsh WyYsTLUSJkxNBHOkNS1P7r3Vt/8Awog/nXfCDrH4R9+/DvrPtHaPyP8Akl8neudy9MYjr7pjdeJ3 nS9e0G96B8Hlt5di7m22a6ioHo4pb0WDMhyNdUPCiQRUpnraf3Xuic/8Ihv+yWfnD/4n/rv/AN91 J7917rd99+691737r3XzRPg9/wBxo+9f/Fv/AOYT/wDA5dl+/de6+l37917r5onzh/7jR9lf+Lf/ AMvb/wCBy609+6919Lv37r3XzQ/+FOf/AHELfEb/AMR/8N//AH/ee9+6919Lz37r3Xzr/wDhX58b t2/GD5ufD7+aP0rHJtvP7tqNsYLO7qx9NCVwvyB+OeVpt3dUbryLlBrrK3CpT01MHdgYsBayhfV7 r3QKfypsvm/56X/Ckjc3zt3ptnIYzqfpLx/Iml2tmUgqo9t4jqfC43rH44bPean8tJBkEzJxm4p4 YmcTPRZF0d3LT+/de6+l37917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv/T3+Pfuvde9+691737 r3Xvfuvde9+691737r3Wvj82/wDhM7/LW+evyT3/APKruD/T/tvtLtD+BT74XrXtHGYTbOZyu38B TbYpM2uH3Jhcu1NUSUNHSQzpSzxwMYhIIVleV5Pde6Kh/wBAbf8AKP8A+ej+X/8A6OXZP/2Ie/de 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 Lbo+PtVj6vYNVncBk9rVuaaMti6EV0NJuCnSYRekRl5C/uvdXGb62dh+xNkbx6/3CKo7f3ztXcOz s4KGcUtacPubETYXJijqSrCOXwTv430nS1jY2t7917qp3+Vd/JB+JP8AKGzHdOd+NO9O/t55LvWh 2XjN2Td37v2HuZMXj9i1WSrMPS7ah2LtjbaxB5MpUGoerFS7aYwjIA2v3XurjPfuvdUk/wAun+Qj 8Mf5Y3yc7a+V3x93p8iNxdidwbH3f15mMN2vvbYW4tl7d2vvXsHE9kZil2vjtr7Wwlcsi12Ex8UE 2RyNY6wIysWkdpT7r3V23v3XuqSfj/8AyEfhj8b/AOZD2J/NC2JvT5EZHv7snfHePYeV2hune2wq /p/E7o+QVVkKvf1VgsBjNrUWaWMNlK4UMNXuCoSES+oSFIynuvdXbe/de613/m9/wl//AJVfza3x uHtOs2Dv7449n7srq7M7p3V8adz4bZeM3RuCulNVU5rOdf7qxWc28s887PNXTYzGUU1U7ySzzNO5 lHuvdEk67/4RdfyyNsZiPKb77o+YPZtJTzQyR7cq98dX7TwVXEpJngysm29pR5Jw/AVqTI0xUauW JBX3XutlT4f/AAn+LvwJ6jh6N+JfUO3+nutxmKjcmQxOHqcxl8nuLc9ZQ0+MrNzbr3RuWprcplMh LT0lLTmqr6yV1ihihQrFHGi+691Xh/MW/kI/DH+Zz8nOpfld8gt6fIjbvYnT+x9odeYfDdUb22Ft 3Ze4tr7K7By3ZGHpd0Y7dG1s3XNI1dm8hFPNjsjRu0DqqlZEWUe691dt7917r3v3XuqGf5iH/CcX +Wn/ADHd+5juPsLZm+OlO8NxXm3R2v8AHncGE2Xlt7ZBSXiym+tsbixeYwOSrGYkVWS/hcWQqEsk 1a2iExe690Sz49f8I7/5VvT278fvDsvO/Iv5LfwvIR1tLsrtDfm2tvdeVK06q9LHmMR1dhcHlKvT MDJLHJmft5lCxS07R+US+691tI7J2Ts7rXZ+2evuvdrbf2RsXZeDxu2do7P2piKHA7a2zt7DUq0O KwmCwuMSKnpaWnhRIoYIY1RFAAAHv3Xuqcf5YP8AIR+GP8pnt7tHun42b0+RG6d09q7H/wBHmUoO 5N7bC3NgNv7XO56bdb0u2qXaG1sBUiRqijpUM2Qqqt/HGACGaR3917q0b5HfG3o75cdNb1+P3yN6 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 uve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69 7917r//U3+Pfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3VPfwu/k cfBX4JfK/tn5n9M43tXNd5duQ73psll+zuw5N7Yza0HY26k3fvM7SpJKOnnWeuqY4opK3JVNbVCA PEs6iepM3uvdXCe/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r3v3XutWr/hS5/Jo+WX826l+GE/xaznTeMqPj3UfIWLe1F2xu7cW05a2HtyPZD7fqtuy4TC5aOZa dtr1qVqzvCymanMQlBlMXuvdbEHxc6uzvR/xm+OvS26K3E5LcvUHRXUfV24sjgZayowWQzuwOv8A H7Ty1bhZ8hBTVD0ktRSSSUzz00UhjKl40a6j3Xuh19+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3VR388b4MdxfzG/5cHcfxS6GymxcT2hvTcXVWewFR2PmMtgNqSw7G7Jxm7ctSVmXwtBk 54ZZKSkmWm/yRkaXQjtGjGRfde6Sv8hf+X93b/LR/l67U+MXyDyvX+W7KoOzOzN8ZCXrTN5jcW2a XHbwzEdRiqNcrmsdi5ZKhYoQ84Sm0KWCq72J9+691c37917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917oOe4abs2s6k7SpOlarbNF3JVdc73 pupa3ek9bS7OpOzZ9s1UWw6rdlTjKatqY8ZHlTSPXyU9HPIsAcxwysAje691qif8J5/+E+HyN/lv fJfuj5e/NXdvUG9O0NxbDrtgdV0XXm59y78rsZVb03BFn+zN/blzO5sNilp8hUx0VLj6J6V6iSSG qyQnaIOgm917rcB9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691Wh/Mz/lYdC/zWuvuq+qPkh2D3vtnrXq3shO0f7l9N7x2ntLEb/3FT4qTB0EPYD7iwGaqZ6e lpKnIQUv8MnoZ4xWVDLPrMTxe690f/r3YGy+qNibN6w6423i9ndf9ebXwWy9lbUwkH22I25tbbOM jw+CwmNguSsNNTQxxJqYmy3Yk3J917pYe/de697917rT0/nK/wAhf5n/AD8/mwfHf5pdJbp6FxnT uwNs/H/B7tp9/wC9N3YPedBU9W9q5Pd+456PB4jb+Rp6mKWhrYfsylaGeUOkiRKFkf3Xutwv37r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvdai3/CiD+Sl/MN/m7fJP43T9JdhfHzaPxm6d67yOIWHsnem+cXufDdi753W1 T2TuyTbWA29kYaqGXE47btPQpFWa2emmWTwK4c+691tF/H/pTZfxu6M6f+P3XNGtDsXpbrXZfWG1 IBDDBK+F2Tt+n2/RVdYtOArVNQsH3FVL9ZJneRiWYk+690L3v3Xuve/de697917r3v3Xuve/de69 7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuve/de6/9Xf49+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691//9bf49+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691//9ff49+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3XvfuvdMsW5Nuz5qo21Dn8LNuKjhW oq8BFlKGTNUtO0ccyz1GKSQzohSWJwzRgWdTezC/uvdPXv3Xuve/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6ZaPcm3chlK7B 0Gfwtdm8YpfJYejylDU5THoGVC1dj4ZGmiAZlF5EHJA/I9+6909e/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917ppgz+CqcvW4CmzWJqM9jYYqjI4SDI0cuXoKeZEkhnrcbG5miR1ljZWdAC HUg2YX917p29+691737r3XvfuvdNOHz+C3DTzVeAzWJzlLTVUlDUVOHyNHk6eCthRZZaOaaid1WV VdGaNiGAZSRYj37r3Tt7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuve/de6xTzwUsE1VVTRU1NTRST1FRPIkMEEEKGSWaaWQhVRVBZmYgA C5492RGkYIgLMxoAMkk8AB5k9Vd0jQySEKqgkkmgAHEk+QHmesFBkKDKUyVmMrqPI0chdY6ugqYa umdo2KSKk9OzKSrAggHg8H3aWGWBzHOpRh5MCD+w56rFNDOglgcOp81II/aMdTPbfTnXvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Qe7y7c6p66rcdjewezuvdi5HMKHxNBvLem29sVuURpTTq2Opc3UwSTgyAoD Ererj6+/de6XlPUU9ZTwVdJPDVUtVDFUU1TTypPT1FPOglhngmiJV0dSGVlJBBBBt7917rN7917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6actn8 FgUpZM5msThUrqpKGifLZGjxyVlbKC0dHStWOgklYAlY0uxtwPfuvdO3v3Xuve/de697917r3v3X uve/de697917r3v3Xuve/de697917r3v3Xuve/de697917plrtybdxeRx+IyefwuOy2WYJisXXZS hpMjk3aTxKuPoqiRZZiXIUCNTzx9ffuvdPXv3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv /9Df49+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3XvfuvdfNI+D80p/4Wj73vLIdfy7/AJg0L3djrii+OXZPjibnlV0JpU8DSLfQ e/de6+lv7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69 7917r3v3Xuve/de60lP+FHm8P59+B+c/R9H/AC38f8zZfju/Tu0J8bP8Vdmbr3NtCTuB9/ZdN1r2 9VbQoqyGMrSrhAse5imN+zuyKQa8+/de63N+t33rJ13sKTsmGjp+xZNl7Wff0GONM2Pg3q2DgbdM NCaNnhMK13nWIxOyaQNLFbH37r3Xze/5DE0rf8KjflgzSyFp+wP5hvnYuxaa/Z2QlPlJPquwDG/5 AP19+6919Lj37r3Xvfuvde9+691737r3Xvfuvde9+691737r3XvfuvdfNI/lRTSn/hYF8obyyHX8 u/5psL3djriize/fHE3PKroTSp4GkW+g9+6919Lf37r3XvfuvdFC/mDO8fwI+b0kbMjp8Qvko6Oj FXR16ZzTKysvIIPII9+691phf8IY3cp/NDjLMUVvhQ6oWOhXcdtq7Kv0BIVQT+bD+g9+691v9e/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r Wf3DuH+bOv8ANnocbjaHv8/Gc9/7epiabb2Xb4/f7L82XgXM1FRmVgOC+6/gRqJGaSo++FdZVH3G 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 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de6+eL/wuLdz2j/LrjLMUXYPyQdULHQrvuLZyuyr9 ASFUE/mw/oPfuvdb3nxQd5Pi18a5JGZ3foHpx3d2LO7t13jmZmZuSSeST7917ofvfuvde9+69173 7r3SF7Q7F2x0/wBadidtb2qKqk2Z1dsXdvYu7qqho5chW022Nk4Co3LnqijoIPXPKlLSytHCnqdg FHJ9+691XF/LE/nGfEP+bVS901HxXg7YopuhKjr6Hf1D2psvHbRqkj7OjzT7Tq8O+JyeUgqY5Tt/ KJMPMjxmNdSaZEY+691av7917r3v3Xuve/de697917rXr/4Ul53+ZlgPg3ser/lh0fetV2XL3ztm DtZvjRgs1uLueHqw7RzTq2Ax21YanM/ZNm1xIyMmIgNQq+MSMtGaq/uvdGJ/kO5b545r+Wr05kP5 jNL2ZS/IyTOb/Rh3TiqjCdwzdexbpnTY83ZOKyUcOQhyX2+tFGVgjrWplp3qVaRjI/uvdaaX/CnK aVf+FC/xBZZZA0HX/wANvAwdg0Nu/wDPyjxEH02Ylhb8kn6+/de6+lx7917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r/9Hf49+691737r3Xvfuvde9+691737r3Xvfuvda0PRf/AApR6R7A/mF/ OH4Wd2dQYf409XfCT/Zi23R8pt7d6UGU2/uCH479uUnUeRer6/bbWPfHyZqrqQ+KpKXN5GpmmMFF DBNU1CKPde6rE+RH/C1HYWK3puXE/D34L747v652nUTmu7X7M7CqOtVyONg1xDL0+xdu7fz01BQ1 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 FqneGg3Jv3NZSWOj2/i55I3SCWo81XPpZ6WiqI45XT3Xutdt/wDhZx3hi6XHdk7k/lI7qxPROVqq RKPeD967ugpZ6Kub7enqMdviv63iw1XK7rI8MKJGspHhEqm8o917rZ7/AJW384n4f/zZ+vM7ub48 5vObb7E2LHRt2f0Z2LT4/Fdl7Gir5npqDNfb42oqaPKYeqkjZabK42pljBKxVSUtS324917qon/h Qd/P22X8Ctwdr/y8cn8Zt4dk57v74cbmni7Rp+w8TtHCbb/0247dPWFC0G3ajE5CbIx49qI1U0gq 6fyMXp1CmPyt7r3Wnl/IU/ni7V/kyf7NZ/eb47bg78/2ZD/QZ9l/Aux8d1//AHT/AND/APfH7n7r +IYfLfd/f/3pj0aPF4vt2vr8g0e6919EP+TF/OF2r/OJ6i7g7U2z0Tujoj/RD2Pjev63D5/eOO31 S53+K7Yh3HTZPH5zH4/GaJI/JJFUUj0p0DwyCV/MUj917oj38yX/AIVP/CD4Hdr7w+OfW+wuxvlz 8hthZ7JbP3rtbYNRRbI652dvvD5J8Rltgbi7Jz0FZUy5emqV8FRDg9v5OGKUPBNPHVRPAPde6qrn /wCFmvdHXecxFd3z/KY3hsDr/cNQ8eMrp+6t17ezhpWmScVOIm3l19SUWXkhpi2qCN6USsVfzQoC re691tp/y6P5kvxg/mg9BUvf/wAZNyZKpxlJkm29vzr/AHdS0OI7J6t3YkIqjtvfOBoKmshieWFl qKKso6qopKqIloJ3aOZIvde6CH+cZ/M7pf5SvxDg+VFR0tUd9zVvbGy+q6HYMPYMfWMb1W7sdk8s +Yq92PhdwGKOmgxc1oUxchkd0XVGupx7r3QwfywvnLS/zJvgx0V81KPrSo6eh7pp+wmfrep3bHvq TbNV172vneqa6Fd2xY7ECtjqJ8FJVwynG05CSqjRhlJPuvdaHX/CnP8A7iFviN/4j/4b/wDv+897 917r6Xnv3XutPT5r/wDCvX4+9Rd0ZjoD4O/Gbe3zo3fgs1kdsZDe+I3hJsbrrJ57FzS01cvWseDw m5ctummikiKfdxUdDTTi81JUVNP45Zfde6h/C3/hW/s3t75I9Y/Fn5i/Bntb4m767a3ls/r/AGlu fH7qqt84qHc3YW4Y8Ds+beWy92YDa+YxWMnmqIIGr6M5M6j5TCkJcxe691uL+/de697917r3v3Xu ve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697 917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3X uve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69 7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuve/de6/9Lf49+691737r3Xvfuvde9+691737r3XvfuvdfJJ2b8D9tfzJ/+FLfy3+JO+d55jYnX +9/5gfz33Hv/ADW3IYZtyVWz+ue294b8y+3tvNVhoIKzJjHrQQ1tRHKlIZfujBUmEU8vuvdfVC+P vxm6C+KvUu3+i/jz1RsvqjqnbWPjx+P2htPDU1FRVVqVaSqyWfqGDVGUyFWqBq/JZGWeqqnJkqJp HYsfde6+aJ/wpV+LOE/lUfzZukflH8OMXj+nqLtDF7X+TmzMJtejXF7a2N3z1xv+WDeMW2sLRFIo MXWS0+Iy81BEUgEtdV08cUVKIox7r3W/p8+fngnx5/lP94fPrYP2cORpvi/jOy+p3rJYMrjqXenb mEoMT1HPWPCjRVlPDmc7i3lVQEnRSoZFfWvuvdaYX/CTrq/4LjO/Ib+YX84e8fj4vyDx3aj7C6Xp vkb211vid04HNT4am392d3bRYfsXJJWVOWytRmKGhotxGASQtDlI4Kh5KipEXuvdbsvdvyb/AJVv yO6r3r0n3j8o/g52Z1Z2Hg6zb27tm7q+QvSOSxWTx9ZGUEiLLmtdPVU76aiiradkqKWdI6inlimj R1917rRn/wCEvfY7fEv+eP8AK34NbD7Fp+xejewY/kZ1ZhM9g8xFmdqb8yfxr31W5frLtjE5DEaq OqWowOPzYpKyIiKWDJMyMbxg+691Zd/wt5/7JZ+D3/if+xP/AH3Ufv3XujLf8Ji/5M3QnR/xF60+ eHdW1do9z/Jr5S7RoOxNq7g3biKPdOO6a6n3HAtTtPb2zoc9HKsWbyVLprs7mURZwJlxkLLTwTy1 3uvdbQ+A6V666vxHZL9EdbdX9Sbr7FkyG4M7mNlbE2ttBdz79OGOLxG7N7Pt+gU5OqhCQRtVVsVR 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 s7I64lqMcctQEY7N01Bk69ZKbI46ZoMjjKtPHNT1EcNRBJHIiOPde60WP+ERe+9xUHy5+aXWVPXT JtLdXxy2jvvL40TSinn3FsDs2m2/t2uaAHQXhpty5SMOV1ASEAgE3917q8z/AIWSf9uj9uf+Lf8A TX/vE7v9+690b/8A4S4/9uKPgz/5cz/8GH2D7917rVB/4U5/9xC3xG/8R/8ADf8A9/3nvfuvdfQX +cu2ezd6/Cf5hbN6Ueuj7l3b8WvkFtnqSTGSSw5KPs3PdS5fFbCfHzQpI6TjKy0hiZI2YPYhWPB9 17r5/v8AwkL+cXwc+I/Zvyd6a+UWf2f0X373LkNiUnWXbnaZxu2tvVuG2muRpdw9OVe9894o9vV0 mQqIa2Omq5oIcnKqwO5q6Sigm917r6GfaHx++OnyRi66z/bXU3Vfci7C3RtXs/qrcW69r7e3bUbU 3Rt7J0+59rbv2Rn6qKWWkkWeGCZZqOZUnjuknkhkZG917odPfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvdf/9Pf 49+691737r3Xvfuvde9+691737r3XvfuvdfM4/lW5HH4/wD4WBfJX7+uo6H775l/zScdRfeVMNN9 5kKnN9gfbUNL5mXyTSaW0RJdmsbA29+6919Mf37r3Xzg/wDhbv2Ngct8pPhD1RSVFPLuTYvQ/Y2+ 83BHU+SopsX2bv6mwmAWppQgEWt9rVzITIS4+qIFVpPde62I/wCcz0hvTE/8Jje0elaqiqIt49V/ Ej4c0+56Kam8VTSSdE79693HvdKimV28bQU+DrTIPIwTSeWtz7r3Wr3/AMJw/wCR3/L6/mvfFvvL sH5I7h72o+5Opu/pdmtiur+wtrbWwUHWWb67wmb2ZkK3F5XC5Wparnyq7ljeoMiRtHDGiKWjlPv3 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 rD6D37r3XzKtj9ifPT/hV3/MM7W6hHyK3V8aPg113iczvaXrzA1GWrNobQ6jpNzU+39l47K7Bxld jqfdm9c7JJFPUZHNz+ClYV0tMIKWCnxsvuvdXpYf/hFJ/LJgxlHFn/kV87cnmUhC5Cvw+/vj/g8Z VVFzeWjxNb1vkJYEtYCN62Y/nWb2HuvdUp/8Il/+y+vld/4qBUf+/n2v7917q/7/AIWSf9uj9uf+ Lf8ATX/vE7v9+690b/8A4S4/9uKPgz/5cz/8GH2D7917rVB/4U5/9xC3xG/8R/8ADf8A9/3nvfuv dfS89+691rk/zN/+EyP8v/8AmLbn3N3FhItwfFX5IbqrKzL7i7U6joqCv2vvrP1paSfNdldS5V4c dkKqWV3qKquxNViq6rmYyVlZUH37r3WoJluyf5qn/CU35ndddUbq7equ7fihvNot3Yrr6HcOZyXR /dXV8OYSg3odp7R3K8smyN40WtUqJ6FUeKp+0aaXK4uRVqPde6+obs3deG35tDau+duTyVO3t57b we68DUzRNBLUYbcWMiy+LnlgblGeCZGZDyCbe/de6Unv3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r//U3+Pfuvde9+69 1737r3Xvfuvde9+691737r3Xx+d8fFD5D/Mz/hQN87unvidvKj2H8j8b86/nr2109uKr3BW7Rlp9 79Md07q7MxEGI3dQAvislI+N04uvfTFFV+EzSQxa54/de6vgo/8AhWL/ADJ/hBtUfG75+fy4mz/y p2vQttyj7C3fuTdHQU26q3Hr9hS7o3D1nBtfK0WdepcwzS1m18tj6Cr1eSjSGKWMj3Xui9fyz/5X /wDMF/nXfzKKD+Zv/Mh2BujYfQNB2Bt7tHOT742tkdg0Ha0fXs9OvXPRnTWxM1or/wC6dMKOlo8h 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 RfbmpkiEjRg+Rfde607tn/8ACu/5mfFKibqn+ZN/LJ3JRdy7dtjK7cWKzG7fjnVZqqoz4PPlOtuw 9u5mMTTqjzvWY3KJSyG5p6SOFl0e690QDtDaH8zH/hVp83ekd45T4v7g+LHw56wo4tsJviuo87U7 E6z63zu4kznYe46TsveOPxSb13lkooqako8fhMdDDeCg81JQ0orcg3uvdfRn7poN5dZfFPtnF/HT ByHsHr34977oOidt46hjysp3ltPriqp+sMHQ42qutS331PQwRQSEiQ2VuCffuvdaL/8Awlk+Uf8A Nj7o/mMdtbX+UXbXy/7V6OpOjOw8n2NQ/I7cva25dnbH7Cod6YWn2tBtxOwlqaXDZo1E9ZTR4egk oy9H943ieOiCJ7r3X0JPfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691/9Xf49+691737r3Xvfuvde9+691737r3XvfuvdfNE/lQ /wDcYF8n/wDxb/8Amof+7vf/AL917r6Xfv3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de6KT8nPnN8YPh3U7To/kN2RJsWs31Q7gyG06WDZ++ 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 VMlNMSfde6v4/lefy8+rv5Ynw36x+K/W32uVyOCpW3N2xv8Ajokoq7tLuHcFLCd776ro7eRYpJIY qHFU8zu9LjaWipGklMHkb3XurCffuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3X//W3+Pfuvde9+691737r3Xvfuvde9+691737r3VcHVf8o7+Xh0n8wN4fPfrD45Y /a/yy37uDsfde6e107F7fy33+5O3Jqio7GzVNsXO7gqttUdRlXq6pp5KLDQlfNKIvGJHB917qx/3 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvdFd+SXwu+Mfy7i2xH8iOq8f2I+zP4mNs1b7g3ftbJ4mPMtTvk6eHLbKyONqnimalgZoZZmQFbh QS1xzyZ7lc7+3rTnk+/az+p0+KPDhlV9GrSSk0cigjU2QAc8eHQC539seRfcZYF5z29b36XV4R8S aJk16dQDwSRsQdK4JIxw49KjoP4v9AfF3btbtboPq3bPW2Jyk9PU5hsPFV1mYzc9JGYaOTPbkzUt Vkq4wqziH7urk8et9Gku90PNnPHNvPN4t/zZfSXskYITWQEQHJ0RoFjStBXQgrQVrQUMOUeQ+UOQ 7JrDlGwisY5CC+gEu5AoPElctJJpqdOt2pU0pU1Hr2FOhb1737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3SI7J642X29sLdnWPYuETcext8YWs29unBPXZPGrlcPXp46ujOQw01PVw6 h/uynnjcfVWB9mey7zuXL262+97PL4N1auJIn0q2l14HS4ZTT0ZSD5joq3vZds5j2i42LeovHtLp DHLHqZdaNxGpGVxX1VgR5HoJfjf8Q/jl8RsLuHAfHjrHHddY7dldRZHcrQZndG5MnmqrGxSw43+I Z3eNdka6SKmWef7eA1HiiMshRFMjlhBzn7hc4+4NzDd84XzXj26ssdUijVAxBbSkKRoC2ldTadTa VqTQUD3JPtzyV7dWs1nybYLZJcMrS0eWRnKghdUkzyOQuptK6tK6moBU1Mj7BnQ2697917r3v3Xu ve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xugl7e6F6W 7+wMW2e6urtj9nYWmkeagpd47dx2ZlxVRJYSVWFrqpDUUUzBQrTUksblbqWKkgiDl7mvmXlO7N7y 1fT2MrYYwyMgYejqDpcDiA4Irmleg7zHylyxzfaCx5nsIL+JcqJo1cofMoxGpCeBKFTTFadEZl/k x/y0pcgMm/xkoRUieKoEcXaPdsOP8kJUopxMO5VpSh0jXEYdD86lNzeUV+8j71LD4A3ttNCKm2si 2f6ZttVfQ1qPIinUUt92X2OabxzsS6qg0F1fBcf0Bc6Keo00PmDU9HQ6V+NHQHxzxlRiujuodh9Z U9bFFBkqra+36KjzWZigbXAud3E6vX1+g8oaypkK/i3uNuZedebecZxcc0bjPfFSSolkJRCeOiPE aV89CrXqTuWOR+UOS4Db8q7bBYhgAxijUO4HDxJMySU8tbNTocPYX6FXXvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X//19/j37r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X// 0N/j37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3X//0d/j37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3X//0t/j37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3X//09/j37r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X//1N/j37r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X//1d/j37r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X//1t/j 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3X//19/j37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3X//0N/j37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3X//0d/j37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X//0t/j37r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X//09/j37r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X//1N/j37r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3X//1d/j37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3X//1t/j37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3X//19/j37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3X//0N/j37r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X//0d/j37r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X//0t/j37r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X// 09/j37r3Xvfuvde9+691737r3XvfuvdBj273Z0z8ftmVPY/fPbfWPSXXlFXUGMrN+du792r1tsyk yWVm+3xePqd0byq6KhjnqZP26eJ5w8jelATx7917op3/AA7F/Ky/72WfAD/0sj46/wD2R+/de69/ w7F/Ky/72WfAD/0sj46//ZH7917r3/DsX8rL/vZZ8AP/AEsj46//AGR+/de6Rf8ANE/mYbG/lo/C yu+aFXsKs762sdydebf27gNlbvw+EpdyRdjVWnEZ6j3fLBkKf7H7cGpjngp5xMDHo9L+Rfde6V38 r35+7d/mb/DLrb5hbY64zXU+N7Ay2+8K+xM9nqHdFdh63Ym9K7ZtWy57H09JHUxTtR+eNjSxMA+h kuupvde6sF9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3XvfuvdFU+cXyowvwi+JHff yx3DtLKb8w/RWwMjvqs2dhcjSYjJbj+znipKfF02VrklipvJLMgedopNCamEbkBD7r3RLv5Nf827 af8AOC6D7J7x2t0tuLo0dadtVPVWS2xuDeGN3x/EaiLaWM3bBmqHNY6hx1kePJCF4JKQFWjJDuG9 PuvdW+e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu ve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697 917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3X uve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69 7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv/9Tf49+691737r3Xvfuvde9+691737r3VdX8 0D+Wx1F/NU+MqfGDujefYWwdrU3Y21OzaDcnWlRt+n3FTZ/adHXY2lp3Xc1DkKWSmmp8lVJKhgDa ijq402b3Xutdf/oCX+Av/eV3y/8A/Ojpj/7F/fuvdahX8qj+Vz1D89/5qO+fgZ2P2D2Rs7rna3+z BfZ7x2S+2F3rUf6IsxLjsJ9y2doKuh/ylEDVWikHP+b0Dj37r3W3r/0BL/AX/vK75f8A/nR0x/8A Yv7917oef+FSXWWA6U/kJYHpralRkqva/Um+vil1ltuqzM8FTl6nAbCpTtXD1GVqaaOGOSpenpI2 neOJFZyxVFBCj3XujDf8JP8A/tyV8cv/ABIHyI/9/fm/fuvdbH3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917qoD+fx/25t/mE/8AiAMv/wC72g9+691SD/wiX/7IF+V3/i39R/75 ja/v3Xutz337r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691//9Xf49+691737r3Xvfuvde9+691737r3 Xvfuvde9+6918wP/AITff9xHHcH/AJe1/wC9RUe/de6+n57917rWB/4V5f8Abm3en/iwHRP/ALvK r37r3Wqh/KX7Z/nE/P34mdXfyqP5beUm+MPSvSeS7B3P8mvlxQbhzu2J5YO2N/5HduIwNf2Dg6Ns liCtPPNT47b+2mORyckU89TUxY2OYU3uvdCB8/v5Jv8ANm/kxdYyfPbpP59767VwuxM1hK7tvdXV +6ezuvd/bIkz2ZixdFuXO7fyuVyMG4cFJkayOkyTzVDsBUB6qhakapli917rcf8A+E+f80fc381H 4GY/s/tdMXF8hunt6V/TXeE+HoaPEY3dmexeHo9wbd7Kx2CoAsFFHm8ZXQGqp4EjgTI09etLDDSi CJPde6D3+efnf50W56341/G/+UjthtvU3di9ky97/IqCTbWKqOqqHa0uETbuMl31uuR6bbkFbBXZ KpeppKGfK1hpxDiSs0E8c3uvdUh13/CRz589vYqfsD5Dfzlt2Z7vetjmrq6Co2p3J27hJszJaQo/ bO899YbLvGzqt6g7bDAAEQmwHv3Xuicfy9v5gP8AMr/kt/zb9pfyvPnX3LuTvXpDevZ/X/UGQpN5 b03J2Tgts43uSso4Oq+7Okt3boZ8pjsb5shST5PDMFp/C9fDPQxZOFZoPde6+kn7917r5Dn8qT+c H/Mm6On+Q3Q3xbm7c+TXzC+a9Z1hsfpbI773TuHt1+usvt+bceW3tvrB7N3nUVlHW5ySnr4pIqvJ 2x9LFDUV2TE9NTGCT3XurueyP+Eu3857uTY2Q+RHbX8zKHffy7qMbVbrh61znYvcWYihy5pjlqTZ 2K7srK2Gmx9WktqKCGjwkeKppAqQ1a0aLMPde6F7/hMF/OT+XG6flRvH+VT89t5707E3ZQ4vf8HT m5+062bL9u7G7F6ZE9R2R0tvTcWSZq/LU646hytdTT5GeeroZsdNSiSWlniSi917rZN/n8f9ubf5 hP8A4gDL/wDu9oPfuvdUZ/8ACKvJ43Cfy8/l/mczkKHEYfEfLHJ5PLZbJ1dPQY3GY2g6Q2zV12Qy FdVskUMEMSPJLLI6oiKWYgAn37r3VcH8zf8Amk/Mj+e5849pfy3f5RGe31hugNo7iqpcx2lsvcW6 Ov6btibFvBRbl7p7T3ViVhqsP15t1pHTD0TgvkJZI6qSnqsjVYjHUfuvdbwv8v8A+JVP/L4+G/W/ x83B3T2F3fkeuMLms9v/ALi7U3Dm87mNx7jy9ZNuTdmSoIMzVVjYvDU8kkkWKxUMzinpY08slRVP UVM/uvdaGGw+2v5nv/Cpv5v9+bA6s+V+5PiJ8KOoo59yUG08NXblxm3dqddZXO1G3OtaLceyti12 Om3hvDMwx1VdXTZrKpSwaK9aSakp1paKT3XujtZT/hOX/Or/AJd2Qwncf8sr+Z1mu8d2YHJUVdmu qtyVe5egaTd0JrY/LjarZu8d07s2XuKk9Ky1dLuKuok8aFoS9QkSn3Xut9r37r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvdf/W3+Pf uvde9+691737r3Xvfuvde9+691737r3XvfuvdfMD/wCE33/cRx3B/wCXtf8AvUVHv3Xuvp+e/de6 1gf+FeX/AG5t3p/4sB0T/wC7yq9+690rP+EmODwuL/kr9G5HGYjF47Ibl7Q+QGW3FXUGPpKSsz+V pe2clgKXJ5qqp0V6qojoKKjoo5p2Z1gghhBEcSKvuvdWg/zd8PjM5/Ko/mT0WWo4a+lg+CXyvzEU E4JRMnt7ozOZ/C1ihSPXTVlNBURn8Oi3uOPfuvdarn/CHerqn6h/mGUL1NQ9FTdkfHurp6NppGpY Kqt2xuqGsqYacnQskqU8CSuoBYRxhiQi2917rbR+fH8xj4mfy1OnY+6flj2RHs3BZTIS4TZm1sRQ y7i7C7G3DDAKmbB7E2hRkTVkkUbI9XVSNFR0ivG1XUwLIhb3XutXPLf8LLKLe+YyifFP+VT8je/d s4yqeKfMZbsyLaGYpqckmnkymC642dv2nppXUxkwnJsBq4kYAFvde61ff5iXz+3v/Mk/m7fFj5Eb /wDi1ur4hZ+my3xi68PVe8dz5fduYrKLbPcNRkKbd/8AFs1tnak3iqzkGp0i/hbKv25tPJcrH7r3 X18ffuvdfMw/4RR4PC5D+YV8mMxX4fF12W2/8RMpNgcpWY+kqcjhJcl25tjH5GXEVsyNLTNPAzQT NCyl4yUa6kj37r3X0z/fuvdfM56Vo6fa3/C0HMwbdRsLHVfMrvysqFx8s1MZqjeHQG48huh5HjYM RXy11W1Ul9LiaRSNLFffuvdbo/8AP4/7c2/zCf8AxAGX/wDd7Qe/de6+Xx138mvmv1F/Jx7O6a6j wlZtb4i9+fMvcO3/AJBdvbcq6p89nN043p3amQ210XnJaYJ/CcLk6OKfJTtrZsx4JKFmhpaWrgyH uvdfRI/4S9dI/BHYX8srrXtD4e1FPu3f3alPTp8quxc/j6Kj7Qk7w25Dp3H1vuijhmqXxmLwD1JG 3cXHN4JKCohyo802Tmqp/de62Msjj6LLY+uxWSp46zH5OjqcfX0kwJiqqKshamqqeUCx0ujMrWP0 Pv3XuvmKb0+Nv81D/hLR81ezvkX8dOt8h3d8KN1VFbiKrecuCym7+rd7dOzZh8xtvandtRtzTX7R 3NhAypBmJvt4GqlkallraKoqaST3Xutnn+Wx/wAKqvgN86Nz7Q6e7bxu4Ph335u+soMJg8D2Vl8b uDqHde5sgVgosDtPuOhjo446qpmJipodwYrFiaRooKeSoqJVjPuvdbP3v3Xuve/de697917r3v3X uve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69 7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu ve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697 917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6//19/j37r3 Xvfuvde9+691737r3Xvfuvde9+691737r3XzA/8AhN9/3Ecdwf8Al7X/AL1FR7917r6fnv3XutYH /hXl/wBubd6f+LAdE/8Au8qvfuvdCB/wk/8A+3JXxy/8SB8iP/f35v37r3Vn/wDNi/7dZfzLP/FA PmR/8DruP37r3WqF/wAIdP8AmVf8xL/xIHxx/wDec3h7917quX/hVfuAbu/nkfG3rv5IZjLYf4z4 Dq3420pEdRV0NFjuoN5dq5OTuPd+MFM5tVyyR5WmnrokWVloKeI6hSxW917r6QXU+yumenupdo7V 6W2/1/1/0ntXaeObZeM2FS4TC9f4rZtPjEqMfX4h8Too/s2pQs/3asVkQ+VpGuWPuvdfL8/nofMD oD5nfz8uj97fHDfFH2XsPrLcHxg6Rye+8II59o7j3psruOqyu5ajZOZidkyeLgfKR0kWThAgqZYZ pKVp6QwVM3uvdfVX9+69180T/hEv/wBl9fK7/wAVAqP/AH8+1/fuvdfS79+69180PrT/ALjRsl/4 uB2z/wDA6Zn37r3W57/P4/7c2/zCf/EAZf8A93tB7917rW7/AOEonxd6c+aH8oL5/wDxm772zDur q/tj5M5Pbueoj448jjKhumNq1OG3Pt2ukV/tMriqxIMhjKtVJhqIY3swBU+691VD8Te8fkb/AMJX /wCbPvb47/IWXPbr+IXaldh6TftVjaCtbD9i9OZDJTRdcfJfr3FRlx/HdvBqqDJ42IyM+nKYklpv tKuH3Xuvpm5HvDqLFdJ5H5IVnYe1/wDQRiur67uqt7VpMlFkdmp1Rjtqvves39Blsf5Umxq4hGyA nh1hoRqXVce/de6j9Md49J/JrrPCdr9E9l7D7m6r3fRlsVu/Ymfxe6duZBJYFarxlVNQPIIaqESC Ktx9UqVFO+qKoijkDIPde6+eZ/wsX+G/wa+O+/fjJ2r0HtHYfUXyJ7nqN/r211t1tR4nbmC3Ts3b 9PQtg+0cxsXCJHS47IPkJ6iibIxQQnKEytN55qN5F917reo/lh53tDdH8uP4Jbk7qqcpXdq574kf H7L76yGdkml3Bk89kOrsZVVGU3HJUM0hyVUrLUZAykP9y8utVa6j3Xuiw9afz1/5c3bfzxyv8uTZ PZ+7sh8kcVv7sXqz7Wo613bRbEyPY3VMGQn3ztPHb1ngEDy0v8JyccVXIiUdQ9OVpqmUy0/m917q 4X37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1//Q3+Pfuvde9+691737r3Xvfuvde9+691737r3Xvfuvdatv8tT/AITi5r+X7/Mw7E+ftd8tcX2j ht0/6bf4J1jSdMVe0cnB/pjzL5P/AHKbpm3NkYh/DUdo/wBmhb7lgG/ycen37r3W0l7917qrT+cV /LiyH81D4T7l+JmJ7Zo+l8nlt+bB31Q72yOzpt80Ecuyso9Y+Lq8HTZLFyaamOV1E6VJMbBT43BN vde6UX8pH+X/AFv8sX4L9XfDzJ9oUvcWS2DmuxM9Xb8odpS7JoclUb+33X7z+zpNvVGQykkaUi1q 0vlesYylDLoiDiNfde6NV8sejf8AZn/ix8lvjT/eX+5f+zD/AB/7k6N/vj/Cf4//AHT/ANLXXWS2 D/eX+Bfc0f3v2H8Q+6+0+7g82jx+aLVrX3Xuqiv5D/8AJVzv8mzZHyL23uL5CYnvvI997q69zaT4 Xris6/otsUXX+IylBDE332Zy0lXLVyZaUtZYViWFLGQyHx+690K384P+SP8AGr+cBsXaFP2Rns51 H3d1hT5Oj6w712ficfm8tiMRmZ0qsltPeG2a6WljzmFeaMVMNG1bTTU05kkpaqAVFUlR7r3WuNtL /hIJ803x0HSe+/5u25ab4rQzaanr3aW2e167HZHGxSq38Pg6ozO7qfblE9QmtPO09UlO2l/BUgGM +690dDt3/hIt8fBvb4R5L4p91r0jtb4x5qi3D2tXb567/wBJ3anf+5qPf2O3i+7Nx71xmWwNLDUt T0RxtNQwYyKio4wrU8I8kyt7r3W4P7917rWM/kc/8J487/J6+Qvdnd+Y+VOJ75pey+qj1Rg9u43q Ks69qMdRSb3oN3SbgyuRqtxZdTKFxkEApIYSpMsjGcCNVk917rZz9+691rF7Y/4TxZ3bv88Cs/m6 t8qcTV7an7W3Z2xH0avUNZDnBW7o6wq9gHb779O4mpxFBNWNV/djFFnRBF4EZ/KnuvdXY/zAvipL 84fhf8jPiXT73j63qe9ut8nsel3zNgG3TBtqqqqmGtpcjUbfSsoGqoxJAqSRrWRHSxIa4APuvdES /kafyjcx/J7+OfanSOe7zxvfGU7P7mqu1pNwYjYNV1/QYOnfZeJ2hT4JKCty2XkqX/3GNUvUmSIf uiMRftmR/de6Vf8AOV/k9dOfzfvj5iOtd27hh6q7k65zTbi6X71ptrx7ryOzKiuMcO6NsZjBisxs mQwmZp440q6Ra+Ex1ENLWIWam8M3uvdJb+WH/Kf378Nv5fnan8vD5U/JOP5f9L9gUfZOx8DioNk5 brYbG6X7a2nJtzffVuOywzeSrpaOrmrMnW0zpLA9G9XKsDaPGIvde6oI3p/wj27m6a37uHdP8u/+ aN2f0XtvcFQY025unG7w2xvLH4hSzQ0OX7S6XzeKTNaNRCB9uUYAvfUSSfde6HD4cf8ACQXrPaXd uH+Q/wDMS+WG8Pmxu3G5jHbmquuxgsvgdn7o3Bi2R6Mdob43dl8zndzY9SiFqFUxizBFiqWnpWlp pPde629+yuxNi9JdYb87X7CzFDtHrXqbYu5t/b0z1Qnjx229lbHwM24NwZOSKAXEVJRU0smhFvZd Kgmw9+69183z/hNV8Vd6/PT+cx3V/M6o9s5rZ3x46W7e757hjqMsVY5XtD5BHPw7F6qgyFPojqav FY3PVGay0tKWSAUtJHOqpkqfye6919MH37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691//9Hf49+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3VZ38274P9v/zF/hdvL4jdR/ILG/G9e0NzbUTsvetfsWv3 7LnusMHVyZrMbFx9DjcvhpaV8jkYMW9TU/cuklJDU0UkRSrZ4/de6F7+Xx8F+nf5cfxO6s+J/SlN 5dvbAxbVG5d3VVDBRZ/szsLMaarenZG51haQ/eZOru0cJmkWkpUpqCB/tqWFV917o6fv3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu ve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697 917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3X uve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69 7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r//0t/j37r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3X//09/j37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3X//1N/j37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3X//1d/j37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3X//1t/j37r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X//19/j37r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X//0N/j37r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X// 0d/j37r3Xvfuvde9+691737r3Xvfuvde9+690R7+Yt88usP5avxO7A+Xfb+1d9b12TsDJbMw9Xtn rilwNVuvJ5HfO7aPZ2IWjTctdjqNYo6itSapkkqgViVyiSPpjb3XukX/ACv/AOZR1B/NV+Mr/J/p bZfY2wNr0nY26+scjtzs6l23Tbgg3BtOjocnVVNM+1sjkqaWklpslSPHIZkcP5UaIBFeT3XurFff uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3XvfuvdU3/zKv57f8vn+VtkYtk99793FvXuyqxtJmKboPpbC0O8+zaXE5GIzY7LbnGTrcbh 8HBOpSWBMxlqaonhYTUtPURgsPde6pC21/wtq+Dtbuf7LdnxG+U+39oNUSxx7iwtf1RufOJB90sd NU1W1qrMYyFbwlpZkjykhRhoTy31j3Xutmr4DfzF/id/Mt6eq+6/iZ2FUbz2zhM5/dbeOEzeByu1 N5bE3V/D4sp/AN1bezEaMkjU80csNVSST0k41fb1Mpjk0e690eP37r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X/9Lf49+691737r3Xvfuv de9+691737r3Xvfuvda4P/CsD/tyV8jf/EgfHf8A9/fhPfuvdAB/wjb/AO3R+4//ABb/ALl/94na Hv3Xutr337r3VVXdv88H+Ut8ed1ZDZHafzy6Fx27MRXS4vNYLaeeyXaFdg8pTs8dXjM6nVtJmhRV MDxtHPT1TRyRONEiq5APuvdD98Wv5j/wR+bE8+P+K/ys6Y7nz9LjxlqzZu194UUPYFDiiiu2Tr+v M19rnIKddQWSaXHqiPdHIcFR7r3R1/fuvdFC338+/hj1j8jtmfETf/yQ6t2p8l+wmwEezemstuBI d55ufdUkkW2KSGjVGjjnyLRMtFBPKkk5KCNW8ker3Xukn8sf5mvwE+DNbRYf5W/K3qHpzc2RpaTI UWx81uB8z2JPiq6VoKPNL1ztOLIZ0UEjpIi15x4pyUceS6tb3XulJ8UP5g3wo+ctFlaz4mfJfqnv CfAUsNfuDA7R3FGu8tv4+odIafJZ/YuYWlzVDTSSSLElRVUEcbSXjDFwVHuvdHF9+690W75GfMX4 p/EPb8W5vk/8iOneiMTVwyz4v/Sbv7bu1snn1hbRLFtjA5GdK/KSqQbw46mmk4J02Bt7r3RCNlf8 KA/5NO/90U20MB/MD6NpMvWVS0cE+8Jd29d7dM7zimTy7x7BxeLxEaFiP3ZK5U0+vVp9Xv3Xurds NmcPuLE43PbfyuNzuCzNDS5PD5rDV1Lk8TlcbXQiooshjcjRM8M8E0bLJFLE7I6kMpIIPv3XusmT yeNwmNyGZzOQocRh8RQ1eTy2WydXT0GNxmNoKdquuyGQrqtkihghiR5JZZHVERSzEAE+/de6qN3h /P5/k37F3hUbFz38wLomXPUtdJjqibbVZufe+2YquKoNLIrb42VjchhNCupvKMh4wPVq08+/de6s m6V766R+SOw8d2h8f+2+ue6eu8qzRUO8+sN44Heu3nqo0WSox02S2/PPHDVwa1Wpo5ik8LeiWNHB Ue690LXv3XumPc+ci2xtrcO5J4JKqDb2Dy2cmpoWVJaiLE0ElfJBE78BnEZVSeATz7917r5ZH/Ce b47dbfziP5wHeHb3z3GP7nrMbsfsb5X7h683VN91g+zuxMp2VhNvUFBnsHNIPudt4b+OGUYdQaQL DQUUsTUBenk917r6Q2/f5c/wC7O2PJ1tvr4V/FrcGyGof4dT7fn6J61pKXFUyxCGE4CbHY2GbGyx KF8FRQSwyxEAxuhAI917oN/5en8rf4ofywMP3Ztn4m4fe23Npd5djUfY+a2tuzeNVvLG7Tq8dgIt v4/bey63KRfxBMZDGkkyjKVtdVmWaTXVtEsMUXuvdWK+/de6rG+Qf853+Vj8Wt3ZPYHd/wA4uidr 76wdc+L3Ds3C7iq+w90bZykRImxm6MD1rTZiqxlSn1kp6+KGRQVLKAy3917oRvi3/ND/AJevzUzH 92fjB8vOk+2d4mnlrI9hYrdkOF7FqKKnh89VX0fXe61oM5NTwrzPPFQNHFcCRlJA9+690eurq6Wg pamurqmnoqGip5qusrKuaOmpaSlpozNUVNTUTFUjjjRS7u5AUAkkAe/de6Jd8X/5kHwU+ae7N1bE +K3yj6m7x3lsnCruTc22tjbgNdl8bt1skmGOeWjqI4mnokqpYaeWqphJFG80CuymeLX7r3R2ffuv dEw+UP8AMT+D3wqz+0Nq/Kz5O9UdGbl35j6rL7TwW+9wigyuXw9HWjHVGYSip0lkioxUEwirqFSJ nWRVcmOTT7r3Rw4cjj6jHxZaCuo58XPRpkYclDUwyY+bHyQipjroqxGMbQtGRIsobSV9QNuffuvd VY9yfzyf5R3Qm4qnafZPz4+P8G4qGoNHkcXsvcVf2vPi6xQxko8s/VFLm0pZoyhWWKodHjayuFYg H3XujG/Fb+Yj8HPm6lcnxS+UfT3duUxVDFlMttXaW7KNd94fFzBPFk8z19l/tc5SUxZxH9xU49I/ IGi1eRGUe690c337r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691//09/j37r3Xvfuvde9+691737r3Xvfuvde9+69 1rg/8KwP+3JXyN/8SB8d/wD39+E9+690AH/CNv8A7dH7j/8AFv8AuX/3idoe/de6IJ/wrW/ms94b U331/wDypPipn85hcv2ls/b+5fkRktjPVLvfdkfYWblw3XHQWHrKArVU0eRjpxks3BTDXX09ZjqP y/bSV1NUe690Z/4I/wDCPT4J7D6R2jXfOl+xO9vkJuHb+PyW/sVt3sbMbA6w6/ztdClZVbV2XDsN 6WvyH8PZmop8pX5OaOsZWnhpaRHSNfde6pj/AJ8P/CfvHfykNpbI/mKfy6+0+3tt7D2B2NtKg3lg MpueWffvRG5svWLRbF7L2F2Tho6KsbFTZQU+LqIK3XV01ZVUzR1NTT1LxUXuvdbkv8h3+YtnP5nH 8uXq3vzf0lDN3Ts/NZ3pHvmoxlJS0FBku0ev6Wjq5dyw0FEEhp3zmFyOFztTTQRRQwT1ssMEaQRx D37r3WkZ/wAKUOxe5epP+FD2yOx/jtBUVPfe0tmfFvJ9NU9Hg4Nz183Zvilptkx43blUksVdVHIy U4paSWKSOWXQjxyKSje691eh8HP+EmXS279j1Xen82/fna3yT+Xvczf307HwuO7Y3DjNu7DzWciN XNisrvXDSLl9yZ+EyKuTyb5L+HiVPt6OCaCIVlV7r3Wt3/Nu+D29P+E4/wDMu+OXevwq7J3hHsPc lO/cHSNZuqv+4z2Grto55ML2j0pvXIYxaZM3hZ6Sro4ahpIozVY7JmjqUkkheon917r6nfVnYOH7 a6x657U27xt/szYe0OwcEPPBVWw+89v0+48Z/lVKTFJ+xUp+5GSrfVSQR7917rVSh/4Sndd/I75i /I35cfzJ/lN2h8k37P7n7B3V1v1dsnL5jZ+MwfWeT3hVZPYW19675zL1mWaHH4maHHQ4LboxtLjl hWOlraiHSq+691O/mAf8JPf5Ye4/i529lviP1bu747997J653Xu7rnN4rt3tbsHbm6N17Yw0ubxu 2N7YHt3N5yMUWUaD7CSpx0tJLTGValfKIjTy+690Sr/hFV8yOzt+bD+Vfwu33ujMbl2R0xT7A7X6 ToctW1deuyMTvTK5XDdkbWw8lSHFPjZa+PF5Gmoo5EjjqZ66ZIy1RKw917p9/wCFrXyy7d666c+I 3xL2Tm8ttrrT5A5btTsDt+TGVVXQHfEHUku3qLZmychPSugqMZFV5yoytfQTB45KmDGTFQ1Oh9+6 90eH4c/8JY/5NWT+J/TWX7B6y3J8jd8b+6n2Vu/K97/6du3tuRZ3K7v2xT5ypzux8D1rnMTgYcX5 KkvioqnHVTinEQqJqqTySSe691Yl/KX/AJLPUP8AKC3d8s6jonuLsrf3WPyXyXUGTwXX3ZdLh6nK dVy9X0+5Y62ODd+D+1hy4ybbiVBK+HpJoYaKnjmlrHvMPde6ug9+691737r3Xy0v5lv8s756/wDC f752Vvz1+C8e5k+NUe9s/vHqztTZOAk3Dt7qfb28ayofK9Ad87Y01EceKgp5WxUFZXp9hkaT7aWK eDJh6el917rYC/ly/wDCxD4nd6ptjrj567Hrvij2lWtSYubtfbSV+8/jpnMhIFh/iGSdfJuDaonm ZVWGrpsnRQIGmqsvDGLD3XutwnaO79p7/wBr4De+w90bd3tsvdeJoc9tbd+0c3jdybX3LgsnAKrG 5rAZ/DSzUlZSVETLJBU08rxyKQysQQffuvdaan/Ct3+bp2z8Vto9a/AL40bxyGxexvkJsfJ7+7y3 vtqqmod54Lpmty8+0dsbK2tlaNhNRSbmrqLMLkqmBo6haSiWnjbxV8tvde6a/wCWf/wkF+IuM+PG wt/fzEoezOyvkFv/AG3jdz7o6swO98r1xsTp/wDjVEldSbHkbaRgy2RzWPWTxZatlya0v3AaGnpf HD9zU+691Xh/Pi/4TZdd/wAvTo6f+YL/AC6t89sbYwfS26No5fsrrPN7rq8zn+vMbXZ2LE4TtfqX sOhWmzUDYrLS4z7ujrJameJJZMhFXwx0jQN7r3Wzp/wnF/mY7y/ma/y9MdubuvJw575CdDbyr+j+ 4849PS002/RQYakz+yuyazH0qiJJctiq2OlyBVVWbI0VfMkUMMkca+691pzdXUx/kQ/8KiBsuRJt tfHre/dU2yKUsZsfgj8Zfl4kU+zJ5KnT/lFBszJZHGvWOiEPU7fmQDUth7r3X1FffuvdfMs+UlJ/ w+B/wqew/S1Mf73/AB+6R7QwnUWYEdT/ABDCJ0V8TXqd092RDIRaoPs9w7lj3HR0FTEpjdspSBWk 1CR/de63aP5zn8vjuz+Zt8TNv/Frpn5ISfGakzfdmzdxdy7oWj3DlI969J4/bOdw26+uqjB7eq6A 5FaityGLyi4+sq4qSoegSKeSNWDr7r3VfHRP/CSD+Tp1fsqiwHafV/aHyV3cKONcrv3sXuns3ZFT PkWjH3VRh9udJZTbNBS0+vUaenqEq3RCFknnYGQ+691qWfz1v5dlP/wn/wDnD8Svkj/L+7H7C2Bt rsiHdm+uq4MxuGbM7h647B6hyOKod+7WTcN46jKbeyNBuHFpLRZQStNBU1tHVS1NO+ke6919PHov s6k7s6S6d7moKT7Ch7c6r697OoqDVK/2VJv3aVHuqmpNcyRufGlWqXdFY25UHj37r3Qqe/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu ve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697 917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3X uve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69 7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv e/de697917r/1N/j37r3Xvfuvde9+691737r3Xvfuvde9+691rg/8KwP+3JXyN/8SB8d/wD39+E9 +690AH/CNv8A7dH7j/8AFv8AuX/3idoe/de61u/m80O6v+FjGz6TsYLLQR/Pn4G4ykpMqn2lLJTY jZvXkexqEU0gVXiqJI6HQhUrUmS7B/Mxb3XuvqA+/de6ph/4UO0OByP8lz+YBT7j+3OPj6fxVdT/ AHUvij/j2L7GweS2rpe4vJ/FIaPwr/ak0rze3v3XuqOv+ERrZo/Df5mJOJv7ur8mdtNiiyRin/jT 9WUIz4ikA1l/AuN8gY2A0FQCWv7r3VU38+j/ALijPip/4kD+Xn/78rHe/de6+l57917rQD/4XOf9 0u//AC9n/wCZH7917rc9/l7f9kC/B7/xUD40/wDvmML7917rU0+Vv/Cmf5mfKL5dZ34PfyMfjbt3 vPOYmuzWJTu3dOFqN3Ve8E2xP9tuTemyMFVZHE7fwO2Keo8cNPuPddZPBVRyxOYKN54A3uvdM27+ sv8Ahafl9nbozW5/kP0NtfblXtnN1e4tpJhPhJUT4vC/wqU5bGLU0Wxsi7P4BIA0OTma59Et7Ee6 90Sb/hEN/wBlT/OD/wAV/wCvf/fiv7917rcM/nG/yjeoP5vXxtx/UO+Nx1XWvaPXOart4dGdxY7F Q5yfZG5sjQLjs1ic5g5JadshgsvDHTpk6GKqgkMlPSVMcokpVR/de60sqfD/APCk/wD4TfYaviwV Kvf3wc2DVVmWmalop+/fjRi8HNkfua7IVdLD/D97dfUjySGSqYNiKFqmody9VIxc+691tw/ySf56 XTP84TYm8MRBs6bpf5M9SY3F5TtDp+qzCZ7E5HbmUqTjqPsPrXcDx081diGqgtNXQVFNHUY6olhh n8sdRS1VT7r3V7nv3Xuve/de6j1dJS19LU0NdTU9bQ1tPNSVlHVwx1NLV0tTGYaimqaeYMkkciMU dHBDAkEEH37r3Wql/Nq/4SyfDb5f7K3/ANrfDjZmD+LHyvhxeY3DgcRseKDBdFdsbkp6KWrpNr7v 2AhTH4CTJVASAZvAx0qwPI1RV0lfyvv3XuqSP+Ea/wA8O3dq/Jbtf+XFvvNZzI9R7t673h211ttj Oy5GaTrDtfYmcok3jhsDQVIP8Po85j62uq8pTsURa6ghdI1nqqlpfde6LV/P8aHc3/CnPq3b/YQW XY0HYPwE220eUQ02O/uJkqrb2Q3DGZ5AA1MaityhlkBIDGRSboQPde6+oD7917quD+cPQ4HI/wAq H+ZHT7k+3/h8fwg+TldT/cy+KP8Aj2L6fy+T2rpe4vJ/FIaPwr/afSvN7e/de61PP+ENTZo7d/mY JOJv7urmviK2KLJGKf8AjT0PZQz4ikA1l/AuN8gY2A0FQCWv7r3Ss/4WrfCs5vrr4w/zAtpYljmO vM1U/HDtvJ0cKGq/uhuiWq3t1LlayaJBJHTY3Lx56iMjyEebLU6KFLEt7r3VyHTn837H1f8AwnZi /maZXM08/ZnXvxYym1twNk54Q+Q+Vmz5P9BuKhyMc7SmOPPb1GPr4Y38kn2dfC+mQmze691Sv/wi s+Hla+F+Wv8AMQ3zSzV+a3lmqX43dY53KtLUZeppcfJSdl93Zt6usZpJ0yFdPtenWrBuZqKtjZ3b WE917rZ5/m6/zYOk/wCUd8aY+7uzcNXb/wB970zU2zek+ncLkYsTlux94w0RyNcazMyxVC4zDYyn 01GWyrU03hDwQRxTVNTTwye691q9dN/Ov/hWl/NJ2rTd6/EHrTpb4r9Aboapl2Ju2o2X1DhcJuDH Uk/hjqsFJ8k23VnMzFI0EkTZegw64+WRpfE0elVh917qh7/hQRs3+drtL/ZSf+HjO2Ov+0P4h/p6 /wBl0/uLjej8f/A/tP7l/wCl3+Kf6Gdtbd1/c+XbHg/iX3FvFJ9v4rz+T3Xuvp+fy9v+yBfg9/4q B8af/fMYX37r3Rv/AH7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvdf/9Xf49+691737r3Xvfuvde9+691737r3RBv5iX8y L43fyvun9id6/KSbfVH1zv7ubbHSFDk9hbVXd9bhtzbp2vm94U2YzmKWqp5xjKeh2/kJKmSjSoqN QjSKmmZ7D3XutRT/AIUqfz4f5e3y4/l4f7Kr8O+6v9PO++4uyOu8/umfDbF7D2phdh7B2FlhvRq3 OV/YWHxTNkK3JUuPpabG0qPMkf3MtUacJDHVe691dB/wlI6E3d0b/Jy6gyW88ZksLke+exuzu+8V i8rEaeqi2jumvptqbMycUDIjLTZXF4OkzFG7F/LT1cUytokVV917rXh/4Vs/B7uz47/NrqP+bh0Z jMsNqbibqiDfm98NjJcj/op+Q3StXS0HWO59zSaXip6LL4yhwdJjJZk8RrMbLBK4kqaWOT3Xuthj 4R/8Kkf5W/yU6Y2luTvLvHB/FPvCLb+OHZ3VXZ+I3TR4jGbphpooM5UbD3vQ0lZjMrh5qsyvjC9b HkPt9LVdFTyB1HuvdUB/8KMP5+/THz86owP8tf8Alwy7u73oO3Owtj/6U+xtvbS3jjaTflXg9xU+ T2J0z1XtPKUlLmM1U1m4o8fV1dW2PWBpKSmgoBW/ctNT+691tVfyDv5due/ln/y3OqujewKaGj7q 31ms93t3xQ008NRT4js3sOkoqMbWWamkmhklwWBxuDwVXNBM8M9TRTTwt4pUA917rTf/AJ9H/cUZ 8VP/ABIH8vP/AN+VjvfuvdfS89+691oB/wDC5z/ul3/5ez/8yP37r3W3z8VNqZnff8q343bH27k/ 4JuDeX8vzp7amCzPlng/hGZ3D8c8diMZk/PSlZU+3nmSXVGQw03Ug29+69189f8A4TH/ADl6B/lU fOb5VdSfPh5Pj7mewNp0vUs++N7YPJFeruy+qt8VLZ/rvexxsFRUYynyUksonrHX7aOpx9Os7qjr KnuvdbV/8zr/AIUx/wAv3oPozd2yvin2ZtX5qfJvszA1+yuseu+np8luvZNBmt10hw1Hnt+b5wcZ ozTU7T6kw2KqpsnWziOlSOljlkrab3XuqEf+ET+Hy23fl/8APXb+extdhs7gukdl4fNYfJ0s1Fks VlsZ2fNRZHG5CiqAskM8EyPFLFIoZHUqwBBHv3Xutqr58fz6/iD/AC0/mt1h8Rfllgeytn7e7Q6N wnctJ8gtv4F95bF2s2d7Bz2xabbu6dq4FZc8Ui/u/U1VRWYqirXTz00f2hV5Jovde6dO3/8AhQJ/ Jm2R07uHf2b+bHSPZmAqNu13/GNtj1NR2Dv7eEdfRPEu1v8ARpRU0taj1wb7WRctTU9NGHJq5IYQ 7j3XutST/hHX0jvXsX+Yv8t/mPtDZlZsL48bW6k3/wBc08NIsiYGn3X292fgt6bQ6sx1SPFHVLic Ph6irqhErfb+OgMiJ91Ax917r6Q/v3XuixfNburfPxv+IPyc+QHWex4eyuweleiu0O0NnbEqVyMl JufcGyNn1e4cdjK2DD/5ZNA0lOGngpCs0sYaOJ0kZXX3Xutbv4P/APCwf+Xf3jtjC4r5g4/enw47 XWnp6XO1M+290ds9MZfJkR04qts7r6/oa3NUcdRKXlaDM4KGKjQhHyFSFac+690IXzr/AOFZn8s/ ojpvddT8UOx675YfIHI4Gvpeutp7Y2Hv/bWwcJuSrp3hxGf7I3lvzHYeEYylkHnno8R93WzlUg8d Mk33cPuvdUyf8I4P5fnbea7z7f8A5mvaWEzWF66pti7m6l6ayuex09DJ2lvzfW4KWv7E3xt6adV+ 4x2FpcfLip6qNfDPWZCSKKQyUFVGnuvdLT/hZF/Ly7QTsLpb+aB09g81kts7d2bhOne/MjtqlrJa zrrM7W3PU5vqTtHKTUet4aSuOTmwc9e3ihpaijxkZYy1y+/de6t5/lx/8Knf5dfyK6B2M3y27qw/ xh+TWB23isV2vt3f23twUOx907ooKMU+V3p1zu3A0dXjTjclIhqkxtZNTVlI8jU3hmiijq5/de6q c/4USf8ACi740/JD4zbk/l9/y8tz5jvTP995Db+2+3e3tubd3bhds4faVBuWmyp6167jzVLR1+dy 24KulpqKsqKWkegGPkmp4Zaqoqz9n7r3V83/AAmw/lq70/lu/wAu7EYbuXCVG3PkJ8id4VXeXbG2 K9NGU2DT5LDUuA2D1tk1VyFqsbiqRK3IwsiyU+Qr62lcuKdG9+691Zj/ADH/AIjYf53/AAY+T3xO y0VC1V3F1Tn8Ps+ryRC0OF7NwwTdPVG46t9LERY3ctBiq6XSNRSJlBBNx7r3Xx5aH5k/ITZfwZ7Q /lWT4rPUW1d1/L3aPdOX268dYNyY7e2z9r5HrzdHWVRt9onlYV2Vi27XNTR6XjrcUoCM0z3917r6 +H8q34fUvwM/l7fFT4simjp9w9b9V4io7FaMxutV2zvWaXffa9THPGqmSH+8OTyKUhe7LTrChJ0D 37r3Wph/wt96X7LzW0PgV37i8dlsr1PsHLd6dZ7urqeKqmxWzt49iR7Xz20Zq4oWjhOap8DkYRKU S7UEcbOzPEo917q5D+XH/P8Av5TOb+CHx4Xd/wAp+o/j3uvqbozq/rzfvTXYFZVbT3Fs7cOwtj0e 2cnhtoYSamV83jVejY42owkdQr05iV0hn1wJ7r3WmD/wpP8A5t+yP5tPaHUtd8b+ud3H4pfELJb7 2JtvvfcW3s7hZOzexO9KbF5jKNUY6vjRMRRSUWyFk29jq9YsnUQw11XUwwgilpfde6+mD/L2/wCy Bfg9/wCKgfGn/wB8xhffuvdG/wDfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691//W3+Pfuvde9+691737r3Xvfuvde9+6 90V75ffC/wCM3zz6brugvlh1Xie3OrazNY7c0WByOSz+CrcPujD09RSYrc23dx7Vq6HJY6vp4auq hSpo6uNjFNNC+qGWSN/de6p86m/4Sw/yYep9+0O/x8dNzdk1GJyUWVxG1O2e1t87z2FR1VPO08EV dtBqmnpctTC4R6POCtp5VUCaKS7avde62GMdjsfiMfQ4nE0NHi8Xi6Omx2NxuOpoaLH47H0UK01H Q0NHTKscMMMarHFFGoVVAVQAAPfuvdMe9dkbM7J2nuDYXYe09t772PuzF1WE3Rs/eGExu5Nsbjw9 anjq8XnMFmI5qWqp5V4eGeJlP5Hv3Xutfvtj/hKv/Jd7T3NWbppfjtu7quryVVU1uRxfU/cXYe3t s1FVVSeR2o9s5mtyVFj4lPEdLioaWnQcJEBx7917o8vwj/kv/wAtb+Xpm6fefxj+MW09udm01PW0 0Xbm8cjuDsztCkiyMD0eQXB7t37VZCbDrUU7tTVEeEWjjliLJKjh31e691aP7917qrr5Cfya/wCX v8pPlzsH5x91dNZbc/yM63ruusntzdtL2d2bt/EnIdT5lc9sGqye0sDlqfGVBoalI2KPTaJ1RUqV mTUre691aL7917quj+YF/Km+Ef8AM9peqqb5jdYZjsJ+lajek/XFZhOw9+7CqsEvYceLj3jTSHZe Qokqo604TFMRVxyNGadfC0YkmEnuvdHp2BsTanVuw9k9ZbDxK4DY/XW0dt7E2ZgkrMhkEwu1No4a Hb+3cStflpZ6qcU1HTwwiapnklfTqkkdyWPuvdVffOX+Rr/LL/mHbtn7J+Rnx0x8/bdVT01LW9td c7l3L1lvzLQ0kP29N/eWr2lU09FmZI4wkUU+ZoauWONEjjdI1C+/de6T/wAJv5B38rT4C71x3afR vxtx+V7fwtQ1VgO1u29ybh7W3fteoEhemrNnQbsnmxWErIAzxx5LD4ymrTGzJJUupt7917ofPh3/ ACqfhB8DO2e8e7vjH1VlNj9j/IisqKrs3N5LsTsLeUWRiqdy1O7paDF4zd2TraaihNfVSTfsRCSw RC5Rbe/de6Er5kfy+Phj/MB2djtj/L/4+7F7qxOEapfbWUzUOSwm9tpNXFGrxs7sbaVRj8/iUqTF EauLH5KGOo8cfnSQRoB7r3VPW3v+Emn8lfB7pTcVZ0b2hujHx1D1CbM3D372h/dYXlEsUDvgq6hy jxx20hZMm2pSRIX9+691fp0f0N0x8aetdu9OdAdYbJ6f6v2pDJFgdj7AwFBt3A0Tzv5a2tekoEXz 1dTJeasragvUVEpaWeSSRmY+690LXv3Xuve/de6pY+VX/Cer+UZ8wNzZnffZfxI2vtTsPP1E1blt 8dK5/dPTOTyOQqUIq8rlMFsGso8FW1kzkTT1ldiZppZbvJIzPJr917oGujv+EvH8mHpDctHu1fjB XduZnGVyV+Mj7x7J3z2FtqmePQVp6zYktZTYDJQXQlocti6pG1MGBXSF917q/bA4HBbVwmI2ztjC 4nbm3Nv42iw2B2/gcdR4fCYTEY2nWkx2KxGKx6RwU1NTxIkUMEMaoiKFVQAB7917r2ewOC3VhMvt nc+FxO49ubgxtbhs9t/PY6jzGEzeIyVO1JkcVl8VkEkgqaaoid4poJo2R0YqykEj37r3Wv8A91f8 Jbv5MHdG563dy/GfMdS5XKVkldk6TpXtDfex9sVE0pculFsmSsrMLjYfUNNPiKCkiXSulB6tXuvd Gn+Ff8jD+V78BN0Y3sP4+/F/badrYjxyYvtnsrM7i7W3/hqxKf7ZsntfJb7qq2mwdU6FxJUYGkon YO6E6GK+/de6tv8AfuvdR6urpaClqa6uqaeioaKnmq6ysq5o6alpKWmjM1RU1NRMVSOONFLu7kBQ CSQB7917r5Z38uPqTrb+bp/wpk333P13sPE4X40bV+RPaPzQy2Kx1FNS47JbJ6v3dFP15uDK4yTQ v3O7t3T7dyOboXOjVkK5dMsaFH917r6nPv3Xug77Y6k6w73673X1J3NsHafZ/WW+MXLht27G3vhK DcO2s9jpWEghr8ZkUeMtHIqTQSgCSGVEliZJERx7r3VAOX/4SffyU8rvYbtT4/diYnFtWfeVHXuI 797bp9k1OqRpJaUtUZOXMwwuWtopcxFoAURlBcH3Xujy9y/yRf5ZHd/xl68+H+4/jFt3avx+6s30 vZeztkdW7g3b1i8G+jt6o2rVbpz2e2dXUuQzVfU0NTJDV1mZqaqeayPJIzorD3XurL9gbE2p1bsP ZPWWw8SuA2P11tHbexNmYJKzIZBMLtTaOGh2/t3ErX5aWeqnFNR08MImqZ5JX06pJHclj7r3Su9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3X//X3+Pfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3XvfuvdFS+dHR/Z3yX+HvyP+PXTfZeN6e7G7q6 l3b1lgOyctiMjm6La8W8se2CztSaTEVVHVRyzY6arpaetpp/JSSypVpHM0Ihk917qo7+Qh/IrT+T nt3vjO767b233b3P3xWbQxtbuLbG0a7beC2XsPYxr6jG7aws+ZqZ6uokyNXkJK3JymOnRjBRxCN/ tvNJ7r3Ww97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu ve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697 917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3X uve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69 7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r//Q3+Pfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvdf//R3+Pf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvdf//Z --001a114dcb02420ec1052d9fafb7-- From sfr@canb.auug.org.au Wed Mar 9 17:41:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 9D2DF7CA0 for ; Wed, 9 Mar 2016 17:41:03 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5344B8F8039 for ; Wed, 9 Mar 2016 15:41:02 -0800 (PST) X-ASG-Debug-ID: 1457566857-04bdf002ed2ba950001-NocioJ Received: from ozlabs.org (ozlabs.org [103.22.144.67]) by cuda.sgi.com with ESMTP id 78jRlqQCRaVItBQT (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 09 Mar 2016 15:40:58 -0800 (PST) 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 876A11402A8; Thu, 10 Mar 2016 10:40:56 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=canb.auug.org.au; s=201601; t=1457566856; bh=FTn+pqA02LrGgeTkgB0Q6HdvOByEV2aXAXDzEPLbvkA=; h=Date:From:To:Cc:Subject:From; b=Q4pzQUOr4LjEaBH6zRkML6d+dyaK06GzUjbMg6UknY3bka3Xyhv3uPPZIRxNuXefp 07YYJFn9wnECyk2Uq9C36C/sulFmJNztDDG0T3d5hVgNZgVxhiHCa+z6C+SivkncBL ZtxnGkbKCpbgds/ghvH5hKj/iPGepag1flIa8o6g= Date: Thu, 10 Mar 2016 10:40:56 +1100 From: Stephen Rothwell To: David Chinner , xfs@oss.sgi.com Cc: linux-next@vger.kernel.org, linux-kernel@vger.kernel.org, Jan Kara Subject: linux-next: manual merge of the xfs tree with the ext4 tree Message-ID: <20160310104056.78033e72@canb.auug.org.au> X-ASG-Orig-Subj: linux-next: manual merge of the xfs tree with the ext4 tree MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ozlabs.org[103.22.144.67] X-Barracuda-Start-Time: 1457566858 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27713 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi all, Today's linux-next merge of the xfs tree got a conflict in: fs/ext4/inode.c between commit: 109811c20fb8 ("ext4: simplify io_end handling for AIO DIO") from the ext4 tree and commit: 74c66bcb7eda ("ext4: Fix data exposure after failed AIO DIO") from the xfs tree. I fixed it up (see below) and can carry the fix as necessary (no action is required). -- Cheers, Stephen Rothwell diff --cc fs/ext4/inode.c index 719accce152a,2b98171a9432..000000000000 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@@ -3285,10 -3161,10 +3285,10 @@@ out } #endif - static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset, + static int ext4_end_io_dio(struct kiocb *iocb, loff_t offset, ssize_t size, void *private) { - ext4_io_end_t *io_end = iocb->private; + ext4_io_end_t *io_end = private; /* if not async direct IO just return */ if (!io_end) @@@ -3296,8 -3172,18 +3296,16 @@@ ext_debug("ext4_end_io_dio(): io_end 0x%p " "for inode %lu, iocb 0x%p, offset %llu, size %zd\n", - iocb->private, io_end->inode->i_ino, iocb, offset, - size); + io_end, io_end->inode->i_ino, iocb, offset, size); - iocb->private = NULL; + /* + * Error during AIO DIO. We cannot convert unwritten extents as the + * data was not written. Just clear the unwritten flag and drop io_end. + */ + if (size <= 0) { + ext4_clear_io_unwritten_flag(io_end); + size = 0; + } io_end->offset = offset; io_end->size = size; ext4_put_io_end(io_end); From sfr@canb.auug.org.au Wed Mar 9 17:41:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 0EFD329E08 for ; Wed, 9 Mar 2016 17:41:08 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D491030404E for ; Wed, 9 Mar 2016 15:41:04 -0800 (PST) X-ASG-Debug-ID: 1457566860-04cb6c58312873b0001-NocioJ Received: from ozlabs.org (ozlabs.org [103.22.144.67]) by cuda.sgi.com with ESMTP id myGjcfgIwH7M98y6 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 09 Mar 2016 15:41:02 -0800 (PST) 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 6DABE140AD9; Thu, 10 Mar 2016 10:41:00 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=canb.auug.org.au; s=201601; t=1457566860; bh=pGQIk83fzYGgbR0GDU5QXMWztIpOauwePzTvcB6vSEw=; h=Date:From:To:Cc:Subject:From; b=lA4jm6rLTaUYlpwcJT87ulESIp3O/MffQG6WoEudQoQAPspb3gI4vIBLxu25yhquj a1yR0DbhYwCJJdFpsSAHv7U2rfHd4bsTnuZLau8WjJVwYrivx1crH+Fv4pUV8i583b 2sDvWeI/GWlAMK9qtHQjQXttMwqJQChjXX9t4np4= Date: Thu, 10 Mar 2016 10:41:00 +1100 From: Stephen Rothwell To: David Chinner , xfs@oss.sgi.com Cc: linux-next@vger.kernel.org, linux-kernel@vger.kernel.org, Jan Kara Subject: linux-next: manual merge of the xfs tree with the ext4 tree Message-ID: <20160310104100.6f906679@canb.auug.org.au> X-ASG-Orig-Subj: linux-next: manual merge of the xfs tree with the ext4 tree MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ozlabs.org[103.22.144.67] X-Barracuda-Start-Time: 1457566861 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27713 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi all, Today's linux-next merge of the xfs tree got a conflict in: fs/ext4/ext4.h between commit: 109811c20fb8 ("ext4: simplify io_end handling for AIO DIO") from the ext4 tree and commit: 74c66bcb7eda ("ext4: Fix data exposure after failed AIO DIO") from the xfs tree. I fixed it up (see below) and can carry the fix as necessary (no action is required). -- Cheers, Stephen Rothwell diff --cc fs/ext4/ext4.h index 70b8e0409566,56c12df107ab..000000000000 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@@ -1499,15 -1504,16 +1499,6 @@@ static inline int ext4_valid_inum(struc ino <= le32_to_cpu(EXT4_SB(sb)->s_es->s_inodes_count)); } - static inline void ext4_set_io_unwritten_flag(struct inode *inode, - struct ext4_io_end *io_end) -static inline ext4_io_end_t *ext4_inode_aio(struct inode *inode) --{ - if (!(io_end->flag & EXT4_IO_END_UNWRITTEN)) { - io_end->flag |= EXT4_IO_END_UNWRITTEN; - atomic_inc(&EXT4_I(inode)->i_unwritten); - } - return inode->i_private; -} - -static inline void ext4_inode_aio_set(struct inode *inode, ext4_io_end_t *io) -{ - inode->i_private = io; --} -- /* * Inode dynamic state flags */ From sales@marketing.powerpc.gr Thu Mar 10 02:44:28 2016 Return-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 378A77CA0 for ; Thu, 10 Mar 2016 02:44:28 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 88810AC069 for ; Thu, 10 Mar 2016 00:44:23 -0800 (PST) X-ASG-Debug-ID: 1457599456-04cbb00b6f2df0d0001-NocioJ Received: from cpanel.mailpowerpc.gr (mail.marketing.powerpc.gr [5.172.194.87]) by cuda.sgi.com with ESMTP id gycnneBUQAaCdkCT (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 10 Mar 2016 00:44:17 -0800 (PST) X-Barracuda-Envelope-From: sales@marketing.powerpc.gr X-Barracuda-Apparent-Source-IP: 5.172.194.87 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=marketing.powerpc.gr; s=default; h=Content-Type:MIME-Version:List-Owner: List-Subscribe:List-Unsubscribe:List-Help:Message-ID:From:Date:Subject:To; bh=hyexNsqEHB3Lic4BYxrDWbR3X6nJUm3BCfwhLN/Deu4=; b=NO62eZoJdqxbywEsmSMuC0pSn +5LtwKkSYViaGJ5WXyRjWSKzLpK+Cl4fDzX6G7TC0IBSypX8rQfAc0+ze+LFkRFKdh3r00KatX7Vi RrlKIK5ea7l8sqPttOI/7kqR3vvBcrJYzEtq15VbdBtBrfL4yGk/w7bBDg0IaABR3aR2gijN3fk3t rWYj6UZh6AodfDaOJvl1yuRX3HY/B1nbNCdQSViEIlg2WPYZh8vAObkuzknZS86uslYXjE70ivKKJ CatqUG+FZ4mGycQwlAxvty1s0emo1dsh6n2269+bij6jFgJJy4xq70gS+ty3Tx+tFiBzCKOQwC0fu JggjfVe5A==; Received: from root by cpanel.mailpowerpc.gr with local (Exim 4.86_1) (envelope-from ) id 1adwCb-0008o4-RZ for xfs@oss.sgi.com; Thu, 10 Mar 2016 10:44:13 +0200 To: xfs@oss.sgi.com Subject: =?UTF-8?B?zpXOr860zrcgzqXPgM6/zrvOv86zzrnPg8+Ez47OvSDPg8+EzrnPgiDOms6x?= =?UTF-8?B?zrvPjc+EzrXPgc61z4IgzqTOuc68zq3PgiE=?= Date: Thu, 10 Mar 2016 02:44:13 -0600 X-ASG-Orig-Subj: =?UTF-8?B?zpXOr860zrcgzqXPgM6/zrvOv86zzrnPg8+Ez47OvSDPg8+EzrnPgiDOms6x?= =?UTF-8?B?zrvPjc+EzrXPgc61z4IgzqTOuc68zq3PgiE=?= From: PowerPC Message-ID: <32bd3553f877403f2e51beeb056ac416@marketing.powerpc.gr> X-Mailer: PHPMailer 5.2.14 (https://github.com/PHPMailer/PHPMailer) X-phpList-version: 3.2.4 X-MessageID: 11 X-ListMember: xfs@oss.sgi.com Precedence: bulk Bounces-To: sales@marketing.powerpc.gr List-Help: List-Unsubscribe: List-Subscribe: List-Owner: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_32bd3553f877403f2e51beeb056ac416" X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - cpanel.mailpowerpc.gr X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [0 0] / [47 12] X-AntiAbuse: Sender Address Domain - marketing.powerpc.gr X-Get-Message-Sender-Via: cpanel.mailpowerpc.gr: sender_ident via received_protocol == local: root/only user confirmed/virtual account not confirmed X-Authenticated-Sender: cpanel.mailpowerpc.gr: root X-Source: /usr/bin/php X-Source-Args: /usr/bin/php /home/powerpc/public_html/marketing/lists/admin/index.php -pprocessqueue -c/home/powerpc/public_html/marketing/lists/config/config.php X-Source-Dir: powerpc.gr:/public_html/marketing/lists/admin X-Barracuda-Connect: mail.marketing.powerpc.gr[5.172.194.87] X-Barracuda-Start-Time: 1457599457 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.93 X-Barracuda-Spam-Status: No, SCORE=0.93 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA038b, DKIM_SIGNED, HTML_IMAGE_ONLY_28, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27723 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 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.20 BSF_SC0_SA038b Custom Rule SA038b This is a multi-part message in MIME format. --b1_32bd3553f877403f2e51beeb056ac416 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable =CE=93=CE=B9=CE=B1 =CE=BD=CE=B1 =CE=B4=CE=B9=CE=B1=CE=B3=CF=81=CE=B1=CF= =86=CE=B5=CE=AF=CF=84=CE=B5 =CE=B1=CF=80=CF=8C =CF=84=CE=B7=CE=BD =CE=BB= =CE=AF=CF=83=CF=84=CE=B1 =CE=B1=CE=BB=CE=BB=CE=B7=CE=BB=CE=BF=CE=B3=CF=81=CE=B1=CF=86=CE=AF=CE=B1= =CF=82, =CE=BA=CE=AC=CE=BD=CF=84=CE=B5 =CE=BA=CE=BB=CE=B9=CE=BA =CE=B5= =CE=B4=CF=8E=0A<[http://marketing.powerpc.gr/lists/lt.php?id=3DZkgBGFVVT1BQ= UwMNAQ> [[tracking_beacon]] -- This message was sent to xfs@oss.sgi.com by sales@marketing.powerpc.gr 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 -- powered by phpList, www.phplist.com -- --b1_32bd3553f877403f2e51beeb056ac416 Content-Type: multipart/related; boundary="b2_32bd3553f877403f2e51beeb056ac416" --b2_32bd3553f877403f2e51beeb056ac416 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable =0A =0A =09 =09=09 =09=09=09 =09=09 =09=09 =09=09=09 =09=09 =09
=09=09=09
 
=09=09=09  =09=09=09
Για να διαγρ&al= pha;φε=CE=AFτε απ=CF=8C την &la= mbda;=CE=AFστα αλληλ&omicron= ;γραφ=CE=AFας, κ=CE=ACντ&epsi= lon; Uns= ubscribe]" title=3D"One click unsubscribe">κλικ εδ=CF=8E
=09=09=09

[[tracking_beacon]]

=09=09=09

-- =20

This message was sent to xfs@oss.sgi.com by sales@marketing.powerp= c.gr

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.

=0A

3D"powered

3D"" --b2_32bd3553f877403f2e51beeb056ac416 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_32bd3553f877403f2e51beeb056ac416-- --b1_32bd3553f877403f2e51beeb056ac416-- From jack@suse.cz Thu Mar 10 03:18:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5D4727CA0 for ; Thu, 10 Mar 2016 03:18:29 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0E7D0304048 for ; Thu, 10 Mar 2016 01:18:25 -0800 (PST) X-ASG-Debug-ID: 1457601499-04bdf002eb2cb440001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id rEb0lDWhw7J70lqJ (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 10 Mar 2016 01:18:20 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 90025AAB4; Thu, 10 Mar 2016 09:18:18 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 2F1C08251E; Thu, 10 Mar 2016 10:18:40 +0100 (CET) Date: Thu, 10 Mar 2016 10:18:40 +0100 From: Jan Kara To: Stephen Rothwell Cc: David Chinner , xfs@oss.sgi.com, linux-next@vger.kernel.org, linux-kernel@vger.kernel.org, Jan Kara Subject: Re: linux-next: manual merge of the xfs tree with the ext4 tree Message-ID: <20160310091840.GC5026@quack.suse.cz> X-ASG-Orig-Subj: Re: linux-next: manual merge of the xfs tree with the ext4 tree References: <20160310104056.78033e72@canb.auug.org.au> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160310104056.78033e72@canb.auug.org.au> User-Agent: Mutt/1.5.24 (2015-08-30) X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1457601500 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27724 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu 10-03-16 10:40:56, Stephen Rothwell wrote: > Hi all, > > Today's linux-next merge of the xfs tree got a conflict in: > > fs/ext4/inode.c > > between commit: > > 109811c20fb8 ("ext4: simplify io_end handling for AIO DIO") > > from the ext4 tree and commit: > > 74c66bcb7eda ("ext4: Fix data exposure after failed AIO DIO") > > from the xfs tree. > > I fixed it up (see below) and can carry the fix as necessary (no action > is required). Thanks. The merge looks correct. Honza -- Jan Kara SUSE Labs, CR From jack@suse.cz Thu Mar 10 03:19:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 890417CA0 for ; Thu, 10 Mar 2016 03:19:00 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5C798304062 for ; Thu, 10 Mar 2016 01:19:00 -0800 (PST) X-ASG-Debug-ID: 1457601535-04cb6c5831296750001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id eyTnzh2ElR4FB3Y5 (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 10 Mar 2016 01:18:56 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id A9A0CABC3; Thu, 10 Mar 2016 09:18:54 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id ADA9B8251E; Thu, 10 Mar 2016 10:19:14 +0100 (CET) Date: Thu, 10 Mar 2016 10:19:14 +0100 From: Jan Kara To: Stephen Rothwell Cc: David Chinner , xfs@oss.sgi.com, linux-next@vger.kernel.org, linux-kernel@vger.kernel.org, Jan Kara Subject: Re: linux-next: manual merge of the xfs tree with the ext4 tree Message-ID: <20160310091914.GD5026@quack.suse.cz> X-ASG-Orig-Subj: Re: linux-next: manual merge of the xfs tree with the ext4 tree References: <20160310104100.6f906679@canb.auug.org.au> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160310104100.6f906679@canb.auug.org.au> User-Agent: Mutt/1.5.24 (2015-08-30) X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1457601536 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27724 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu 10-03-16 10:41:00, Stephen Rothwell wrote: > Hi all, > > Today's linux-next merge of the xfs tree got a conflict in: > > fs/ext4/ext4.h > > between commit: > > 109811c20fb8 ("ext4: simplify io_end handling for AIO DIO") > > from the ext4 tree and commit: > > 74c66bcb7eda ("ext4: Fix data exposure after failed AIO DIO") > > from the xfs tree. > > I fixed it up (see below) and can carry the fix as necessary (no action > is required). Thanks! This merge looks correct as well. Honza -- Jan Kara SUSE Labs, CR From garibovae@list.ru Thu Mar 10 04:56:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE, HTML_MIME_NO_HTML_TAG,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A8AEA7CA0 for ; Thu, 10 Mar 2016 04:56:54 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 413558F8049 for ; Thu, 10 Mar 2016 02:56:51 -0800 (PST) X-ASG-Debug-ID: 1457607406-04bdf002ee2cfa80001-NocioJ Received: from mxs.mail.ru (mx2.sackserver.de [85.93.16.30]) by cuda.sgi.com with ESMTP id eOlZmj1sKjNV6pwb for ; Thu, 10 Mar 2016 02:56:46 -0800 (PST) X-Barracuda-Envelope-From: garibovae@list.ru X-Barracuda-Apparent-Source-IP: 85.93.16.30 From: "=?utf-8?B?0JPQvtGB0L7QsdC+0YDQvtC90LfQsNC60LDQty4=?=" To: xfs@oss.sgi.com Subject: =?utf-8?B?0J/RgNCw0LrRgtC40YfQtdGB0LrQuNC1INGA0LXQutC+0LzQtdC90LTQsNGG0LjQuCDQtNC70Y8g0YHQv9C10YbQuNCw0LvQuNGB0YLQvtCyINC/0L4g0JPQntCX?= MIME-Version: 1.0 X-ASG-Orig-Subj: =?utf-8?B?0J/RgNCw0LrRgtC40YfQtdGB0LrQuNC1INGA0LXQutC+0LzQtdC90LTQsNGG0LjQuCDQtNC70Y8g0YHQv9C10YbQuNCw0LvQuNGB0YLQvtCyINC/0L4g0JPQntCX?= Message-ID: <339302018.20160310135647@IGLMTYSFEDYK> X-Mailer: Yamail [ http://yandex.ru ] 5.0 Date: Thu, 10 Mar 2016 13:56:47 +0300 Content-Transfer-Encoding: base64 Content-Type: text/html; charset=utf-8 X-Barracuda-Connect: mx2.sackserver.de[85.93.16.30] X-Barracuda-Start-Time: 1457607406 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.05 X-Barracuda-Spam-Status: No, SCORE=1.05 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, HTML_MIME_NO_HTML_TAG, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27726 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 1.05 HTML_MIME_NO_HTML_TAG HTML-only message, but there is no HTML tag PGRpdj48ZGl2IGFsaWduPSJjZW50ZXIiPjx0YWJsZSBiZ2NvbG9yPSIjZjJmMGVlIiBib3JkZXI9 IjMiPjx0Ym9keT48dHI+PHRkPjx0YWJsZSBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIj48dGJvZHk+ PHRyPjx0ZCBiZ2NvbG9yPSIjZTNlMGRkIj48dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSI+ PHRib2R5Pjx0cj48dGQgYmdjb2xvcj0iI2YyZjBlZSI+PGI+0JDRgNGC0LjQutGD0Ls8c3BhbiBs YW5nPSJlbi11cyI+OiA8L3NwYW4+IDwvYj48c3BhbiBsYW5nPSJlbi11cyI+MzA4PC9zcGFuPi48 L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjxwIGFsaWduPSJjZW50ZXIiPjxiciAvPjxiPjxmb250 IGNvbG9yPSIjMDAwMGNjIiBmYWNlPSJDYWxpYnJpIiBzaXplPSI1Ij7Qk9Ce0KHQo9CU0JDQoNCh 0KLQktCV0J3QndCr0Jkg0J7QkdCe0KDQntCd0J3Qq9CZINCX0JDQmtCQ0JcuPC9mb250Pjxmb250 IGNvbG9yPSIjMDAwMGNjIiBmYWNlPSJDYWxpYnJpIiBzaXplPSI0Ij4gPGJyIC8+0J3QntCS0J7Q lSDQkiDQndCe0KDQnNCQ0KLQmNCS0J3Qni3Qn9Cg0JDQktCe0JLQntCcINCg0JXQk9Cj0JvQmNCg 0J7QktCQ0J3QmNCYLCDQkNCa0KLQo9CQ0JvQrNCd0KvQlSA8YnIgLz4g0JLQntCf0KDQntCh0Ksg 0KbQldCd0J7QntCR0KDQkNCX0J7QktCQ0J3QmNCvLCDQntCi0JLQldCi0KHQotCS0JXQndCd0J7Q odCi0Kwg0JfQkCDQndCV0JjQodCf0J7Qm9Cd0JXQndCY0JUgPGJyIC8+INCa0J7QndCi0KDQkNCa 0KLQntCSPC9mb250PjwvYj48c3BhbiBsYW5nPSJlbi11cyI+PGJyIC8+PC9zcGFuPjxiciAvPjxm b250IGZhY2U9IkFyaWFsIiBzaXplPSI0Ij48Zm9udCBjb2xvcj0iI2NjMzMwMCI+PHNwYW4gbGFu Zz0iZW4tdXMiPjIyLTIzPC9zcGFuPiDQvNCw0YDRgtCwPC9mb250Pjxmb250IGNvbG9yPSIjODAw MDAwIj4gPC9mb250PjwvZm9udD48Zm9udCBmYWNlPSJBcmlhbCI+KNGBIDEwOjAwINC00L4gMTc6 MzApIDwvZm9udD4gPGZvbnQgZmFjZT0iQXJpYWwiIHNpemU9IjQiPjxmb250IGNvbG9yPSIjY2Mz MzAwIj48YnIgLz7Qsy4g0JzQvtGB0LrQstCwPC9mb250PjxiciAvPjwvZm9udD4gPGJyIC8+PGI+ 0JzQtdGA0L7Qv9GA0LjRj9GC0LjQtSDRgdC+0YHRgtC+0LjRgtGB0Y8g0L/QviDQsNC00YDQtdGB 0YM6PC9iPiDRg9C7LiDQkdCw0YPQvNCw0L3RgdC60LDRjywg0LQuNiwg0JEu0KYuIDxmb250IGZh Y2U9IlRpbWVzIE5ldyBSb21hbiI+ItCS0LjQutGC0L7RgNC40Y8g0J/Qu9Cw0LfQsCI8c3BhbiBs YW5nPSJlbiI+PGJyIC8+PC9zcGFuPjwvZm9udD48YnIgLz48Yj7Qo9C30L3QsNGC0Ywg0LLRgdGO INC/0L7QtNGA0L7QsdC90YPRjiDQuNC90YTQvtGA0LzQsNGG0LjRjiDQuCDQt9Cw0YDQtdCz0LjR gdGC0YDQuNGA0L7QstCw0YLRjNGB0Y8g0LzQvtC20L3QviDQv9C+INGC0LXQuy4gOiA8L2I+PC9w PjxwIGFsaWduPSJjZW50ZXIiPjxmb250IGZhY2U9IkFyaWFsIiBzaXplPSI0Ij44IDwvZm9udD4g PGZvbnQgZmFjZT0iQXJpYWwiIHNpemU9IjIiPtC60L7QtCDQs9C+0YDQvtC00LA8L2ZvbnQ+PGZv bnQgZmFjZT0iQXJpYWwiIHNpemU9IjQiPiAoNDk1KSA8L2ZvbnQ+PGZvbnQgZmFjZT0iQXJpYWwi IHNpemU9IjIiPtGC0LXQu9C10YTQvtC9PC9mb250Pjxmb250IGZhY2U9IkFyaWFsIiBzaXplPSI0 Ij4gOTYxIC0gMDAgLSAzOCA8L2ZvbnQ+PGZvbnQgZmFjZT0iQXJpYWwiIHNpemU9IjIiPiAo0LzQ vdC+0LPQvtC60LDQvdCw0LvRjNC90YvQuSk8L2ZvbnQ+PGZvbnQgZmFjZT0iQXJpYWwiIHNpemU9 IjQiPjxiciAvPjwvZm9udD4gPGI+LS0tPC9iPjwvcD48cCBhbGlnbj0ibGVmdCI+PGI+0JIg0L7Q sdGD0YfQtdC90LjQuCDQv9GA0LjQvdC40LzQsNGO0YIg0YPRh9Cw0YHRgtC40LUg0YHQv9C10YbQ uNCw0LvQuNGB0YLRiyDQo9C/0YDQsNCy0LvQtdC90LjRjyDQutC+0L3RgtGA0L7Qu9GPINCz0L7R gdGD0LTQsNGA0YHRgtCy0LXQvdC90L7Qs9C+IDxiciAvPiDQvtCx0L7RgNC+0L3QvdC+0LPQviDQ t9Cw0LrQsNC30LAg0KbQtdC90YLRgNCw0LvRjNC90L7Qs9C+INCw0L/Qv9Cw0YDQsNGC0LAg0KTQ kNChINCg0L7RgdGB0LjQuCwg0L/RgNC10LTRgdGC0LDQstC40YLQtdC70Lgg0Y3QutGB0L/QtdGA 0YLQvdGL0YUgPGJyIC8+INCz0YDRg9C/0L8g0J/RgNCw0LLQuNGC0LXQu9GM0YHRgtCy0LAg0KDQ pDwvYj48YnIgLz7CoDwvcD48L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjxwPjxmb250IGNvbG9y PSIjMDAwMDgwIj7CoDxiPtCSINCf0KDQntCT0KDQkNCc0JzQlTo8L2I+PGJyIC8+PC9mb250Pjxi ciAvPiDCoDxiPjEuPC9iPiDQmNC30LzQtdC90LXQvdC40Y8g0LIg0LfQsNC60L7QvdC+0LTQsNGC 0LXQu9GM0YHRgtCy0LUg0L4g0LPQvtGB0YPQtNCw0YDRgdGC0LLQtdC90L3QvtC8INC+0LHQvtGA 0L7QvdC90L7QvCDQt9Cw0LrQsNC30LUgKNCT0J7QlyksINCa0L7QtNC10LrRgdC1INC+0LEgPGJy IC8+wqDQsNC00LzQuNC90LjRgdGC0YDQsNGC0LjQstC90YvRhSDQv9GA0LDQstC+0L3QsNGA0YPR iNC10L3QuNGP0YUg0LIg0KDQpCDQuCDRgi7QtC48YnIgLz48YnIgLz48Yj7CoNCd0L7RgNC80Ysg 0Lgg0YLRgNC10LHQvtCy0LDQvdC40Y8g0KTQlyDihJYgMjc1LdCk0Jcg0L7RgiAyOSDQtNC10LrQ sNCx0YDRjyAyMDEyINCzLiAi0J4g0JPQntCXIjs8YnIgLz4gwqDQndC+0LLQvtC1INCyINGB0LjR gdGC0LXQvNC1INCT0J7QlyDQsiDRgdC+0L7RgtCy0LXRgtGB0YLQstC40Lgg0YEg0L/QvtC70L7Q ttC10L3QuNGP0LzQuCDQpNCXIOKEliAxNTkt0KTQlyDQvtGCIDI5INC40Y7QvdGPIDIwMTUg0LMu IDxiciAvPiDCoCLQniDQstC90LXRgdC10L3QuNC4INC40LfQvNC10L3QtdC90LjQuSDQsiDQpNCX ICLQniDQk9Ce0JciINC4INC+0YLQtNC10LvRjNC90YvQtSDQt9Cw0LrQvtC90L7QtNCw0YLQtdC7 0YzQvdGL0LUg0LDQutGC0Ysg0KDQpCIuPC9iPjxiciAvPjxiciAvPiDCoDxiPjIuPC9iPiDQntGB 0L3QvtCy0L3Ri9C1INC/0YDQsNCy0LAg0Lgg0L7QsdGP0LfQsNC90L3QvtGB0YLQuCDQs9C+0YHR g9C00LDRgNGB0YLQstC10L3QvdC+0LPQviDQt9Cw0LrQsNC30YfQuNC60LAsINCz0L7Qu9C+0LLQ vdC+0LPQviDQuNGB0L/QvtC70L3QuNGC0LXQu9GPLCA8YnIgLz4gwqDCoMKgwqAg0LjRgdC/0L7Q u9C90LjRgtC10LvRjy48YnIgLz48YnIgLz4gwqA8Yj4zLjwvYj4g0J3QvtCy0YvQtSDQvtGB0L3Q vtCy0L3Ri9C1INC/0YDQsNCy0LAg0Lgg0L7QsdGP0LfQsNC90L3QvtGB0YLQuCDQs9C+0LvQvtCy 0L3QvtCz0L4g0LjRgdC/0L7Qu9C90LjRgtC10LvRjy4g0JrQvtC+0L/QtdGA0LDRhtC40Y8g0LPQ vtC70L7QstC90L7Qs9C+IDxiciAvPsKgwqDCoMKgINC40YHQv9C+0LvQvdC40YLQtdC70Y8uPGJy IC8+PGJyIC8+IMKgPGI+NC48L2I+INCd0L7QstGL0LUg0L7RgdC90L7QstC90YvQtSDQv9GA0LDQ stCwINC4INC+0LHRj9C30LDQvdC90L7RgdGC0Lgg0LjRgdC/0L7Qu9C90LjRgtC10LvRjy48YnIg Lz48YnIgLz4gwqA8Yj41LjwvYj4g0KTQvtGA0LzQuNGA0L7QstCw0L3QuNC1INC60L7QvtC/0LXR gNCw0YbQuNC4INCz0L7Qu9C+0LLQvdGL0LzQuCDQuNGB0L/QvtC70L3QuNGC0LXQu9GP0LzQuCDQ uCDQuNGB0L/QvtC70L3QuNGC0LXQu9GP0LzQuCDQk9Ce0JcuINCj0YHQu9C+0LLQuNGPIDxiciAv PsKgwqDCoMKgINC30LDQutC70Y7Rh9Cw0LXQvNGL0YUg0LrQvtC90YLRgNCw0LrRgtC+0LIg0L/Q viDQk9Ce0JcuPGJyIC8+PGJyIC8+IMKgPGI+Ni48L2I+INCe0LHQtdGB0L/QtdGH0LXQvdC40LUg 0L/QvtGB0YLQsNCy0L7QuiDQv9GA0L7QtNGD0LrRhtC40LgsINGA0LDQt9C80LXRidC10L3QuNGP INC30LDQutCw0LfQvtCyINC90LAg0L/QvtGB0YLQsNCy0LrQuCDQv9GA0L7QtNGD0LrRhtC40Lgu PGJyIC8+PGJyIC8+IMKgPGI+Ny48L2I+INCX0LDQutC70Y7Rh9C10L3QuNC1INCz0L7RgdGD0LTQ sNGA0YHRgtCy0LXQvdC90L7Qs9C+INC60L7QvdGC0YDQsNC60YLQsC4g0JLQstC10LTQtdC90LjQ tSDQuNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgNCwINCz0L7RgdGD0LTQsNGA0YHRgtCy0LXQvdC9 0L7Qs9C+IDxiciAvPsKgwqDCoMKgINC60L7QvdGC0YDQsNC60YLQsC48YnIgLz48YnIgLz4gwqA8 Yj44LjwvYj4g0JrQvtC90YLRgNC+0LvRjCDQt9CwINC+0LHQtdGB0L/QtdGH0LXQvdC40LXQvCDQ utC+0L3RgtGA0LDQutGC0LAg0Lgg0L/QvtGB0YLQsNCy0L7QuiDQv9GA0L7QtNGD0LrRhtC40Lgg 0LjRgdC/0L7Qu9C90LjRgtC10LvRj9C80Lgg0Lgv0LjQu9C4INCz0L7Qu9C+0LLQvdGL0LwgPGJy IC8+wqDCoMKgwqAg0LjRgdC/0L7Qu9C90LjRgtC10LvQtdC8LjxiciAvPjxiciAvPiDCoDxiPjku PC9iPiDQntGC0LrQsNC3INGD0YfQsNGB0YLQvdC40LrQvtCyINC60L7QvtC/0LXRgNCw0YbQuNC4 INC+0YIg0LfQsNC60LvRjtGH0LXQvdC40Y8g0LrQvtC90YLRgNCw0LrRgtC+0LIg0LIg0YDQsNC8 0LrQsNGFINGB0L7Qv9GA0L7QstC+0LbQtNCw0LXQvNC+0Lkg0YHQtNC10LvQutC4LiA8YnIgLz4g wqDCoMKgwqAg0JDQu9Cz0L7RgNC40YLQvCDRgNCw0LHQvtGC0Ysg0L/QviDRg9GA0LXQs9GD0LvQ uNGA0L7QstCw0L3QuNGOINGA0LDQt9C90L7Qs9C70LDRgdC40Lk7INCg0LXQttC40Lwg0LjRgdC/ 0L7Qu9GM0LfQvtCy0LDQvdC40Y8g0L7RgtC00LXQu9GM0L3QvtCz0L4g0YHRh9C10YLQsCDQuCA8 YnIgLz7CoMKgwqDCoCDQt9Cw0L/RgNC10YLRiyDQvdCwINGB0L7QstC10YDRiNC10L3QuNC1INC+ 0L/QtdGA0LDRhtC40Lk7INCa0YDQuNGC0LXRgNC40Lgg0L7Qv9C10YDQsNGG0LjQuSwg0L/RgNC4 0L7RgdGC0LDQvdCw0LLQu9C40LLQsNC10LzRi9GFINCyINGB0L7QvtGC0LLQtdGC0YHRgtCy0LjQ uCDRgSA8YnIgLz7CoMKgwqDCoCDQpNC10LTQtdGA0LDQu9GM0L3Ri9C8INC30LDQutC+0L3QvtC8 ICLQniDQs9C+0YHRg9C00LDRgNGB0YLQstC10L3QvdC+0Lwg0L7QsdC+0YDQvtC90L3QvtC8INC3 0LDQutCw0LfQtSIg0Lgg0YIu0LQuPGJyIC8+PGJyIC8+IMKgPGI+MTAuPC9iPiDQo9GB0LvQvtCy 0LjRjyDQs9C+0YHRg9C00LDRgNGB0YLQstC10L3QvdGL0YUg0LrQvtC90YLRgNCw0LrRgtC+0LIs INGD0YHRgtCw0L3QsNCy0LvQuNCy0LDRjtGJ0LjQtSDRgNCw0LfQvNC10YAg0L/RgNC40LHRi9C7 0Lgg0LggKNC40LvQuCkg0L/QvtGA0Y/QtNC+0LogPGJyIC8+wqDCoMKgwqDCoMKg0LrQvtC80L/Q tdC90YHQsNGG0LjQuCDQv9C+0L3QtdGB0LXQvdC90YvRhSDQt9CwINGB0YfQtdGCINGB0L7QsdGB 0YLQstC10L3QvdGL0YUg0YHRgNC10LTRgdGC0LIg0YDQsNGB0YXQvtC00L7QsiDQvdCwINGE0L7R gNC80LjRgNC+0LLQsNC90LjQtSDQt9Cw0L/QsNGB0LAgPGJyIC8+wqDCoMKgwqDCoMKg0L/RgNC+ 0LTRg9C60YbQuNC4LCDRgdGL0YDRjNGPLCDQvNCw0YLQtdGA0LjQsNC70L7Qsiwg0L/QvtC70YPR hNCw0LHRgNC40LrQsNGC0L7Qsiwg0LrQvtC80L/Qu9C10LrRgtGD0Y7RidC40YUg0LjQt9C00LXQ u9C40LksINC90LXQvtCx0YXQvtC00LjQvNC+0LPQviDQtNC70Y8gPGJyIC8+wqDCoMKgwqDCoMKg 0LLRi9C/0L7Qu9C90LXQvdC40Y8g0JPQntCXOzxiciAvPjxiciAvPiDCoDxiPjExLjwvYj4g0JjR gdGC0L7Rh9C90LjQutC4INGE0LjQvdCw0L3RgdC40YDQvtCy0LDQvdC40Y8g0YDQsNCx0L7RgiDQ v9C+INC60L7QvdGC0YDQsNC60YLQsNC8LCDQt9Cw0LrQu9GO0YfQtdC90L3Ri9C8INGBINC40YHQ v9C+0LvQvdC40YLQtdC70Y/QvNC4INC4IDxiciAvPsKgwqDCoMKgwqDCoCDQt9Cw0LrQsNC30YfQ uNC60LDQvNC4LjxiciAvPjxiciAvPiDCoDxiPjEyLjwvYj4g0JHQsNC90LrQvtCy0YHQutC+0LUg 0YHQvtC/0YDQvtCy0L7QttC00LXQvdC40LUg0LPQvtGB0YPQtNCw0YDRgdGC0LLQtdC90L3QvtCz 0L4g0LrQvtC90YLRgNCw0LrRgtCwINC4INC60L7QvdGC0YDQsNC60YLQvtCyINC/0L4g0JPQntCX PGJyIC8+PGJyIC8+wqA8Yj4xMy48L2I+INCT0L7RgdGD0LTQsNGA0YHRgtCy0LXQvdC90YvQuSDQ utC+0L3RgtGA0L7Qu9GMICjQvdCw0LTQt9C+0YApINCyINGB0YTQtdGA0LUg0LPQvtGB0YPQtNCw 0YDRgdGC0LLQtdC90L3QvtCz0L4g0L7QsdC+0YDQvtC90L3QvtCz0L4g0LfQsNC60LDQt9CwLjxi ciAvPjxiciAvPiDCoDxiPjE0LjwvYj4g0J3QvtCy0YvQtSDQv9GA0LDQstC40LvQsCDRhtC10L3Q vtC+0LHRgNCw0LfQvtCy0LDQvdC40Y8g0L3QsCDQv9GA0L7QtNGD0LrRhtC40Y4g0L7QsdC+0YDQ vtC90L3QvtCz0L4g0L3QsNC30L3QsNGH0LXQvdC40Y8uPGJyIC8+PGJyIC8+IMKgPGI+MTUuPC9i PiDQn9C+0YDRj9C00L7QuiDQstC10LTQtdC90LjRjyDRgNCw0LfQtNC10LvRjNC90L7Qs9C+INGD 0YfQtdGC0LAg0LfQsNGC0YDQsNGCINC4INGA0LXQt9GD0LvRjNGC0LDRgtC+0LIg0YTQuNC90LDQ vdGB0L7QstC+LdGF0L7Qt9GP0LnRgdGC0LLQtdC90L3QvtC5IDxiciAvPsKgwqDCoMKgwqDCoCDQ tNC10Y/RgtC10LvRjNC90L7RgdGC0Lgg0LIg0YHRhNC10YDQtSDQk9Ce0JcuPGJyIC8+PGJyIC8+ IMKgPGI+MTYuPC9iPiDQndC+0LLRi9C1INC/0L7Qu9C90L7QvNC+0YfQuNGPINCk0JDQoSDQoNC+ 0YHRgdC40Lgg0L/QviDQutC+0L3RgtGA0L7Qu9GOINCyINGB0YTQtdGA0LUg0JPQntCXLCDQsCDR gtCw0LrQttC1INGA0LXQs9C40YHRgtGA0LDRhtC40Lgg0YbQtdC9INC90LAgPGJyIC8+wqDCoMKg wqDCoMKgINC/0YDQvtC00YPQutGG0LjRjiwg0L/QvtGB0YLQsNCy0LvRj9C10LzRg9GOINC/0L4g 0JPQntCXLjxiciAvPjxiciAvPiDCoDxiPjE3LjwvYj4g0JDQtNC80LjQvdC40YHRgtGA0LDRgtC4 0LLQvdCw0Y8g0L7RgtCy0LXRgtGB0YLQstC10L3QvdC+0YHRgtGMINCyINCa0L7QtNC10LrRgdC1 INC+0LEg0LDQtNC80LjQvdC40YHRgtGA0LDRgtC40LLQvdGL0YUg0L/RgNCw0LLQvtC90LDRgNGD 0YjQtdC90LjRj9GFINCyINCg0KQ6IDxiciAvPiDCoMKgwqDCoMKgwqAg0LLQuNC00Ysg0L/RgNCw 0LLQvtC90LDRgNGD0YjQtdC90LjQuSDQuCDRgNCw0LfQvNC10YAg0L7RgtCy0LXRgtGB0YLQstC1 0L3QvdC+0YHRgtC4LiDQntGC0LLQtdGC0YHRgtCy0LXQvdC90L7RgdGC0Ywg0LfQsCDQvdC10LTQ vtCx0YDQvtGB0L7QstC10YHRgtC90L7QtSA8YnIgLz7CoMKgwqDCoMKgwqAg0LLRi9C/0L7Qu9C9 0LXQvdC40LUg0JPQntCXINCyINGB0L7QvtGC0LLQtdGC0YHRgtCy0LjQuCDRgSDRgtGA0LXQsdC+ 0LLQsNC90LjRj9C80Lgg0J/QvtGB0YLQsNC90L7QstC70LXQvdC40Y8g0J/RgNCw0LLQuNGC0LXQ u9GM0YHRgtCy0LAg4oSWIDEyMTEg0L7RgiAyMiA8YnIgLz4gwqDCoMKgwqDCoMKgINC90L7Rj9Cx 0YDRjyAyMDEyINCzLjxiciAvPiDCoDwvcD48dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSI+ PHRib2R5Pjx0cj48dGQ+PHAgYWxpZ249ImxlZnQiPjxiPtCh0YLQvtC40LzQvtGB0YLRjCDRg9GH 0LDRgdGC0LjRjzo8L2I+IDI5ODAwINGA0YPQsS4gPGJyIC8+PGI+0KHQujxzcGFuIGxhbmc9ImVu LXVzIj51PC9zcGFuPtC00Lo8c3BhbiBsYW5nPSJlbi11cyI+dTwvc3Bhbj48L2I+ICjQv9GA0Lgg 0YPRh9Cw0YHRgtC40LggMiDRgdC+0YLRgNGD0LTQvdC40LrQvtCyINC+0YIg0L7QtNC90L7QuSDQ utC+0LzQv9Cw0L3QuNC4IC0gPGJyIC8+MTAlLCDQv9GA0Lgg0YPRh9Cw0YHRgtC40LggMyAtIDE1 JSwg0L/RgNC4INGD0YfQsNGB0YLQuNC4IDQg0Lgg0LHQvtC70LXQtSDRgdC+0YLRgNGD0LTQvdC4 0LrQvtCyINC+0YIg0L7QtNC90L7QuSDQutC+0LzQv9Cw0L3QuNC4IC0gMjAlKSA8YnIgLz7QkiDR gdGC0L7QuNC80L7RgdGC0Ywg0LLRhdC+0LTQuNGCINC80LXRgtC+0LTQuNGH0LXRgdC60LjQuSDQ vNCw0YLQtdGA0LjQsNC7LCDQvtCx0LXQtNGLLCDQutC+0YTQtS3Qv9Cw0YPQt9GLLCDRgdC10YDR gtC40YTQuNC60LDRgi48L3A+PC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L3RkPjwvdHI+PC90 Ym9keT48L3RhYmxlPjwvZGl2PjwvZGl2Pg== From dan.carpenter@oracle.com Thu Mar 10 07:04:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 085D37CA0 for ; Thu, 10 Mar 2016 07:04:12 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id CCBDC8F8050 for ; Thu, 10 Mar 2016 05:04:08 -0800 (PST) X-ASG-Debug-ID: 1457615046-04cb6c583229df00001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id pEnBKw9AlJn70JOr (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 10 Mar 2016 05:04:07 -0800 (PST) X-Barracuda-Envelope-From: dan.carpenter@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u2AD45IE016363 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 10 Mar 2016 13:04:06 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u2AD45CM018686 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Thu, 10 Mar 2016 13:04:05 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u2AD44Bh015103; Thu, 10 Mar 2016 13:04:05 GMT Received: from mwanda (/154.0.139.178) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 10 Mar 2016 05:04:03 -0800 Date: Thu, 10 Mar 2016 16:03:49 +0300 From: Dan Carpenter To: sandeen@sandeen.net Cc: xfs@oss.sgi.com Subject: re: xfs: eliminate committed arg from xfs_bmap_finish Message-ID: <20160310130349.GA15596@mwanda> X-ASG-Orig-Subj: re: xfs: eliminate committed arg from xfs_bmap_finish MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1457615047 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27728 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Hello Eric Sandeen, The patch f6106efae5f4: "xfs: eliminate committed arg from xfs_bmap_finish" from Jan 11, 2016, leads to the following static checker warning: fs/xfs/xfs_bmap_util.c:132 xfs_bmap_finish() error: XXX potentially using uninitialized 'committed'. fs/xfs/xfs_bmap_util.c 98 int /* error */ 99 xfs_bmap_finish( 100 struct xfs_trans **tp, /* transaction pointer addr */ 101 struct xfs_bmap_free *flist, /* i/o: list extents to free */ 102 struct xfs_inode *ip) 103 { 104 struct xfs_efd_log_item *efd; /* extent free data */ 105 struct xfs_efi_log_item *efi; /* extent free intention */ 106 int error; /* error return value */ 107 int committed;/* xact committed or not */ 108 struct xfs_bmap_free_item *free; /* free extent item */ 109 struct xfs_bmap_free_item *next; /* next item on free list */ 110 111 ASSERT((*tp)->t_flags & XFS_TRANS_PERM_LOG_RES); 112 if (flist->xbf_count == 0) 113 return 0; 114 115 efi = xfs_trans_get_efi(*tp, flist->xbf_count); 116 for (free = flist->xbf_first; free; free = free->xbfi_next) 117 xfs_trans_log_efi_extent(*tp, efi, free->xbfi_startblock, 118 free->xbfi_blockcount); 119 120 error = __xfs_trans_roll(tp, ip, &committed); 121 if (error) { 122 /* 123 * If the transaction was committed, drop the EFD reference 124 * since we're bailing out of here. The other reference is 125 * dropped when the EFI hits the AIL. 126 * 127 * If the transaction was not committed, the EFI is freed by the 128 * EFI item unlock handler on abort. Also, we have a new 129 * transaction so we should return committed=1 even though we're 130 * returning an error. 131 */ 132 if (committed) { "committed" is never initialized to zero. It's either 1 or uninitialized. 133 xfs_efi_release(efi); 134 xfs_force_shutdown((*tp)->t_mountp, 135 (error == -EFSCORRUPTED) ? 136 SHUTDOWN_CORRUPT_INCORE : 137 SHUTDOWN_META_IO_ERROR); 138 } regards, dan carpenter From dan.carpenter@oracle.com Thu Mar 10 07:28:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2F7ED7CA0 for ; Thu, 10 Mar 2016 07:28:25 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 88A64AC007 for ; Thu, 10 Mar 2016 05:28:24 -0800 (PST) X-ASG-Debug-ID: 1457616502-04cbb00b722ea040001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 4xcdZLIwd3vR24y8 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 10 Mar 2016 05:28:22 -0800 (PST) X-Barracuda-Envelope-From: dan.carpenter@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u2ADSMYu014729 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Mar 2016 13:28:22 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u2ADSMZU027253 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL) for ; Thu, 10 Mar 2016 13:28:22 GMT Received: from abhmp0009.oracle.com (abhmp0009.oracle.com [141.146.116.15]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u2ADSLqq014606 for ; Thu, 10 Mar 2016 13:28:22 GMT Received: from mwanda (/154.0.139.178) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 10 Mar 2016 05:28:21 -0800 Date: Thu, 10 Mar 2016 16:28:16 +0300 From: Dan Carpenter To: xfs@oss.sgi.com Subject: [report] potential uninitialized variable in xfs_dir2_node_to_leaf() Message-ID: <20160310132816.GA16611@mwanda> X-ASG-Orig-Subj: [report] potential uninitialized variable in xfs_dir2_node_to_leaf() MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1457616502 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27728 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Hello XFS devs, I get the following static checker warning: fs/xfs/libxfs/xfs_dir2_leaf.c:1726 xfs_dir2_node_to_leaf() error: potentially using uninitialized 'rval'. fs/xfs/libxfs/xfs_dir2_leaf.c 1691 int rval; /* successful free trim? */ ^^^^ 1692 xfs_trans_t *tp; /* transaction pointer */ 1693 struct xfs_dir3_icleaf_hdr leafhdr; 1694 struct xfs_dir3_icfree_hdr freehdr; 1695 1696 /* 1697 * There's more than a leaf level in the btree, so there must 1698 * be multiple leafn blocks. Give up. 1699 */ 1700 if (state->path.active > 1) 1701 return 0; 1702 args = state->args; 1703 1704 trace_xfs_dir2_node_to_leaf(args); 1705 1706 mp = state->mp; 1707 dp = args->dp; 1708 tp = args->trans; 1709 /* 1710 * Get the last offset in the file. 1711 */ 1712 if ((error = xfs_bmap_last_offset(dp, &fo, XFS_DATA_FORK))) { 1713 return error; 1714 } 1715 fo -= args->geo->fsbcount; 1716 /* 1717 * If there are freespace blocks other than the first one, 1718 * take this opportunity to remove trailing empty freespace blocks 1719 * that may have been left behind during no-space-reservation 1720 * operations. 1721 */ 1722 while (fo > args->geo->freeblk) { 1723 if ((error = xfs_dir2_node_trim_free(args, fo, &rval))) { ^^^^ The first "return 0" happens before "rval" is initialized. 1724 return error; 1725 } 1726 if (rval) ^^^^ 1727 fo -= args->geo->fsbcount; 1728 else 1729 return 0; 1730 } regards, dan carpenter From sandeen@sandeen.net Thu Mar 10 07:52:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 140867CA0 for ; Thu, 10 Mar 2016 07:52:02 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C8A8C304053 for ; Thu, 10 Mar 2016 05:51:58 -0800 (PST) X-ASG-Debug-ID: 1457617914-04bdf002ec2d5940001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id OKtJmt03uyxGPSyX for ; Thu, 10 Mar 2016 05:51:54 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 661D83251 for ; Thu, 10 Mar 2016 07:51:43 -0600 (CST) Subject: Re: xfs: eliminate committed arg from xfs_bmap_finish To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: eliminate committed arg from xfs_bmap_finish References: <20160310130349.GA15596@mwanda> From: Eric Sandeen Message-ID: <56E17BFA.7010000@sandeen.net> Date: Thu, 10 Mar 2016 07:51:54 -0600 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <20160310130349.GA15596@mwanda> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1457617914 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27729 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/10/16 7:03 AM, Dan Carpenter wrote: > Hello Eric Sandeen, > > The patch f6106efae5f4: "xfs: eliminate committed arg from > xfs_bmap_finish" from Jan 11, 2016, leads to the following static > checker warning: > > fs/xfs/xfs_bmap_util.c:132 xfs_bmap_finish() > error: XXX potentially using uninitialized 'committed'. You're right; thankfully it's "only" on an error path, but I'll get a patch sent out to fix this up. -Eric > fs/xfs/xfs_bmap_util.c > 98 int /* error */ > 99 xfs_bmap_finish( > 100 struct xfs_trans **tp, /* transaction pointer addr */ > 101 struct xfs_bmap_free *flist, /* i/o: list extents to free */ > 102 struct xfs_inode *ip) > 103 { > 104 struct xfs_efd_log_item *efd; /* extent free data */ > 105 struct xfs_efi_log_item *efi; /* extent free intention */ > 106 int error; /* error return value */ > 107 int committed;/* xact committed or not */ > 108 struct xfs_bmap_free_item *free; /* free extent item */ > 109 struct xfs_bmap_free_item *next; /* next item on free list */ > 110 > 111 ASSERT((*tp)->t_flags & XFS_TRANS_PERM_LOG_RES); > 112 if (flist->xbf_count == 0) > 113 return 0; > 114 > 115 efi = xfs_trans_get_efi(*tp, flist->xbf_count); > 116 for (free = flist->xbf_first; free; free = free->xbfi_next) > 117 xfs_trans_log_efi_extent(*tp, efi, free->xbfi_startblock, > 118 free->xbfi_blockcount); > 119 > 120 error = __xfs_trans_roll(tp, ip, &committed); > 121 if (error) { > 122 /* > 123 * If the transaction was committed, drop the EFD reference > 124 * since we're bailing out of here. The other reference is > 125 * dropped when the EFI hits the AIL. > 126 * > 127 * If the transaction was not committed, the EFI is freed by the > 128 * EFI item unlock handler on abort. Also, we have a new > 129 * transaction so we should return committed=1 even though we're > 130 * returning an error. > 131 */ > 132 if (committed) { > > "committed" is never initialized to zero. It's either 1 or > uninitialized. > > 133 xfs_efi_release(efi); > 134 xfs_force_shutdown((*tp)->t_mountp, > 135 (error == -EFSCORRUPTED) ? > 136 SHUTDOWN_CORRUPT_INCORE : > 137 SHUTDOWN_META_IO_ERROR); > 138 } > > regards, > dan carpenter > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From BATV+6b0ca702f8b6ab34884e+4582+infradead.org+hch@bombadil.srs.infradead.org Thu Mar 10 08:14:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 58DAD7CA2 for ; Thu, 10 Mar 2016 08:14:44 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C81A3AC001 for ; Thu, 10 Mar 2016 06:14:40 -0800 (PST) X-ASG-Debug-ID: 1457619274-04cb6c583029fdb0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id n6AiLLvRkS4C3XDG (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 10 Mar 2016 06:14:35 -0800 (PST) X-Barracuda-Envelope-From: BATV+6b0ca702f8b6ab34884e+4582+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 1ae1MI-0007mI-4Q; Thu, 10 Mar 2016 14:14:34 +0000 Date: Thu, 10 Mar 2016 06:14:34 -0800 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/16] xfs: first part of rmapbt functionality Message-ID: <20160310141434.GA29058@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 0/16] xfs: first part of rmapbt functionality References: <1457410578-30233-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1457410578-30233-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457619274 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27729 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Mar 08, 2016 at 03:16:02PM +1100, Dave Chinner wrote: > This isn't all of the rmap functionality. It's patches up to the > point where I've come across the first piece that needs to be > reworked (the rmap intent execution code), so there's no point > holding these back until I've sorted that out. This builds on top of > for-next and the patch set I posted yesterday. > > Darrick, I've changed the authorship of the patches to reflect > the original series this has come from - can you check to see if > there's anything I got wrong when I did that? I'll come some minor bits on the actual patches, but I'd like to understand a few fundamental things first: For one Darrick has introduced a new rmapxbt btree recently, which allows using a rmap on reflink enabled file systems. In his tree we thus have two different implementation of a reverse mapping btree. Is there any good reason to keep it this way? For one reflinks are a compelling feature that I doubt people want to disable in the long run, so most filesystem will be using rmapxbt. I also don't think having these two implementations is good for the testing matrix in the long run. From BATV+6b0ca702f8b6ab34884e+4582+infradead.org+hch@bombadil.srs.infradead.org Thu Mar 10 08:17:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 869E97CA2 for ; Thu, 10 Mar 2016 08:17:02 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 45DFD8F8039 for ; Thu, 10 Mar 2016 06:17:02 -0800 (PST) X-ASG-Debug-ID: 1457619419-04bdf002ec2d6690001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id YoMyKNKBQAjTNA1S (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 10 Mar 2016 06:16:59 -0800 (PST) X-Barracuda-Envelope-From: BATV+6b0ca702f8b6ab34884e+4582+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 1ae1Od-00019I-Kl; Thu, 10 Mar 2016 14:16:59 +0000 Date: Thu, 10 Mar 2016 06:16:59 -0800 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 03/16] xfs: rmap btree add more reserved blocks Message-ID: <20160310141659.GB29058@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 03/16] xfs: rmap btree add more reserved blocks References: <1457410578-30233-1-git-send-email-david@fromorbit.com> <1457410578-30233-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1457410578-30233-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457619419 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27729 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > + mp->m_ag_prealloc_blocks = xfs_prealloc_blocks(mp); We only use the m_ag_prealloc_blocks member in xfs_growfs_data_private. I think a local variable would do it as well, as growfs isn't exactly a frequent fast path operation. From BATV+6b0ca702f8b6ab34884e+4582+infradead.org+hch@bombadil.srs.infradead.org Thu Mar 10 08:19:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 516C57CA2 for ; Thu, 10 Mar 2016 08:19:16 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B2CA1AC006 for ; Thu, 10 Mar 2016 06:19:15 -0800 (PST) X-ASG-Debug-ID: 1457619553-04cb6c58312a0060001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id Vb48mlKzEoOtg7iz (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 10 Mar 2016 06:19:13 -0800 (PST) X-Barracuda-Envelope-From: BATV+6b0ca702f8b6ab34884e+4582+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 1ae1Qn-000274-7O; Thu, 10 Mar 2016 14:19:13 +0000 Date: Thu, 10 Mar 2016 06:19:13 -0800 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 05/16] xfs: add owner field to extent allocation and freeing Message-ID: <20160310141913.GC29058@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 05/16] xfs: add owner field to extent allocation and freeing References: <1457410578-30233-1-git-send-email-david@fromorbit.com> <1457410578-30233-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1457410578-30233-6-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457619553 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27729 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Mar 08, 2016 at 03:16:07PM +1100, Dave Chinner wrote: > From: "Darrick J. Wong" > > For the rmap btree to work, we have to fed the extent owner s/fed/feed/ > +/* > + * Ownership info for an extent. This is used to create reverse-mapping > + * entries. > + */ > +#define XFS_RMAP_INO_ATTR_FORK (1) > +#define XFS_RMAP_BMBT_BLOCK (2) These are OR-able flags - it might make sense to define them as: #define XFS_RMAP_INO_ATTR_FORK (1 << 0) #define XFS_RMAP_BMBT_BLOCK (1 << 1) to make this more obvious. From BATV+6b0ca702f8b6ab34884e+4582+infradead.org+hch@bombadil.srs.infradead.org Thu Mar 10 08:22:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A57447CA2 for ; Thu, 10 Mar 2016 08:22:13 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 30BC2AC009 for ; Thu, 10 Mar 2016 06:22:10 -0800 (PST) X-ASG-Debug-ID: 1457619727-04cbb00b6f2eba70001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id FKy91dABvuTPc5y3 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 10 Mar 2016 06:22:08 -0800 (PST) X-Barracuda-Envelope-From: BATV+6b0ca702f8b6ab34884e+4582+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 1ae1Tb-0003mb-Ef; Thu, 10 Mar 2016 14:22:07 +0000 Date: Thu, 10 Mar 2016 06:22:07 -0800 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 03/16] xfs: rmap btree add more reserved blocks Message-ID: <20160310142207.GD29058@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 03/16] xfs: rmap btree add more reserved blocks References: <1457410578-30233-1-git-send-email-david@fromorbit.com> <1457410578-30233-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1457410578-30233-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457619728 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27729 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Sorry for the second reply to the same mail - I expect this defintion to be in patch 7, where it logically belongs.. > +#define XFS_RMAP_BLOCK(mp) \ > (xfs_sb_version_hasfinobt(&((mp)->m_sb)) ? \ > XFS_FIBT_BLOCK(mp) + 1 : \ > XFS_IBT_BLOCK(mp) + 1) Is there any good reason for the variable offset for the rmap block. Yes, it saves one otherwise unused block per AG, but fixed offsets for metadata make a format much easier to understand. From darrick.wong@oracle.com Thu Mar 10 10:58:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 902627CA0 for ; Thu, 10 Mar 2016 10:58:02 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4130B8F8040 for ; Thu, 10 Mar 2016 08:57:59 -0800 (PST) X-ASG-Debug-ID: 1457629076-04bdf002ed2db4c0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 5ykynyij83ooZRmI (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 10 Mar 2016 08:57:57 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u2AGvMjf012493 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 10 Mar 2016 16:57:23 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u2AGvMtF030723 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Thu, 10 Mar 2016 16:57:22 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u2AGvJQk022101; Thu, 10 Mar 2016 16:57:20 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 10 Mar 2016 08:57:18 -0800 Date: Thu, 10 Mar 2016 08:57:17 -0800 From: "Darrick J. Wong" To: Christoph Hellwig Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 0/16] xfs: first part of rmapbt functionality Message-ID: <20160310165717.GH27973@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 0/16] xfs: first part of rmapbt functionality References: <1457410578-30233-1-git-send-email-david@fromorbit.com> <20160310141434.GA29058@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160310141434.GA29058@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1457629077 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27732 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Thu, Mar 10, 2016 at 06:14:34AM -0800, Christoph Hellwig wrote: > On Tue, Mar 08, 2016 at 03:16:02PM +1100, Dave Chinner wrote: > > This isn't all of the rmap functionality. It's patches up to the > > point where I've come across the first piece that needs to be > > reworked (the rmap intent execution code), so there's no point > > holding these back until I've sorted that out. This builds on top of > > for-next and the patch set I posted yesterday. > > > > Darrick, I've changed the authorship of the patches to reflect > > the original series this has come from - can you check to see if > > there's anything I got wrong when I did that? > > I'll come some minor bits on the actual patches, but I'd like to > understand a few fundamental things first: > > For one Darrick has introduced a new rmapxbt btree recently, which > allows using a rmap on reflink enabled file systems. In his tree > we thus have two different implementation of a reverse mapping > btree. Is there any good reason to keep it this way? For one > reflinks are a compelling feature that I doubt people want to > disable in the long run, so most filesystem will be using rmapxbt. > I also don't think having these two implementations is good for the > testing matrix in the long run. The only compelling reason for the split rmapbt/rmapxbt is to increase the fanout factor for (!reflink && rmap) by a factor of 5. If we assume a 4K block size, that works out to the rmapbt occupying about 0.023% more space. (It's half a percent for a 1k block size, but I assume that's not a common case.) Functionality-wise, there's no reason why we can't just run the rmapxbt even if reflink is disabled. If our notion is to introduce both features at the same time then Christoph is probably right that we don't need to have both tree types. --D > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Thu Mar 10 11:02:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DF6B97CA0 for ; Thu, 10 Mar 2016 11:02:49 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A3898304032 for ; Thu, 10 Mar 2016 09:02:46 -0800 (PST) X-ASG-Debug-ID: 1457629361-04bdf002ec2db780001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id DUgqyH72HNxpbvDB for ; Thu, 10 Mar 2016 09:02:42 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 6FCF44801 for ; Thu, 10 Mar 2016 11:02:30 -0600 (CST) Subject: Re: an mount option question and dunno if right here... To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: an mount option question and dunno if right here... References: <08297acdf77244b468e15458f3d78327@zbfmail.de> From: Eric Sandeen Message-ID: <56E1A8B1.2080800@sandeen.net> Date: Thu, 10 Mar 2016 11:02:41 -0600 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <08297acdf77244b468e15458f3d78327@zbfmail.de> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1457629361 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27732 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/9/16 4:35 AM, Marko Weber | 8000 wrote: > > > hello list, > > my drives are all xfs formatted. > in fstab i set: > > lazytime,logbsize=256k,logbufs=8 > > > when i call "mount" on console i get: > > rw,relatime,lazytime,attr2,inode64,logbufs=8,logbsize=256k,sunit=1024,swidth=3072,noquota > > > Why is relatime listed? Or is lazytime override this setting? > Even when i set "norelatime" in /etc/fstab i get "relatime" listed on 'mount' > > Or am i wrong here with this question? is this not xfs related? > anyway, for any hints or suggestions i am thankful lazytime is not a valid xfs mount option: [root ~]# mount -o lazytime /dev/sdb1 /mnt/test mount: wrong fs type, bad option, bad superblock on /dev/sdb1, missing codepage or helper program, or other error In some cases useful info is found in syslog - try dmesg | tail or so [root ~]# dmesg | tail -n 1 [645779.811802] XFS (sdb1): unknown mount option [lazytime]. I'm guessing this is your root fs? xfs today will silently ignore unknown mount options on remount (patches to fix that are upstream), and the root fs may get remounted w/ fstab options. So presumably that's how you got lazytime into the mount output, especially if it's looking at /etc/mtab. Look in /proc/mounts; I doubt you'll see "lazytime" for this filesystem: [root ~]# mount /dev/sdb1 /mnt/test [root ~]# mount -o remount,lazytime /mnt/test [root ~]# grep sdb1 /etc/mtab /proc/mounts /etc/mtab:/dev/sdb1 /mnt/test xfs rw,lazytime 0 0 /proc/mounts:/dev/sdb1 /mnt/test xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0 -Eric From sales@marketing.powerpc.gr Thu Mar 10 11:31:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 002A97CA0 for ; Thu, 10 Mar 2016 11:31:30 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A6B0F304043 for ; Thu, 10 Mar 2016 09:31:29 -0800 (PST) X-ASG-Debug-ID: 1457631080-04bdf002ee2dc580001-NocioJ Received: from cpanel.mailpowerpc.gr (mail.marketing.powerpc.gr [5.172.194.87]) by cuda.sgi.com with ESMTP id nnIsMOx7pB8CyeEG (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 10 Mar 2016 09:31:21 -0800 (PST) X-Barracuda-Envelope-From: sales@marketing.powerpc.gr X-Barracuda-Apparent-Source-IP: 5.172.194.87 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=marketing.powerpc.gr; s=default; h=Content-Transfer-Encoding:Content-Type: MIME-Version:List-Unsubscribe:Message-ID:From:Date:Subject:To; bh=KQsJDKkv+MgQXpc9D6cYt6eKH/3t+GUlPlH+lSeY3FE=; b=dMZEetYsQDZIWoj0AckXwvsRpm 3XmIusJDT/tJXXtU2zg6BhML/oGUaDqKN+UT4Y9xTyFsBwSA2+UdnT9+dFKTH3pwY6HLvc7VuqwHK 4m4A/a5xjZ1p/s/iCJF9cMxvE0MeKTyxkU1W3Hy1I4S5tkCpaMcVyV6vQ6139eq75LzHC4mpKYreq d3XBQ5ljmKUwfUDTcT/TQ1YYkP2uFazfeTtj+Lypc6MEJldNjk/YcWgoqIMLJBlcjm6LDS33hHOpg 2WES3sJCRX7mW6HbLW5EbLQkkTLzoBTV7/MqLQvs3zL7q/LE6g8p4xJXE0E6M6lUZWxD4mUMPbvnm HmDYMJAA==; Received: from powerpc by cpanel.mailpowerpc.gr with local (Exim 4.86_1) (envelope-from ) id 1ae4Qf-0009ko-Cy for xfs@oss.sgi.com; Thu, 10 Mar 2016 19:31:17 +0200 To: xfs@oss.sgi.com Subject: Goodbye from our Newsletter X-PHP-Script: marketing.powerpc.gr/lists/index.php for 157.55.39.116 X-ASG-Orig-Subj: Goodbye from our Newsletter Received: from msnbot-157-55-39-116.search.msn.com [157.55.39.116] by marketing.powerpc.gr with HTTP; Thu, 10 Mar 2016 11:31:17 -0600 Date: Thu, 10 Mar 2016 11:31:17 -0600 From: PowerPC Message-ID: <7adb0aa73ce18784dc5cc7dd9ace4907@marketing.powerpc.gr> X-Mailer: PHPMailer 5.2.14 (https://github.com/PHPMailer/PHPMailer) X-phpList-version: 3.2.4 X-MessageID: systemmessage X-ListMember: xfs@oss.sgi.com Precedence: bulk Bounces-To: sales@marketing.powerpc.gr List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - cpanel.mailpowerpc.gr X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [500 498] / [47 12] X-AntiAbuse: Sender Address Domain - marketing.powerpc.gr X-Get-Message-Sender-Via: cpanel.mailpowerpc.gr: authenticated_id: powerpc/from_h X-Authenticated-Sender: cpanel.mailpowerpc.gr: sales@marketing.powerpc.gr X-Source: /usr/bin/php X-Source-Args: /usr/bin/php /home/powerpc/public_html/marketing/lists/index.php X-Source-Dir: powerpc.gr:/public_html/marketing/lists X-Barracuda-Connect: mail.marketing.powerpc.gr[5.172.194.87] X-Barracuda-Start-Time: 1457631081 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27732 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://marketing.powerpc.gr/lists/?p=subscribe and follow the steps. Thank you From sandeen@redhat.com Thu Mar 10 12:00:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 02DD67CA0 for ; Thu, 10 Mar 2016 12:00:58 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 79C22AC008 for ; Thu, 10 Mar 2016 10:00:54 -0800 (PST) X-ASG-Debug-ID: 1457632849-04bdf002eb2dd1f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id I4bznpxSCTg2Dxc2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 10 Mar 2016 10:00:49 -0800 (PST) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 4A895D4798; Thu, 10 Mar 2016 18:00:49 +0000 (UTC) Received: from Liberator.local (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 u2AI0mo5017066 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 10 Mar 2016 13:00:49 -0500 To: xfs@oss.sgi.com Cc: Dan Carpenter From: Eric Sandeen Subject: [PATCH] xfs: ensure committed is initialized in xfs_trans_roll Message-ID: <56E1B650.8040400@redhat.com> X-ASG-Orig-Subj: [PATCH] xfs: ensure committed is initialized in xfs_trans_roll Date: Thu, 10 Mar 2016 12:00:48 -0600 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 10 Mar 2016 18:00:49 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1457632849 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 __xfs_trans_roll() can return without setting the *committed argument; this was a problem for xfs_bmap_finish(): int committed;/* xact committed or not */ ... error = __xfs_trans_roll(tp, ip, &committed); if (error) { ... if (committed) { and we tested an uninitialized "committed" variable on the error path. No caller is preserving "committed" state across calls to __xfs_trans_roll(), so just initialize committed inside the function to avoid future errors like this. Reported-by: Dan Carpenter Signed-off-by: Eric Sandeen --- diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 748b16a..20c5366 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -1028,6 +1028,8 @@ __xfs_trans_roll( struct xfs_trans_res tres; int error; + *committed = 0; + /* * Ensure that the inode is always logged. */ @@ -1082,6 +1084,6 @@ xfs_trans_roll( struct xfs_trans **tpp, struct xfs_inode *dp) { - int committed = 0; + int committed; return __xfs_trans_roll(tpp, dp, &committed); } From david@fromorbit.com Thu Mar 10 15:44:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 583387CA0 for ; Thu, 10 Mar 2016 15:44:40 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2B2B28F8050 for ; Thu, 10 Mar 2016 13:44:37 -0800 (PST) X-ASG-Debug-ID: 1457646273-04cbb00b722fd540001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 7HqJfjQVG8ppcYfz for ; Thu, 10 Mar 2016 13:44:34 -0800 (PST) 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: A2DQBwDu6eFWPFEqLHleKAECgxOBP4Jtg3mgEAMGjAOFToQOhgkEAgKBRE0BAQEBAQEHAQEBAUFAhEIBAQQ6HCMQCAMOCgklDwUlAwcaE4gjvUABAQgCHhmFN4UKiHQFlzyNbo8JjmqCZRmBXCguilEBAQE Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl2.internode.on.net with ESMTP; 11 Mar 2016 08:14:33 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ae8Nk-0003KU-E0; Fri, 11 Mar 2016 08:44:32 +1100 Date: Fri, 11 Mar 2016 08:44:32 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/16] xfs: first part of rmapbt functionality Message-ID: <20160310214432.GX30721@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/16] xfs: first part of rmapbt functionality References: <1457410578-30233-1-git-send-email-david@fromorbit.com> <20160310141434.GA29058@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160310141434.GA29058@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1457646273 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27739 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Mar 10, 2016 at 06:14:34AM -0800, Christoph Hellwig wrote: > On Tue, Mar 08, 2016 at 03:16:02PM +1100, Dave Chinner wrote: > > This isn't all of the rmap functionality. It's patches up to the > > point where I've come across the first piece that needs to be > > reworked (the rmap intent execution code), so there's no point > > holding these back until I've sorted that out. This builds on top of > > for-next and the patch set I posted yesterday. > > > > Darrick, I've changed the authorship of the patches to reflect > > the original series this has come from - can you check to see if > > there's anything I got wrong when I did that? > > I'll come some minor bits on the actual patches, but I'd like to > understand a few fundamental things first: > > For one Darrick has introduced a new rmapxbt btree recently, which > allows using a rmap on reflink enabled file systems. In his tree > we thus have two different implementation of a reverse mapping > btree. Is there any good reason to keep it this way? For one > reflinks are a compelling feature that I doubt people want to > disable in the long run, so most filesystem will be using rmapxbt. > I also don't think having these two implementations is good for the > testing matrix in the long run. I haven't got as far as the rmapxbt code yet - it's currently at the end of the entire series, and I'm trying to sort out problems in infrastructure right now (i.e. rmapbt modifications are atomic and crash safe w.r.t. bmapbt changes and EFI processing). I'm planning on re-ordering the rmapxbt and interval query tree stuff to before the reflink code is included, but I haven't got hatfar yet so I haven't looked at the code yet. It's slow going, and right now I don't think I'm going to have even a complete rmapbt series done in time for the merge 4.6 merge window, let alone all the extra stuff Darrick has done. So with only a couple of days left before the merge window opens, I think this all needs to slip to the next merge window while we sort out what disk format we are going to use and rework the series to introduce only that format. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Mar 10 16:09:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C9CB87CA3 for ; Thu, 10 Mar 2016 16:09:56 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9DFFA8F8040 for ; Thu, 10 Mar 2016 14:09:53 -0800 (PST) X-ASG-Debug-ID: 1457647787-04cbb00b6f2fdeb0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 0qCiji7nAi3h0AIT for ; Thu, 10 Mar 2016 14:09:47 -0800 (PST) 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: A2DQBwCi7+FWPFEqLHleKAECgxOBP4Jtg3mgEAMGjAOFToQOhgkEAgKBRE0BAQEBAQEHAQEBAUFAhEIBAQQnExwjEAgDDgoJJQ8FJQMHGhOII713AQEIAh4ZhTeFCoQbAQGEVwWXPI1ujwmOaoRaKC6JH4EyAQEB Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl2.internode.on.net with ESMTP; 11 Mar 2016 08:39:46 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ae8m9-0003Mv-NB; Fri, 11 Mar 2016 09:09:45 +1100 Date: Fri, 11 Mar 2016 09:09:45 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 03/16] xfs: rmap btree add more reserved blocks Message-ID: <20160310220945.GY30721@dastard> X-ASG-Orig-Subj: Re: [PATCH 03/16] xfs: rmap btree add more reserved blocks References: <1457410578-30233-1-git-send-email-david@fromorbit.com> <1457410578-30233-4-git-send-email-david@fromorbit.com> <20160310142207.GD29058@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160310142207.GD29058@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1457647787 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27740 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Mar 10, 2016 at 06:22:07AM -0800, Christoph Hellwig wrote: > Sorry for the second reply to the same mail - I expect this defintion to > be in patch 7, where it logically belongs.. > > > +#define XFS_RMAP_BLOCK(mp) \ > > (xfs_sb_version_hasfinobt(&((mp)->m_sb)) ? \ > > XFS_FIBT_BLOCK(mp) + 1 : \ > > XFS_IBT_BLOCK(mp) + 1) > > Is there any good reason for the variable offset for the rmap block. > Yes, it saves one otherwise unused block per AG, but fixed offsets > for metadata make a format much easier to understand. The root btree blocks are not a fixed location. The moment the tree splits to the root we get a new root block and the old root is now at a lower level of the tree. IOWs, it doesn't matter if there is a hole at the time of growfs/mkfs laying out the initial tree roots because they are going to move around anyway. Also, it depends on the sector vs block size as to where these are initially located, too. A disk with 512 byte sectors and 4k block size results in the root btree blocks being located from fsb 2-7. On a 4k sector/4k block size fs has the root btree blocks located from fsb 4-9. Hence I really don't think it matters if the initial location changes depenedent on features and geometry as you have to look it up with xfs_db anyway to find it even on a pristine new filesystem... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Mar 10 18:23:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 382647CA0 for ; Thu, 10 Mar 2016 18:23:43 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id DF040304051 for ; Thu, 10 Mar 2016 16:23:42 -0800 (PST) X-ASG-Debug-ID: 1457655819-04bdf002eb2e7280001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id lsOSBBswJelF1UUR for ; Thu, 10 Mar 2016 16:23:39 -0800 (PST) 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: A2DuBwChD+JWPFEqLHleKAECgxNSbYJtg3mfNgIZAwaBD4p0hU6EDhmFcAQCgUFNAQEBAQEBBwEBAQFBQIRvExwjGBUPNAUlAwcGJ4gjvW8BCx4ZhTeKEIJfgQ8Fh12LIIQ/hWqIBIFuhEeIVIYAiGqEWiguilEBAQE Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl2.internode.on.net with ESMTP; 11 Mar 2016 10:53:24 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aeArT-0003e3-3o; Fri, 11 Mar 2016 11:23:23 +1100 Date: Fri, 11 Mar 2016 11:23:23 +1100 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 v2] xfs: fixes for 4.5-rc7 Message-ID: <20160311002323.GB11812@dastard> X-ASG-Orig-Subj: [GIT PULL v2] xfs: fixes for 4.5-rc7 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1457655819 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27745 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header [v2 - now with correct cc list. Sorry for the dup, Linus] Hi Linus, Can you please pull the XFS fixes from the tag below? This is a fix for a regression introduced in 4.5-rc1 by the new torn log write detection code. The regression only affects people moving a clean filesystem between machines/kernels of different architecture (such as changing between 32 bit and 64 bit kernels), but this is the recommended (and only!) safe way to migrate a filesystem between architectures so we really need to ensure it works. The changes are larger than I'd prefer right at the end of the release cycle, but the majority of the change is just factoring code to enable the detection of a clean log at the correct time to avoid this issue. Thanks! -Dave. The following changes since commit 36f90b0a2ddd60823fe193a85e60ff1906c2a9b3: Linux 4.5-rc2 (2016-01-31 18:12:16 -0800) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git tags/xfs-for-linus-4.5-rc7 for you to fetch changes up to 7f6aff3a29b08fc4234c8136eb1ac31b4897522c: xfs: only run torn log write detection on dirty logs (2016-03-07 08:22:22 +1100) ---------------------------------------------------------------- xfs: fixes for 4.5-rc7 Changes: o Only perform torn log write detection on dirty logs. This prevents failures being detected due to a clean filesystem being moved between machines or kernels of different architectures (e.g. 32 -> 64 bit, BE -> LE, etc). This fixes a regression introduced by the torn log write detection in 4.5-rc1. ---------------------------------------------------------------- Brian Foster (4): xfs: separate log head record discovery from verification xfs: refactor unmount record detection into helper xfs: refactor in-core log state update to helper xfs: only run torn log write detection on dirty logs fs/xfs/xfs_log_recover.c | 271 ++++++++++++++++++++++++++++------------------ 1 file changed, 168 insertions(+), 103 deletions(-) -- Dave Chinner david@fromorbit.com From ag@iss-integration.com Thu Mar 10 21:27:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 1534529DF8 for ; Thu, 10 Mar 2016 21:27:02 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id CD9F88F8039 for ; Thu, 10 Mar 2016 19:26:58 -0800 (PST) X-ASG-Debug-ID: 1457666812-04cb6c58312b2f70001-NocioJ Received: from mail-yw0-f178.google.com (mail-yw0-f178.google.com [209.85.161.178]) by cuda.sgi.com with ESMTP id k544Kp5a7NMcDYjb (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 10 Mar 2016 19:26:52 -0800 (PST) X-Barracuda-Envelope-From: ag@iss-integration.com X-Barracuda-Apparent-Source-IP: 209.85.161.178 Received: by mail-yw0-f178.google.com with SMTP id d65so84604853ywb.0 for ; Thu, 10 Mar 2016 19:26:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iss-integration-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=nRDh3yucFxh3BwqF+zkQrC3aGUELrWYz7dj3dsAhaWk=; b=JvzkY7GtUTy69N/76AquYxoZLtjNOfVGnjxi8C041FSu2T2G/v7vDiJAVgS7bCjYYh WLD/ki6TUG7p5gXz8bFMoeaKRCA69cu/wrV42MiwIWcALGLz2VRaBYrV5NZU8PkWUhSM idW27LYQ3cYn3Nl8C2wKZrCUj48PLntdkuMgit6947DXk0hFoUsE6PF1gtV1I+X4BAhe 27XrPKcDbTjApcY8iwHp8tPXmC7yxypnkqEc3QPvhDztCRFYZIXfN0DHwc0xMSGO0tB+ 179ILovzD31CKl2MhNcjwhgsmwIl918knXyrgzdj7OgfSx3d0V5TSX4OeEtFaWpu7O9U nwEQ== 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; bh=nRDh3yucFxh3BwqF+zkQrC3aGUELrWYz7dj3dsAhaWk=; b=iZD780xAhAi+z9h6JWYLk2Zm3VtVtybeXreA9yygmCvrKzu/llX9JHQ3kT3t+9deXI 4ytwEkzMxzveSs8/zVQMkzZ3jHqiO+NSILk9kq4o0EfRajlI4aP2J9ARegMX2TtUnkQK faHmGWuPURvwH/m09XiSPu46eHBpQ0Q701pLIciDzWplQX457scTPOvyUDKMgSyG1JUJ BWBlxfOj91BEvRQgqyg6+1gi1tBofvLdEKJBiAYtPVMXF0Pa56YEDW30MMBo3+t7vSTO HnExU8YazKdRMyULVuPLPgZeq4wluVgSaYAyrrUwahA9cmepPTq1kRSldoIhO4i1vcvq Cckg== X-Gm-Message-State: AD7BkJK367OpxZ7F2IhsY0u7RF+fD0H2Mq6R4/wduQeRvZrT5EUNrKvcLgO2eTK4/KTGmJRCkNTg1SKgZc47Cw== MIME-Version: 1.0 X-Received: by 10.13.223.14 with SMTP id i14mr3838769ywe.20.1457666812087; Thu, 10 Mar 2016 19:26:52 -0800 (PST) Received: by 10.37.13.21 with HTTP; Thu, 10 Mar 2016 19:26:52 -0800 (PST) In-Reply-To: References: <20150703235141.GQ7943@dastard> <20150704233802.GS7943@dastard> <20150705232443.GA3902@dastard> <20150707003542.GW7943@dastard> Date: Thu, 10 Mar 2016 22:26:52 -0500 Message-ID: Subject: Re: Failing XFS filesystem underlying Ceph OSDs From: Alex Gorbachev X-ASG-Orig-Subj: Re: Failing XFS filesystem underlying Ceph OSDs To: Dave Chinner Cc: "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=001a114fd64489457d052dbd80b1 X-Barracuda-Connect: mail-yw0-f178.google.com[209.85.161.178] X-Barracuda-Start-Time: 1457666812 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC5_SA210e, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27748 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC5_SA210e Custom Rule SA210e --001a114fd64489457d052dbd80b1 Content-Type: text/plain; charset=UTF-8 Final update: no issues for many months when using 1GB! On Thursday, August 13, 2015, Alex Gorbachev wrote: > Good morning, > > We have experienced one more failure like the ones originally described. > I am assuming the vm.min_free_kbytes at 256 MB helped (only one hit, OSD > went down but the rest of the cluster stayed up unlike the previous massive > storms). So I went ahead and increased the vm.min_free_kbytes to 1 GB. > > I do not know of any way to reproduce the problem, or what causes it. > There is no unusual IO pattern at the time that we are aware of. > > Thanks, > Alex > > On Wed, Jul 22, 2015 at 8:23 AM, Alex Gorbachev > wrote: > >> Hi Dave, >> >> On Mon, Jul 6, 2015 at 8:35 PM, Dave Chinner > > wrote: >> >>> On Mon, Jul 06, 2015 at 03:20:19PM -0400, Alex Gorbachev wrote: >>> > On Sun, Jul 5, 2015 at 7:24 PM, Dave Chinner >> > wrote: >>> > > On Sun, Jul 05, 2015 at 12:25:47AM -0400, Alex Gorbachev wrote: >>> > > > > > sysctl vm.swappiness=20 (can probably be 1 as per article) >>> > > > > > >>> > > > > > sysctl vm.min_free_kbytes=262144 >>> > > > > >>> > > [...] >>> > > > >>> > > > We have experienced the problem in various guises with kernels >>> 3.14, >>> > > 3.19, >>> > > > 4.1-rc2 and now 4.1, so it's not new to us, just different error >>> stack. >>> > > > Below are some other stack dumps of what manifested as the same >>> error. >>> > > > >>> > > > [] schedule+0x29/0x70 >>> > > > [] _xfs_log_force+0x187/0x280 [xfs] >>> > > > [] ? try_to_wake_up+0x2a0/0x2a0 >>> > > > [] xfs_log_force+0x39/0xc0 [xfs] >>> > > > [] xfsaild_push+0x552/0x5a0 [xfs] >>> > > > [] ? schedule_timeout+0x124/0x210 >>> > > > [] xfsaild+0x9f/0x140 [xfs] >>> > > > [] ? xfsaild_push+0x5a0/0x5a0 [xfs] >>> > > > [] kthread+0xc9/0xe0 >>> > > > [] ? flush_kthread_worker+0x90/0x90 >>> > > > [] ret_from_fork+0x58/0x90 >>> > > > [] ? flush_kthread_worker+0x90/0x90 >>> > > > INFO: task xfsaild/sdg1:2606 blocked for more than 120 seconds. >>> > > > Not tainted 3.19.4-031904-generic #201504131440 >>> > > > "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this >>> > > message. >>> > > >>> > > That's indicative of IO completion problems, but not a crash. >>> > > >>> > > > BUG: unable to handle kernel NULL pointer dereference at >>> > > (null) >>> > > > IP: [] xfs_count_page_state+0x3f/0x70 [xfs] >>> > > .... >>> > > > [] xfs_vm_releasepage+0x40/0x120 [xfs] >>> > > > [] try_to_release_page+0x32/0x50 >>> > > > [] shrink_page_list+0x69d/0x720 >>> > > > [] shrink_inactive_list+0x1dd/0x5d0 >>> > > .... >>> > > >>> > > Again, this is indicative of a page cache issue: a page without >>> > > buffers has been passed to xfs_vm_releasepage(), which implies the >>> > > page flags are not correct. i.e PAGE_FLAGS_PRIVATE is set but >>> > > page->private is null... >>> > > >>> > > Again, this is unlikely to be an XFS issue. >>> > > >>> > >>> > Sorry for my ignorance, but would this likely come from Ceph code or a >>> > hardware issue of some kind, such as a disk drive? I have reached out >>> to >>> > RedHat and Ceph community on that as well. >>> >>> More likely a kernel bug somewhere in the page cache or memory >>> reclaim paths. The issue is that we only notice the problem long >>> after it has occurred. i.e. when XFS goes to tear down the page it has >>> been handed, the page is already in a bad state and so it doesn't >>> really tell us anything about the cause of the problem. >>> >>> Realisticaly, we need a script that reproduces the problem (that >>> doesn't require a Ceph cluster) to be able to isolate the cause. >>> In the mean time, you can always try running CONFIG_XFS_WARN=y to >>> see if that catches problems earlier, and you might also want to do >>> things like turn on memory poisoning and other kernel debugging >>> options to try to isolate the cause of the issue.... >>> >> >> We have been error free for almost 3 weeks now with these changes: >> >> vm.swappiness=1 >> vm.min_free_kbytes=262144 >> >> I wonder if this is related to us using high speed Areca HBAs with RAM >> writeback cache and having had vm.swappiness=0 previously. POssibly the >> HBA handing down a large chunk of IO very fast and page cache not being to >> handle it with swappiness=0. I will keep monitoring, but thank you very >> much for the analysis and info. >> >> Alex >> >> >> >>> >>> Cheers, >>> >>> Dave. >>> -- >>> Dave Chinner >>> david@fromorbit.com >>> >>> >> >> > -- -- Alex Gorbachev Storcium --001a114fd64489457d052dbd80b1 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Final update: no issues for many months when using 1GB! =C2=A0

On Th= ursday, August 13, 2015, Alex Gorbachev <ag@iss-integration.com> wrote:
Good morning,

We have experienc= ed one more failure like the ones originally described.=C2=A0 I am assuming= the=C2=A0vm.min_free_kbytes a= t 256 MB helped (only one hit, OSD went down but the rest of the cluster=C2= =A0stayed=C2=A0up unlike the=C2=A0previous massive storms).=C2=A0 So I went= ahead and increased the=C2=A0vm.min_free_kbytes to 1 GB. =C2=A0

I do not know of any way to reproduce the problem, or = what causes it.=C2=A0 There is no unusual IO pattern at the time that we ar= e aware of.
<= br>
Thanks,
Alex

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

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

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

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

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

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

Alex

=C2=A0
=

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com




--
--
Alex Gorbachev
Storcium

--001a114fd64489457d052dbd80b1-- From Diet@som.sockwars.org Fri Mar 11 00:51:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=DIET_1,HTML_IMAGE_RATIO_06, HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 63F707CA0 for ; Fri, 11 Mar 2016 00:51:10 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3577A30404E for ; Thu, 10 Mar 2016 22:51:07 -0800 (PST) X-ASG-Debug-ID: 1457679004-04cbb00b6f30b6b0003-NocioJ Received: from som.sockwars.org (hostagreabil.com [67.211.208.93]) by cuda.sgi.com with ESMTP id waCgtCG2qOdYBZB1 for ; Thu, 10 Mar 2016 22:50:46 -0800 (PST) X-Barracuda-Envelope-From: Diet@som.sockwars.org X-Barracuda-Apparent-Source-IP: 67.211.208.93 Received: by som.sockwars.org id hs9ldg0e97c0 for ; Fri, 11 Mar 2016 06:16:13 +0000 (envelope-from ) MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="8d349498e3d8c7c" From: "Mayo Clinic" To: xfs@oss.sgi.com Subject: First Time Ever: Official Mayo Clinic Diet is Online! Message-ID: <0.0.1.14F.1D17B5D8305B5D4.35C28@som.sockwars.org> X-ASG-Orig-Subj: First Time Ever: Official Mayo Clinic Diet is Online! Date: Fri, 11 Mar 2016 06:16:13 +0000 X-Barracuda-Connect: hostagreabil.com[67.211.208.93] X-Barracuda-Start-Time: 1457679038 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.64 X-Barracuda-Spam-Status: No, SCORE=1.64 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MJ1359, BSF_SC0_SA038b, DIET_1, HTML_IMAGE_RATIO_06, HTML_MESSAGE, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27752 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.34 DIET_1 BODY: Lose Weight Spam 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 HTML_IMAGE_RATIO_06 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.50 BSF_SC0_MJ1359 Custom Rule MJ1359 0.20 BSF_SC0_SA038b Custom Rule SA038b --8d349498e3d8c7c Content-Type: text/plain; PHASE 1 Lose It ? () Jump-start your weight loss and lose 6 to 10 pounds in your first 2 weeks. PHASE 2 Live It ? () Continue to lose 1 to 2 pounds a week until you hit your goal weight and maintain it for life! Get What You Need ? () Eat great lose weight: () Track your progress: () Boost your weight loss: () Personalized meal plans 100s of delicious recipes Portion-control guides Motivational lifestyle tips Healthy habit tracker Food fitness journal Weight inch tracker Vitamin nutrient log Personalized workouts Robust exercise index Walk run guides Fitness tips for all levels Start Losing Weight Today ? () Copyright ? 2014 Everyday Health Media, LLC . All rights reserved. Get What You Need ? --8d349498e3d8c7c Content-type: text/html; Untitled Document
The Mayo Clinic Diet | Eat Well. Enjoy Life. Lose Weight. | Start Today »

You are receiving this message because you subscribed to or visited an Everyday Health newsletter or product.
If you would like to unsubscribe, click here.
 
The last diet
you'll ever need.
Designed to help you lose
up to 6 to 10 lbs in 2 weeks!
Learn more »
 
The Mayo Clinic Diet was created by a team of weight-loss experts to help you lose weight and get healthier. This is the first and only weight-loss diet ever created by Mayo Clinic — and the results are designed to last a lifetime. Get started today »
 
  Find Out How It Works »
 
PHASE 1
Lose It »
Jump-start your weight loss and lose 6 to 10 pounds in your f i rst 2 weeks.
PHASE 2
Live It »
Continue to lose 1 to 2 pounds a week until you hit your goal weight and maintain it for life!
  Get What You Need »
   
Eat great & lose weight:   Track your progress:   Boost your weight loss:




Personalized meal plans
100s of delicious recipes
Portion-control guides
Motivational lifestyle tips
 




Healthy habit tracker
Food & fitness journal
Weight & inch tracker
Vitamin & nutrient log
 




Pe r sonalized workouts
Robust exercise index
Walk & run guides
Fitness tips for all levels
Start Losing Weight Today »
Copyright © 2014 Everyday Health Media, LLC. All rights reserved.

You are receiving this message because you subscribed to or visited an Everyday Health newsletter or product. If you no longer wish to have these exclusive offers e-mailed to you, please unsubscribe from Special Offers.

Use of Everyday Health sites is subject to our terms of service and privacy policy.

Mailing address: 4 Marshall Street, North Adams, MA 01247
--8d349498e3d8c7c-- From BATV+c466a6942243809e4eb6+4583+infradead.org+hch@bombadil.srs.infradead.org Fri Mar 11 01:32:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2BF097CA1 for ; Fri, 11 Mar 2016 01:32:52 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id F309C304043 for ; Thu, 10 Mar 2016 23:32:48 -0800 (PST) X-ASG-Debug-ID: 1457681565-04cbb00b6f30c650001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id EutBAyLqnHXrz3TR (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 10 Mar 2016 23:32:46 -0800 (PST) X-Barracuda-Envelope-From: BATV+c466a6942243809e4eb6+4583+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 1aeHYz-0000WO-Nn; Fri, 11 Mar 2016 07:32:45 +0000 Date: Thu, 10 Mar 2016 23:32:45 -0800 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 03/16] xfs: rmap btree add more reserved blocks Message-ID: <20160311073245.GA709@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 03/16] xfs: rmap btree add more reserved blocks References: <1457410578-30233-1-git-send-email-david@fromorbit.com> <1457410578-30233-4-git-send-email-david@fromorbit.com> <20160310142207.GD29058@infradead.org> <20160310220945.GY30721@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160310220945.GY30721@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457681566 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27752 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, Mar 11, 2016 at 09:09:45AM +1100, Dave Chinner wrote: > The root btree blocks are not a fixed location. The moment the tree > splits to the root we get a new root block and the old root is now > at a lower level of the tree. IOWs, it doesn't matter if there is a > hole at the time of growfs/mkfs laying out the initial tree roots > because they are going to move around anyway. Yeah, once we update the root it moves anyway. Objection retracted.. From BATV+c466a6942243809e4eb6+4583+infradead.org+hch@bombadil.srs.infradead.org Fri Mar 11 03:36:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 30C197CA0 for ; Fri, 11 Mar 2016 03:36:46 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A269DAC001 for ; Fri, 11 Mar 2016 01:36:42 -0800 (PST) X-ASG-Debug-ID: 1457688999-04bdf002ed2f8db0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id VjBoK6GUJIo9fro7 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 11 Mar 2016 01:36:39 -0800 (PST) X-Barracuda-Envelope-From: BATV+c466a6942243809e4eb6+4583+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 1aeJUs-0006Vj-Nv; Fri, 11 Mar 2016 09:36:38 +0000 Date: Fri, 11 Mar 2016 01:36:38 -0800 From: Christoph Hellwig To: Eric Sandeen Cc: xfs@oss.sgi.com, Dan Carpenter Subject: Re: [PATCH] xfs: ensure committed is initialized in xfs_trans_roll Message-ID: <20160311093638.GA23445@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: ensure committed is initialized in xfs_trans_roll References: <56E1B650.8040400@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56E1B650.8040400@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457688999 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/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=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27754 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+5ac105dd53782d8a0c39+4583+infradead.org+hch@casper.srs.infradead.org Fri Mar 11 03:42:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 141FF7CA0 for ; Fri, 11 Mar 2016 03:42:22 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DB480304043 for ; Fri, 11 Mar 2016 01:42:21 -0800 (PST) X-ASG-Debug-ID: 1457689338-04cbb00b70311140001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id c5n9kAsyjVekCjoc (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 11 Mar 2016 01:42:19 -0800 (PST) X-Barracuda-Envelope-From: BATV+5ac105dd53782d8a0c39+4583+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85 #2 (Red Hat Linux)) id 1aeJaM-0008BB-1E for xfs@oss.sgi.com; Fri, 11 Mar 2016 09:42:18 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH] xfs: always set rvalp in xfs_dir2_node_trim_free Date: Fri, 11 Mar 2016 10:42:17 +0100 X-ASG-Orig-Subj: [PATCH] xfs: always set rvalp in xfs_dir2_node_trim_free Message-Id: <1457689337-4018-1-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1457689339 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27754 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- xfs_dir2_node_trim_free can return with setting the rvalp argument pointer. Initialize it to 0 at the beginning of the function and only update it to 1 if we succeeded trimming a freespace block. Signed-off-by: Christoph Hellwig Reported-by: Dan Carpenter --- fs/xfs/libxfs/xfs_dir2_node.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_dir2_node.c b/fs/xfs/libxfs/xfs_dir2_node.c index 63ee03d..75a5574 100644 --- a/fs/xfs/libxfs/xfs_dir2_node.c +++ b/fs/xfs/libxfs/xfs_dir2_node.c @@ -2235,6 +2235,9 @@ xfs_dir2_node_trim_free( dp = args->dp; tp = args->trans; + + *rvalp = 0; + /* * Read the freespace block. */ @@ -2255,7 +2258,6 @@ xfs_dir2_node_trim_free( */ if (freehdr.nused > 0) { xfs_trans_brelse(tp, bp); - *rvalp = 0; return 0; } /* -- 2.1.4 From cmaiolino@redhat.com Fri Mar 11 05:06:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B07D37CA0 for ; Fri, 11 Mar 2016 05:06:03 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 78292304051 for ; Fri, 11 Mar 2016 03:06:00 -0800 (PST) X-ASG-Debug-ID: 1457694358-04cbb00b6f315540001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id lfbEqmF85jDii6Hi (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 11 Mar 2016 03:05:59 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 9EA88335E9A; Fri, 11 Mar 2016 11:05:58 +0000 (UTC) Received: from redhat.com (vpn-60-174.rdu2.redhat.com [10.10.60.174]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2BB5tpt029490 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Fri, 11 Mar 2016 06:05:57 -0500 Date: Fri, 11 Mar 2016 12:05:54 +0100 From: Carlos Maiolino To: xfs@oss.sgi.com Cc: hch@lst.de Subject: Re: [PATCH] xfs: always set rvalp in xfs_dir2_node_trim_free Message-ID: <20160311110554.GA3163@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: always set rvalp in xfs_dir2_node_trim_free Mail-Followup-To: xfs@oss.sgi.com, hch@lst.de References: <1457689337-4018-1-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1457689337-4018-1-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457694359 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 I was just sending this patch when I saw yours. Looks good to me: Reviewed-by: Carlos Maiolino On Fri, Mar 11, 2016 at 10:42:17AM +0100, Christoph Hellwig wrote: > xfs_dir2_node_trim_free can return with setting the rvalp argument > pointer. Initialize it to 0 at the beginning of the function and > only update it to 1 if we succeeded trimming a freespace block. > > Signed-off-by: Christoph Hellwig > Reported-by: Dan Carpenter > --- > fs/xfs/libxfs/xfs_dir2_node.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/libxfs/xfs_dir2_node.c b/fs/xfs/libxfs/xfs_dir2_node.c > index 63ee03d..75a5574 100644 > --- a/fs/xfs/libxfs/xfs_dir2_node.c > +++ b/fs/xfs/libxfs/xfs_dir2_node.c > @@ -2235,6 +2235,9 @@ xfs_dir2_node_trim_free( > > dp = args->dp; > tp = args->trans; > + > + *rvalp = 0; > + > /* > * Read the freespace block. > */ > @@ -2255,7 +2258,6 @@ xfs_dir2_node_trim_free( > */ > if (freehdr.nused > 0) { > xfs_trans_brelse(tp, bp); > - *rvalp = 0; > return 0; > } > /* > -- > 2.1.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From BATV+c466a6942243809e4eb6+4583+infradead.org+hch@bombadil.srs.infradead.org Fri Mar 11 08:01:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 925A17CA0 for ; Fri, 11 Mar 2016 08:01:49 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 06F96AC001 for ; Fri, 11 Mar 2016 06:01:45 -0800 (PST) X-ASG-Debug-ID: 1457704902-04cbb00b71322210001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id cwHgbRyCvXdtJwQM (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 11 Mar 2016 06:01:42 -0800 (PST) X-Barracuda-Envelope-From: BATV+c466a6942243809e4eb6+4583+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 1aeNdG-0006yt-GI; Fri, 11 Mar 2016 14:01:34 +0000 Date: Fri, 11 Mar 2016 06:01:34 -0800 From: Christoph Hellwig To: Andreas Gruenbacher Cc: Alexander Viro , "J. Bruce Fields" , linux-nfs@vger.kernel.org, Theodore Ts'o , linux-cifs@vger.kernel.org, linux-api@vger.kernel.org, Trond Myklebust , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Christoph Hellwig , Andreas Dilger , linux-fsdevel@vger.kernel.org, Jeff Layton , linux-ext4@vger.kernel.org, Anna Schumaker Subject: Re: [PATCH v18 00/22] Richacls (Core and Ext4) Message-ID: <20160311140134.GA14808@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v18 00/22] Richacls (Core and Ext4) References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1456733847-17982-1-git-send-email-agruenba@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457704902 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27759 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Feb 29, 2016 at 09:17:05AM +0100, Andreas Gruenbacher wrote: > Al, > > could you please make sure you are happy with the current version of the > richacl patch queue for the next merge window? I'm still not happy. For one I still see no reason to merge this broken ACL model at all. It provides our actualy Linux users no benefit at all, while breaking a lot of assumptions, especially by adding allow and deny ACE at the same sime. It also doesn't help with the issue that the main thing it's trying to be compatible with (Windows) actually uses a fundamentally different identifier to apply the ACLs to - as long as you're still limited to users and groups and not guids we'll still have that mapping problem anyway. But besides that fundamental question on the purpose of it I also don't think the code is suitable, more in the individual patches. From BATV+c466a6942243809e4eb6+4583+infradead.org+hch@bombadil.srs.infradead.org Fri Mar 11 08:03:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B7C417CA1 for ; Fri, 11 Mar 2016 08:03:37 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6F83F8F8039 for ; Fri, 11 Mar 2016 06:03:34 -0800 (PST) X-ASG-Debug-ID: 1457705012-04bdf002eb309df0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id ECtE59gNG8Nwrre3 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 11 Mar 2016 06:03:32 -0800 (PST) X-Barracuda-Envelope-From: BATV+c466a6942243809e4eb6+4583+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 1aeNf5-0007fK-S5; Fri, 11 Mar 2016 14:03:27 +0000 Date: Fri, 11 Mar 2016 06:03:27 -0800 From: Christoph Hellwig To: Andreas Gruenbacher Cc: Alexander Viro , "J. Bruce Fields" , linux-nfs@vger.kernel.org, Theodore Ts'o , linux-cifs@vger.kernel.org, linux-api@vger.kernel.org, Trond Myklebust , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Christoph Hellwig , Andreas Dilger , linux-fsdevel@vger.kernel.org, Jeff Layton , linux-ext4@vger.kernel.org, Anna Schumaker Subject: Re: [PATCH v18 10/22] posix_acl: Unexport acl_by_type and make it static Message-ID: <20160311140327.GB14808@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v18 10/22] posix_acl: Unexport acl_by_type and make it static References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <1456733847-17982-11-git-send-email-agruenba@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1456733847-17982-11-git-send-email-agruenba@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457705012 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/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=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27759 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+c466a6942243809e4eb6+4583+infradead.org+hch@bombadil.srs.infradead.org Fri Mar 11 08:07:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 212797CA3 for ; Fri, 11 Mar 2016 08:07:54 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 96540AC001 for ; Fri, 11 Mar 2016 06:07:53 -0800 (PST) X-ASG-Debug-ID: 1457705271-04cb6c7f2915dc0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id QWEgAQYaMc9LPZkR (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 11 Mar 2016 06:07:51 -0800 (PST) X-Barracuda-Envelope-From: BATV+c466a6942243809e4eb6+4583+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 1aeNjG-0002Iz-As; Fri, 11 Mar 2016 14:07:46 +0000 Date: Fri, 11 Mar 2016 06:07:46 -0800 From: Christoph Hellwig To: Andreas Gruenbacher Cc: Alexander Viro , "J. Bruce Fields" , linux-nfs@vger.kernel.org, Theodore Ts'o , linux-cifs@vger.kernel.org, linux-api@vger.kernel.org, Trond Myklebust , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Christoph Hellwig , Andreas Dilger , linux-fsdevel@vger.kernel.org, Jeff Layton , linux-ext4@vger.kernel.org, Anna Schumaker , jaegeuk@kernel.org, chao2.yu@samsung.com Subject: Re: [PATCH v18 11/22] vfs: Cache base_acl objects in inodes Message-ID: <20160311140746.GC14808@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v18 11/22] vfs: Cache base_acl objects in inodes References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <1456733847-17982-12-git-send-email-agruenba@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1456733847-17982-12-git-send-email-agruenba@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457705271 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27759 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Feb 29, 2016 at 09:17:16AM +0100, Andreas Gruenbacher wrote: > POSIX ACLs and richacls are both objects allocated by kmalloc() with a > reference count which are freed by kfree_rcu(). An inode can either > cache an access and a default POSIX ACL, or a richacl (richacls do not > have default acls). To allow an inode to cache either of the two kinds > of acls, introduce a new base_acl type and convert i_acl and > i_default_acl to that type. In most cases, the vfs then doesn't care which > kind of acl an inode caches (if any). This base_acl object is pointless. I've asked in the past to have a proper container for the ACLs in common code, but a union of a refcount and a rcu head doesn't really fit that category. But this points out that the f2fs folks really need a couple of slaps on their hands. Not if generic funtionality doesn't fit your needs you are not going to blindly copy and paste it, please talk to find a solution instead of duplicating it. Folks, please come up with a suggestion to get rid of f2fs_acl_clone, f2fs_acl_create_masq and f2fs_acl_create ASAP. From bfields@fieldses.org Fri Mar 11 08:08:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CE9187CA3 for ; Fri, 11 Mar 2016 08:08:03 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A2836304043 for ; Fri, 11 Mar 2016 06:08:00 -0800 (PST) X-ASG-Debug-ID: 1457705277-04cbb00b72322900001-NocioJ Received: from fieldses.org (fieldses.org [173.255.197.46]) by cuda.sgi.com with ESMTP id CBgkGr0KPH1XscA3 for ; Fri, 11 Mar 2016 06:07:58 -0800 (PST) X-Barracuda-Envelope-From: bfields@fieldses.org X-Barracuda-Apparent-Source-IP: 173.255.197.46 Received: by fieldses.org (Postfix, from userid 2815) id B68FF2020; Fri, 11 Mar 2016 09:07:57 -0500 (EST) Date: Fri, 11 Mar 2016 09:07:57 -0500 From: "J. Bruce Fields" To: Christoph Hellwig Cc: Andreas Gruenbacher , Alexander Viro , linux-nfs@vger.kernel.org, Theodore Ts'o , linux-cifs@vger.kernel.org, linux-api@vger.kernel.org, Trond Myklebust , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Andreas Dilger , linux-fsdevel@vger.kernel.org, Jeff Layton , linux-ext4@vger.kernel.org, Anna Schumaker Subject: Re: [PATCH v18 00/22] Richacls (Core and Ext4) Message-ID: <20160311140757.GB13178@fieldses.org> X-ASG-Orig-Subj: Re: [PATCH v18 00/22] Richacls (Core and Ext4) References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <20160311140134.GA14808@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160311140134.GA14808@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: fieldses.org[173.255.197.46] X-Barracuda-Start-Time: 1457705278 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27759 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Mar 11, 2016 at 06:01:34AM -0800, Christoph Hellwig wrote: > On Mon, Feb 29, 2016 at 09:17:05AM +0100, Andreas Gruenbacher wrote: > > Al, > > > > could you please make sure you are happy with the current version of the > > richacl patch queue for the next merge window? > > I'm still not happy. > > For one I still see no reason to merge this broken ACL model at all. > It provides our actualy Linux users no benefit at all, while breaking > a lot of assumptions, especially by adding allow and deny ACE at the > same sime. Could you explain what you mean by "adding allow and deny ACE at the same time"? > It also doesn't help with the issue that the main thing it's trying > to be compatible with (Windows) actually uses a fundamentally different > identifier to apply the ACLs to - as long as you're still limited > to users and groups and not guids we'll still have that mapping problem > anyway. Agreed, but, one step at a time? My impression is that the Samba people still consider this a step forward for Linux compatibility. --b. > > But besides that fundamental question on the purpose of it I also > don't think the code is suitable, more in the individual patches. From BATV+c466a6942243809e4eb6+4583+infradead.org+hch@bombadil.srs.infradead.org Fri Mar 11 08:09:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B31AE7CA6 for ; Fri, 11 Mar 2016 08:09:54 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7A12D8F8035 for ; Fri, 11 Mar 2016 06:09:54 -0800 (PST) X-ASG-Debug-ID: 1457705392-04cb6c7f2815fc0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id cy2NzyAQ83QeG7gg (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 11 Mar 2016 06:09:52 -0800 (PST) X-Barracuda-Envelope-From: BATV+c466a6942243809e4eb6+4583+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 1aeNlD-0003IC-R8; Fri, 11 Mar 2016 14:09:47 +0000 Date: Fri, 11 Mar 2016 06:09:47 -0800 From: Christoph Hellwig To: Andreas Gruenbacher Cc: Alexander Viro , "J. Bruce Fields" , linux-nfs@vger.kernel.org, Theodore Ts'o , linux-cifs@vger.kernel.org, linux-api@vger.kernel.org, Trond Myklebust , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Christoph Hellwig , Andreas Dilger , linux-fsdevel@vger.kernel.org, Jeff Layton , linux-ext4@vger.kernel.org, Anna Schumaker Subject: Re: [PATCH v18 09/22] richacl: Permission check algorithm Message-ID: <20160311140947.GD14808@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v18 09/22] richacl: Permission check algorithm References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <1456733847-17982-10-git-send-email-agruenba@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1456733847-17982-10-git-send-email-agruenba@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457705392 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27759 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > fs/Makefile | 2 +- > fs/richacl_inode.c | 149 ++++++++++++++++++++++++++++++++++++++++++++++++ What's the point of a tiny separate file here? All richacls files together are still small, and it would be much preferably to have all that code together. From BATV+c466a6942243809e4eb6+4583+infradead.org+hch@bombadil.srs.infradead.org Fri Mar 11 08:17:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3375E7CA1 for ; Fri, 11 Mar 2016 08:17:08 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 05EE58F8039 for ; Fri, 11 Mar 2016 06:17:07 -0800 (PST) X-ASG-Debug-ID: 1457705824-04cbb00b72323390001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 46CY1DSdkRr9OBeQ (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 11 Mar 2016 06:17:05 -0800 (PST) X-Barracuda-Envelope-From: BATV+c466a6942243809e4eb6+4583+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 1aeNsD-0007os-6C; Fri, 11 Mar 2016 14:17:01 +0000 Date: Fri, 11 Mar 2016 06:17:01 -0800 From: Christoph Hellwig To: Andreas Gruenbacher Cc: Alexander Viro , "J. Bruce Fields" , linux-nfs@vger.kernel.org, Theodore Ts'o , linux-cifs@vger.kernel.org, linux-api@vger.kernel.org, Trond Myklebust , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Christoph Hellwig , Andreas Dilger , linux-fsdevel@vger.kernel.org, Jeff Layton , linux-ext4@vger.kernel.org, Anna Schumaker Subject: Re: [PATCH v18 18/22] richacl: xattr mapping functions Message-ID: <20160311141701.GE14808@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v18 18/22] richacl: xattr mapping functions References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <1456733847-17982-19-git-send-email-agruenba@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1456733847-17982-19-git-send-email-agruenba@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457705825 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27759 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > +#include > + > +MODULE_LICENSE("GPL"); what's the point given that the code isn't even modolar? > +static void > +fix_xattr_from_user(const char *kname, void *kvalue, size_t size) > +{ > + if (strncmp(kname, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) > + return; > + kname += XATTR_SYSTEM_PREFIX_LEN; > + if (!strcmp(kname, XATTR_POSIX_ACL_ACCESS) || > + !strcmp(kname, XATTR_POSIX_ACL_DEFAULT)) > + posix_acl_fix_xattr_from_user(kvalue, size); > +} > > /* > * Extended attribute SET operations > @@ -329,9 +339,7 @@ setxattr(struct dentry *d, const char __user *name, const void __user *value, > error = -EFAULT; > goto out; > } > - if ((strcmp(kname, XATTR_NAME_POSIX_ACL_ACCESS) == 0) || > - (strcmp(kname, XATTR_NAME_POSIX_ACL_DEFAULT) == 0)) > - posix_acl_fix_xattr_from_user(kvalue, size); > + fix_xattr_from_user(kname, kvalue, size); > } > > error = vfs_setxattr(d, kname, kvalue, size, flags); > @@ -396,6 +404,17 @@ SYSCALL_DEFINE5(fsetxattr, int, fd, const char __user *, name, > return error; > } > > +static void > +fix_xattr_to_user(const char *kname, void *kvalue, size_t size) > +{ > + if (strncmp(kname, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) > + return; > + kname += XATTR_SYSTEM_PREFIX_LEN; > + if (!strcmp(kname, XATTR_POSIX_ACL_ACCESS) || > + !strcmp(kname, XATTR_POSIX_ACL_DEFAULT)) > + posix_acl_fix_xattr_to_user(kvalue, size); > +} > + > /* > * Extended attribute GET operations > */ > @@ -426,9 +445,7 @@ getxattr(struct dentry *d, const char __user *name, void __user *value, > > error = vfs_getxattr(d, kname, kvalue, size); > if (error > 0) { > - if ((strcmp(kname, XATTR_NAME_POSIX_ACL_ACCESS) == 0) || > - (strcmp(kname, XATTR_NAME_POSIX_ACL_DEFAULT) == 0)) > - posix_acl_fix_xattr_to_user(kvalue, size); > + fix_xattr_to_user(kname, kvalue, size); I don't see how this is related to the rest of the patch. > +++ b/include/linux/richacl_xattr.h What's the point in splitting this from the richacl.h header? Same for the uapi versions. > +struct richacl_xattr { > + unsigned char a_version; > + unsigned char a_flags; Explicit __u8 for uapi headers, please. From BATV+c466a6942243809e4eb6+4583+infradead.org+hch@bombadil.srs.infradead.org Fri Mar 11 08:17:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E7C7B7CA1 for ; Fri, 11 Mar 2016 08:17:41 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9E39E8F8033 for ; Fri, 11 Mar 2016 06:17:41 -0800 (PST) X-ASG-Debug-ID: 1457705858-04bdf002eb30ae60001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id tERa8TLCxUsm3wpG (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 11 Mar 2016 06:17:38 -0800 (PST) X-Barracuda-Envelope-From: BATV+c466a6942243809e4eb6+4583+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 1aeNsl-0007z6-Ke; Fri, 11 Mar 2016 14:17:35 +0000 Date: Fri, 11 Mar 2016 06:17:35 -0800 From: Christoph Hellwig To: Andreas Gruenbacher Cc: Alexander Viro , "J. Bruce Fields" , linux-nfs@vger.kernel.org, Theodore Ts'o , linux-cifs@vger.kernel.org, linux-api@vger.kernel.org, Trond Myklebust , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Christoph Hellwig , Andreas Dilger , linux-fsdevel@vger.kernel.org, Jeff Layton , linux-ext4@vger.kernel.org, Anna Schumaker Subject: Re: [PATCH v18 19/22] richacl: Add richacl xattr handler Message-ID: <20160311141735.GF14808@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v18 19/22] richacl: Add richacl xattr handler References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <1456733847-17982-20-git-send-email-agruenba@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1456733847-17982-20-git-send-email-agruenba@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457705858 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27759 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Feb 29, 2016 at 09:17:24AM +0100, Andreas Gruenbacher wrote: > Add richacl xattr handler implementing the xattr operations based on the > get_richacl and set_richacl inode operations. Given all the issues with Posix ACLs and selinux attributes these really should be proper syscalls instead of abusing the xattr interface. From bfields@fieldses.org Fri Mar 11 08:19:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 601687CA1 for ; Fri, 11 Mar 2016 08:19:08 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2FFB5304048 for ; Fri, 11 Mar 2016 06:19:08 -0800 (PST) X-ASG-Debug-ID: 1457705945-04cb6c7f2816a10001-NocioJ Received: from fieldses.org (fieldses.org [173.255.197.46]) by cuda.sgi.com with ESMTP id EM8ImUykuWOQx6qJ for ; Fri, 11 Mar 2016 06:19:06 -0800 (PST) X-Barracuda-Envelope-From: bfields@fieldses.org X-Barracuda-Apparent-Source-IP: 173.255.197.46 Received: by fieldses.org (Postfix, from userid 2815) id 9406624CD; Fri, 11 Mar 2016 09:19:05 -0500 (EST) Date: Fri, 11 Mar 2016 09:19:05 -0500 From: "J. Bruce Fields" To: Christoph Hellwig Cc: Andreas Gruenbacher , Alexander Viro , linux-nfs@vger.kernel.org, Theodore Ts'o , linux-cifs@vger.kernel.org, linux-api@vger.kernel.org, Trond Myklebust , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Andreas Dilger , linux-fsdevel@vger.kernel.org, Jeff Layton , linux-ext4@vger.kernel.org, Anna Schumaker Subject: Re: [PATCH v18 19/22] richacl: Add richacl xattr handler Message-ID: <20160311141905.GC13178@fieldses.org> X-ASG-Orig-Subj: Re: [PATCH v18 19/22] richacl: Add richacl xattr handler References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <1456733847-17982-20-git-send-email-agruenba@redhat.com> <20160311141735.GF14808@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160311141735.GF14808@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: fieldses.org[173.255.197.46] X-Barracuda-Start-Time: 1457705946 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27759 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Mar 11, 2016 at 06:17:35AM -0800, Christoph Hellwig wrote: > On Mon, Feb 29, 2016 at 09:17:24AM +0100, Andreas Gruenbacher wrote: > > Add richacl xattr handler implementing the xattr operations based on the > > get_richacl and set_richacl inode operations. > > Given all the issues with Posix ACLs and selinux attributes these really > should be proper syscalls instead of abusing the xattr interface. What are those problems exactly? --b. From BATV+c466a6942243809e4eb6+4583+infradead.org+hch@bombadil.srs.infradead.org Fri Mar 11 08:27:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3823C7CA0 for ; Fri, 11 Mar 2016 08:27:27 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CAE1E8F8039 for ; Fri, 11 Mar 2016 06:27:26 -0800 (PST) X-ASG-Debug-ID: 1457706444-04bdf002ec30b8b0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id GVxstMR4sQL4Dp1C (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 11 Mar 2016 06:27:25 -0800 (PST) X-Barracuda-Envelope-From: BATV+c466a6942243809e4eb6+4583+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 1aeO2B-0003eG-Q2; Fri, 11 Mar 2016 14:27:19 +0000 Date: Fri, 11 Mar 2016 06:27:19 -0800 From: Christoph Hellwig To: Andreas Gruenbacher Cc: Alexander Viro , "Aneesh Kumar K.V" , "J. Bruce Fields" , linux-nfs@vger.kernel.org, Theodore Ts'o , linux-cifs@vger.kernel.org, linux-api@vger.kernel.org, Trond Myklebust , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Christoph Hellwig , Andreas Dilger , linux-fsdevel@vger.kernel.org, Jeff Layton , linux-ext4@vger.kernel.org, Anna Schumaker Subject: Re: [PATCH v18 21/22] ext4: Add richacl support Message-ID: <20160311142719.GG14808@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v18 21/22] ext4: Add richacl support References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <1456733847-17982-22-git-send-email-agruenba@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1456733847-17982-22-git-send-email-agruenba@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457706445 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27759 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > +static inline int > +ext4_acl_chmod(struct inode *inode, umode_t mode) > +{ > + if (IS_RICHACL(inode)) > + return richacl_chmod(inode, inode->i_mode); > + return posix_acl_chmod(inode, inode->i_mode); > +} Thi isn't ext4-specific and potentially duplicated in every caller. Please provide this as a common helper. Also while we're at it, the mode argument is ignore and the function always uses inode->i_mode instead. > +ext4_get_richacl(struct inode *inode) > +{ > + const int name_index = EXT4_XATTR_INDEX_RICHACL; > + void *value = NULL; > + struct richacl *acl = NULL; > + int retval; > + > + retval = ext4_xattr_get(inode, name_index, "", NULL, 0); > + if (retval > 0) { > + value = kmalloc(retval, GFP_NOFS); > + if (!value) > + return ERR_PTR(-ENOMEM); > + retval = ext4_xattr_get(inode, name_index, "", value, retval); > + } > + if (retval > 0) { > + acl = richacl_from_xattr(&init_user_ns, value, retval); > + if (acl == ERR_PTR(-EINVAL)) > + acl = ERR_PTR(-EIO); Shouldn't richacl_from_xattr return the error pointer that ->get_richacl callers expect? > +static int > +__ext4_set_richacl(handle_t *handle, struct inode *inode, struct richacl *acl) > +{ > + const int name_index = EXT4_XATTR_INDEX_RICHACL; > + umode_t mode = inode->i_mode; > + int retval, size; > + void *value; > + > + if (richacl_equiv_mode(acl, &mode) == 0) { > + inode->i_ctime = ext4_current_time(inode); > + inode->i_mode = mode; > + ext4_mark_inode_dirty(handle, inode); > + return __ext4_remove_richacl(handle, inode); > + } Should this check for a NULL acl instead of special casing that in ext4_set_richacl? > +int > +ext4_init_richacl(handle_t *handle, struct inode *inode, struct inode *dir) > +{ > + struct richacl *acl = richacl_create(&inode->i_mode, dir); > + int error; > + > + error = PTR_ERR(acl); > + if (IS_ERR(acl)) > + return error; if (IS_ERR(acl)) return PTR_ERR(acl); > + if (acl) { > + error = __ext4_set_richacl(handle, inode, acl); > + richacl_put(acl); > + } Shouldn't richacl_create return NULL if the ACL is equivalent to the mode bits instead of letting every filesystem figure that out on it's own? From hch@lst.de Fri Mar 11 08:48:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0A3437CA0 for ; Fri, 11 Mar 2016 08:48:03 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D28F48F8040 for ; Fri, 11 Mar 2016 06:48:02 -0800 (PST) X-ASG-Debug-ID: 1457707679-04cbb00b6f325b50001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id VKz7xR3OuAhYvxJ0 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 11 Mar 2016 06:48:00 -0800 (PST) X-Barracuda-Envelope-From: hch@lst.de X-Barracuda-Apparent-Source-IP: 213.95.11.211 Received: by newverein.lst.de (Postfix, from userid 2407) id 5668368ABE; Fri, 11 Mar 2016 15:47:58 +0100 (CET) Date: Fri, 11 Mar 2016 15:47:58 +0100 From: Christoph Hellwig To: Brian Foster Cc: Christoph Hellwig , xfs@oss.sgi.com, Dave Chinner Subject: Re: [PATCH 2/3] xfs: don't release bios on completion immediately Message-ID: <20160311144758.GA2551@lst.de> X-ASG-Orig-Subj: Re: [PATCH 2/3] xfs: don't release bios on completion immediately References: <1456302011-18915-1-git-send-email-hch@lst.de> <1456302011-18915-3-git-send-email-hch@lst.de> <20160303151722.GB57990@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160303151722.GB57990@bfoster.bfoster> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1457707679 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27759 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Mar 03, 2016 at 10:17:22AM -0500, Brian Foster wrote: > > +xfs_finish_page_writeback( > > + struct page *page, > > + unsigned int start, > > + unsigned int end, > > + int error) > > +{ > > + struct buffer_head *head, *bh; > > + unsigned int off = 0; > > + > > + bh = head = page_buffers(page); > > + > > + do { > > + if (start > off) > > + goto next_bh; > > Probably not an issue for current usage, which appears to be on buffer > size granularity, but shouldn't this check whether start is beyond the > end of the current buffer (e.g., start >= off + bh->b_size)? I don't understand that question. We get called for a given page, and a start and end offset inside that page. These offsets by design need to be aligned to the filesystem blocksize. So what we basically want is to skip a few buffers at the beginning and/or end of the page, and the code seems to handle that fine. > > mempool_free(ioend, xfs_ioend_pool); > > } > > > > + > > Unnecessary whitespace here. Fixed. From hch@lst.de Fri Mar 11 08:55:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 10B837CA0 for ; Fri, 11 Mar 2016 08:55:15 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id BA14D304032 for ; Fri, 11 Mar 2016 06:55:14 -0800 (PST) X-ASG-Debug-ID: 1457708110-04bdf002eb30e000001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id fCjLAEQGXroYF2cQ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 11 Mar 2016 06:55:12 -0800 (PST) X-Barracuda-Envelope-From: hch@lst.de X-Barracuda-Apparent-Source-IP: 213.95.11.211 Received: by newverein.lst.de (Postfix, from userid 2407) id D2B6168ABE; Fri, 11 Mar 2016 15:55:09 +0100 (CET) Date: Fri, 11 Mar 2016 15:55:09 +0100 From: Christoph Hellwig To: Brian Foster Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 3/3] xfs: optimize bio handling in the buffer writeback path Message-ID: <20160311145509.GB2551@lst.de> X-ASG-Orig-Subj: Re: [PATCH 3/3] xfs: optimize bio handling in the buffer writeback path References: <1456302011-18915-1-git-send-email-hch@lst.de> <1456302011-18915-4-git-send-email-hch@lst.de> <20160303151730.GC57990@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160303151730.GC57990@bfoster.bfoster> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1457708111 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27760 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Mar 03, 2016 at 10:17:30AM -0500, Brian Foster wrote: > > + > > + /* > > + * For the last bio, bi_private points to the ioend, so we > > + * need to explicitly end the iteration here. > > + */ > > Do you mean the last bio is pointed to by the ioend? No, bio->bi_private of the last bio points to the ioend. > > @@ -541,10 +457,8 @@ xfs_submit_ioend( > > * at this point in time. > > */ > > error_finish: > > - if (ioend->io_bio) > > - bio_put(ioend->io_bio); > > - ioend->io_error = status; > > - xfs_finish_ioend(ioend); > > + ioend->io_bio->bi_error = status; > > + bio_endio(ioend->io_bio); > > return status; > > bi_end_io is not set here, so what happens to the buffers added to the > ioend in this case? We're not calling the end_io function we should be, good catch and fixed. > Trailing whitespace on the above line. Ok, fixed. > And FWIW, I'm not a huge fan of > open coding both the bio and ioend allocations. It makes it easier to > distinguish the higher level algorithm from all of the structure > initialization noise. It looks to me that alloc_ioend() could remain > mostly as is, using the new bioset allocation, and alloc_ioend_bio() > could be inlined and renamed to something like init_bio_from_bh() or > some such. Hmm, not a huge fan of these single use function in general, but I'll see if I can do something sensible. > I'm trying to make sure I grok how this works without knowing much about > the block layer. So we chain the current bio to the new one, the latter > becoming the parent, and submit the old one. It looks to me that this > could result in bio_endio() on the parent, which seems fishy... what am > I missing? IOW, is it safe to submit bios like this before the entire > chain is created? Ignoring this for now and jumping to the next reply.. > > + out_free_ioend_bioset: > > + bioset_free(xfs_ioend_bioset); > > Space before tab ^. Fixed. > > + bioset_free(xfs_ioend_bioset); > > Space before tab ^. Fixed. From hch@lst.de Fri Mar 11 09:06:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 74BAC7CA0 for ; Fri, 11 Mar 2016 09:06:13 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D94F5AC003 for ; Fri, 11 Mar 2016 07:06:09 -0800 (PST) X-ASG-Debug-ID: 1457708767-04cbb00b71326ed0001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id qxxBn8uZgrwBlLAH (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 11 Mar 2016 07:06:08 -0800 (PST) X-Barracuda-Envelope-From: hch@lst.de X-Barracuda-Apparent-Source-IP: 213.95.11.211 Received: by newverein.lst.de (Postfix, from userid 2407) id EB62468ABE; Fri, 11 Mar 2016 16:06:06 +0100 (CET) Date: Fri, 11 Mar 2016 16:06:06 +0100 From: Christoph Hellwig To: Brian Foster Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 3/3] xfs: optimize bio handling in the buffer writeback path Message-ID: <20160311150606.GA3016@lst.de> X-ASG-Orig-Subj: Re: [PATCH 3/3] xfs: optimize bio handling in the buffer writeback path References: <1456302011-18915-1-git-send-email-hch@lst.de> <1456302011-18915-4-git-send-email-hch@lst.de> <20160303151730.GC57990@bfoster.bfoster> <20160304133854.GB3758@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160304133854.GB3758@bfoster.bfoster> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1457708767 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27760 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Mar 04, 2016 at 08:38:55AM -0500, Brian Foster wrote: > One thing I'm a bit suspicious about still is whether the error > propagation is racy. For example, consider we've created two chained > bios A and B, such that A is the parent and thus bio(io_remaining) for > each is A(2) and B(1). Suppose bio A happens to complete first with an > error. A->bi_error is set and bio_endio(A) is called, which IIUC > basically just does A(2)->A(1). If bio B completes successfully, > B->bi_error presumably remains set to 0 and bio_endio(B) is called. The > latter checks that B->bi_end_io == bio_chain_endio, propagates > B->bi_error to A->bi_error unconditionally and then walks up to the > parent bio to drop its reference and finally call A->bi_end_io(). > > Doesn't this mean that we can potentially lose errors in the chain? I > could easily still be missing something here... Yes, it looks like bio_chain_endio and bio_endio should be fixed to only set parent->bi_error if it's not already set. I'll send a patch. From agruenba@redhat.com Fri Mar 11 10:11:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B4D6C7CA0 for ; Fri, 11 Mar 2016 10:11:57 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8A1468F8033 for ; Fri, 11 Mar 2016 08:11:54 -0800 (PST) X-ASG-Debug-ID: 1457712711-04cb6c7f2b1f9a0001-NocioJ Received: from mail-vk0-f54.google.com (mail-vk0-f54.google.com [209.85.213.54]) by cuda.sgi.com with ESMTP id Krt1bM8hPqUdrfa8 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 11 Mar 2016 08:11:52 -0800 (PST) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.85.213.54 Received: by mail-vk0-f54.google.com with SMTP id c3so139456931vkb.3 for ; Fri, 11 Mar 2016 08:11:52 -0800 (PST) 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; bh=/Y/qR7eSG6DKQUOEjzDVGtH9qFVm3AqCH9MMuzRPsFY=; b=eT2UdfWXJuHeVewl7sQ0AnO7cPec3ibLRYBLawcgFO2D3osocGF0sAHZHtMv2xdX+f O3l59V/tomOSvqReNPq8O3lHs4C9z9vxvwVP4aFacMxHZhnfaC+c2Xm3uLfC3hUoxrKc XLQFXfZnProjPKX0oH51Ip40W+B5usN6POwwOb12VeLkRTU3imPq2VbyeY+dfs1v8c3T s4Nply6lZKx/MU+pwAJ0qzAmfZIA36Pc6+XLYrJK2f/MY5xQBEVyIy/Xl5Q13FepKGut 843uaRtovliqzaR+sKvfYeDlu91NLDUa11V6pOC4vnouML8gsViF9b0+A3TLL4UPx71i 9Dhg== X-Gm-Message-State: AD7BkJIx+ZOZ7w2DPGwr7QughaaULVnJBwVRDcehMEAPyoeDOKGCkInFoW+kF0ik/i+zf/YdmF7Bt9GRDHvLg2/2 MIME-Version: 1.0 X-Received: by 10.31.149.135 with SMTP id x129mr10565706vkd.62.1457712711511; Fri, 11 Mar 2016 08:11:51 -0800 (PST) Received: by 10.159.33.173 with HTTP; Fri, 11 Mar 2016 08:11:51 -0800 (PST) In-Reply-To: <20160311140134.GA14808@infradead.org> References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <20160311140134.GA14808@infradead.org> Date: Fri, 11 Mar 2016 17:11:51 +0100 Message-ID: Subject: Re: [PATCH v18 00/22] Richacls (Core and Ext4) From: Andreas Gruenbacher X-ASG-Orig-Subj: Re: [PATCH v18 00/22] Richacls (Core and Ext4) To: Christoph Hellwig Cc: Alexander Viro , "J. Bruce Fields" , Linux NFS Mailing List , "Theodore Ts'o" , linux-cifs@vger.kernel.org, Linux API , Trond Myklebust , LKML , XFS Developers , Andreas Dilger , linux-fsdevel , Jeff Layton , linux-ext4 , Anna Schumaker Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-vk0-f54.google.com[209.85.213.54] X-Barracuda-Start-Time: 1457712712 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27761 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Mar 11, 2016 at 3:01 PM, Christoph Hellwig wrote: > On Mon, Feb 29, 2016 at 09:17:05AM +0100, Andreas Gruenbacher wrote: >> Al, >> >> could you please make sure you are happy with the current version of the >> richacl patch queue for the next merge window? > > I'm still not happy. > > For one I still see no reason to merge this broken ACL model at all. > It provides our actualy Linux users no benefit at all, This permission model is useful in mixed environments that involve UNIX and Windows machines. Think of NAS boxes with Linux and Windows clients, for example. It also fits the NFSv4 ACL model very well. If you're not a user dealing with such environments, then the model likely won't provide any benefits to *you*, and you're better off with a less complicated permission model. That doesn't say anything about other users, though. > while breaking a lot of assumptions, The model is designed specifically to be compliant with the POSIX permission model. What assumptions are you talking about? > especially by adding allow and deny ACE at the same time. I remember from past discussions that a permission model like the POSIX ACL model that doesn't have DENY ACEs would be more to your liking. This argument is dead from the start though: NFSv4 ACLs without DENY ACEs cannot represent basic file permissions like 0604 where the owning group has fewer permissions than others, for example (see the richaclex(7) man page). We would end up with a permission model that isn't even compatible with the traditional POSIX file permission model, one which nobody else implements or cares about. > It also doesn't help with the issue that the main thing it's trying > to be compatible with (Windows) actually uses a fundamentally different > identifier to apply the ACLs to - as long as you're still limited > to users and groups and not guids we'll still have that mapping problem > anyway. Samba has been dealing with mapping between SIDs and UIDs/GIDs for a long time, and it's working acceptably well. We could store SIDs in ACEs, but that wouldn't make the actual problems go away: Files on Linux have an owner and an owning group which are identitifed by UID/GID, whereas a file is owned by a SID which can be either a user or a group in a SID world. Also, processes on Linux have an owner and a list of groups which are identified by UID/GID, so any SIDs stored in filesystems would never match a process, anyway. (NFSv4 refers to users and groups as opposed to SIDs, and so it doesn't have this problem.) Thanks, Andreas From agruenba@redhat.com Fri Mar 11 10:24:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 831EF7CA1 for ; Fri, 11 Mar 2016 10:24:53 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 28F4E304043 for ; Fri, 11 Mar 2016 08:24:49 -0800 (PST) X-ASG-Debug-ID: 1457713485-04bdf002ed314c60001-NocioJ Received: from mail-vk0-f43.google.com (mail-vk0-f43.google.com [209.85.213.43]) by cuda.sgi.com with ESMTP id pfv0iOVxsABPc6XV (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 11 Mar 2016 08:24:46 -0800 (PST) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.85.213.43 Received: by mail-vk0-f43.google.com with SMTP id e6so140000351vkh.2 for ; Fri, 11 Mar 2016 08:24:46 -0800 (PST) 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; bh=Q0vpNaDAWxnQVs4qjCf4hU6tUFaYtzJB9oTS5PP84k8=; b=FgsWaPQ9JrwcKu00/9Kyljsrh59nlryaI2Sc7HKD7NupqAn2IwYnQJaUHvfbo7aLSC 2dRtCMAx0CQTb/7FLU2i/DFrFgAD49yUcJLOdDy7e+/qXLiISLsH4t+gcRnvAt9jaKrG 4Lnbf2rttXPpieVm4ukoTDLHUAsBH0l83h/qhOK9VAXj4VzKgn2UXbAK/JLZqyFP2s9f 8dlK66esMApb3Jpan7qu0DYUxqY0mKz4RwAGIDFkO2U+7277lzu+fHh/nV59yi25zI4x kTkzNlZBXEDoylbUUtzLpfcgDhE6Uxk4dJGe8wx3WYbeeZdByUlayY57C+q6s+3yjYSF 0SzQ== X-Gm-Message-State: AD7BkJLPG+1vv7JsYDLj21O34mpdyqJ05a32kduVRsq55tHIFk8TCVJ2helpRUSyfj6W2muqM58pqSC5Ppcv8ABo MIME-Version: 1.0 X-Received: by 10.31.151.75 with SMTP id z72mr9893570vkd.104.1457713485508; Fri, 11 Mar 2016 08:24:45 -0800 (PST) Received: by 10.159.33.173 with HTTP; Fri, 11 Mar 2016 08:24:45 -0800 (PST) In-Reply-To: <20160311140746.GC14808@infradead.org> References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <1456733847-17982-12-git-send-email-agruenba@redhat.com> <20160311140746.GC14808@infradead.org> Date: Fri, 11 Mar 2016 17:24:45 +0100 Message-ID: Subject: Re: [PATCH v18 11/22] vfs: Cache base_acl objects in inodes From: Andreas Gruenbacher X-ASG-Orig-Subj: Re: [PATCH v18 11/22] vfs: Cache base_acl objects in inodes To: Christoph Hellwig Cc: Alexander Viro , "J. Bruce Fields" , Linux NFS Mailing List , "Theodore Ts'o" , linux-cifs@vger.kernel.org, Linux API , Trond Myklebust , LKML , XFS Developers , Andreas Dilger , linux-fsdevel , Jeff Layton , linux-ext4 , Anna Schumaker , jaegeuk@kernel.org, chao2.yu@samsung.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-vk0-f43.google.com[209.85.213.43] X-Barracuda-Start-Time: 1457713486 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27761 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Mar 11, 2016 at 3:07 PM, Christoph Hellwig wrote: > On Mon, Feb 29, 2016 at 09:17:16AM +0100, Andreas Gruenbacher wrote: >> POSIX ACLs and richacls are both objects allocated by kmalloc() with a >> reference count which are freed by kfree_rcu(). An inode can either >> cache an access and a default POSIX ACL, or a richacl (richacls do not >> have default acls). To allow an inode to cache either of the two kinds >> of acls, introduce a new base_acl type and convert i_acl and >> i_default_acl to that type. In most cases, the vfs then doesn't care which >> kind of acl an inode caches (if any). > > This base_acl object is pointless. I've asked in the past to have > a proper container for the ACLs in common code, but a union > of a refcount and a rcu head doesn't really fit that category. POSIX ACLs and RichACLs are different objects, with different members and different algorithms operating on them. The only commonality is that they are both kmalloc()ed, reference counted objects, and when an inode is destroyed, both kinds of ACLs can be put in the same way, avoiding an unnecessary if. What kind of common-code container beyond that are you still dreaming about? Thanks, Andreas From agruenba@redhat.com Fri Mar 11 11:03:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B9FE77CA3 for ; Fri, 11 Mar 2016 11:03:21 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 45B86AC005 for ; Fri, 11 Mar 2016 09:03:18 -0800 (PST) X-ASG-Debug-ID: 1457715792-04bdf002ee317020001-NocioJ Received: from mail-vk0-f47.google.com (mail-vk0-f47.google.com [209.85.213.47]) by cuda.sgi.com with ESMTP id yhkzmZeSr7MG7T6w (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 11 Mar 2016 09:03:12 -0800 (PST) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.85.213.47 Received: by mail-vk0-f47.google.com with SMTP id e185so141318103vkb.1 for ; Fri, 11 Mar 2016 09:03:12 -0800 (PST) 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; bh=j9MeQFcPOT1Ncy6Inz6Ev+U2CB7GkXWN4Es8Da6DVTI=; b=HdTzT73rUGeKv0u1sdRKmIje5KYQu95HL2uPGdi6dPv4qCvOqEYpfMMNwDMvUUV5PE KCuF8Oai3yGEnK6D/lcPPs33yh3GiT2MvzPkIE4UMqefp06PNTAIu44bYo6qvroht5m7 6xkHWUM1jgPQkXn8FOtEv14LETv/00RBwHowpntp3HlBZBRWKHXQRPJ5ipOj95+t7ty5 q0nHp+W9igt7ciScmqrRLh9a/Wz/zgn/K1XtHtq+tAEQt6WVJoYrrFTlSvNYJ4DbfW0B 4gxejNldsXrufPQrKvPU6QTNC5gVC0seaJnvNwxt2/MYKHJnD9ir0jmzuQnFVivVKueE D1xw== X-Gm-Message-State: AD7BkJLiFOryUukD4rK+6ldCyo4xrfldBiaWaPtNOp03p2+OqDvsbjX1CQuThwZ6cjQ4fME61E5cPPU9BfXjkL41 MIME-Version: 1.0 X-Received: by 10.31.149.135 with SMTP id x129mr10860727vkd.62.1457715791826; Fri, 11 Mar 2016 09:03:11 -0800 (PST) Received: by 10.159.33.173 with HTTP; Fri, 11 Mar 2016 09:03:11 -0800 (PST) In-Reply-To: <20160311141701.GE14808@infradead.org> References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <1456733847-17982-19-git-send-email-agruenba@redhat.com> <20160311141701.GE14808@infradead.org> Date: Fri, 11 Mar 2016 18:03:11 +0100 Message-ID: Subject: Re: [PATCH v18 18/22] richacl: xattr mapping functions From: Andreas Gruenbacher X-ASG-Orig-Subj: Re: [PATCH v18 18/22] richacl: xattr mapping functions To: Christoph Hellwig Cc: Alexander Viro , "J. Bruce Fields" , Linux NFS Mailing List , "Theodore Ts'o" , linux-cifs@vger.kernel.org, Linux API , Trond Myklebust , LKML , XFS Developers , Andreas Dilger , linux-fsdevel , Jeff Layton , linux-ext4 , Anna Schumaker Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-vk0-f47.google.com[209.85.213.47] X-Barracuda-Start-Time: 1457715792 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27762 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Mar 11, 2016 at 3:17 PM, Christoph Hellwig wrote: >> +#include >> + >> +MODULE_LICENSE("GPL"); > > what's the point given that the code isn't even modolar? A leftover, removed now. >> +static void >> +fix_xattr_from_user(const char *kname, void *kvalue, size_t size) >> +{ >> + if (strncmp(kname, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) >> + return; >> + kname += XATTR_SYSTEM_PREFIX_LEN; >> + if (!strcmp(kname, XATTR_POSIX_ACL_ACCESS) || >> + !strcmp(kname, XATTR_POSIX_ACL_DEFAULT)) >> + posix_acl_fix_xattr_from_user(kvalue, size); >> +} >> >> /* >> * Extended attribute SET operations >> @@ -329,9 +339,7 @@ setxattr(struct dentry *d, const char __user *name, const void __user *value, >> error = -EFAULT; >> goto out; >> } >> - if ((strcmp(kname, XATTR_NAME_POSIX_ACL_ACCESS) == 0) || >> - (strcmp(kname, XATTR_NAME_POSIX_ACL_DEFAULT) == 0)) >> - posix_acl_fix_xattr_from_user(kvalue, size); >> + fix_xattr_from_user(kname, kvalue, size); >> } >> >> error = vfs_setxattr(d, kname, kvalue, size, flags); >> @@ -396,6 +404,17 @@ SYSCALL_DEFINE5(fsetxattr, int, fd, const char __user *, name, >> return error; >> } >> >> +static void >> +fix_xattr_to_user(const char *kname, void *kvalue, size_t size) >> +{ >> + if (strncmp(kname, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) >> + return; >> + kname += XATTR_SYSTEM_PREFIX_LEN; >> + if (!strcmp(kname, XATTR_POSIX_ACL_ACCESS) || >> + !strcmp(kname, XATTR_POSIX_ACL_DEFAULT)) >> + posix_acl_fix_xattr_to_user(kvalue, size); >> +} >> + >> /* >> * Extended attribute GET operations >> */ >> @@ -426,9 +445,7 @@ getxattr(struct dentry *d, const char __user *name, void __user *value, >> >> error = vfs_getxattr(d, kname, kvalue, size); >> if (error > 0) { >> - if ((strcmp(kname, XATTR_NAME_POSIX_ACL_ACCESS) == 0) || >> - (strcmp(kname, XATTR_NAME_POSIX_ACL_DEFAULT) == 0)) >> - posix_acl_fix_xattr_to_user(kvalue, size); >> + fix_xattr_to_user(kname, kvalue, size); > > I don't see how this is related to the rest of the patch. Indeed, this is unrelated now. I'll split it off. >> +++ b/include/linux/richacl_xattr.h > > What's the point in splitting this from the richacl.h header? > > Same for the uapi versions. > >> +struct richacl_xattr { >> + unsigned char a_version; >> + unsigned char a_flags; > > Explicit __u8 for uapi headers, please. Okay. Thanks, Andreas From bfoster@redhat.com Fri Mar 11 11:52:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D57557CA6 for ; Fri, 11 Mar 2016 11:52:36 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A82418F8035 for ; Fri, 11 Mar 2016 09:52:33 -0800 (PST) X-ASG-Debug-ID: 1457718752-04cbb00b6f333b50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QTCyZSEHqpUqJVVU (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 11 Mar 2016 09:52:32 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id CA208C0006FF; Fri, 11 Mar 2016 17:52:31 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-186.bos.redhat.com [10.18.41.186]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2BHqVrq028780; Fri, 11 Mar 2016 12:52:31 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 20371125041; Fri, 11 Mar 2016 12:52:30 -0500 (EST) Date: Fri, 11 Mar 2016 12:52:30 -0500 From: Brian Foster To: Christoph Hellwig Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 2/3] xfs: don't release bios on completion immediately Message-ID: <20160311175229.GA45351@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/3] xfs: don't release bios on completion immediately References: <1456302011-18915-1-git-send-email-hch@lst.de> <1456302011-18915-3-git-send-email-hch@lst.de> <20160303151722.GB57990@bfoster.bfoster> <20160311144758.GA2551@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160311144758.GA2551@lst.de> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1457718752 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Mar 11, 2016 at 03:47:58PM +0100, Christoph Hellwig wrote: > On Thu, Mar 03, 2016 at 10:17:22AM -0500, Brian Foster wrote: > > > +xfs_finish_page_writeback( > > > + struct page *page, > > > + unsigned int start, > > > + unsigned int end, > > > + int error) > > > +{ > > > + struct buffer_head *head, *bh; > > > + unsigned int off = 0; > > > + > > > + bh = head = page_buffers(page); > > > + > > > + do { > > > + if (start > off) > > > + goto next_bh; > > > > Probably not an issue for current usage, which appears to be on buffer > > size granularity, but shouldn't this check whether start is beyond the > > end of the current buffer (e.g., start >= off + bh->b_size)? > > I don't understand that question. We get called for a given page, > and a start and end offset inside that page. These offsets by design > need to be aligned to the filesystem blocksize. So what we basically > want is to skip a few buffers at the beginning and/or end of the page, > and the code seems to handle that fine. > Yes, that's what I meant by it not being an issue for current usage. My point was that when looking at the new helper, nothing explicitly indicates the offsets must be block aligned. This page buffer_head walking loop is rewritten all over the fs/ code in a manner that is correct for arbitrary offsets, so this instance looked wrong at first glance. Then I realized it probably works fine once looking at the callers. I'm fine with it as is if we add an assert for the alignment of the offsets. Brian > > > mempool_free(ioend, xfs_ioend_pool); > > > } > > > > > > + > > > > Unnecessary whitespace here. > > Fixed. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From smfrench@gmail.com Fri Mar 11 14:05:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 7FCAB7CAE for ; Fri, 11 Mar 2016 14:05:46 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4E413304039 for ; Fri, 11 Mar 2016 12:05:37 -0800 (PST) X-ASG-Debug-ID: 1457726736-04cb6c7f2929630001-NocioJ Received: from mail-ig0-f171.google.com (mail-ig0-f171.google.com [209.85.213.171]) by cuda.sgi.com with ESMTP id TywfdpwyveDSfd1q (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 11 Mar 2016 12:05:36 -0800 (PST) X-Barracuda-Envelope-From: smfrench@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.213.171 Received: by mail-ig0-f171.google.com with SMTP id vf5so18900093igb.0 for ; Fri, 11 Mar 2016 12:05:36 -0800 (PST) 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; bh=dNbp9NUzYWqA5RoMCj7tjTt9aEgaieOLi/QHXECYvPA=; b=omxedqYzyX6/v0k7CM+WA9oT3UQzs6kJe9zqGPtsJOS3N09424EIXvTePOPlxSCkEF +XEXs22zv4OY0byZYDAcrRNIQz3aCP3hOtC5VuyjMTA4VJaZwNdzsxPaYat7l9pGqGEU M5m+hweLURMxZKJYl5uCRyjw4O9UnQGO9J5NbTfa44cW2fZ2q/WPSLfOY9J8LlKM8m2K qnJCMVYjOZ/1q1DmWBTs7pf57mkHSs1LfQGJGOAY6fCOj4gJo2Cpb36vwqMbqrIiCHs0 shuzWXBPh8hLOu8sMRkVckliUNcxVpbCMJNSEgYAMFdBveZz+Khlj7c9Fxvv8KCx5bZV lNDA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=dNbp9NUzYWqA5RoMCj7tjTt9aEgaieOLi/QHXECYvPA=; b=fM4q8C5EGUTwqQ20xnShVA2hmUfjG7+mG6M7YyFga39GVND+WyZkgjba57jmFC2sLX 2sEX0BZaDLkc9M0L1BFBAZZ4U7PMxTuVWNl/7UMi/pywcpmlaoX5gBZNHizFuhnkl1Mk MN6p5pfC3SoQbw4b1b64qrtOwon8xNXWjtRAohZQTk7/l6ozvFhuJOOYX2aYhbWgP1rZ QtViLljS0W4m4qthkkPMsjv7zn33S5/cV4Wr6nDE5LUHy6gQz8ihFeYpkUky2hgGR0AX IkGl6s247HYMPOmy1JQHVtd684sj1Xs8TREAZLxasYsKAe0KklQAP88UBmIJ3jd/Yas/ 8/rw== X-Gm-Message-State: AD7BkJL1VhLYJyRiB7q3ZbkbaMF2R7vtiwRgCsrowFBE6eIZX1+L6xwbyFH5zf2Fm08/pKn244V9qWO4BFsERw== X-Received: by 10.50.178.180 with SMTP id cz20mr5748623igc.44.1457726735832; Fri, 11 Mar 2016 12:05:35 -0800 (PST) MIME-Version: 1.0 Received: by 10.79.104.193 with HTTP; Fri, 11 Mar 2016 12:05:16 -0800 (PST) In-Reply-To: References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <20160311140134.GA14808@infradead.org> From: Steve French Date: Fri, 11 Mar 2016 14:05:16 -0600 Message-ID: Subject: Re: [PATCH v18 00/22] Richacls (Core and Ext4) To: Andreas Gruenbacher X-ASG-Orig-Subj: Re: [PATCH v18 00/22] Richacls (Core and Ext4) Cc: Christoph Hellwig , Alexander Viro , "J. Bruce Fields" , Linux NFS Mailing List , "Theodore Ts'o" , "linux-cifs@vger.kernel.org" , Linux API , Trond Myklebust , LKML , XFS Developers , Andreas Dilger , linux-fsdevel , Jeff Layton , linux-ext4 , Anna Schumaker Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ig0-f171.google.com[209.85.213.171] X-Barracuda-Start-Time: 1457726736 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27765 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Fri, Mar 11, 2016 at 10:11 AM, Andreas Gruenbacher wrote: > On Fri, Mar 11, 2016 at 3:01 PM, Christoph Hellwig w > The model is designed specifically to be compliant with the POSIX > permission model. What assumptions are you talking about? > >> especially by adding allow and deny ACE at the same time. > > I remember from past discussions that a permission model like the > POSIX ACL model that doesn't have DENY ACEs would be more to your > liking. This argument is dead from the start though: NFSv4 ACLs > without DENY ACEs cannot represent basic file permissions like 0604 > where the owning group has fewer permissions than others, for example > (see the richaclex(7) man page). We would end up with a permission > model that isn't even compatible with the traditional POSIX file > permission model, one which nobody else implements or cares about. NFSv4.1 (and later) and Samba's (and cifs.ko and NTFS-3g) ACL model are close enough that doing a common approach that helps all three seems very reasonable. A loosely related question is what can be done for tools around existing interfaces for ACLs. I recently found out NTFS-3g has this xattr: static const char nf_ns_xattr_ntfs_acl[] = "system.ntfs_acl"; which allows you to query system.ntfs_acl xattr to get their full ACL (I hope) from NTFS but it hard to read without tools to parse the blobs better. I was prototyping adding this to cifs.ko for the most current (SMB3 and later) protocol dialects at least to allow backup and debug tools to use this to get the actual ACL. cifs.ko ACL should match almost exactly to NTFS-3g's but I wish I could find some tools that use this xattr so I could try comparing this with cacls.exe output and smbcacls (samba tool) for display detailed ACL information. Any idea of disk management tools for dumping/viewing/editing ntfs ACLs on Linux for comparison? >> It also doesn't help with the issue that the main thing it's trying >> to be compatible with (Windows) actually uses a fundamentally different >> identifier to apply the ACLs to - as long as you're still limited >> to users and groups and not guids we'll still have that mapping problem >> anyway. > > Samba has been dealing with mapping between SIDs and UIDs/GIDs for a > long time, and it's working acceptably well. > > We could store SIDs in ACEs, but that wouldn't make the actual > problems go away: Files on Linux have an owner and an owning group > which are identitifed by UID/GID, whereas a file is owned by a SID > which can be either a user or a group in a SID world. Also, processes > on Linux have an owner and a list of groups which are identified by > UID/GID, so any SIDs stored in filesystems would never match a > process, anyway. Samba's SID<->Username and SID<->UID mapping does work acceptably well, if a bit "over-configurable" ie with many choices for how it is done. (the related RFC2307 mapping needed for mapping usernames to uids across an enterprise, which Samba's winbind can also do is helpful much more broadly - since, unlike a uid which is too small, the username in an NFS ACLs are basically a one to one mapping for Samba to SIDs (there are may samba vfs modules for different OS that already do this, including a one for an earlier version of Linux RichACLs) Sounds like I need to quickly rework the SMB3 ACL helper functions for cifs.ko Also do you know where is the current version of the corresponding vfs_richacl for Samba which works with the current RichACL format? -- Thanks, Steve From sandeen@redhat.com Fri Mar 11 16:10:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0FE247CA0 for ; Fri, 11 Mar 2016 16:10:45 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D56D58F8033 for ; Fri, 11 Mar 2016 14:10:41 -0800 (PST) X-ASG-Debug-ID: 1457734240-04cb6c7f2b332d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BiFGQb259DEcA0Yx (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 11 Mar 2016 14:10:41 -0800 (PST) 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 (Postfix) with ESMTPS id F27EFC00F5FD for ; Fri, 11 Mar 2016 22:10:39 +0000 (UTC) Received: from Liberator.local (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 u2BMAcx0003909 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 11 Mar 2016 17:10:39 -0500 To: xfs@oss.sgi.com From: Eric Sandeen Subject: [PATCH 0/4] xfs: rework the attr ->put_listent code a bit Message-ID: <56E3425E.40509@redhat.com> X-ASG-Orig-Subj: [PATCH 0/4] xfs: rework the attr ->put_listent code a bit Date: Fri, 11 Mar 2016 16:10:38 -0600 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 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: 1457734240 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Lots of cruft in there, maybe more to do but here's the obvious stuff; removing bad error returns, unused variables and structure members, and then consolidating a little code. xfs_attr.h | 4 +- xfs_attr_list.c | 86 ++++++++++++++++---------------------------------------- xfs_xattr.c | 17 +++++++---- 3 files changed, 39 insertions(+), 68 deletions(-) -Eric From sandeen@sandeen.net Fri Mar 11 16:11:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F3A7E7CA4 for ; Fri, 11 Mar 2016 16:11:20 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B6725304032 for ; Fri, 11 Mar 2016 14:11:17 -0800 (PST) X-ASG-Debug-ID: 1457734274-04cb6c7f28333a0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id EuPM4octX7amcBFX for ; Fri, 11 Mar 2016 14:11:15 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id EE9682AD4 for ; Fri, 11 Mar 2016 16:11:01 -0600 (CST) Subject: [PATCH 1/4] xfs: only return -errno or success from attr ->put_listent To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/4] xfs: only return -errno or success from attr ->put_listent References: <56E3425E.40509@redhat.com> From: Eric Sandeen Message-ID: <56E34282.5050906@sandeen.net> Date: Fri, 11 Mar 2016 16:11:14 -0600 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <56E3425E.40509@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1457734274 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27768 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Today, the put_listent formatters return either 1 or 0; if they return 1, some callers treat this as an error and return it up the stack, despite "1" not being a valid (negative) error code. The intent seems to be that if the input buffer is full, we set seen_enough or set count = -1, and return 1; but some callers check the return before checking the seen_enough or count fields of the context. Fix this by only returning non-zero for actual errors encountered, and rely on the caller to first check the return value, then check the values in the context to decide what to do. Signed-off-by: Eric Sandeen --- fs/xfs/xfs_attr.h | 1 + fs/xfs/xfs_attr_list.c | 8 +++----- fs/xfs/xfs_xattr.c | 14 ++++++++++---- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/fs/xfs/xfs_attr.h b/fs/xfs/xfs_attr.h index dd48245..2343312 100644 --- a/fs/xfs/xfs_attr.h +++ b/fs/xfs/xfs_attr.h @@ -112,6 +112,7 @@ typedef struct attrlist_cursor_kern { *========================================================================*/ +/* Return 0 on success, or -errno; other state communicated via *context */ typedef int (*put_listent_func_t)(struct xfs_attr_list_context *, int, unsigned char *, int, int, unsigned char *); diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index 0ef7c2e..d5ab59f 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -108,16 +108,14 @@ xfs_attr_shortform_list(xfs_attr_list_context_t *context) (int)sfe->namelen, (int)sfe->valuelen, &sfe->nameval[sfe->namelen]); - + if (error) + return error; /* * Either search callback finished early or * didn't fit it all in the buffer after all. */ if (context->seen_enough) break; - - if (error) - return error; sfe = XFS_ATTR_SF_NEXTENTRY(sfe); } trace_xfs_attr_list_sf_all(context); @@ -580,7 +578,7 @@ xfs_attr_put_listent( trace_xfs_attr_list_full(context); alist->al_more = 1; context->seen_enough = 1; - return 1; + return 0; } aep = (attrlist_ent_t *)&context->alist[context->firstu]; diff --git a/fs/xfs/xfs_xattr.c b/fs/xfs/xfs_xattr.c index 110f1d7..f220129 100644 --- a/fs/xfs/xfs_xattr.c +++ b/fs/xfs/xfs_xattr.c @@ -146,7 +146,7 @@ __xfs_xattr_put_listent( arraytop = context->count + prefix_len + namelen + 1; if (arraytop > context->firstu) { context->count = -1; /* insufficient space */ - return 1; + return 0; } offset = (char *)context->alist + context->count; strncpy(offset, prefix, prefix_len); @@ -221,11 +221,15 @@ xfs_xattr_put_listent( } ssize_t -xfs_vn_listxattr(struct dentry *dentry, char *data, size_t size) +xfs_vn_listxattr( + struct dentry *dentry, + char *data, + size_t size) { struct xfs_attr_list_context context; struct attrlist_cursor_kern cursor = { 0 }; - struct inode *inode = d_inode(dentry); + struct inode *inode = d_inode(dentry); + int error; /* * First read the regular on-disk attributes. @@ -239,7 +243,9 @@ xfs_vn_listxattr(struct dentry *dentry, char *data, size_t size) context.firstu = context.bufsize; context.put_listent = xfs_xattr_put_listent; - xfs_attr_list_int(&context); + error = xfs_attr_list_int(&context); + if (error) + return error; if (context.count < 0) return -ERANGE; -- 1.7.1 From sandeen@sandeen.net Fri Mar 11 16:11:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 675A37CA1 for ; Fri, 11 Mar 2016 16:11:49 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CD26DAC003 for ; Fri, 11 Mar 2016 14:11:48 -0800 (PST) X-ASG-Debug-ID: 1457734303-04cbb00b6f33a9d0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id hGZGaV91HklbGImG for ; Fri, 11 Mar 2016 14:11:43 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 9BFF62AD4 for ; Fri, 11 Mar 2016 16:11:30 -0600 (CST) Subject: [PATCH 2/4] xfs: don't pass value into attr ->put_listent To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/4] xfs: don't pass value into attr ->put_listent References: <56E3425E.40509@redhat.com> From: Eric Sandeen Message-ID: <56E3429E.4030003@sandeen.net> Date: Fri, 11 Mar 2016 16:11:42 -0600 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <56E3425E.40509@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1457734303 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27768 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The value is not used; only names and value lengths are returned. Remove the argument. Signed-off-by: Eric Sandeen --- fs/xfs/xfs_attr.h | 2 +- fs/xfs/xfs_attr_list.c | 18 ++++++------------ fs/xfs/xfs_xattr.c | 3 +-- 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/fs/xfs/xfs_attr.h b/fs/xfs/xfs_attr.h index 2343312..dab4f41 100644 --- a/fs/xfs/xfs_attr.h +++ b/fs/xfs/xfs_attr.h @@ -114,7 +114,7 @@ typedef struct attrlist_cursor_kern { /* Return 0 on success, or -errno; other state communicated via *context */ typedef int (*put_listent_func_t)(struct xfs_attr_list_context *, int, - unsigned char *, int, int, unsigned char *); + unsigned char *, int, int); typedef struct xfs_attr_list_context { struct xfs_inode *dp; /* inode */ diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index d5ab59f..1d36d78 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -106,8 +106,7 @@ xfs_attr_shortform_list(xfs_attr_list_context_t *context) sfe->flags, sfe->nameval, (int)sfe->namelen, - (int)sfe->valuelen, - &sfe->nameval[sfe->namelen]); + (int)sfe->valuelen); if (error) return error; /* @@ -198,8 +197,7 @@ xfs_attr_shortform_list(xfs_attr_list_context_t *context) sbp->flags, sbp->name, sbp->namelen, - sbp->valuelen, - &sbp->name[sbp->namelen]); + sbp->valuelen); if (error) return error; if (context->seen_enough) @@ -428,8 +426,7 @@ xfs_attr3_leaf_list_int( entry->flags, name_loc->nameval, (int)name_loc->namelen, - be16_to_cpu(name_loc->valuelen), - &name_loc->nameval[name_loc->namelen]); + be16_to_cpu(name_loc->valuelen)); if (retval) return retval; } else { @@ -458,16 +455,14 @@ xfs_attr3_leaf_list_int( entry->flags, name_rmt->name, (int)name_rmt->namelen, - valuelen, - args.value); + valuelen); kmem_free(args.value); } else { retval = context->put_listent(context, entry->flags, name_rmt->name, (int)name_rmt->namelen, - valuelen, - NULL); + valuelen); } if (retval) return retval; @@ -548,8 +543,7 @@ xfs_attr_put_listent( int flags, unsigned char *name, int namelen, - int valuelen, - unsigned char *value) + int valuelen) { struct attrlist *alist = (struct attrlist *)context->alist; attrlist_ent_t *aep; diff --git a/fs/xfs/xfs_xattr.c b/fs/xfs/xfs_xattr.c index f220129..7fdcf33 100644 --- a/fs/xfs/xfs_xattr.c +++ b/fs/xfs/xfs_xattr.c @@ -166,8 +166,7 @@ xfs_xattr_put_listent( int flags, unsigned char *name, int namelen, - int valuelen, - unsigned char *value) + int valuelen) { char *prefix; int prefix_len; -- 1.7.1 From sandeen@sandeen.net Fri Mar 11 16:12:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9A02A7CA1 for ; Fri, 11 Mar 2016 16:12:16 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 282A3AC002 for ; Fri, 11 Mar 2016 14:12:15 -0800 (PST) X-ASG-Debug-ID: 1457734334-04bdf002ee323f40001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 11WUFZBHxWndxQOZ for ; Fri, 11 Mar 2016 14:12:14 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 838562AD4 for ; Fri, 11 Mar 2016 16:12:01 -0600 (CST) Subject: [PATCH 3/4] xfs: remove put_value from attr ->put_listent context To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 3/4] xfs: remove put_value from attr ->put_listent context References: <56E3425E.40509@redhat.com> From: Eric Sandeen Message-ID: <56E342BD.2030103@sandeen.net> Date: Fri, 11 Mar 2016 16:12:13 -0600 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <56E3425E.40509@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1457734334 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27769 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The put_value context member is never set; remove it and the conditional test in xfs_attr3_leaf_list_int(). Signed-off-by: Eric Sandeen --- fs/xfs/xfs_attr.h | 1 - fs/xfs/xfs_attr_list.c | 26 +------------------------- 2 files changed, 1 insertions(+), 26 deletions(-) diff --git a/fs/xfs/xfs_attr.h b/fs/xfs/xfs_attr.h index dab4f41..e3da5d4 100644 --- a/fs/xfs/xfs_attr.h +++ b/fs/xfs/xfs_attr.h @@ -127,7 +127,6 @@ typedef struct xfs_attr_list_context { int firstu; /* first used byte in buffer */ int flags; /* from VOP call */ int resynch; /* T/F: resynch with cursor */ - int put_value; /* T/F: need value for listent */ put_listent_func_t put_listent; /* list output fmt function */ int index; /* index into output buffer */ } xfs_attr_list_context_t; diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index 1d36d78..900164c 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -435,35 +435,11 @@ xfs_attr3_leaf_list_int( int valuelen = be32_to_cpu(name_rmt->valuelen); - if (context->put_value) { - xfs_da_args_t args; - - memset((char *)&args, 0, sizeof(args)); - args.geo = context->dp->i_mount->m_attr_geo; - args.dp = context->dp; - args.whichfork = XFS_ATTR_FORK; - args.valuelen = valuelen; - args.rmtvaluelen = valuelen; - args.value = kmem_alloc(valuelen, KM_SLEEP | KM_NOFS); - args.rmtblkno = be32_to_cpu(name_rmt->valueblk); - args.rmtblkcnt = xfs_attr3_rmt_blocks( - args.dp->i_mount, valuelen); - retval = xfs_attr_rmtval_get(&args); - if (retval) - return retval; - retval = context->put_listent(context, - entry->flags, - name_rmt->name, - (int)name_rmt->namelen, - valuelen); - kmem_free(args.value); - } else { - retval = context->put_listent(context, + retval = context->put_listent(context, entry->flags, name_rmt->name, (int)name_rmt->namelen, valuelen); - } if (retval) return retval; } -- 1.7.1 From sandeen@sandeen.net Fri Mar 11 16:12:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5A5F87CA1 for ; Fri, 11 Mar 2016 16:12:40 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2021C8F8033 for ; Fri, 11 Mar 2016 14:12:39 -0800 (PST) X-ASG-Debug-ID: 1457734358-04bdf002ee323f80001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id vV31cr6gnZLcDGD5 for ; Fri, 11 Mar 2016 14:12:38 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 6D8042AD4 for ; Fri, 11 Mar 2016 16:12:25 -0600 (CST) Subject: [PATCH 4/4] xfs: collapse cases in xfs_attr3_leaf_list_int To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 4/4] xfs: collapse cases in xfs_attr3_leaf_list_int References: <56E3425E.40509@redhat.com> From: Eric Sandeen Message-ID: <56E342D5.7000900@sandeen.net> Date: Fri, 11 Mar 2016 16:12:37 -0600 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <56E3425E.40509@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1457734358 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27769 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Consolidate the 2 calls to ->put_listent in xfs_attr3_leaf_list_int(), by setting up name, namelen, and valuelen for the local vs remote cases, then call ->put_listent and do the error handling all in one spot. Signed-off-by: Eric Sandeen --- fs/xfs/xfs_attr_list.c | 42 ++++++++++++++++++++---------------------- 1 files changed, 20 insertions(+), 22 deletions(-) diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index 900164c..007be5c 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -410,6 +410,9 @@ xfs_attr3_leaf_list_int( */ retval = 0; for (; i < ichdr.count; entry++, i++) { + char *name; + int namelen, valuelen; + if (be32_to_cpu(entry->hashval) != cursor->hashval) { cursor->hashval = be32_to_cpu(entry->hashval); cursor->offset = 0; @@ -419,30 +422,25 @@ xfs_attr3_leaf_list_int( continue; /* skip incomplete entries */ if (entry->flags & XFS_ATTR_LOCAL) { - xfs_attr_leaf_name_local_t *name_loc = - xfs_attr3_leaf_name_local(leaf, i); - - retval = context->put_listent(context, - entry->flags, - name_loc->nameval, - (int)name_loc->namelen, - be16_to_cpu(name_loc->valuelen)); - if (retval) - return retval; + xfs_attr_leaf_name_local_t *name_loc; + + name_loc = xfs_attr3_leaf_name_local(leaf, i); + name = name_loc->nameval; + namelen = name_loc->namelen; + valuelen = be16_to_cpu(name_loc->valuelen); } else { - xfs_attr_leaf_name_remote_t *name_rmt = - xfs_attr3_leaf_name_remote(leaf, i); - - int valuelen = be32_to_cpu(name_rmt->valuelen); - - retval = context->put_listent(context, - entry->flags, - name_rmt->name, - (int)name_rmt->namelen, - valuelen); - if (retval) - return retval; + xfs_attr_leaf_name_remote_t *name_rmt; + + name_rmt = xfs_attr3_leaf_name_remote(leaf, i); + name = name_rmt->name; + namelen = name_rmt->namelen; + valuelen = be32_to_cpu(name_rmt->valuelen); } + + retval = context->put_listent(context, entry->flags, + name, namelen, valuelen); + if (retval) + return retval; if (context->seen_enough) break; cursor->offset++; -- 1.7.1 From jra@samba.org Fri Mar 11 17:03:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 ADDA07CA0 for ; Fri, 11 Mar 2016 17:03:59 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7E215304043 for ; Fri, 11 Mar 2016 15:03:56 -0800 (PST) X-ASG-Debug-ID: 1457737432-04cbb00b7233be10001-NocioJ Received: from hr2.samba.org (hr2.samba.org [144.76.82.148]) by cuda.sgi.com with ESMTP id SDYlLEXUyNVHGGs7 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 11 Mar 2016 15:03:53 -0800 (PST) X-Barracuda-Envelope-From: jra@samba.org X-Barracuda-Apparent-Source-IP: 144.76.82.148 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=samba.org; s=42627210; h=Message-ID:Cc:To:From:Date; bh=De0TaqLNNaj8XVPUjrISdJ78d2pgTv8jeGm9Ahg+yGI=; b=aQYLYFhwDOu9nX/DT8zV2EAquPZACDJjRacPJh6W98DOKUWT4DQBS+jitOV6QWf9XVllAwxtxCNPVNZHCEeFXQO1/sFh/MsWCvI7KXXX78boAgwj6hVBXnXktU3U4qHGTMJvlQtlL4IaPfV8cuO+v8kXu5G2na8KOMsfYnccswA=; Received: from [127.0.0.2] (localhost [127.0.0.1]) by hr2.samba.org with esmtpsa (TLS1.2:RSA_AES_128_CBC_SHA1:128) (Exim) id 1aeW5T-0007Qk-9A; Fri, 11 Mar 2016 23:03:15 +0000 Date: Fri, 11 Mar 2016 15:02:54 -0800 From: Jeremy Allison To: Steve French Cc: Andreas Gruenbacher , Christoph Hellwig , Alexander Viro , "J. Bruce Fields" , Linux NFS Mailing List , Theodore Ts'o , "linux-cifs@vger.kernel.org" , Linux API , Trond Myklebust , LKML , XFS Developers , Andreas Dilger , linux-fsdevel , Jeff Layton , linux-ext4 , Anna Schumaker Subject: Re: [PATCH v18 00/22] Richacls (Core and Ext4) Message-ID: <20160311230254.GG2792@jra3> X-ASG-Orig-Subj: Re: [PATCH v18 00/22] Richacls (Core and Ext4) Reply-To: Jeremy Allison References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <20160311140134.GA14808@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: hr2.samba.org[144.76.82.148] X-Barracuda-Start-Time: 1457737433 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27771 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Fri, Mar 11, 2016 at 02:05:16PM -0600, Steve French wrote: > Sounds like I need to quickly rework the SMB3 ACL helper functions > for cifs.ko > > Also do you know where is the current version of the corresponding > vfs_richacl for > Samba which works with the current RichACL format? I have a patch for a new vfs_richacl somewhere. I remember sending it to Andreas for testing... From poornima.gunasekera@mea.gov.lk Sat Mar 12 04:26:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9B92329DF8 for ; Sat, 12 Mar 2016 04:26:22 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 701068F8039 for ; Sat, 12 Mar 2016 02:26:19 -0800 (PST) X-ASG-Debug-ID: 1457778375-04cb6c7f2946b20001-NocioJ Received: from vije.mea.gov.lk (vije.mea.gov.lk [203.115.21.154]) by cuda.sgi.com with ESMTP id VCfOhoZXw5Q3Fnka; Sat, 12 Mar 2016 02:26:15 -0800 (PST) X-Barracuda-Envelope-From: poornima.gunasekera@mea.gov.lk X-Barracuda-Apparent-Source-IP: 203.115.21.154 Received: from localhost (localhost.localdomain [127.0.0.1]) by vije.mea.gov.lk (Postfix) with ESMTP id 54A1A1E23AB; Sat, 12 Mar 2016 15:55:58 +0530 (IST) X-Virus-Scanned: amavisd-new at mea.gov.lk Received: from vije.mea.gov.lk ([127.0.0.1]) by localhost (vije.mea.gov.lk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id nP8O16EaFhRN; Sat, 12 Mar 2016 15:55:57 +0530 (IST) Received: from vije.mea.gov.lk (vije.mea.gov.lk [203.115.21.154]) by vije.mea.gov.lk (Postfix) with ESMTP id 3EB851E2387; Sat, 12 Mar 2016 15:55:56 +0530 (IST) Date: Sat, 12 Mar 2016 15:55:56 +0530 (IST) From: Jack Reply-To: Jack <2936410069@qq.com> Message-ID: <9041934.31407.1457778356238.JavaMail.root@vije> Subject: hi beautiful MIME-Version: 1.0 X-ASG-Orig-Subj: hi beautiful Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [77.234.43.148] X-Mailer: Zimbra 6.0.7_GA_2473.F11 (zclient/6.0.7_GA_2473.F11) To: undisclosed-recipients:; X-Barracuda-Connect: vije.mea.gov.lk[203.115.21.154] X-Barracuda-Start-Time: 1457778375 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.20 X-Barracuda-Spam-Status: No, SCORE=2.20 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA620a, BSF_SC7_SA298e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27783 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.20 BSF_SC7_SA298e Custom Rule SA298e 2.00 BSF_SC0_SA620a Custom Rule SA620a hi, I am seriously looking for some love and affection, I'm an adventurous, hardworking, seriously committed and kind person. I would like to find someone who shares my commitment to live, health and fitness, but also has unique interests and wants to try new things with me, for the rest of our lives. I know it will be difficult for you to understand, but I will be glad if you to write me and tell me a little about yourself and if you will be interested in knowing more about me and I hope this will be the beginning of a very successful relationship for us. Kind regards, Jack. From idra@samba.org Sat Mar 12 15:13:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 E3CD97CA1 for ; Sat, 12 Mar 2016 15:13:22 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4AA81AC002 for ; Sat, 12 Mar 2016 13:13:19 -0800 (PST) X-ASG-Debug-ID: 1457817195-04cb6c7f2a6a660001-NocioJ Received: from hr2.samba.org (hr2.samba.org [144.76.82.148]) by cuda.sgi.com with ESMTP id UXXlwzNH2x8f1kH0 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 12 Mar 2016 13:13:16 -0800 (PST) X-Barracuda-Envelope-From: idra@samba.org X-Barracuda-Apparent-Source-IP: 144.76.82.148 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=samba.org; s=42627210; h=Date:Cc:To:From:Message-ID; bh=3ewMiSVIQcKauZn3jdBq8SQJzAHobdSjVNoxHfC0FXs=; b=jFuiCNM4Zkc5QJZDIcN/7Dl2HttMTkpjBVeBEZVjyTcySK66jFTXSXxjzswmJAaD1+NaYXdxUCRXIhkMSUhRTTcRqbrm+nFEuOmB+0oPq4G0rhI7ztp//rfM9LTAxmFFtwpdQ0IWZMJIYQabp74CnUcrEJfQMz+I0b0pXcQ48+o=; Received: from [127.0.0.2] (localhost [127.0.0.1]) by hr2.samba.org with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim) id 1aeqpy-0000sy-2L; Sat, 12 Mar 2016 21:12:38 +0000 Message-ID: <1457817147.3540.28.camel@samba.org> Subject: Re: [PATCH v18 00/22] Richacls (Core and Ext4) From: Simo X-ASG-Orig-Subj: Re: [PATCH v18 00/22] Richacls (Core and Ext4) To: "J. Bruce Fields" , Christoph Hellwig Cc: Andreas Gruenbacher , Alexander Viro , linux-nfs@vger.kernel.org, Theodore Ts'o , linux-cifs@vger.kernel.org, linux-api@vger.kernel.org, Trond Myklebust , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Andreas Dilger , linux-fsdevel@vger.kernel.org, Jeff Layton , linux-ext4@vger.kernel.org, Anna Schumaker Date: Sat, 12 Mar 2016 16:12:27 -0500 In-Reply-To: <20160311140757.GB13178@fieldses.org> References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <20160311140134.GA14808@infradead.org> <20160311140757.GB13178@fieldses.org> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.18.5.1 (3.18.5.1-1.fc23) Mime-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: idra@samba.org X-Barracuda-Connect: hr2.samba.org[144.76.82.148] X-Barracuda-Start-Time: 1457817196 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27794 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Fri, 2016-03-11 at 09:07 -0500, J. Bruce Fields wrote: > On Fri, Mar 11, 2016 at 06:01:34AM -0800, Christoph Hellwig wrote: > > > > On Mon, Feb 29, 2016 at 09:17:05AM +0100, Andreas Gruenbacher > > wrote: > > > > > > Al, > > > > > > could you please make sure you are happy with the current version > > > of the > > > richacl patch queue for the next merge window? > > I'm still not happy. > > > > For one I still see no reason to merge this broken ACL model at > > all. > > It provides our actualy Linux users no benefit at all, while > > breaking > > a lot of assumptions, especially by adding allow and deny ACE at > > the > > same sime. > Could you explain what you mean by "adding allow and deny ACE at the > same time"? > > > > > It also doesn't help with the issue that the main thing it's trying > > to be compatible with (Windows) actually uses a fundamentally > > different > > identifier to apply the ACLs to - as long as you're still limited > > to users and groups and not guids we'll still have that mapping > > problem > > anyway. > Agreed, but, one step at a time?  My impression is that the Samba > people > still consider this a step forward for Linux compatibility. It is a step forward, but being able to store SIDs in the ACL, would be a much better one. Simo. > --b. > > > > > > > But besides that fundamental question on the purpose of it I also > > don't think the code is suitable, more in the individual patches. > -- > To unsubscribe from this list: send the line "unsubscribe linux-cifs" > in > the body of a message to majordomo@vger.kernel.org > More majordomo info at  http://vger.kernel.org/majordomo-info.html From agruenba@redhat.com Sun Mar 13 18:02:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0BE007CA1 for ; Sun, 13 Mar 2016 18:02:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D278B8F8035 for ; Sun, 13 Mar 2016 16:02:15 -0700 (PDT) X-ASG-Debug-ID: 1457910133-04cb6c7f29a2ea0001-NocioJ Received: from mail-vk0-f43.google.com (mail-vk0-f43.google.com [209.85.213.43]) by cuda.sgi.com with ESMTP id cv7nZFlkzGgKWTwd (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 13 Mar 2016 16:02:13 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.85.213.43 Received: by mail-vk0-f43.google.com with SMTP id k1so189707204vkb.0 for ; Sun, 13 Mar 2016 16:02:13 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=uKzHw5dnWduQn9aJ/UZDz2T+HacnryPW6QTS76jEZmg=; b=SOKyS3ac8yGCU7bD0EJSt8e3ZfNYGYeUBXRphZ0+vfcI2DH68VkHPC+aqcsu0zNGXM 6iTdH4rtrGyrG271dDigXKsPLWz8UjlLUEW32nOLZuPfp3WyN5LrxuwjCDgOSsrVtzes GOYaXuZkdHsXiMwbShojCRO4dCj7y0Wvh5gSEYQVxvmADRFF5FzbhvHpBJwFSVsrDKfW 0SPppXjaeB0gcbpwGOQqiTP0e+eqxBWuQFuiT1q10Jrdvi1KObc3vqVD+WRtpxm7TZpk N059ViJuxjQ1gJltYVzxJ8r8TqbdGS2VBCyT15FvJ0uOC/seduK2wh1Ov1YJ3OuC9FlU 9HzA== X-Gm-Message-State: AD7BkJK3VlVjywCerbjOAmLG+gP71jl97xwKh1NW51AP3aSl7Dn8e/SfiRxOT625mY0nP2i1UG+X+XaMhNXpaPR+ MIME-Version: 1.0 X-Received: by 10.31.52.65 with SMTP id b62mr21935246vka.61.1457910133198; Sun, 13 Mar 2016 16:02:13 -0700 (PDT) Received: by 10.159.33.173 with HTTP; Sun, 13 Mar 2016 16:02:13 -0700 (PDT) In-Reply-To: <20160311230254.GG2792@jra3> References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <20160311140134.GA14808@infradead.org> <20160311230254.GG2792@jra3> Date: Mon, 14 Mar 2016 00:02:13 +0100 Message-ID: Subject: Re: [PATCH v18 00/22] Richacls (Core and Ext4) From: Andreas Gruenbacher X-ASG-Orig-Subj: Re: [PATCH v18 00/22] Richacls (Core and Ext4) To: Jeremy Allison Cc: Steve French , Christoph Hellwig , Alexander Viro , "J. Bruce Fields" , Linux NFS Mailing List , "Theodore Ts'o" , "linux-cifs@vger.kernel.org" , Linux API , Trond Myklebust , LKML , XFS Developers , Andreas Dilger , linux-fsdevel , Jeff Layton , linux-ext4 , Anna Schumaker Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-vk0-f43.google.com[209.85.213.43] X-Barracuda-Start-Time: 1457910133 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27819 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sat, Mar 12, 2016 at 12:02 AM, Jeremy Allison wrote: > On Fri, Mar 11, 2016 at 02:05:16PM -0600, Steve French wrote: >> Sounds like I need to quickly rework the SMB3 ACL helper functions >> for cifs.ko >> >> Also do you know where is the current version of the corresponding >> vfs_richacl for >> Samba which works with the current RichACL format? > > I have a patch for a new vfs_richacl somewhere. I remember > sending it to Andreas for testing... Ah, the patch was for testing, not resting ... how could I get that mixed up. I've applied your patch to the latest master branch, made it compile again, and fixed a few obvious problems. The results I get with smbcacls look reasonable now. The code is here: https://github.com/andreas-gruenbacher/samba richacl I've used the following smb.conf: [richacl] comment = Richacl directory path = /mnt/ext4 vfs objects = richacl writeable = yes browseable = yes Is there a particular reason why you didn't make vfs_richacl a dynamically loadable module? Thanks, Andreas From agruenba@redhat.com Sun Mar 13 18:08:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DEE4B7CA3 for ; Sun, 13 Mar 2016 18:08:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B4092304039 for ; Sun, 13 Mar 2016 16:08:35 -0700 (PDT) X-ASG-Debug-ID: 1457910511-04cbb00b6f3c26e0001-NocioJ Received: from mail-vk0-f41.google.com (mail-vk0-f41.google.com [209.85.213.41]) by cuda.sgi.com with ESMTP id Vz5QiEpC4E5rQkKS (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 13 Mar 2016 16:08:32 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.85.213.41 Received: by mail-vk0-f41.google.com with SMTP id e6so189641578vkh.2 for ; Sun, 13 Mar 2016 16:08:32 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=zHlei+UG4oGUejoSqay4CMern2ph0ks2osh36uOLEjY=; b=gWpRvCJGLoiQNkVzkWXt+yZ8zn8ZM72EDZdm5UCrvXOby4QbNjAU2T8AsvrRKpCYvA qm4f46cSYBPhyLBfdgwAVQdLUmRbnDFryaca5TCKoHMQgwfG4c/hgaaN5auJuAZhQsiX Oog93CDrUtXD3j4XcPc/u3ZkBd3FSWUcmyYwZoHXMKNnkMqMzdMQKL4WbTk/z2RgddFp LuC5Tnj+2PkyiKPSniVpsXCusZLJ5c6EQ9BPyG+oCKC3fFo2bK8a0Jf+X0RQHVdyJkJz g3dndZhyiNq93dNllOiQrtzgLvt1WxBsJqqouy9vgjK6Pwu39TSvc7mkm7u+VJvNiZCl O7jQ== X-Gm-Message-State: AD7BkJK4xlm5tPCxX8J9Lq1fsZXNRK8Jfwe4khZ4jxW6piR1IvawSP7VdVus2dqK/c6XXIMuPKTwFwfNTb0Hmz0i MIME-Version: 1.0 X-Received: by 10.31.162.20 with SMTP id l20mr19609773vke.137.1457910511709; Sun, 13 Mar 2016 16:08:31 -0700 (PDT) Received: by 10.159.33.173 with HTTP; Sun, 13 Mar 2016 16:08:31 -0700 (PDT) In-Reply-To: <20160311142719.GG14808@infradead.org> References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <1456733847-17982-22-git-send-email-agruenba@redhat.com> <20160311142719.GG14808@infradead.org> Date: Mon, 14 Mar 2016 00:08:31 +0100 Message-ID: Subject: Re: [PATCH v18 21/22] ext4: Add richacl support From: Andreas Gruenbacher X-ASG-Orig-Subj: Re: [PATCH v18 21/22] ext4: Add richacl support To: Christoph Hellwig Cc: Alexander Viro , "Aneesh Kumar K.V" , "J. Bruce Fields" , Linux NFS Mailing List , "Theodore Ts'o" , linux-cifs@vger.kernel.org, Linux API , Trond Myklebust , LKML , XFS Developers , Andreas Dilger , linux-fsdevel , Jeff Layton , linux-ext4 , Anna Schumaker Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-vk0-f41.google.com[209.85.213.41] X-Barracuda-Start-Time: 1457910512 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27819 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Mar 11, 2016 at 3:27 PM, Christoph Hellwig wrote: >> +static inline int >> +ext4_acl_chmod(struct inode *inode, umode_t mode) >> +{ >> + if (IS_RICHACL(inode)) >> + return richacl_chmod(inode, inode->i_mode); >> + return posix_acl_chmod(inode, inode->i_mode); >> +} > > Thi isn't ext4-specific and potentially duplicated in every caller. > Please provide this as a common helper. > > Also while we're at it, the mode argument is ignore and the function > always uses inode->i_mode instead. > >> +ext4_get_richacl(struct inode *inode) >> +{ >> + const int name_index = EXT4_XATTR_INDEX_RICHACL; >> + void *value = NULL; >> + struct richacl *acl = NULL; >> + int retval; >> + >> + retval = ext4_xattr_get(inode, name_index, "", NULL, 0); >> + if (retval > 0) { >> + value = kmalloc(retval, GFP_NOFS); >> + if (!value) >> + return ERR_PTR(-ENOMEM); >> + retval = ext4_xattr_get(inode, name_index, "", value, retval); >> + } >> + if (retval > 0) { >> + acl = richacl_from_xattr(&init_user_ns, value, retval); >> + if (acl == ERR_PTR(-EINVAL)) >> + acl = ERR_PTR(-EIO); > > Shouldn't richacl_from_xattr return the error pointer that ->get_richacl > callers expect? The xattr representation is the same on disk and at the xattr syscall layer, and so richacl_from_xattr is used for converting into the in-memory representation in both cases. The error codes are not the same when a user supplies an invalid value via setxattr or NFS and when an invalid xattr is read from disk though. I'll add a parameter to richacl_from_xattr to make this more explicit. >> +static int >> +__ext4_set_richacl(handle_t *handle, struct inode *inode, struct richacl *acl) >> +{ >> + const int name_index = EXT4_XATTR_INDEX_RICHACL; >> + umode_t mode = inode->i_mode; >> + int retval, size; >> + void *value; >> + >> + if (richacl_equiv_mode(acl, &mode) == 0) { >> + inode->i_ctime = ext4_current_time(inode); >> + inode->i_mode = mode; >> + ext4_mark_inode_dirty(handle, inode); >> + return __ext4_remove_richacl(handle, inode); >> + } > > Should this check for a NULL acl instead of special casing that > in ext4_set_richacl? I'm not sure I understand what you mean. When the >> +int >> +ext4_init_richacl(handle_t *handle, struct inode *inode, struct inode *dir) >> +{ >> + struct richacl *acl = richacl_create(&inode->i_mode, dir); >> + int error; >> + >> + error = PTR_ERR(acl); >> + if (IS_ERR(acl)) >> + return error; > > if (IS_ERR(acl)) > return PTR_ERR(acl); > >> + if (acl) { >> + error = __ext4_set_richacl(handle, inode, acl); >> + richacl_put(acl); >> + } > > Shouldn't richacl_create return NULL if the ACL is equivalent to the > mode bits instead of letting every filesystem figure that out on it's > own? > From agruenba@redhat.com Sun Mar 13 18:50:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7F34D7CA6 for ; Sun, 13 Mar 2016 18:50:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2DBFF304048 for ; Sun, 13 Mar 2016 16:50:00 -0700 (PDT) X-ASG-Debug-ID: 1457912997-04bdf002eb3b5440001-NocioJ Received: from mail-vk0-f43.google.com (mail-vk0-f43.google.com [209.85.213.43]) by cuda.sgi.com with ESMTP id HXgWBfZM12iPOSjM (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 13 Mar 2016 16:49:57 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.85.213.43 Received: by mail-vk0-f43.google.com with SMTP id e185so190154776vkb.1 for ; Sun, 13 Mar 2016 16:49: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:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=ByYqsCxXR4RzqolRCCNCnP5kFPFpmE6BIGP24WWyl1c=; b=HUcv7nREvWenLNmNlek7GveU9tlQP6MyksssUM40PfZqio8z945S2/iLUdxKkZDDit 1ZRbQ9CVI9DM7eGOYanf4SW2VfIOMb4dbdKAKGFJmQtlFMW7mEU+ID5IOPzb+54SGvKp vMIo5maEoBBX4sRo9B1ET5wLj3zmzj3l2n0PJtqPbFB4xCeAGprM2JU8pykY+tlWCCkO pz3CdA9XRB1BQqAQdjEFMk+/I1sYQz5EL0K/JLUKZWBV9wlglRf6n3iYLNrG+jxrWt86 i5mRHXPEUwCkgHUaelp45x/zhRxtdzB2CEQiIk2UEk+2iF2w5OF5eAR9sPVylZQNr2zA emag== X-Gm-Message-State: AD7BkJLoSdYEOiATkndUrpuuLJxoPD2rC4GeP/7c606UUz87shJgcobU9W1y6k0jfG2MbTAHDP8yY44fXiVOFduy MIME-Version: 1.0 X-Received: by 10.31.52.65 with SMTP id b62mr22051839vka.61.1457912997052; Sun, 13 Mar 2016 16:49:57 -0700 (PDT) Received: by 10.159.33.173 with HTTP; Sun, 13 Mar 2016 16:49:57 -0700 (PDT) In-Reply-To: <20160311142719.GG14808@infradead.org> References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <1456733847-17982-22-git-send-email-agruenba@redhat.com> <20160311142719.GG14808@infradead.org> Date: Mon, 14 Mar 2016 00:49:57 +0100 Message-ID: Subject: Re: [PATCH v18 21/22] ext4: Add richacl support From: Andreas Gruenbacher X-ASG-Orig-Subj: Re: [PATCH v18 21/22] ext4: Add richacl support To: Christoph Hellwig Cc: Alexander Viro , "Aneesh Kumar K.V" , "J. Bruce Fields" , Linux NFS Mailing List , "Theodore Ts'o" , linux-cifs@vger.kernel.org, Linux API , Trond Myklebust , LKML , XFS Developers , Andreas Dilger , linux-fsdevel , Jeff Layton , linux-ext4 , Anna Schumaker Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-vk0-f43.google.com[209.85.213.43] X-Barracuda-Start-Time: 1457912997 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27819 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Mar 11, 2016 at 3:27 PM, Christoph Hellwig wrote: >> +static int >> +__ext4_set_richacl(handle_t *handle, struct inode *inode, struct richacl *acl) >> +{ >> + const int name_index = EXT4_XATTR_INDEX_RICHACL; >> + umode_t mode = inode->i_mode; >> + int retval, size; >> + void *value; >> + >> + if (richacl_equiv_mode(acl, &mode) == 0) { >> + inode->i_ctime = ext4_current_time(inode); >> + inode->i_mode = mode; >> + ext4_mark_inode_dirty(handle, inode); >> + return __ext4_remove_richacl(handle, inode); >> + } > > Should this check for a NULL acl instead of special casing that > in ext4_set_richacl? I'm not sure I understand what you mean. When iop->set_richacl is called with a richacl that is mode-equivalent, the file permission bits need to be updated and any existing acl needs to be removed. Doing this at the vfs level would result in two calls, iop->setattr and iop->set_richacl, which can cause problems. To remove an existing acl without setting the mode, set_richacl is called with a NULL richacl. __ext4_set_richacl() was split into __ext4_set_richacl() and __ext4_remove_richacl() to align with the xfs code due to the following comment from Dave Chinner: http://oss.sgi.com/archives/xfs/2015-10/msg00354.html Diff here: https://git.kernel.org/cgit/linux/kernel/git/agruen/linux-richacl.git/diff/fs/ext4/richacl.c?id=richacl-2015-10-16&id2=richacl-2015-10-12 >> +int >> +ext4_init_richacl(handle_t *handle, struct inode *inode, struct inode *dir) >> +{ >> + struct richacl *acl = richacl_create(&inode->i_mode, dir); >> + int error; >> + >> + error = PTR_ERR(acl); >> + if (IS_ERR(acl)) >> + return error; > > if (IS_ERR(acl)) > return PTR_ERR(acl); > >> + if (acl) { >> + error = __ext4_set_richacl(handle, inode, acl); >> + richacl_put(acl); >> + } > > Shouldn't richacl_create return NULL if the ACL is equivalent to the > mode bits instead of letting every filesystem figure that out on it's > own? Hm, that's what it does? Thanks, Andreas From jra@samba.org Sun Mar 13 22:54:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 AB6487CA0 for ; Sun, 13 Mar 2016 22:54:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7F4CB8F8033 for ; Sun, 13 Mar 2016 20:54:56 -0700 (PDT) X-ASG-Debug-ID: 1457927692-04cb6c7f28b6f80001-NocioJ Received: from hr2.samba.org (hr2.samba.org [144.76.82.148]) by cuda.sgi.com with ESMTP id 0PCFrl488d5hbqke (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 13 Mar 2016 20:54:54 -0700 (PDT) X-Barracuda-Envelope-From: jra@samba.org X-Barracuda-Apparent-Source-IP: 144.76.82.148 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=samba.org; s=42627210; h=Message-ID:Cc:To:From:Date; bh=9MdGarrpdlwkObTz54TRN52UkP3Q3haEmpt9/rP3mLk=; b=WBfYaBXBHoU+n5wek7fFrA181m8pTOtVdr2MPqZ/mBTTRYKinHp2OkgghCEyFGjwQc4bx1V0FNwgGumlHfsjhQf9AjAr9DskK/6CJYx3UTPLg1jBDtnCVOwaOxP1AyDXCmRCBw/SKBk8wR9cbc4v4zKxzlyHR9+cINOm1xTcP1k=; Received: from [127.0.0.2] (localhost [127.0.0.1]) by hr2.samba.org with esmtpsa (TLS1.2:RSA_AES_128_CBC_SHA1:128) (Exim) id 1afJaJ-0005uK-4L; Mon, 14 Mar 2016 03:54:23 +0000 Date: Sun, 13 Mar 2016 20:54:24 -0700 From: Jeremy Allison To: Andreas Gruenbacher Cc: Steve French , Christoph Hellwig , Alexander Viro , "J. Bruce Fields" , Linux NFS Mailing List , Theodore Ts'o , "linux-cifs@vger.kernel.org" , Linux API , Trond Myklebust , LKML , XFS Developers , Andreas Dilger , linux-fsdevel , Jeff Layton , linux-ext4 , Anna Schumaker Subject: Re: [PATCH v18 00/22] Richacls (Core and Ext4) Message-ID: <20160314035424.GA7131@jeremy-HP> X-ASG-Orig-Subj: Re: [PATCH v18 00/22] Richacls (Core and Ext4) Reply-To: Jeremy Allison References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <20160311140134.GA14808@infradead.org> <20160311230254.GG2792@jra3> 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: hr2.samba.org[144.76.82.148] X-Barracuda-Start-Time: 1457927693 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27822 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Mon, Mar 14, 2016 at 12:02:13AM +0100, Andreas Gruenbacher wrote: > On Sat, Mar 12, 2016 at 12:02 AM, Jeremy Allison wrote: > > On Fri, Mar 11, 2016 at 02:05:16PM -0600, Steve French wrote: > >> Sounds like I need to quickly rework the SMB3 ACL helper functions > >> for cifs.ko > >> > >> Also do you know where is the current version of the corresponding > >> vfs_richacl for > >> Samba which works with the current RichACL format? > > > > I have a patch for a new vfs_richacl somewhere. I remember > > sending it to Andreas for testing... > > Ah, the patch was for testing, not resting ... how could I get that mixed up. :-). > I've applied your patch to the latest master branch, made it compile > again, and fixed a few obvious problems. The results I get with > smbcacls look reasonable now. > > The code is here: > https://github.com/andreas-gruenbacher/samba richacl > > I've used the following smb.conf: > [richacl] > comment = Richacl directory > path = /mnt/ext4 > vfs objects = richacl > writeable = yes > browseable = yes Great ! Once richacls gets into the kernel I'll submit this into the Samba master branch. > Is there a particular reason why you didn't make vfs_richacl a > dynamically loadable module? Probably sheer lazyness :-). From agruenba@redhat.com Mon Mar 14 08:02:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 61DB77CAF for ; Mon, 14 Mar 2016 08:02:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 347A430404E for ; Mon, 14 Mar 2016 06:02:37 -0700 (PDT) X-ASG-Debug-ID: 1457960554-04cb6c7f29cf2f0001-NocioJ Received: from mail-vk0-f54.google.com (mail-vk0-f54.google.com [209.85.213.54]) by cuda.sgi.com with ESMTP id OsaLfOccj72Ec6Kj (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 14 Mar 2016 06:02:34 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.85.213.54 Received: by mail-vk0-f54.google.com with SMTP id e6so206978458vkh.2 for ; Mon, 14 Mar 2016 06:02:34 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=5mrKBR7l0xqSTjfgf+g/RIyQOKdkVzdqqkcCIpEvJ60=; b=IZAw+MkzB9/6RVyZ1dbLRf52jUtAedVxE/HSxG1+xorwKdTZMbePFU0TB2giZSXQtn q6ewpitadImAeTipGmByhmDLcFeGaF+FCUes+EKP/1REmcQeRCeF9TtyBRdGwUxZfhfV BoH9pTxhyXiOZUhb31OrBj5PtwpjDjybrdEx8zQdcjufMNg6kithKKR9+u7HZ5sCUuhy cAy4b2YrsglTHfM1LczWCQrhT3A+OYga6YL8VhQLP1VqEuZSy5OhS+e7IKP0sb/Socks 13lbAjUR7WW53ayJ9+erys6mWUKbFN8T0NTm1PqowJaJHB1b4q1shiIuXIJKO8zt26dl URSA== X-Gm-Message-State: AD7BkJJyLh6ALpnuzB92BRD5moMuE/76j5EARnDjSmMHih0JTLsrXLq/aeLU/1PR9Yd+Czf+g17/tH6ll/xAnZ1k MIME-Version: 1.0 X-Received: by 10.31.183.209 with SMTP id h200mr24580522vkf.141.1457960553841; Mon, 14 Mar 2016 06:02:33 -0700 (PDT) Received: by 10.159.33.173 with HTTP; Mon, 14 Mar 2016 06:02:33 -0700 (PDT) In-Reply-To: <20160311142719.GG14808@infradead.org> References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <1456733847-17982-22-git-send-email-agruenba@redhat.com> <20160311142719.GG14808@infradead.org> Date: Mon, 14 Mar 2016 14:02:33 +0100 Message-ID: Subject: Re: [PATCH v18 21/22] ext4: Add richacl support From: Andreas Gruenbacher X-ASG-Orig-Subj: Re: [PATCH v18 21/22] ext4: Add richacl support To: Christoph Hellwig Cc: Alexander Viro , "Aneesh Kumar K.V" , "J. Bruce Fields" , Linux NFS Mailing List , "Theodore Ts'o" , linux-cifs@vger.kernel.org, Linux API , Trond Myklebust , LKML , XFS Developers , Andreas Dilger , linux-fsdevel , Jeff Layton , linux-ext4 , Anna Schumaker Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-vk0-f54.google.com[209.85.213.54] X-Barracuda-Start-Time: 1457960554 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27831 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Mar 11, 2016 at 3:27 PM, Christoph Hellwig wrote: >> +static inline int >> +ext4_acl_chmod(struct inode *inode, umode_t mode) >> +{ >> + if (IS_RICHACL(inode)) >> + return richacl_chmod(inode, inode->i_mode); >> + return posix_acl_chmod(inode, inode->i_mode); >> +} > > Thi isn't ext4-specific and potentially duplicated in every caller. > Please provide this as a common helper. This can go in neither fs.h nor posix_acl.h nor richacl.h unless we turn it into a macro, and I don't think we want to add a new header file for such extreme trivia. > Also while we're at it, the mode argument is ignore and the function > always uses inode->i_mode instead. Right, thanks. Andreas From molienase@yahoo.com Mon Mar 14 08:23:47 2016 Return-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.6 required=5.0 tests=BANG_GUAR,FORGED_YAHOO_RCVD, FREEMAIL_FROM,T_FILL_THIS_FORM_SHORT 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 04E6A7CB1 for ; Mon, 14 Mar 2016 08:23:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CBDF830404E for ; Mon, 14 Mar 2016 06:23:46 -0700 (PDT) X-ASG-Debug-ID: 1457961822-04cbb00b703e9700001-NocioJ Received: from zhuyu.305503.com (zhuyu.305503.com [77.81.108.13]) by cuda.sgi.com with ESMTP id YsT4ryOg0TbbTy1d for ; Mon, 14 Mar 2016 06:23:43 -0700 (PDT) X-Barracuda-Envelope-From: molienase@yahoo.com X-Barracuda-Apparent-Source-IP: 77.81.108.13 To: xfs@oss.sgi.com Subject: Distribute a Necessary Safety Product Message-ID: <1e90f1be8c952a85f857f4509018df9a@minnetonkamoccasin.com> X-ASG-Orig-Subj: Distribute a Necessary Safety Product Date: Mon, 14 Mar 2016 14:08:36 +0100 From: "Jason Williams" Reply-To: christend@aliyun.com MIME-Version: 1.0 X-Mailer-LID: 3 X-Mailer-RecptId: 4686092 X-Mailer-SID: 1205 X-Mailer-Sent-By: 1 Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: zhuyu.305503.com[77.81.108.13] X-Barracuda-Start-Time: 1457961822 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.65 X-Barracuda-Spam-Status: No, SCORE=2.65 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BANG_GUAR, FORGED_YAHOO_RCVD, FORGED_YAHOO_RCVD_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27832 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.24 BANG_GUAR BODY: Something is emphatically guaranteed 0.00 FORGED_YAHOO_RCVD 'From' yahoo.com does not match 'Received' headers 1.41 FORGED_YAHOO_RCVD_2 'From' yahoo.com does not match 'Received' headers 26 YEAR OLD U.S. COMPANY NEEDS DISTRIBUTORS IN MANY COUNTRIES for our amazing slip-resistant floor product. One 30 minute application with our Amazing Anti-Slip Floor Treatment will make floors slip-resistant and safe for 4 years - Guaranteed! Indoors or Outdoors No Change in Appearance Typical Applications: Restaurant Kitchen Floors, Hotels, Hospitals, Office Buildings, etc. For use on: Ceramic, Porcelain and Quarry Tiles, Marble, Granite, Concrete, etc. Some of our satisfied customers: McDonald's, Kroger, Holiday Inn, Miami Children's Hospital Pfizer, etc. Please contact us for details and to see if there is a distributorship available in your country. $2,000-$4,000 INVENTORY INVESTMENT REQUIRED PLEASE INCLUDE YOUR NAME, COUNTRY & E-MAIL ADDRESS Jason Williams Email: carerynt@sina.com From molienase@yahoo.com Mon Mar 14 08:39:48 2016 Return-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.6 required=5.0 tests=BANG_GUAR,FORGED_YAHOO_RCVD, FREEMAIL_FROM,T_FILL_THIS_FORM_SHORT 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 027297CB3 for ; Mon, 14 Mar 2016 08:39:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 68F4AAC004 for ; Mon, 14 Mar 2016 06:39:44 -0700 (PDT) X-ASG-Debug-ID: 1457962779-04cbb00b713e9ff0001-NocioJ Received: from zhuyu.305503.com (zhuyu.305503.com [77.81.108.13]) by cuda.sgi.com with ESMTP id p4wjayaWDY8LQOyr for ; Mon, 14 Mar 2016 06:39:41 -0700 (PDT) X-Barracuda-Envelope-From: molienase@yahoo.com X-Barracuda-Apparent-Source-IP: 77.81.108.13 To: xfs@oss.sgi.com Subject: Distributorships Available Message-ID: X-ASG-Orig-Subj: Distributorships Available Date: Mon, 14 Mar 2016 14:37:12 +0100 From: "Jason Williams" Reply-To: christend@aliyun.com MIME-Version: 1.0 X-Mailer-LID: 8 X-Mailer-RecptId: 10449103 X-Mailer-SID: 1288 X-Mailer-Sent-By: 1 Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: zhuyu.305503.com[77.81.108.13] X-Barracuda-Start-Time: 1457962779 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.65 X-Barracuda-Spam-Status: No, SCORE=2.65 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BANG_GUAR, FORGED_YAHOO_RCVD, FORGED_YAHOO_RCVD_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27832 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.24 BANG_GUAR BODY: Something is emphatically guaranteed 0.00 FORGED_YAHOO_RCVD 'From' yahoo.com does not match 'Received' headers 1.41 FORGED_YAHOO_RCVD_2 'From' yahoo.com does not match 'Received' headers 26 YEAR OLD U.S. COMPANY NEEDS DISTRIBUTORS IN MANY COUNTRIES for our amazing slip-resistant floor product. One 30 minute application with our Amazing Anti-Slip Floor Treatment will make floors slip-resistant and safe for 4 years - Guaranteed! Indoors or Outdoors No Change in Appearance Typical Applications: Restaurant Kitchen Floors, Hotels, Hospitals, Office Buildings, etc. For use on: Ceramic, Porcelain and Quarry Tiles, Marble, Granite, Concrete, etc. Some of our satisfied customers: McDonald's, Kroger, Holiday Inn, Miami Children's Hospital Pfizer, etc. Please contact us for details and to see if there is a distributorship available in your country. $2,000-$4,000 INVENTORY INVESTMENT REQUIRED PLEASE INCLUDE YOUR NAME, COUNTRY & E-MAIL ADDRESS Jason Williams Email: carerynt@sina.com From agruenba@redhat.com Mon Mar 14 09:55:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2AC867CB4 for ; Mon, 14 Mar 2016 09:55:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id EF3E28F804B for ; Mon, 14 Mar 2016 07:55:31 -0700 (PDT) X-ASG-Debug-ID: 1457967329-04cb6c7f28d6f40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id DImwq1IA7V4Mao3M (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 14 Mar 2016 07:55:30 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 9C0C23F3A8; Mon, 14 Mar 2016 14:55:28 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-74.ams2.redhat.com [10.36.5.74]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2EEtN9d021293; Mon, 14 Mar 2016 10:55:23 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v19 00/23] Richacls (Core and Ext4) Date: Mon, 14 Mar 2016 15:54:59 +0100 X-ASG-Orig-Subj: [PATCH v19 00/23] Richacls (Core and Ext4) Message-Id: <1457967322-14886-1-git-send-email-agruenba@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: 1457967330 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Al, could you please merge the current richacl patch queue, up to and including the ext4 support? Changes since the last posting (https://lwn.net/Articles/677901/): * richacl_from_xattr now takes an invalid_error parameter specifying the error code to return when an xattr is invallid. This allows to better use this function when decoding an xattr stored on a filesystem as well as when decoding a user-provided xattr. * ext4_acl_chmod and xfs_acl_chmod have lost their mode parameter; they have aready been using inode->i_mode instead of the parameter. * Use __u8 instead of unsigned char in uapi headers. Drop left-over MODULE_LICENSE declarations. Use IS_ERR_OR_NULL instead of IS_ERR in ext4_init_richacl. * Rebased on top of v4.5. The complete patch queue is available here: git://git.kernel.org/pub/scm/linux/kernel/git/agruen/linux-richacl.git \ richacl-2016-03-14 The richacl user-space utilitites, man pages, and test suite are available here: https://github.com/andreas-gruenbacher/richacl Changes to other user-space packages for richacl: https://github.com/andreas-gruenbacher/coreutils https://github.com/andreas-gruenbacher/e2fsprogs https://github.com/andreas-gruenbacher/samba https://github.com/andreas-gruenbacher/xfsprogs-dev https://github.com/andreas-gruenbacher/nfs-utils Please see the richacl homepage for more information: http://www.bestbits.at/richacl/ Thanks, Andreas Andreas Gruenbacher (21): vfs: Add IS_ACL() and IS_RICHACL() tests vfs: Add MAY_CREATE_FILE and MAY_CREATE_DIR permission flags vfs: Add MAY_DELETE_SELF and MAY_DELETE_CHILD permission flags vfs: Make the inode passed to inode_change_ok non-const vfs: Add permission flags for setting file attributes richacl: In-memory representation and helper functions richacl: Permission mapping functions richacl: Compute maximum file masks from an acl richacl: Permission check algorithm posix_acl: Unexport acl_by_type and make it static posix_acl: Improve xattr fixup code vfs: Cache base_acl objects in inodes vfs: Add get_richacl and set_richacl inode operations vfs: Cache richacl in struct inode richacl: Update the file masks in chmod() richacl: Check if an acl is equivalent to a file mode richacl: Create-time inheritance richacl: Automatic Inheritance richacl: xattr mapping functions richacl: Add richacl xattr handler vfs: Add richacl permission checking Aneesh Kumar K.V (2): ext4: Add richacl support ext4: Add richacl feature flag drivers/staging/lustre/lustre/llite/llite_lib.c | 2 +- fs/Kconfig | 3 + fs/Makefile | 2 + fs/attr.c | 81 +++- fs/ext4/Kconfig | 11 + fs/ext4/Makefile | 1 + fs/ext4/ext4.h | 6 +- fs/ext4/file.c | 3 + fs/ext4/ialloc.c | 11 +- fs/ext4/inode.c | 12 +- fs/ext4/namei.c | 5 + fs/ext4/richacl.c | 137 ++++++ fs/ext4/richacl.h | 40 ++ fs/ext4/super.c | 49 +- fs/ext4/xattr.c | 7 + fs/f2fs/acl.c | 4 +- fs/inode.c | 15 +- fs/jffs2/acl.c | 10 +- fs/namei.c | 118 ++++- fs/posix_acl.c | 50 +- fs/richacl_base.c | 578 ++++++++++++++++++++++++ fs/richacl_inode.c | 333 ++++++++++++++ fs/richacl_xattr.c | 235 ++++++++++ fs/xattr.c | 29 +- include/linux/fs.h | 60 ++- include/linux/posix_acl.h | 13 +- include/linux/richacl.h | 208 +++++++++ include/linux/richacl_xattr.h | 31 ++ include/uapi/linux/Kbuild | 2 + include/uapi/linux/fs.h | 3 +- include/uapi/linux/richacl.h | 152 +++++++ include/uapi/linux/richacl_xattr.h | 44 ++ include/uapi/linux/xattr.h | 2 + 33 files changed, 2150 insertions(+), 107 deletions(-) create mode 100644 fs/ext4/richacl.c create mode 100644 fs/ext4/richacl.h create mode 100644 fs/richacl_base.c create mode 100644 fs/richacl_inode.c create mode 100644 fs/richacl_xattr.c create mode 100644 include/linux/richacl.h create mode 100644 include/linux/richacl_xattr.h create mode 100644 include/uapi/linux/richacl.h create mode 100644 include/uapi/linux/richacl_xattr.h -- 2.5.0 From agruenba@redhat.com Mon Mar 14 09:55:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A738529E07 for ; Mon, 14 Mar 2016 09:55:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0E639AC005 for ; Mon, 14 Mar 2016 07:55:34 -0700 (PDT) X-ASG-Debug-ID: 1457967333-04cbb00b713eda70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id CWwL81qjun7elO0n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 14 Mar 2016 07:55:33 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id F04A7486B1; Mon, 14 Mar 2016 14:55:32 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-74.ams2.redhat.com [10.36.5.74]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2EEtN9e021293; Mon, 14 Mar 2016 10:55:28 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v19 01/23] vfs: Add IS_ACL() and IS_RICHACL() tests Date: Mon, 14 Mar 2016 15:55:00 +0100 X-ASG-Orig-Subj: [PATCH v19 01/23] vfs: Add IS_ACL() and IS_RICHACL() tests Message-Id: <1457967322-14886-2-git-send-email-agruenba@redhat.com> In-Reply-To: <1457967322-14886-1-git-send-email-agruenba@redhat.com> References: <1457967322-14886-1-git-send-email-agruenba@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: 1457967333 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The vfs does not apply the umask for file systems that support acls. The test used for this used to be called IS_POSIXACL(). Switch to a new IS_ACL() test to check for either posix acls or richacls instead. Add a new MS_RICHACL flag and IS_RICHACL() test for richacls alone. The IS_POSIXACL() test is still needed by nfsd. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields Reviewed-by: Andreas Dilger --- fs/Kconfig | 3 +++ fs/namei.c | 8 ++++---- include/linux/fs.h | 12 ++++++++++++ include/uapi/linux/fs.h | 3 ++- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/fs/Kconfig b/fs/Kconfig index 9adee0d..f7b26f3 100644 --- a/fs/Kconfig +++ b/fs/Kconfig @@ -63,6 +63,9 @@ endif # BLOCK config FS_POSIX_ACL def_bool n +config FS_RICHACL + def_bool n + config EXPORTFS tristate diff --git a/fs/namei.c b/fs/namei.c index 9c590e0..68e1056 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -2861,7 +2861,7 @@ static int atomic_open(struct nameidata *nd, struct dentry *dentry, } mode = op->mode; - if ((open_flag & O_CREAT) && !IS_POSIXACL(dir)) + if ((open_flag & O_CREAT) && !IS_ACL(dir)) mode &= ~current_umask(); excl = (open_flag & (O_EXCL | O_CREAT)) == (O_EXCL | O_CREAT); @@ -3045,7 +3045,7 @@ static int lookup_open(struct nameidata *nd, struct path *path, /* Negative dentry, just create the file */ if (!dentry->d_inode && (op->open_flag & O_CREAT)) { umode_t mode = op->mode; - if (!IS_POSIXACL(dir->d_inode)) + if (!IS_ACL(dir->d_inode)) mode &= ~current_umask(); /* * This write is needed to ensure that a @@ -3620,7 +3620,7 @@ retry: if (IS_ERR(dentry)) return PTR_ERR(dentry); - if (!IS_POSIXACL(path.dentry->d_inode)) + if (!IS_ACL(path.dentry->d_inode)) mode &= ~current_umask(); error = security_path_mknod(&path, dentry, mode, dev); if (error) @@ -3689,7 +3689,7 @@ retry: if (IS_ERR(dentry)) return PTR_ERR(dentry); - if (!IS_POSIXACL(path.dentry->d_inode)) + if (!IS_ACL(path.dentry->d_inode)) mode &= ~current_umask(); error = security_path_mkdir(&path, dentry, mode); if (!error) diff --git a/include/linux/fs.h b/include/linux/fs.h index ae68100..f9d2b59 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1804,6 +1804,12 @@ struct super_operations { #define IS_IMMUTABLE(inode) ((inode)->i_flags & S_IMMUTABLE) #define IS_POSIXACL(inode) __IS_FLG(inode, MS_POSIXACL) +#ifdef CONFIG_FS_RICHACL +#define IS_RICHACL(inode) __IS_FLG(inode, MS_RICHACL) +#else +#define IS_RICHACL(inode) 0 +#endif + #define IS_DEADDIR(inode) ((inode)->i_flags & S_DEAD) #define IS_NOCMTIME(inode) ((inode)->i_flags & S_NOCMTIME) #define IS_SWAPFILE(inode) ((inode)->i_flags & S_SWAPFILE) @@ -1817,6 +1823,12 @@ struct super_operations { (inode)->i_rdev == WHITEOUT_DEV) /* + * IS_ACL() tells the VFS to not apply the umask + * and use check_acl for acl permission checks when defined. + */ +#define IS_ACL(inode) __IS_FLG(inode, MS_POSIXACL | MS_RICHACL) + +/* * Inode state bits. Protected by inode->i_lock * * Three bits determine the dirty state of the inode, I_DIRTY_SYNC, diff --git a/include/uapi/linux/fs.h b/include/uapi/linux/fs.h index 149bec8..540dbef 100644 --- a/include/uapi/linux/fs.h +++ b/include/uapi/linux/fs.h @@ -120,7 +120,7 @@ struct inodes_stat_t { #define MS_VERBOSE 32768 /* War is peace. Verbosity is silence. MS_VERBOSE is deprecated. */ #define MS_SILENT 32768 -#define MS_POSIXACL (1<<16) /* VFS does not apply the umask */ +#define MS_POSIXACL (1<<16) /* Supports POSIX ACLs */ #define MS_UNBINDABLE (1<<17) /* change to unbindable */ #define MS_PRIVATE (1<<18) /* change to private */ #define MS_SLAVE (1<<19) /* change to slave */ @@ -130,6 +130,7 @@ struct inodes_stat_t { #define MS_I_VERSION (1<<23) /* Update inode I_version field */ #define MS_STRICTATIME (1<<24) /* Always perform atime updates */ #define MS_LAZYTIME (1<<25) /* Update the on-disk [acm]times lazily */ +#define MS_RICHACL (1<<26) /* Supports richacls */ /* These sb flags are internal to the kernel */ #define MS_NOSEC (1<<28) -- 2.5.0 From agruenba@redhat.com Mon Mar 14 09:55:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CC4B529E07 for ; Mon, 14 Mar 2016 09:55:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 916ED8F804C for ; Mon, 14 Mar 2016 07:55:39 -0700 (PDT) X-ASG-Debug-ID: 1457967337-04cbb00b723eda90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id wAWOklr2Dif2PtXN (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 14 Mar 2016 07:55:37 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 3FF4F64D10; Mon, 14 Mar 2016 14:55:37 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-74.ams2.redhat.com [10.36.5.74]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2EEtN9f021293; Mon, 14 Mar 2016 10:55:33 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v19 02/23] vfs: Add MAY_CREATE_FILE and MAY_CREATE_DIR permission flags Date: Mon, 14 Mar 2016 15:55:01 +0100 X-ASG-Orig-Subj: [PATCH v19 02/23] vfs: Add MAY_CREATE_FILE and MAY_CREATE_DIR permission flags Message-Id: <1457967322-14886-3-git-send-email-agruenba@redhat.com> In-Reply-To: <1457967322-14886-1-git-send-email-agruenba@redhat.com> References: <1457967322-14886-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 14 Mar 2016 14:55:37 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1457967337 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Richacls distinguish between creating non-directories and directories. To support that, add an isdir parameter to may_create(). When checking inode_permission() for create permission, pass in an additional MAY_CREATE_FILE or MAY_CREATE_DIR mask flag. Add may_replace() to allow checking for delete and create access when replacing an existing file in vfs_rename(). Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields Reviewed-by: Andreas Dilger --- fs/namei.c | 49 +++++++++++++++++++++++++++++++++---------------- include/linux/fs.h | 2 ++ 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/fs/namei.c b/fs/namei.c index 68e1056..2092742 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -453,7 +453,9 @@ static int sb_permission(struct super_block *sb, struct inode *inode, int mask) * this, letting us set arbitrary permissions for filesystem access without * changing the "normal" UIDs which are used for other things. * - * When checking for MAY_APPEND, MAY_WRITE must also be set in @mask. + * MAY_WRITE must be set in @mask whenever MAY_APPEND, MAY_CREATE_FILE, or + * MAY_CREATE_DIR are set. That way, file systems that don't support these + * permissions will check for MAY_WRITE instead. */ int inode_permission(struct inode *inode, int mask) { @@ -2616,7 +2618,8 @@ EXPORT_SYMBOL(__check_sticky); * 10. We don't allow removal of NFS sillyrenamed files; it's handled by * nfs_async_unlink(). */ -static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) +static int may_delete_or_replace(struct inode *dir, struct dentry *victim, + bool isdir, int mask) { struct inode *inode = d_backing_inode(victim); int error; @@ -2628,7 +2631,7 @@ static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) BUG_ON(victim->d_parent->d_inode != dir); audit_inode_child(dir, victim, AUDIT_TYPE_CHILD_DELETE); - error = inode_permission(dir, MAY_WRITE | MAY_EXEC); + error = inode_permission(dir, mask); if (error) return error; if (IS_APPEND(dir)) @@ -2651,6 +2654,18 @@ static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) return 0; } +static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) +{ + return may_delete_or_replace(dir, victim, isdir, MAY_WRITE | MAY_EXEC); +} + +static int may_replace(struct inode *dir, struct dentry *victim, bool isdir) +{ + int mask = isdir ? MAY_CREATE_DIR : MAY_CREATE_FILE; + + return may_delete_or_replace(dir, victim, isdir, mask | MAY_WRITE | MAY_EXEC); +} + /* Check whether we can create an object with dentry child in directory * dir. * 1. We can't do it if child already exists (open has special treatment for @@ -2659,14 +2674,16 @@ static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) * 3. We should have write and exec permissions on dir * 4. We can't do it if dir is immutable (done in permission()) */ -static inline int may_create(struct inode *dir, struct dentry *child) +static inline int may_create(struct inode *dir, struct dentry *child, bool isdir) { + int mask = isdir ? MAY_CREATE_DIR : MAY_CREATE_FILE; + audit_inode_child(dir, child, AUDIT_TYPE_CHILD_CREATE); if (child->d_inode) return -EEXIST; if (IS_DEADDIR(dir)) return -ENOENT; - return inode_permission(dir, MAY_WRITE | MAY_EXEC); + return inode_permission(dir, MAY_WRITE | MAY_EXEC | mask); } /* @@ -2716,7 +2733,7 @@ EXPORT_SYMBOL(unlock_rename); int vfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, bool want_excl) { - int error = may_create(dir, dentry); + int error = may_create(dir, dentry, false); if (error) return error; @@ -3561,7 +3578,7 @@ EXPORT_SYMBOL(user_path_create); int vfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev) { - int error = may_create(dir, dentry); + int error = may_create(dir, dentry, false); if (error) return error; @@ -3653,7 +3670,7 @@ SYSCALL_DEFINE3(mknod, const char __user *, filename, umode_t, mode, unsigned, d int vfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) { - int error = may_create(dir, dentry); + int error = may_create(dir, dentry, true); unsigned max_links = dir->i_sb->s_max_links; if (error) @@ -3734,7 +3751,7 @@ EXPORT_SYMBOL(dentry_unhash); int vfs_rmdir(struct inode *dir, struct dentry *dentry) { - int error = may_delete(dir, dentry, 1); + int error = may_delete(dir, dentry, true); if (error) return error; @@ -3856,7 +3873,7 @@ SYSCALL_DEFINE1(rmdir, const char __user *, pathname) int vfs_unlink(struct inode *dir, struct dentry *dentry, struct inode **delegated_inode) { struct inode *target = dentry->d_inode; - int error = may_delete(dir, dentry, 0); + int error = may_delete(dir, dentry, false); if (error) return error; @@ -3990,7 +4007,7 @@ SYSCALL_DEFINE1(unlink, const char __user *, pathname) int vfs_symlink(struct inode *dir, struct dentry *dentry, const char *oldname) { - int error = may_create(dir, dentry); + int error = may_create(dir, dentry, false); if (error) return error; @@ -4073,7 +4090,7 @@ int vfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_de if (!inode) return -ENOENT; - error = may_create(dir, new_dentry); + error = may_create(dir, new_dentry, false); if (error) return error; @@ -4266,14 +4283,14 @@ int vfs_rename(struct inode *old_dir, struct dentry *old_dentry, return error; if (!target) { - error = may_create(new_dir, new_dentry); + error = may_create(new_dir, new_dentry, is_dir); } else { new_is_dir = d_is_dir(new_dentry); if (!(flags & RENAME_EXCHANGE)) - error = may_delete(new_dir, new_dentry, is_dir); + error = may_replace(new_dir, new_dentry, is_dir); else - error = may_delete(new_dir, new_dentry, new_is_dir); + error = may_replace(new_dir, new_dentry, new_is_dir); } if (error) return error; @@ -4536,7 +4553,7 @@ SYSCALL_DEFINE2(rename, const char __user *, oldname, const char __user *, newna int vfs_whiteout(struct inode *dir, struct dentry *dentry) { - int error = may_create(dir, dentry); + int error = may_create(dir, dentry, false); if (error) return error; diff --git a/include/linux/fs.h b/include/linux/fs.h index f9d2b59..02e99d7 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -83,6 +83,8 @@ typedef void (dax_iodone_t)(struct buffer_head *bh_map, int uptodate); #define MAY_CHDIR 0x00000040 /* called from RCU mode, don't block */ #define MAY_NOT_BLOCK 0x00000080 +#define MAY_CREATE_FILE 0x00000100 +#define MAY_CREATE_DIR 0x00000200 /* * flags in file.f_mode. Note that FMODE_READ and FMODE_WRITE must correspond -- 2.5.0 From agruenba@redhat.com Mon Mar 14 09:55:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DE7C129E13 for ; Mon, 14 Mar 2016 09:55:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 45983AC00A for ; Mon, 14 Mar 2016 07:55:43 -0700 (PDT) X-ASG-Debug-ID: 1457967341-04cb6c7f2bd6f90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id lXSSitKPiwpzPWLp (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 14 Mar 2016 07:55:42 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 39AC9C00EB1B; Mon, 14 Mar 2016 14:55:41 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-74.ams2.redhat.com [10.36.5.74]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2EEtN9g021293; Mon, 14 Mar 2016 10:55:37 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v19 03/23] vfs: Add MAY_DELETE_SELF and MAY_DELETE_CHILD permission flags Date: Mon, 14 Mar 2016 15:55:02 +0100 X-ASG-Orig-Subj: [PATCH v19 03/23] vfs: Add MAY_DELETE_SELF and MAY_DELETE_CHILD permission flags Message-Id: <1457967322-14886-4-git-send-email-agruenba@redhat.com> In-Reply-To: <1457967322-14886-1-git-send-email-agruenba@redhat.com> References: <1457967322-14886-1-git-send-email-agruenba@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: 1457967341 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Normally, deleting a file requires MAY_WRITE access to the parent directory. With richacls, a file may be deleted with MAY_DELETE_CHILD access to the parent directory or with MAY_DELETE_SELF access to the file. To support that, pass the MAY_DELETE_CHILD mask flag to inode_permission() when checking for delete access inside a directory, and MAY_DELETE_SELF when checking for delete access to a file itelf. The MAY_DELETE_SELF permission overrides the sticky directory check. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields --- fs/namei.c | 20 ++++++++++++-------- include/linux/fs.h | 2 ++ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/fs/namei.c b/fs/namei.c index 2092742..28707ae 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -453,9 +453,9 @@ static int sb_permission(struct super_block *sb, struct inode *inode, int mask) * this, letting us set arbitrary permissions for filesystem access without * changing the "normal" UIDs which are used for other things. * - * MAY_WRITE must be set in @mask whenever MAY_APPEND, MAY_CREATE_FILE, or - * MAY_CREATE_DIR are set. That way, file systems that don't support these - * permissions will check for MAY_WRITE instead. + * MAY_WRITE must be set in @mask whenever MAY_APPEND, MAY_CREATE_FILE, + * MAY_CREATE_DIR, or MAY_DELETE_CHILD are set. That way, file systems that + * don't support these permissions will check for MAY_WRITE instead. */ int inode_permission(struct inode *inode, int mask) { @@ -2631,14 +2631,18 @@ static int may_delete_or_replace(struct inode *dir, struct dentry *victim, BUG_ON(victim->d_parent->d_inode != dir); audit_inode_child(dir, victim, AUDIT_TYPE_CHILD_DELETE); - error = inode_permission(dir, mask); + error = inode_permission(dir, mask | MAY_WRITE | MAY_DELETE_CHILD); + if (!error && check_sticky(dir, inode)) + error = -EPERM; + if (error && IS_RICHACL(inode) && + inode_permission(inode, MAY_DELETE_SELF) == 0 && + inode_permission(dir, mask) == 0) + error = 0; if (error) return error; if (IS_APPEND(dir)) return -EPERM; - - if (check_sticky(dir, inode) || IS_APPEND(inode) || - IS_IMMUTABLE(inode) || IS_SWAPFILE(inode)) + if (IS_APPEND(inode) || IS_IMMUTABLE(inode) || IS_SWAPFILE(inode)) return -EPERM; if (isdir) { if (!d_is_dir(victim)) @@ -2656,7 +2660,7 @@ static int may_delete_or_replace(struct inode *dir, struct dentry *victim, static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) { - return may_delete_or_replace(dir, victim, isdir, MAY_WRITE | MAY_EXEC); + return may_delete_or_replace(dir, victim, isdir, MAY_EXEC); } static int may_replace(struct inode *dir, struct dentry *victim, bool isdir) diff --git a/include/linux/fs.h b/include/linux/fs.h index 02e99d7..97e34ba 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -85,6 +85,8 @@ typedef void (dax_iodone_t)(struct buffer_head *bh_map, int uptodate); #define MAY_NOT_BLOCK 0x00000080 #define MAY_CREATE_FILE 0x00000100 #define MAY_CREATE_DIR 0x00000200 +#define MAY_DELETE_CHILD 0x00000400 +#define MAY_DELETE_SELF 0x00000800 /* * flags in file.f_mode. Note that FMODE_READ and FMODE_WRITE must correspond -- 2.5.0 From agruenba@redhat.com Mon Mar 14 09:55:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C3FA929E07 for ; Mon, 14 Mar 2016 09:55:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 968E4304051 for ; Mon, 14 Mar 2016 07:55:47 -0700 (PDT) X-ASG-Debug-ID: 1457967345-04cbb00b713edac0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id f4ZNa4e9fT04IUTB (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 14 Mar 2016 07:55:46 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 54C734AD7B; Mon, 14 Mar 2016 14:55:45 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-74.ams2.redhat.com [10.36.5.74]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2EEtN9h021293; Mon, 14 Mar 2016 10:55:41 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v19 04/23] vfs: Make the inode passed to inode_change_ok non-const Date: Mon, 14 Mar 2016 15:55:03 +0100 X-ASG-Orig-Subj: [PATCH v19 04/23] vfs: Make the inode passed to inode_change_ok non-const Message-Id: <1457967322-14886-5-git-send-email-agruenba@redhat.com> In-Reply-To: <1457967322-14886-1-git-send-email-agruenba@redhat.com> References: <1457967322-14886-1-git-send-email-agruenba@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: 1457967345 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 We will need to call iop->permission and iop->get_acl from inode_change_ok() for additional permission checks, and both take a non-const inode. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields Reviewed-by: Andreas Dilger --- fs/attr.c | 2 +- include/linux/fs.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/attr.c b/fs/attr.c index 25b24d0..7ca7fa0 100644 --- a/fs/attr.c +++ b/fs/attr.c @@ -28,7 +28,7 @@ * Should be called as the first thing in ->setattr implementations, * possibly after taking additional locks. */ -int inode_change_ok(const struct inode *inode, struct iattr *attr) +int inode_change_ok(struct inode *inode, struct iattr *attr) { unsigned int ia_valid = attr->ia_valid; diff --git a/include/linux/fs.h b/include/linux/fs.h index 97e34ba..efff04f 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2908,7 +2908,7 @@ extern int buffer_migrate_page(struct address_space *, #define buffer_migrate_page NULL #endif -extern int inode_change_ok(const struct inode *, struct iattr *); +extern int inode_change_ok(struct inode *, struct iattr *); extern int inode_newsize_ok(const struct inode *, loff_t offset); extern void setattr_copy(struct inode *inode, const struct iattr *attr); -- 2.5.0 From agruenba@redhat.com Mon Mar 14 09:55:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8CBA429E07 for ; Mon, 14 Mar 2016 09:55:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5FA948F804B for ; Mon, 14 Mar 2016 07:55:51 -0700 (PDT) X-ASG-Debug-ID: 1457967349-04cb6c7f29d6fa0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id iduZxttDLFtY3P7T (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 14 Mar 2016 07:55:50 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 7AB578E740; Mon, 14 Mar 2016 14:55:49 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-74.ams2.redhat.com [10.36.5.74]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2EEtN9i021293; Mon, 14 Mar 2016 10:55:45 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v19 05/23] vfs: Add permission flags for setting file attributes Date: Mon, 14 Mar 2016 15:55:04 +0100 X-ASG-Orig-Subj: [PATCH v19 05/23] vfs: Add permission flags for setting file attributes Message-Id: <1457967322-14886-6-git-send-email-agruenba@redhat.com> In-Reply-To: <1457967322-14886-1-git-send-email-agruenba@redhat.com> References: <1457967322-14886-1-git-send-email-agruenba@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: 1457967350 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Richacls support permissions that allow to take ownership of a file, change the file permissions, and set the file timestamps. Support that by introducing new permission mask flags and by checking for those mask flags in inode_change_ok(). Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields --- fs/attr.c | 79 +++++++++++++++++++++++++++++++++++++++++++++--------- include/linux/fs.h | 3 +++ 2 files changed, 70 insertions(+), 12 deletions(-) diff --git a/fs/attr.c b/fs/attr.c index 7ca7fa0..2a8c49c 100644 --- a/fs/attr.c +++ b/fs/attr.c @@ -17,6 +17,65 @@ #include /** + * inode_extended_permission - permissions beyond read/write/execute + * + * Check for permissions that only richacls can currently grant. + */ +static int inode_extended_permission(struct inode *inode, int mask) +{ + if (!IS_RICHACL(inode)) + return -EPERM; + return inode_permission(inode, mask); +} + +static bool inode_uid_change_ok(struct inode *inode, kuid_t ia_uid) +{ + if (uid_eq(current_fsuid(), inode->i_uid) && + uid_eq(ia_uid, inode->i_uid)) + return true; + if (uid_eq(current_fsuid(), ia_uid) && + inode_extended_permission(inode, MAY_TAKE_OWNERSHIP) == 0) + return true; + if (capable_wrt_inode_uidgid(inode, CAP_CHOWN)) + return true; + return false; +} + +static bool inode_gid_change_ok(struct inode *inode, kgid_t ia_gid) +{ + int in_group = in_group_p(ia_gid); + if (uid_eq(current_fsuid(), inode->i_uid) && + (in_group || gid_eq(ia_gid, inode->i_gid))) + return true; + if (in_group && inode_extended_permission(inode, MAY_TAKE_OWNERSHIP) == 0) + return true; + if (capable_wrt_inode_uidgid(inode, CAP_CHOWN)) + return true; + return false; +} + +/** + * inode_owner_permitted_or_capable + * + * Check for permissions implicitly granted to the owner, like MAY_CHMOD or + * MAY_SET_TIMES. Equivalent to inode_owner_or_capable for file systems + * without support for those permissions. + */ +static bool inode_owner_permitted_or_capable(struct inode *inode, int mask) +{ + struct user_namespace *ns; + + if (uid_eq(current_fsuid(), inode->i_uid)) + return true; + if (inode_extended_permission(inode, mask) == 0) + return true; + ns = current_user_ns(); + if (ns_capable(ns, CAP_FOWNER) && kuid_has_mapping(ns, inode->i_uid)) + return true; + return false; +} + +/** * inode_change_ok - check if attribute changes to an inode are allowed * @inode: inode to check * @attr: attributes to change @@ -47,22 +106,18 @@ int inode_change_ok(struct inode *inode, struct iattr *attr) return 0; /* Make sure a caller can chown. */ - if ((ia_valid & ATTR_UID) && - (!uid_eq(current_fsuid(), inode->i_uid) || - !uid_eq(attr->ia_uid, inode->i_uid)) && - !capable_wrt_inode_uidgid(inode, CAP_CHOWN)) - return -EPERM; + if (ia_valid & ATTR_UID) + if (!inode_uid_change_ok(inode, attr->ia_uid)) + return -EPERM; /* Make sure caller can chgrp. */ - if ((ia_valid & ATTR_GID) && - (!uid_eq(current_fsuid(), inode->i_uid) || - (!in_group_p(attr->ia_gid) && !gid_eq(attr->ia_gid, inode->i_gid))) && - !capable_wrt_inode_uidgid(inode, CAP_CHOWN)) - return -EPERM; + if (ia_valid & ATTR_GID) + if (!inode_gid_change_ok(inode, attr->ia_gid)) + return -EPERM; /* Make sure a caller can chmod. */ if (ia_valid & ATTR_MODE) { - if (!inode_owner_or_capable(inode)) + if (!inode_owner_permitted_or_capable(inode, MAY_CHMOD)) return -EPERM; /* Also check the setgid bit! */ if (!in_group_p((ia_valid & ATTR_GID) ? attr->ia_gid : @@ -73,7 +128,7 @@ int inode_change_ok(struct inode *inode, struct iattr *attr) /* Check for setting the inode time. */ if (ia_valid & (ATTR_MTIME_SET | ATTR_ATIME_SET | ATTR_TIMES_SET)) { - if (!inode_owner_or_capable(inode)) + if (!inode_owner_permitted_or_capable(inode, MAY_SET_TIMES)) return -EPERM; } diff --git a/include/linux/fs.h b/include/linux/fs.h index efff04f..0f560b7 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -87,6 +87,9 @@ typedef void (dax_iodone_t)(struct buffer_head *bh_map, int uptodate); #define MAY_CREATE_DIR 0x00000200 #define MAY_DELETE_CHILD 0x00000400 #define MAY_DELETE_SELF 0x00000800 +#define MAY_TAKE_OWNERSHIP 0x00001000 +#define MAY_CHMOD 0x00002000 +#define MAY_SET_TIMES 0x00004000 /* * flags in file.f_mode. Note that FMODE_READ and FMODE_WRITE must correspond -- 2.5.0 From agruenba@redhat.com Mon Mar 14 09:55:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AA46729E10 for ; Mon, 14 Mar 2016 09:55:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4EA9830405F for ; Mon, 14 Mar 2016 07:55:57 -0700 (PDT) X-ASG-Debug-ID: 1457967353-04bdf002ec400920001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id wCtJotSodUW9c7z0 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 14 Mar 2016 07:55:54 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id BD6578F4E2; Mon, 14 Mar 2016 14:55:53 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-74.ams2.redhat.com [10.36.5.74]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2EEtN9j021293; Mon, 14 Mar 2016 10:55:49 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v19 06/23] richacl: In-memory representation and helper functions Date: Mon, 14 Mar 2016 15:55:05 +0100 X-ASG-Orig-Subj: [PATCH v19 06/23] richacl: In-memory representation and helper functions Message-Id: <1457967322-14886-7-git-send-email-agruenba@redhat.com> In-Reply-To: <1457967322-14886-1-git-send-email-agruenba@redhat.com> References: <1457967322-14886-1-git-send-email-agruenba@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: 1457967354 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 A richacl consists of an NFSv4 acl and an owner, group, and other mask. These three masks correspond to the owner, group, and other file permission bits, but they contain NFSv4 permissions instead of POSIX permissions. Each entry in the NFSv4 acl applies to the file owner (OWNER@), the owning group (GROUP@), everyone (EVERYONE@), or to a specific uid or gid. As in the standard POSIX file permission model, each process is the owner, group, or other file class. A richacl grants a requested access only if the NFSv4 acl in the richacl grants the access (according to the NFSv4 permission check algorithm), and the file mask that applies to the process includes the requested permissions. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields --- fs/Makefile | 2 + fs/richacl_base.c | 65 ++++++++++++++++ include/linux/richacl.h | 179 +++++++++++++++++++++++++++++++++++++++++++ include/uapi/linux/Kbuild | 1 + include/uapi/linux/richacl.h | 99 ++++++++++++++++++++++++ 5 files changed, 346 insertions(+) create mode 100644 fs/richacl_base.c create mode 100644 include/linux/richacl.h create mode 100644 include/uapi/linux/richacl.h diff --git a/fs/Makefile b/fs/Makefile index 79f5225..e5994c4 100644 --- a/fs/Makefile +++ b/fs/Makefile @@ -48,6 +48,8 @@ obj-$(CONFIG_COREDUMP) += coredump.o obj-$(CONFIG_SYSCTL) += drop_caches.o obj-$(CONFIG_FHANDLE) += fhandle.o +obj-$(CONFIG_FS_RICHACL) += richacl.o +richacl-y := richacl_base.o obj-y += quota/ diff --git a/fs/richacl_base.c b/fs/richacl_base.c new file mode 100644 index 0000000..bcc6591 --- /dev/null +++ b/fs/richacl_base.c @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2006, 2010 Novell, Inc. + * Copyright (C) 2015 Red Hat, Inc. + * Written by Andreas Gruenbacher + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#include +#include +#include +#include +#include + +/** + * richacl_alloc - allocate a richacl + * @count: number of entries + */ +struct richacl * +richacl_alloc(int count, gfp_t gfp) +{ + size_t size = sizeof(struct richacl) + count * sizeof(struct richace); + struct richacl *acl = kzalloc(size, gfp); + + if (acl) { + atomic_set(&acl->a_refcount, 1); + acl->a_count = count; + } + return acl; +} +EXPORT_SYMBOL_GPL(richacl_alloc); + +/** + * richacl_clone - create a copy of a richacl + */ +struct richacl * +richacl_clone(const struct richacl *acl, gfp_t gfp) +{ + int count = acl->a_count; + size_t size = sizeof(struct richacl) + count * sizeof(struct richace); + struct richacl *dup = kmalloc(size, gfp); + + if (dup) { + memcpy(dup, acl, size); + atomic_set(&dup->a_refcount, 1); + } + return dup; +} + +/** + * richace_copy - copy an acl entry + */ +void +richace_copy(struct richace *to, const struct richace *from) +{ + memcpy(to, from, sizeof(struct richace)); +} diff --git a/include/linux/richacl.h b/include/linux/richacl.h new file mode 100644 index 0000000..edb8480 --- /dev/null +++ b/include/linux/richacl.h @@ -0,0 +1,179 @@ +/* + * Copyright (C) 2006, 2010 Novell, Inc. + * Copyright (C) 2015 Red Hat, Inc. + * Written by Andreas Gruenbacher + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#ifndef __RICHACL_H +#define __RICHACL_H + +#include + +struct richace { + unsigned short e_type; + unsigned short e_flags; + unsigned int e_mask; + union { + kuid_t uid; + kgid_t gid; + unsigned int special; + } e_id; +}; + +struct richacl { + atomic_t a_refcount; + unsigned int a_owner_mask; + unsigned int a_group_mask; + unsigned int a_other_mask; + unsigned short a_count; + unsigned short a_flags; + struct richace a_entries[0]; +}; + +#define richacl_for_each_entry(_ace, _acl) \ + for (_ace = (_acl)->a_entries; \ + _ace != (_acl)->a_entries + (_acl)->a_count; \ + _ace++) + +#define richacl_for_each_entry_reverse(_ace, _acl) \ + for (_ace = (_acl)->a_entries + (_acl)->a_count - 1; \ + _ace != (_acl)->a_entries - 1; \ + _ace--) + +/** + * richacl_get - grab another reference to a richacl handle + */ +static inline struct richacl * +richacl_get(struct richacl *acl) +{ + if (acl) + atomic_inc(&acl->a_refcount); + return acl; +} + +/** + * richacl_put - free a richacl handle + */ +static inline void +richacl_put(struct richacl *acl) +{ + if (acl && atomic_dec_and_test(&acl->a_refcount)) + kfree(acl); +} + +/** + * richace_is_owner - check if @ace is an OWNER@ entry + */ +static inline bool +richace_is_owner(const struct richace *ace) +{ + return (ace->e_flags & RICHACE_SPECIAL_WHO) && + ace->e_id.special == RICHACE_OWNER_SPECIAL_ID; +} + +/** + * richace_is_group - check if @ace is a GROUP@ entry + */ +static inline bool +richace_is_group(const struct richace *ace) +{ + return (ace->e_flags & RICHACE_SPECIAL_WHO) && + ace->e_id.special == RICHACE_GROUP_SPECIAL_ID; +} + +/** + * richace_is_everyone - check if @ace is an EVERYONE@ entry + */ +static inline bool +richace_is_everyone(const struct richace *ace) +{ + return (ace->e_flags & RICHACE_SPECIAL_WHO) && + ace->e_id.special == RICHACE_EVERYONE_SPECIAL_ID; +} + +/** + * richace_is_unix_user - check if @ace applies to a specific user + */ +static inline bool +richace_is_unix_user(const struct richace *ace) +{ + return !(ace->e_flags & RICHACE_SPECIAL_WHO) && + !(ace->e_flags & RICHACE_IDENTIFIER_GROUP); +} + +/** + * richace_is_unix_group - check if @ace applies to a specific group + */ +static inline bool +richace_is_unix_group(const struct richace *ace) +{ + return !(ace->e_flags & RICHACE_SPECIAL_WHO) && + (ace->e_flags & RICHACE_IDENTIFIER_GROUP); +} + +/** + * richace_is_inherit_only - check if @ace is for inheritance only + * + * ACEs with the %RICHACE_INHERIT_ONLY_ACE flag set have no effect during + * permission checking. + */ +static inline bool +richace_is_inherit_only(const struct richace *ace) +{ + return ace->e_flags & RICHACE_INHERIT_ONLY_ACE; +} + +/** + * richace_is_inheritable - check if @ace is inheritable + */ +static inline bool +richace_is_inheritable(const struct richace *ace) +{ + return ace->e_flags & (RICHACE_FILE_INHERIT_ACE | + RICHACE_DIRECTORY_INHERIT_ACE); +} + +/** + * richace_is_allow - check if @ace is an %ALLOW type entry + */ +static inline bool +richace_is_allow(const struct richace *ace) +{ + return ace->e_type == RICHACE_ACCESS_ALLOWED_ACE_TYPE; +} + +/** + * richace_is_deny - check if @ace is a %DENY type entry + */ +static inline bool +richace_is_deny(const struct richace *ace) +{ + return ace->e_type == RICHACE_ACCESS_DENIED_ACE_TYPE; +} + +/** + * richace_is_same_identifier - are both identifiers the same? + */ +static inline bool +richace_is_same_identifier(const struct richace *a, const struct richace *b) +{ + return !((a->e_flags ^ b->e_flags) & + (RICHACE_SPECIAL_WHO | RICHACE_IDENTIFIER_GROUP)) && + !memcmp(&a->e_id, &b->e_id, sizeof(a->e_id)); +} + +extern struct richacl *richacl_alloc(int, gfp_t); +extern struct richacl *richacl_clone(const struct richacl *, gfp_t); +extern void richace_copy(struct richace *, const struct richace *); + +#endif /* __RICHACL_H */ diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild index ebd10e6..6e05dc8 100644 --- a/include/uapi/linux/Kbuild +++ b/include/uapi/linux/Kbuild @@ -351,6 +351,7 @@ header-y += reboot.h header-y += reiserfs_fs.h header-y += reiserfs_xattr.h header-y += resource.h +header-y += richacl.h header-y += rfkill.h header-y += romfs_fs.h header-y += rose.h diff --git a/include/uapi/linux/richacl.h b/include/uapi/linux/richacl.h new file mode 100644 index 0000000..08856f8 --- /dev/null +++ b/include/uapi/linux/richacl.h @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2006, 2010 Novell, Inc. + * Copyright (C) 2015 Red Hat, Inc. + * Written by Andreas Gruenbacher + * + * This file is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + */ + +#ifndef __UAPI_RICHACL_H +#define __UAPI_RICHACL_H + +/* a_flags values */ +#define RICHACL_WRITE_THROUGH 0x40 +#define RICHACL_MASKED 0x80 + +/* e_type values */ +#define RICHACE_ACCESS_ALLOWED_ACE_TYPE 0x0000 +#define RICHACE_ACCESS_DENIED_ACE_TYPE 0x0001 + +/* e_flags bitflags */ +#define RICHACE_FILE_INHERIT_ACE 0x0001 +#define RICHACE_DIRECTORY_INHERIT_ACE 0x0002 +#define RICHACE_NO_PROPAGATE_INHERIT_ACE 0x0004 +#define RICHACE_INHERIT_ONLY_ACE 0x0008 +#define RICHACE_IDENTIFIER_GROUP 0x0040 +#define RICHACE_SPECIAL_WHO 0x4000 + +/* e_mask bitflags */ +#define RICHACE_READ_DATA 0x00000001 +#define RICHACE_LIST_DIRECTORY 0x00000001 +#define RICHACE_WRITE_DATA 0x00000002 +#define RICHACE_ADD_FILE 0x00000002 +#define RICHACE_APPEND_DATA 0x00000004 +#define RICHACE_ADD_SUBDIRECTORY 0x00000004 +#define RICHACE_READ_NAMED_ATTRS 0x00000008 +#define RICHACE_WRITE_NAMED_ATTRS 0x00000010 +#define RICHACE_EXECUTE 0x00000020 +#define RICHACE_DELETE_CHILD 0x00000040 +#define RICHACE_READ_ATTRIBUTES 0x00000080 +#define RICHACE_WRITE_ATTRIBUTES 0x00000100 +#define RICHACE_WRITE_RETENTION 0x00000200 +#define RICHACE_WRITE_RETENTION_HOLD 0x00000400 +#define RICHACE_DELETE 0x00010000 +#define RICHACE_READ_ACL 0x00020000 +#define RICHACE_WRITE_ACL 0x00040000 +#define RICHACE_WRITE_OWNER 0x00080000 +#define RICHACE_SYNCHRONIZE 0x00100000 + +/* e_id values */ +#define RICHACE_OWNER_SPECIAL_ID 0 +#define RICHACE_GROUP_SPECIAL_ID 1 +#define RICHACE_EVERYONE_SPECIAL_ID 2 + +#define RICHACL_VALID_FLAGS ( \ + RICHACL_WRITE_THROUGH | \ + RICHACL_MASKED ) + +#define RICHACE_VALID_FLAGS ( \ + RICHACE_FILE_INHERIT_ACE | \ + RICHACE_DIRECTORY_INHERIT_ACE | \ + RICHACE_NO_PROPAGATE_INHERIT_ACE | \ + RICHACE_INHERIT_ONLY_ACE | \ + RICHACE_IDENTIFIER_GROUP | \ + RICHACE_SPECIAL_WHO ) + +#define RICHACE_INHERITANCE_FLAGS ( \ + RICHACE_FILE_INHERIT_ACE | \ + RICHACE_DIRECTORY_INHERIT_ACE | \ + RICHACE_NO_PROPAGATE_INHERIT_ACE | \ + RICHACE_INHERIT_ONLY_ACE ) + +/* Valid RICHACE_* flags for directories and non-directories */ +#define RICHACE_VALID_MASK ( \ + RICHACE_READ_DATA | RICHACE_LIST_DIRECTORY | \ + RICHACE_WRITE_DATA | RICHACE_ADD_FILE | \ + RICHACE_APPEND_DATA | RICHACE_ADD_SUBDIRECTORY | \ + RICHACE_READ_NAMED_ATTRS | \ + RICHACE_WRITE_NAMED_ATTRS | \ + RICHACE_EXECUTE | \ + RICHACE_DELETE_CHILD | \ + RICHACE_READ_ATTRIBUTES | \ + RICHACE_WRITE_ATTRIBUTES | \ + RICHACE_WRITE_RETENTION | \ + RICHACE_WRITE_RETENTION_HOLD | \ + RICHACE_DELETE | \ + RICHACE_READ_ACL | \ + RICHACE_WRITE_ACL | \ + RICHACE_WRITE_OWNER | \ + RICHACE_SYNCHRONIZE ) + +#endif /* __UAPI_RICHACL_H */ -- 2.5.0 From agruenba@redhat.com Mon Mar 14 09:56:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 57F7C29E20 for ; Mon, 14 Mar 2016 09:56:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2885F30405F for ; Mon, 14 Mar 2016 07:56:00 -0700 (PDT) X-ASG-Debug-ID: 1457967358-04cbb00b6f3edb10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id tHLY1wHWru1HfNTV (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 14 Mar 2016 07:55:58 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 19ADDC0006F7; Mon, 14 Mar 2016 14:55:58 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-74.ams2.redhat.com [10.36.5.74]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2EEtN9k021293; Mon, 14 Mar 2016 10:55:54 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v19 07/23] richacl: Permission mapping functions Date: Mon, 14 Mar 2016 15:55:06 +0100 X-ASG-Orig-Subj: [PATCH v19 07/23] richacl: Permission mapping functions Message-Id: <1457967322-14886-8-git-send-email-agruenba@redhat.com> In-Reply-To: <1457967322-14886-1-git-send-email-agruenba@redhat.com> References: <1457967322-14886-1-git-send-email-agruenba@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: 1457967358 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 We need to map from POSIX permissions to NFSv4 permissions when a chmod() is done, from NFSv4 permissions to POSIX permissions when an acl is set (which implicitly sets the file permission bits), and from the MAY_READ/MAY_WRITE/MAY_EXEC/MAY_APPEND flags to NFSv4 permissions when doing an access check in a richacl. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields --- fs/richacl_base.c | 118 +++++++++++++++++++++++++++++++++++++++++++ include/linux/richacl.h | 3 ++ include/uapi/linux/richacl.h | 44 ++++++++++++++++ 3 files changed, 165 insertions(+) diff --git a/fs/richacl_base.c b/fs/richacl_base.c index bcc6591..d0a4135 100644 --- a/fs/richacl_base.c +++ b/fs/richacl_base.c @@ -63,3 +63,121 @@ richace_copy(struct richace *to, const struct richace *from) { memcpy(to, from, sizeof(struct richace)); } + +/* + * richacl_mask_to_mode - compute the file permission bits from mask + * @mask: %RICHACE_* permission mask + * + * Compute the file permission bits corresponding to a particular set of + * richacl permissions. + * + * See richacl_masks_to_mode(). + */ +static int +richacl_mask_to_mode(unsigned int mask) +{ + int mode = 0; + + if (mask & RICHACE_POSIX_MODE_READ) + mode |= S_IROTH; + if (mask & RICHACE_POSIX_MODE_WRITE) + mode |= S_IWOTH; + if (mask & RICHACE_POSIX_MODE_EXEC) + mode |= S_IXOTH; + + return mode; +} + +/** + * richacl_masks_to_mode - compute file permission bits from file masks + * + * When setting a richacl, we set the file permission bits to indicate maximum + * permissions: for example, we set the Write permission when a mask contains + * RICHACE_APPEND_DATA even if it does not also contain RICHACE_WRITE_DATA. + * + * Permissions which are not in RICHACE_POSIX_MODE_READ, + * RICHACE_POSIX_MODE_WRITE, or RICHACE_POSIX_MODE_EXEC cannot be represented + * in the file permission bits. Such permissions can still be effective, but + * not for new files or after a chmod(); they must be explicitly enabled in the + * richacl. + */ +int +richacl_masks_to_mode(const struct richacl *acl) +{ + return richacl_mask_to_mode(acl->a_owner_mask) << 6 | + richacl_mask_to_mode(acl->a_group_mask) << 3 | + richacl_mask_to_mode(acl->a_other_mask); +} +EXPORT_SYMBOL_GPL(richacl_masks_to_mode); + +/** + * richacl_mode_to_mask - compute a file mask from the lowest three mode bits + * @mode: mode to convert to richacl permissions + * + * When the file permission bits of a file are set with chmod(), this specifies + * the maximum permissions that processes will get. All permissions beyond + * that will be removed from the file masks, and become ineffective. + */ +unsigned int +richacl_mode_to_mask(umode_t mode) +{ + unsigned int mask = 0; + + if (mode & S_IROTH) + mask |= RICHACE_POSIX_MODE_READ; + if (mode & S_IWOTH) + mask |= RICHACE_POSIX_MODE_WRITE; + if (mode & S_IXOTH) + mask |= RICHACE_POSIX_MODE_EXEC; + + return mask; +} + +/** + * richacl_want_to_mask - convert the iop->permission want argument to a mask + * @want: @want argument of the permission inode operation + * + * When checking for append, @want is (MAY_WRITE | MAY_APPEND). + * + * Richacls use the iop->may_create and iop->may_delete hooks which are used + * for checking if creating and deleting files is allowed. These hooks do not + * use richacl_want_to_mask(), so we do not have to deal with mapping MAY_WRITE + * to RICHACE_ADD_FILE, RICHACE_ADD_SUBDIRECTORY, and RICHACE_DELETE_CHILD + * here. + */ +unsigned int +richacl_want_to_mask(unsigned int want) +{ + unsigned int mask = 0; + + if (want & MAY_READ) + mask |= RICHACE_READ_DATA; + if (want & MAY_DELETE_SELF) + mask |= RICHACE_DELETE; + if (want & MAY_TAKE_OWNERSHIP) + mask |= RICHACE_WRITE_OWNER; + if (want & MAY_CHMOD) + mask |= RICHACE_WRITE_ACL; + if (want & MAY_SET_TIMES) + mask |= RICHACE_WRITE_ATTRIBUTES; + if (want & MAY_EXEC) + mask |= RICHACE_EXECUTE; + /* + * differentiate MAY_WRITE from these request + */ + if (want & (MAY_APPEND | + MAY_CREATE_FILE | MAY_CREATE_DIR | + MAY_DELETE_CHILD)) { + if (want & MAY_APPEND) + mask |= RICHACE_APPEND_DATA; + if (want & MAY_CREATE_FILE) + mask |= RICHACE_ADD_FILE; + if (want & MAY_CREATE_DIR) + mask |= RICHACE_ADD_SUBDIRECTORY; + if (want & MAY_DELETE_CHILD) + mask |= RICHACE_DELETE_CHILD; + } else if (want & MAY_WRITE) + mask |= RICHACE_WRITE_DATA; + return mask; +} +EXPORT_SYMBOL_GPL(richacl_want_to_mask); diff --git a/include/linux/richacl.h b/include/linux/richacl.h index edb8480..9102ef0 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -175,5 +175,8 @@ richace_is_same_identifier(const struct richace *a, const struct richace *b) extern struct richacl *richacl_alloc(int, gfp_t); extern struct richacl *richacl_clone(const struct richacl *, gfp_t); extern void richace_copy(struct richace *, const struct richace *); +extern int richacl_masks_to_mode(const struct richacl *); +extern unsigned int richacl_mode_to_mask(umode_t); +extern unsigned int richacl_want_to_mask(unsigned int); #endif /* __RICHACL_H */ diff --git a/include/uapi/linux/richacl.h b/include/uapi/linux/richacl.h index 08856f8..1ed48ac 100644 --- a/include/uapi/linux/richacl.h +++ b/include/uapi/linux/richacl.h @@ -96,4 +96,48 @@ RICHACE_WRITE_OWNER | \ RICHACE_SYNCHRONIZE ) +/* + * The POSIX permissions are supersets of the following richacl permissions: + * + * - MAY_READ maps to READ_DATA or LIST_DIRECTORY, depending on the type + * of the file system object. + * + * - MAY_WRITE maps to WRITE_DATA or RICHACE_APPEND_DATA for files, and to + * ADD_FILE, RICHACE_ADD_SUBDIRECTORY, or RICHACE_DELETE_CHILD for directories. + * + * - MAY_EXECUTE maps to RICHACE_EXECUTE. + * + * (Some of these richacl permissions have the same bit values.) + */ +#define RICHACE_POSIX_MODE_READ ( \ + RICHACE_READ_DATA | \ + RICHACE_LIST_DIRECTORY) +#define RICHACE_POSIX_MODE_WRITE ( \ + RICHACE_WRITE_DATA | \ + RICHACE_ADD_FILE | \ + RICHACE_APPEND_DATA | \ + RICHACE_ADD_SUBDIRECTORY | \ + RICHACE_DELETE_CHILD) +#define RICHACE_POSIX_MODE_EXEC RICHACE_EXECUTE +#define RICHACE_POSIX_MODE_ALL ( \ + RICHACE_POSIX_MODE_READ | \ + RICHACE_POSIX_MODE_WRITE | \ + RICHACE_POSIX_MODE_EXEC) + +/* + * These permissions are always allowed no matter what the acl says. + */ +#define RICHACE_POSIX_ALWAYS_ALLOWED ( \ + RICHACE_SYNCHRONIZE | \ + RICHACE_READ_ATTRIBUTES | \ + RICHACE_READ_ACL) + +/* + * The owner is implicitly granted these permissions under POSIX. + */ +#define RICHACE_POSIX_OWNER_ALLOWED ( \ + RICHACE_WRITE_ATTRIBUTES | \ + RICHACE_WRITE_OWNER | \ + RICHACE_WRITE_ACL) + #endif /* __UAPI_RICHACL_H */ -- 2.5.0 From agruenba@redhat.com Mon Mar 14 09:56:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A4ABD29E0B for ; Mon, 14 Mar 2016 09:56:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6B2D48F8040 for ; Mon, 14 Mar 2016 07:56:04 -0700 (PDT) X-ASG-Debug-ID: 1457967362-04cbb00b723edb40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id RWXmqKv85PGcWqlF (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 14 Mar 2016 07:56:03 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 48A5D64D10; Mon, 14 Mar 2016 14:56:02 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-74.ams2.redhat.com [10.36.5.74]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2EEtN9l021293; Mon, 14 Mar 2016 10:55:58 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v19 08/23] richacl: Compute maximum file masks from an acl Date: Mon, 14 Mar 2016 15:55:07 +0100 X-ASG-Orig-Subj: [PATCH v19 08/23] richacl: Compute maximum file masks from an acl Message-Id: <1457967322-14886-9-git-send-email-agruenba@redhat.com> In-Reply-To: <1457967322-14886-1-git-send-email-agruenba@redhat.com> References: <1457967322-14886-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 14 Mar 2016 14:56:02 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1457967362 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Compute upper bound owner, group, and other file masks with as few permissions as possible without denying any permissions that the NFSv4 acl in a richacl grants. This algorithm is used when a file inherits an acl at create time and when an acl is set via a mechanism that does not provide file masks (such as setting an acl via nfsd). When user-space sets an acl via setxattr, the extended attribute already includes the file masks. Setting an acl also sets the file mode permission bits: they are determined by the file masks; see richacl_masks_to_mode(). Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields --- fs/richacl_base.c | 157 ++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/richacl.h | 1 + 2 files changed, 158 insertions(+) diff --git a/fs/richacl_base.c b/fs/richacl_base.c index d0a4135..056228f 100644 --- a/fs/richacl_base.c +++ b/fs/richacl_base.c @@ -181,3 +181,160 @@ richacl_want_to_mask(unsigned int want) return mask; } EXPORT_SYMBOL_GPL(richacl_want_to_mask); + +/* + * Note: functions like richacl_allowed_to_who(), richacl_group_class_allowed(), + * and richacl_compute_max_masks() iterate through the entire acl in reverse + * order as an optimization. + * + * In the standard algorithm, aces are considered in forward order. When a + * process matches an ace, the permissions in the ace are either allowed or + * denied depending on the ace type. Once a permission has been allowed or + * denied, it is no longer considered in further aces. + * + * By iterating through the acl in reverse order, we can compute the same + * result without having to keep track of which permissions have been allowed + * and denied already. + */ + +/** + * richacl_allowed_to_who - permissions allowed to a specific who value + * + * Compute the maximum mask values allowed to a specific who value, taking + * everyone@ aces into account. + */ +static unsigned int richacl_allowed_to_who(struct richacl *acl, + struct richace *who) +{ + struct richace *ace; + unsigned int allowed = 0; + + richacl_for_each_entry_reverse(ace, acl) { + if (richace_is_inherit_only(ace)) + continue; + if (richace_is_same_identifier(ace, who) || + richace_is_everyone(ace)) { + if (richace_is_allow(ace)) + allowed |= ace->e_mask; + else if (richace_is_deny(ace)) + allowed &= ~ace->e_mask; + } + } + return allowed; +} + +/** + * richacl_group_class_allowed - maximum permissions of the group class + * + * Compute the maximum mask values allowed to a process in the group class + * (i.e., a process which is not the owner but is in the owning group or + * matches a user or group acl entry). This includes permissions granted or + * denied by everyone@ aces. + * + * See richacl_compute_max_masks(). + */ +static unsigned int richacl_group_class_allowed(struct richacl *acl) +{ + struct richace *ace; + unsigned int everyone_allowed = 0, group_class_allowed = 0; + int had_group_ace = 0; + + richacl_for_each_entry_reverse(ace, acl) { + if (richace_is_inherit_only(ace) || + richace_is_owner(ace)) + continue; + + if (richace_is_everyone(ace)) { + if (richace_is_allow(ace)) + everyone_allowed |= ace->e_mask; + else if (richace_is_deny(ace)) + everyone_allowed &= ~ace->e_mask; + } else { + group_class_allowed |= + richacl_allowed_to_who(acl, ace); + + if (richace_is_group(ace)) + had_group_ace = 1; + } + } + /* + * If the acl doesn't contain any group@ aces, richacl_allowed_to_who() + * wasn't called for the owning group. We could make that call now, but + * we already know the result (everyone_allowed). + */ + if (!had_group_ace) + group_class_allowed |= everyone_allowed; + return group_class_allowed; +} + +/** + * richacl_compute_max_masks - compute upper bound masks + * + * Computes upper bound owner, group, and other masks so that none of the + * permissions allowed by the acl are disabled. + * + * We don't make assumptions about who the owner is so that the owner can + * change with no effect on the file masks or file mode permission bits; this + * means that we must assume that all entries can match the owner. + */ +void richacl_compute_max_masks(struct richacl *acl) +{ + unsigned int gmask = ~0; + struct richace *ace; + + /* + * @gmask contains all permissions which the group class is ever + * allowed. We use it to avoid adding permissions to the group mask + * from everyone@ allow aces which the group class is always denied + * through other aces. For example, the following acl would otherwise + * result in a group mask of rw: + * + * group@:w::deny + * everyone@:rw::allow + * + * Avoid computing @gmask for acls which do not include any group class + * deny aces: in such acls, the group class is never denied any + * permissions from everyone@ allow aces, and the group class cannot + * have fewer permissions than the other class. + */ + +restart: + acl->a_owner_mask = 0; + acl->a_group_mask = 0; + acl->a_other_mask = 0; + + richacl_for_each_entry_reverse(ace, acl) { + if (richace_is_inherit_only(ace)) + continue; + + if (richace_is_owner(ace)) { + if (richace_is_allow(ace)) + acl->a_owner_mask |= ace->e_mask; + else if (richace_is_deny(ace)) + acl->a_owner_mask &= ~ace->e_mask; + } else if (richace_is_everyone(ace)) { + if (richace_is_allow(ace)) { + acl->a_owner_mask |= ace->e_mask; + acl->a_group_mask |= ace->e_mask & gmask; + acl->a_other_mask |= ace->e_mask; + } else if (richace_is_deny(ace)) { + acl->a_owner_mask &= ~ace->e_mask; + acl->a_group_mask &= ~ace->e_mask; + acl->a_other_mask &= ~ace->e_mask; + } + } else { + if (richace_is_allow(ace)) { + acl->a_owner_mask |= ace->e_mask & gmask; + acl->a_group_mask |= ace->e_mask & gmask; + } else if (richace_is_deny(ace) && gmask == ~0) { + gmask = richacl_group_class_allowed(acl); + if (likely(gmask != ~0)) + /* should always be true */ + goto restart; + } + } + } + + acl->a_flags &= ~(RICHACL_WRITE_THROUGH | RICHACL_MASKED); +} +EXPORT_SYMBOL_GPL(richacl_compute_max_masks); diff --git a/include/linux/richacl.h b/include/linux/richacl.h index 9102ef0..3559b2c 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -178,5 +178,6 @@ extern void richace_copy(struct richace *, const struct richace *); extern int richacl_masks_to_mode(const struct richacl *); extern unsigned int richacl_mode_to_mask(umode_t); extern unsigned int richacl_want_to_mask(unsigned int); +extern void richacl_compute_max_masks(struct richacl *); #endif /* __RICHACL_H */ -- 2.5.0 From agruenba@redhat.com Mon Mar 14 09:56:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A312429E24 for ; Mon, 14 Mar 2016 09:56:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 27FC4AC007 for ; Mon, 14 Mar 2016 07:56:08 -0700 (PDT) X-ASG-Debug-ID: 1457967366-04bdf002ee4009b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Rw4Dq4J2sj2c4CL5 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 14 Mar 2016 07:56:06 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 645908F2E4; Mon, 14 Mar 2016 14:56:06 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-74.ams2.redhat.com [10.36.5.74]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2EEtN9m021293; Mon, 14 Mar 2016 10:56:02 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v19 09/23] richacl: Permission check algorithm Date: Mon, 14 Mar 2016 15:55:08 +0100 X-ASG-Orig-Subj: [PATCH v19 09/23] richacl: Permission check algorithm Message-Id: <1457967322-14886-10-git-send-email-agruenba@redhat.com> In-Reply-To: <1457967322-14886-1-git-send-email-agruenba@redhat.com> References: <1457967322-14886-1-git-send-email-agruenba@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: 1457967366 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 A richacl roughly grants a requested access if the NFSv4 acl in the richacl grants the requested permissions according to the NFSv4 permission check algorithm and the file mask that applies to the process includes the requested permissions. Signed-off-by: Andreas Gruenbacher Reviewed-by: "J. Bruce Fields" --- fs/Makefile | 2 +- fs/richacl_inode.c | 149 ++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/richacl.h | 3 + 3 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 fs/richacl_inode.c diff --git a/fs/Makefile b/fs/Makefile index e5994c4..d5b45ca 100644 --- a/fs/Makefile +++ b/fs/Makefile @@ -49,7 +49,7 @@ obj-$(CONFIG_SYSCTL) += drop_caches.o obj-$(CONFIG_FHANDLE) += fhandle.o obj-$(CONFIG_FS_RICHACL) += richacl.o -richacl-y := richacl_base.o +richacl-y := richacl_base.o richacl_inode.o obj-y += quota/ diff --git a/fs/richacl_inode.c b/fs/richacl_inode.c new file mode 100644 index 0000000..99b3c93 --- /dev/null +++ b/fs/richacl_inode.c @@ -0,0 +1,149 @@ +/* + * Copyright (C) 2010 Novell, Inc. + * Copyright (C) 2015 Red Hat, Inc. + * Written by Andreas Gruenbacher + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#include +#include +#include +#include +#include + +/** + * richacl_permission - richacl permission check algorithm + * @inode: inode to check + * @acl: rich acl of the inode + * @want: requested access (MAY_* flags) + * + * Checks if the current process is granted @mask flags in @acl. + */ +int +richacl_permission(struct inode *inode, const struct richacl *acl, + int want) +{ + const struct richace *ace; + unsigned int mask = richacl_want_to_mask(want); + unsigned int requested = mask, denied = 0; + int in_owning_group = in_group_p(inode->i_gid); + int in_owner_or_group_class = in_owning_group; + + /* + * A process is + * - in the owner file class if it owns the file, + * - in the group file class if it is in the file's owning group or + * it matches any of the user or group entries, and + * - in the other file class otherwise. + * The file class is only relevant for determining which file mask to + * apply, which only happens for masked acls. + */ + if (acl->a_flags & RICHACL_MASKED) { + if ((acl->a_flags & RICHACL_WRITE_THROUGH) && + uid_eq(current_fsuid(), inode->i_uid)) { + denied = requested & ~acl->a_owner_mask; + goto out; + } + } else { + /* + * When the acl is not masked, there is no need to determine if + * the process is in the group class and we can break out + * earlier of the loop below. + */ + in_owner_or_group_class = 1; + } + + /* + * Check if the acl grants the requested access and determine which + * file class the process is in. + */ + richacl_for_each_entry(ace, acl) { + unsigned int ace_mask = ace->e_mask; + + if (richace_is_inherit_only(ace)) + continue; + if (richace_is_owner(ace)) { + if (!uid_eq(current_fsuid(), inode->i_uid)) + continue; + goto entry_matches_owner; + } else if (richace_is_group(ace)) { + if (!in_owning_group) + continue; + } else if (richace_is_unix_user(ace)) { + if (!uid_eq(current_fsuid(), ace->e_id.uid)) + continue; + if (uid_eq(current_fsuid(), inode->i_uid)) + goto entry_matches_owner; + } else if (richace_is_unix_group(ace)) { + if (!in_group_p(ace->e_id.gid)) + continue; + } else + goto entry_matches_everyone; + + /* + * Apply the group file mask to entries other than owner@ and + * everyone@ or user entries matching the owner. This ensures + * that we grant the same permissions as the acl computed by + * richacl_apply_masks(). + * + * Without this restriction, the following richacl would grant + * rw access to processes which are both the owner and in the + * owning group, but not to other users in the owning group, + * which could not be represented without masks: + * + * owner:rw::mask + * group@:rw::allow + */ + if ((acl->a_flags & RICHACL_MASKED) && richace_is_allow(ace)) + ace_mask &= acl->a_group_mask; + +entry_matches_owner: + /* The process is in the owner or group file class. */ + in_owner_or_group_class = 1; + +entry_matches_everyone: + /* Check which mask flags the ACE allows or denies. */ + if (richace_is_deny(ace)) + denied |= ace_mask & mask; + mask &= ~ace_mask; + + /* + * Keep going until we know which file class + * the process is in. + */ + if (!mask && in_owner_or_group_class) + break; + } + denied |= mask; + + if (acl->a_flags & RICHACL_MASKED) { + /* + * The file class a process is in determines which file mask + * applies. Check if that file mask also grants the requested + * access. + */ + if (uid_eq(current_fsuid(), inode->i_uid)) + denied |= requested & ~acl->a_owner_mask; + else if (in_owner_or_group_class) + denied |= requested & ~acl->a_group_mask; + else { + if (acl->a_flags & RICHACL_WRITE_THROUGH) + denied = requested & ~acl->a_other_mask; + else + denied |= requested & ~acl->a_other_mask; + } + } + +out: + return denied ? -EACCES : 0; +} +EXPORT_SYMBOL_GPL(richacl_permission); diff --git a/include/linux/richacl.h b/include/linux/richacl.h index 3559b2c..1d9f5f7 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -180,4 +180,7 @@ extern unsigned int richacl_mode_to_mask(umode_t); extern unsigned int richacl_want_to_mask(unsigned int); extern void richacl_compute_max_masks(struct richacl *); +/* richacl_inode.c */ +extern int richacl_permission(struct inode *, const struct richacl *, int); + #endif /* __RICHACL_H */ -- 2.5.0 From agruenba@redhat.com Mon Mar 14 09:56:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DAB4F29E11 for ; Mon, 14 Mar 2016 09:56:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9E9BD304051 for ; Mon, 14 Mar 2016 07:56:12 -0700 (PDT) X-ASG-Debug-ID: 1457967371-04cbb00b723edb80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id kmhdAzoIxkcEDVY5 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 14 Mar 2016 07:56:11 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id B02C480508; Mon, 14 Mar 2016 14:56:10 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-74.ams2.redhat.com [10.36.5.74]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2EEtN9n021293; Mon, 14 Mar 2016 10:56:06 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v19 10/23] posix_acl: Unexport acl_by_type and make it static Date: Mon, 14 Mar 2016 15:55:09 +0100 X-ASG-Orig-Subj: [PATCH v19 10/23] posix_acl: Unexport acl_by_type and make it static Message-Id: <1457967322-14886-11-git-send-email-agruenba@redhat.com> In-Reply-To: <1457967322-14886-1-git-send-email-agruenba@redhat.com> References: <1457967322-14886-1-git-send-email-agruenba@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: 1457967371 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 acl_by_type(inode, type) returns a pointer to either inode->i_acl or inode->i_default_acl depending on type. This is useful in fs/posix_acl.c, but should never have been visible outside that file. Signed-off-by: Andreas Gruenbacher Reviewed-by: Christoph Hellwig --- fs/posix_acl.c | 3 +-- include/linux/posix_acl.h | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/fs/posix_acl.c b/fs/posix_acl.c index 711dd51..55f2445 100644 --- a/fs/posix_acl.c +++ b/fs/posix_acl.c @@ -21,7 +21,7 @@ #include #include -struct posix_acl **acl_by_type(struct inode *inode, int type) +static struct posix_acl **acl_by_type(struct inode *inode, int type) { switch (type) { case ACL_TYPE_ACCESS: @@ -32,7 +32,6 @@ struct posix_acl **acl_by_type(struct inode *inode, int type) BUG(); } } -EXPORT_SYMBOL(acl_by_type); struct posix_acl *get_cached_acl(struct inode *inode, int type) { diff --git a/include/linux/posix_acl.h b/include/linux/posix_acl.h index 3e96a6a..5b5a80c 100644 --- a/include/linux/posix_acl.h +++ b/include/linux/posix_acl.h @@ -99,7 +99,6 @@ extern int posix_acl_create(struct inode *, umode_t *, struct posix_acl **, extern int simple_set_acl(struct inode *, struct posix_acl *, int); extern int simple_acl_create(struct inode *, struct inode *); -struct posix_acl **acl_by_type(struct inode *inode, int type); struct posix_acl *get_cached_acl(struct inode *inode, int type); struct posix_acl *get_cached_acl_rcu(struct inode *inode, int type); void set_cached_acl(struct inode *inode, int type, struct posix_acl *acl); -- 2.5.0 From agruenba@redhat.com Mon Mar 14 09:56:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7B54229E1D for ; Mon, 14 Mar 2016 09:56:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E5B6CAC008 for ; Mon, 14 Mar 2016 07:56:16 -0700 (PDT) X-ASG-Debug-ID: 1457967375-04cb6c7f29d6ff0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id uH5B5uM8yUneha2e (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 14 Mar 2016 07:56:15 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id E55A78F2F2; Mon, 14 Mar 2016 14:56:14 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-74.ams2.redhat.com [10.36.5.74]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2EEtN9o021293; Mon, 14 Mar 2016 10:56:10 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v19 11/23] posix_acl: Improve xattr fixup code Date: Mon, 14 Mar 2016 15:55:10 +0100 X-ASG-Orig-Subj: [PATCH v19 11/23] posix_acl: Improve xattr fixup code Message-Id: <1457967322-14886-12-git-send-email-agruenba@redhat.com> In-Reply-To: <1457967322-14886-1-git-send-email-agruenba@redhat.com> References: <1457967322-14886-1-git-send-email-agruenba@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: 1457967375 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Both XATTR_NAME_POSIX_ACL_ACCESS and XATTR_NAME_POSIX_ACL_DEFAULT have the same XATTR_SYSTEM_PREFIX prefix; don't check for the same prefix repeatedly. Signed-off-by: Andreas Gruenbacher --- fs/xattr.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/fs/xattr.c b/fs/xattr.c index 4861322..c364696 100644 --- a/fs/xattr.c +++ b/fs/xattr.c @@ -295,6 +295,16 @@ out: } EXPORT_SYMBOL_GPL(vfs_removexattr); +static void +fix_xattr_from_user(const char *kname, void *kvalue, size_t size) +{ + if (strncmp(kname, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) + return; + kname += XATTR_SYSTEM_PREFIX_LEN; + if (!strcmp(kname, XATTR_POSIX_ACL_ACCESS) || + !strcmp(kname, XATTR_POSIX_ACL_DEFAULT)) + posix_acl_fix_xattr_from_user(kvalue, size); +} /* * Extended attribute SET operations @@ -329,9 +339,7 @@ setxattr(struct dentry *d, const char __user *name, const void __user *value, error = -EFAULT; goto out; } - if ((strcmp(kname, XATTR_NAME_POSIX_ACL_ACCESS) == 0) || - (strcmp(kname, XATTR_NAME_POSIX_ACL_DEFAULT) == 0)) - posix_acl_fix_xattr_from_user(kvalue, size); + fix_xattr_from_user(kname, kvalue, size); } error = vfs_setxattr(d, kname, kvalue, size, flags); @@ -396,6 +404,17 @@ SYSCALL_DEFINE5(fsetxattr, int, fd, const char __user *, name, return error; } +static void +fix_xattr_to_user(const char *kname, void *kvalue, size_t size) +{ + if (strncmp(kname, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) + return; + kname += XATTR_SYSTEM_PREFIX_LEN; + if (!strcmp(kname, XATTR_POSIX_ACL_ACCESS) || + !strcmp(kname, XATTR_POSIX_ACL_DEFAULT)) + posix_acl_fix_xattr_to_user(kvalue, size); +} + /* * Extended attribute GET operations */ @@ -426,9 +445,7 @@ getxattr(struct dentry *d, const char __user *name, void __user *value, error = vfs_getxattr(d, kname, kvalue, size); if (error > 0) { - if ((strcmp(kname, XATTR_NAME_POSIX_ACL_ACCESS) == 0) || - (strcmp(kname, XATTR_NAME_POSIX_ACL_DEFAULT) == 0)) - posix_acl_fix_xattr_to_user(kvalue, size); + fix_xattr_to_user(kname, kvalue, size); if (size && copy_to_user(value, kvalue, error)) error = -EFAULT; } else if (error == -ERANGE && size >= XATTR_SIZE_MAX) { -- 2.5.0 From agruenba@redhat.com Mon Mar 14 09:56:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B00E829E2E for ; Mon, 14 Mar 2016 09:56:21 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 841CF8F804C for ; Mon, 14 Mar 2016 07:56:21 -0700 (PDT) X-ASG-Debug-ID: 1457967379-04cb6c7f2ad7000001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Y9D6qhshfc1szAb4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 14 Mar 2016 07:56:19 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 030F464D1D; Mon, 14 Mar 2016 14:56:19 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-74.ams2.redhat.com [10.36.5.74]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2EEtN9p021293; Mon, 14 Mar 2016 10:56:15 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v19 12/23] vfs: Cache base_acl objects in inodes Date: Mon, 14 Mar 2016 15:55:11 +0100 X-ASG-Orig-Subj: [PATCH v19 12/23] vfs: Cache base_acl objects in inodes Message-Id: <1457967322-14886-13-git-send-email-agruenba@redhat.com> In-Reply-To: <1457967322-14886-1-git-send-email-agruenba@redhat.com> References: <1457967322-14886-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 14 Mar 2016 14:56:19 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1457967379 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 POSIX ACLs and richacls are both objects allocated by kmalloc() with a reference count which are freed by kfree_rcu(). An inode can either cache an access and a default POSIX ACL, or a richacl (richacls do not have default acls). To allow an inode to cache either of the two kinds of acls, introduce a new base_acl type and convert i_acl and i_default_acl to that type. In most cases, the vfs then doesn't care which kind of acl an inode caches (if any). Signed-off-by: Andreas Gruenbacher Reviewed-by: Andreas Dilger --- drivers/staging/lustre/lustre/llite/llite_lib.c | 2 +- fs/f2fs/acl.c | 4 +-- fs/inode.c | 4 +-- fs/jffs2/acl.c | 10 ++++-- fs/posix_acl.c | 41 +++++++++++++------------ fs/richacl_base.c | 4 +-- include/linux/fs.h | 34 ++++++++++++++++++-- include/linux/posix_acl.h | 12 +++----- include/linux/richacl.h | 9 +++--- 9 files changed, 75 insertions(+), 45 deletions(-) diff --git a/drivers/staging/lustre/lustre/llite/llite_lib.c b/drivers/staging/lustre/lustre/llite/llite_lib.c index b2fc5b3..b587944 100644 --- a/drivers/staging/lustre/lustre/llite/llite_lib.c +++ b/drivers/staging/lustre/lustre/llite/llite_lib.c @@ -1073,7 +1073,7 @@ void ll_clear_inode(struct inode *inode) } #ifdef CONFIG_FS_POSIX_ACL else if (lli->lli_posix_acl) { - LASSERT(atomic_read(&lli->lli_posix_acl->a_refcount) == 1); + LASSERT(base_acl_refcount(&lli->lli_posix_acl->a_base) == 1); LASSERT(lli->lli_remote_perms == NULL); posix_acl_release(lli->lli_posix_acl); lli->lli_posix_acl = NULL; diff --git a/fs/f2fs/acl.c b/fs/f2fs/acl.c index c8f25f7..9646197 100644 --- a/fs/f2fs/acl.c +++ b/fs/f2fs/acl.c @@ -270,7 +270,7 @@ static struct posix_acl *f2fs_acl_clone(const struct posix_acl *acl, sizeof(struct posix_acl_entry); clone = kmemdup(acl, size, flags); if (clone) - atomic_set(&clone->a_refcount, 1); + base_acl_init(&clone->a_base); } return clone; } @@ -282,7 +282,7 @@ static int f2fs_acl_create_masq(struct posix_acl *acl, umode_t *mode_p) umode_t mode = *mode_p; int not_equiv = 0; - /* assert(atomic_read(acl->a_refcount) == 1); */ + /* assert(base_acl_refcount(&acl->a_base) == 1); */ FOREACH_ACL_ENTRY(pa, acl, pe) { switch(pa->e_tag) { diff --git a/fs/inode.c b/fs/inode.c index 69b8b52..101d806 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -239,9 +239,9 @@ void __destroy_inode(struct inode *inode) #ifdef CONFIG_FS_POSIX_ACL if (inode->i_acl && inode->i_acl != ACL_NOT_CACHED) - posix_acl_release(inode->i_acl); + base_acl_put(inode->i_acl); if (inode->i_default_acl && inode->i_default_acl != ACL_NOT_CACHED) - posix_acl_release(inode->i_default_acl); + base_acl_put(inode->i_default_acl); #endif this_cpu_dec(nr_inodes); } diff --git a/fs/jffs2/acl.c b/fs/jffs2/acl.c index 2f7a3c0..569cb1b 100644 --- a/fs/jffs2/acl.c +++ b/fs/jffs2/acl.c @@ -294,13 +294,19 @@ int jffs2_init_acl_post(struct inode *inode) int rc; if (inode->i_default_acl) { - rc = __jffs2_set_acl(inode, JFFS2_XPREFIX_ACL_DEFAULT, inode->i_default_acl); + struct posix_acl *default_acl = container_of( + inode->i_default_acl, struct posix_acl, a_base); + + rc = __jffs2_set_acl(inode, JFFS2_XPREFIX_ACL_DEFAULT, default_acl); if (rc) return rc; } if (inode->i_acl) { - rc = __jffs2_set_acl(inode, JFFS2_XPREFIX_ACL_ACCESS, inode->i_acl); + struct posix_acl *acl = container_of( + inode->i_acl, struct posix_acl, a_base); + + rc = __jffs2_set_acl(inode, JFFS2_XPREFIX_ACL_ACCESS, acl); if (rc) return rc; } diff --git a/fs/posix_acl.c b/fs/posix_acl.c index 55f2445..743b6dc 100644 --- a/fs/posix_acl.c +++ b/fs/posix_acl.c @@ -21,7 +21,7 @@ #include #include -static struct posix_acl **acl_by_type(struct inode *inode, int type) +static struct base_acl **acl_by_type(struct inode *inode, int type) { switch (type) { case ACL_TYPE_ACCESS: @@ -35,63 +35,64 @@ static struct posix_acl **acl_by_type(struct inode *inode, int type) struct posix_acl *get_cached_acl(struct inode *inode, int type) { - struct posix_acl **p = acl_by_type(inode, type); - struct posix_acl *acl = ACCESS_ONCE(*p); + struct base_acl **p = acl_by_type(inode, type); + struct base_acl *acl = ACCESS_ONCE(*p); if (acl) { spin_lock(&inode->i_lock); acl = *p; if (acl != ACL_NOT_CACHED) - acl = posix_acl_dup(acl); + base_acl_get(acl); spin_unlock(&inode->i_lock); } - return acl; + return container_of(acl, struct posix_acl, a_base); } EXPORT_SYMBOL(get_cached_acl); struct posix_acl *get_cached_acl_rcu(struct inode *inode, int type) { - return rcu_dereference(*acl_by_type(inode, type)); + struct base_acl *acl = rcu_dereference(*acl_by_type(inode, type)); + return container_of(acl, struct posix_acl, a_base); } EXPORT_SYMBOL(get_cached_acl_rcu); void set_cached_acl(struct inode *inode, int type, struct posix_acl *acl) { - struct posix_acl **p = acl_by_type(inode, type); - struct posix_acl *old; + struct base_acl **p = acl_by_type(inode, type); + struct base_acl *old; spin_lock(&inode->i_lock); old = *p; - rcu_assign_pointer(*p, posix_acl_dup(acl)); + rcu_assign_pointer(*p, &posix_acl_dup(acl)->a_base); spin_unlock(&inode->i_lock); if (old != ACL_NOT_CACHED) - posix_acl_release(old); + base_acl_put(old); } EXPORT_SYMBOL(set_cached_acl); void forget_cached_acl(struct inode *inode, int type) { - struct posix_acl **p = acl_by_type(inode, type); - struct posix_acl *old; + struct base_acl **p = acl_by_type(inode, type); + struct base_acl *old; spin_lock(&inode->i_lock); old = *p; *p = ACL_NOT_CACHED; spin_unlock(&inode->i_lock); if (old != ACL_NOT_CACHED) - posix_acl_release(old); + base_acl_put(old); } EXPORT_SYMBOL(forget_cached_acl); void forget_all_cached_acls(struct inode *inode) { - struct posix_acl *old_access, *old_default; + struct base_acl *old_access, *old_default; spin_lock(&inode->i_lock); old_access = inode->i_acl; old_default = inode->i_default_acl; inode->i_acl = inode->i_default_acl = ACL_NOT_CACHED; spin_unlock(&inode->i_lock); if (old_access != ACL_NOT_CACHED) - posix_acl_release(old_access); + base_acl_put(old_access); if (old_default != ACL_NOT_CACHED) - posix_acl_release(old_default); + base_acl_put(old_default); } EXPORT_SYMBOL(forget_all_cached_acls); @@ -128,7 +129,7 @@ EXPORT_SYMBOL(get_acl); void posix_acl_init(struct posix_acl *acl, int count) { - atomic_set(&acl->a_refcount, 1); + base_acl_init(&acl->a_base); acl->a_count = count; } EXPORT_SYMBOL(posix_acl_init); @@ -161,7 +162,7 @@ posix_acl_clone(const struct posix_acl *acl, gfp_t flags) sizeof(struct posix_acl_entry); clone = kmemdup(acl, size, flags); if (clone) - atomic_set(&clone->a_refcount, 1); + base_acl_init(&clone->a_base); } return clone; } @@ -383,7 +384,7 @@ static int posix_acl_create_masq(struct posix_acl *acl, umode_t *mode_p) umode_t mode = *mode_p; int not_equiv = 0; - /* assert(atomic_read(acl->a_refcount) == 1); */ + /* assert(base_acl_refcount(&acl->a_base) == 1); */ FOREACH_ACL_ENTRY(pa, acl, pe) { switch(pa->e_tag) { @@ -438,7 +439,7 @@ static int __posix_acl_chmod_masq(struct posix_acl *acl, umode_t mode) struct posix_acl_entry *group_obj = NULL, *mask_obj = NULL; struct posix_acl_entry *pa, *pe; - /* assert(atomic_read(acl->a_refcount) == 1); */ + /* assert(base_acl_refcount(&acl->a_base) == 1); */ FOREACH_ACL_ENTRY(pa, acl, pe) { switch(pa->e_tag) { diff --git a/fs/richacl_base.c b/fs/richacl_base.c index 056228f..ce611d0 100644 --- a/fs/richacl_base.c +++ b/fs/richacl_base.c @@ -31,7 +31,7 @@ richacl_alloc(int count, gfp_t gfp) struct richacl *acl = kzalloc(size, gfp); if (acl) { - atomic_set(&acl->a_refcount, 1); + base_acl_init(&acl->a_base); acl->a_count = count; } return acl; @@ -50,7 +50,7 @@ richacl_clone(const struct richacl *acl, gfp_t gfp) if (dup) { memcpy(dup, acl, size); - atomic_set(&dup->a_refcount, 1); + base_acl_init(&dup->a_base); } return dup; } diff --git a/include/linux/fs.h b/include/linux/fs.h index 0f560b7..3db7729 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -578,6 +578,12 @@ static inline void mapping_allow_writable(struct address_space *mapping) #define i_size_ordered_init(inode) do { } while (0) #endif +struct base_acl { + union { + atomic_t ba_refcount; + struct rcu_head ba_rcu; + }; +}; struct posix_acl; #define ACL_NOT_CACHED ((void *)(-1)) @@ -597,9 +603,9 @@ struct inode { kgid_t i_gid; unsigned int i_flags; -#ifdef CONFIG_FS_POSIX_ACL - struct posix_acl *i_acl; - struct posix_acl *i_default_acl; +#if defined(CONFIG_FS_POSIX_ACL) + struct base_acl *i_acl; + struct base_acl *i_default_acl; #endif const struct inode_operations *i_op; @@ -3097,4 +3103,26 @@ static inline bool dir_relax(struct inode *inode) extern bool path_noexec(const struct path *path); extern void inode_nohighmem(struct inode *inode); +static inline void base_acl_get(struct base_acl *acl) +{ + if (acl) + atomic_inc(&acl->ba_refcount); +} + +static inline void base_acl_put(struct base_acl *acl) +{ + if (acl && atomic_dec_and_test(&acl->ba_refcount)) + kfree_rcu(acl, ba_rcu); +} + +static inline void base_acl_init(struct base_acl *acl) +{ + atomic_set(&acl->ba_refcount, 1); +} + +static inline int base_acl_refcount(struct base_acl *acl) +{ + return atomic_read(&acl->ba_refcount); +} + #endif /* _LINUX_FS_H */ diff --git a/include/linux/posix_acl.h b/include/linux/posix_acl.h index 5b5a80c..cef5428 100644 --- a/include/linux/posix_acl.h +++ b/include/linux/posix_acl.h @@ -43,10 +43,7 @@ struct posix_acl_entry { }; struct posix_acl { - union { - atomic_t a_refcount; - struct rcu_head a_rcu; - }; + struct base_acl a_base; /* must be first, see posix_acl_release() */ unsigned int a_count; struct posix_acl_entry a_entries[0]; }; @@ -61,8 +58,7 @@ struct posix_acl { static inline struct posix_acl * posix_acl_dup(struct posix_acl *acl) { - if (acl) - atomic_inc(&acl->a_refcount); + base_acl_get(&acl->a_base); return acl; } @@ -72,8 +68,8 @@ posix_acl_dup(struct posix_acl *acl) static inline void posix_acl_release(struct posix_acl *acl) { - if (acl && atomic_dec_and_test(&acl->a_refcount)) - kfree_rcu(acl, a_rcu); + BUILD_BUG_ON(offsetof(struct posix_acl, a_base) != 0); + base_acl_put(&acl->a_base); } diff --git a/include/linux/richacl.h b/include/linux/richacl.h index 1d9f5f7..7628fad 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -31,7 +31,7 @@ struct richace { }; struct richacl { - atomic_t a_refcount; + struct base_acl a_base; /* must be first, see richacl_put() */ unsigned int a_owner_mask; unsigned int a_group_mask; unsigned int a_other_mask; @@ -56,8 +56,7 @@ struct richacl { static inline struct richacl * richacl_get(struct richacl *acl) { - if (acl) - atomic_inc(&acl->a_refcount); + base_acl_get(&acl->a_base); return acl; } @@ -67,8 +66,8 @@ richacl_get(struct richacl *acl) static inline void richacl_put(struct richacl *acl) { - if (acl && atomic_dec_and_test(&acl->a_refcount)) - kfree(acl); + BUILD_BUG_ON(offsetof(struct richacl, a_base) != 0); + base_acl_put(&acl->a_base); } /** -- 2.5.0 From agruenba@redhat.com Mon Mar 14 09:56:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DCF0B29E05 for ; Mon, 14 Mar 2016 09:56:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A0E0B304048 for ; Mon, 14 Mar 2016 07:56:24 -0700 (PDT) X-ASG-Debug-ID: 1457967383-04cb6c7f2bd7010001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ywrs6WbCnuVbrY4v (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 14 Mar 2016 07:56:23 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 1A1ADC0003F5; Mon, 14 Mar 2016 14:56:23 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-74.ams2.redhat.com [10.36.5.74]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2EEtN9q021293; Mon, 14 Mar 2016 10:56:19 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v19 13/23] vfs: Add get_richacl and set_richacl inode operations Date: Mon, 14 Mar 2016 15:55:12 +0100 X-ASG-Orig-Subj: [PATCH v19 13/23] vfs: Add get_richacl and set_richacl inode operations Message-Id: <1457967322-14886-14-git-send-email-agruenba@redhat.com> In-Reply-To: <1457967322-14886-1-git-send-email-agruenba@redhat.com> References: <1457967322-14886-1-git-send-email-agruenba@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: 1457967383 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 These operations are similar to the get_acl and set_acl operations for POSIX ACLs. The distinction between access and default ACLs doesn't exist for richacls. Signed-off-by: Andreas Gruenbacher --- include/linux/fs.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/linux/fs.h b/include/linux/fs.h index 3db7729..e04dbb4 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1682,6 +1682,7 @@ struct inode_operations { const char * (*get_link) (struct dentry *, struct inode *, struct delayed_call *); int (*permission) (struct inode *, int); struct posix_acl * (*get_acl)(struct inode *, int); + struct richacl * (*get_richacl)(struct inode *); int (*readlink) (struct dentry *, char __user *,int); @@ -1710,6 +1711,7 @@ struct inode_operations { umode_t create_mode, int *opened); int (*tmpfile) (struct inode *, struct dentry *, umode_t); int (*set_acl)(struct inode *, struct posix_acl *, int); + int (*set_richacl)(struct inode *, struct richacl *); } ____cacheline_aligned; ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector, -- 2.5.0 From agruenba@redhat.com Mon Mar 14 09:56:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2C62429E0A for ; Mon, 14 Mar 2016 09:56:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 89DFDAC00A for ; Mon, 14 Mar 2016 07:56:29 -0700 (PDT) X-ASG-Debug-ID: 1457967387-04cbb00b703edc00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id uBX9oj1Q0NMGmL9P (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 14 Mar 2016 07:56:28 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 600486DD86; Mon, 14 Mar 2016 14:56:27 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-74.ams2.redhat.com [10.36.5.74]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2EEtN9r021293; Mon, 14 Mar 2016 10:56:23 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v19 14/23] vfs: Cache richacl in struct inode Date: Mon, 14 Mar 2016 15:55:13 +0100 X-ASG-Orig-Subj: [PATCH v19 14/23] vfs: Cache richacl in struct inode Message-Id: <1457967322-14886-15-git-send-email-agruenba@redhat.com> In-Reply-To: <1457967322-14886-1-git-send-email-agruenba@redhat.com> References: <1457967322-14886-1-git-send-email-agruenba@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: 1457967387 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Cache richacls in struct inode so that this doesn't have to be done individually in each filesystem. This is similar to POSIX ACLs. Signed-off-by: Andreas Gruenbacher --- fs/inode.c | 11 +++++-- fs/posix_acl.c | 2 +- fs/richacl_inode.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/fs.h | 5 +++- include/linux/richacl.h | 6 ++++ 5 files changed, 96 insertions(+), 5 deletions(-) diff --git a/fs/inode.c b/fs/inode.c index 101d806..de80116 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -180,8 +180,11 @@ int inode_init_always(struct super_block *sb, struct inode *inode) inode->i_private = NULL; inode->i_mapping = mapping; INIT_HLIST_HEAD(&inode->i_dentry); /* buggered by rcu freeing */ -#ifdef CONFIG_FS_POSIX_ACL - inode->i_acl = inode->i_default_acl = ACL_NOT_CACHED; +#if defined(CONFIG_FS_POSIX_ACL) || defined(CONFIG_FS_RICHACL) + inode->i_acl = ACL_NOT_CACHED; +# if defined(CONFIG_FS_POSIX_ACL) + inode->i_default_acl = ACL_NOT_CACHED; +# endif #endif #ifdef CONFIG_FSNOTIFY @@ -237,11 +240,13 @@ void __destroy_inode(struct inode *inode) atomic_long_dec(&inode->i_sb->s_remove_count); } -#ifdef CONFIG_FS_POSIX_ACL +#if defined(CONFIG_FS_POSIX_ACL) || defined(CONFIG_FS_RICHACL) if (inode->i_acl && inode->i_acl != ACL_NOT_CACHED) base_acl_put(inode->i_acl); +# if defined(CONFIG_FS_POSIX_ACL) if (inode->i_default_acl && inode->i_default_acl != ACL_NOT_CACHED) base_acl_put(inode->i_default_acl); +# endif #endif this_cpu_dec(nr_inodes); } diff --git a/fs/posix_acl.c b/fs/posix_acl.c index 743b6dc..f24646e 100644 --- a/fs/posix_acl.c +++ b/fs/posix_acl.c @@ -37,7 +37,7 @@ struct posix_acl *get_cached_acl(struct inode *inode, int type) { struct base_acl **p = acl_by_type(inode, type); struct base_acl *acl = ACCESS_ONCE(*p); - if (acl) { + if (acl && IS_POSIXACL(inode)) { spin_lock(&inode->i_lock); acl = *p; if (acl != ACL_NOT_CACHED) diff --git a/fs/richacl_inode.c b/fs/richacl_inode.c index 99b3c93..52c1595 100644 --- a/fs/richacl_inode.c +++ b/fs/richacl_inode.c @@ -20,6 +20,83 @@ #include #include +struct richacl *get_cached_richacl(struct inode *inode) +{ + struct base_acl *acl; + + acl = ACCESS_ONCE(inode->i_acl); + if (acl && IS_RICHACL(inode)) { + spin_lock(&inode->i_lock); + acl = inode->i_acl; + if (acl != ACL_NOT_CACHED) + base_acl_get(acl); + spin_unlock(&inode->i_lock); + } + return container_of(acl, struct richacl, a_base); +} +EXPORT_SYMBOL_GPL(get_cached_richacl); + +struct richacl *get_cached_richacl_rcu(struct inode *inode) +{ + struct base_acl *acl = rcu_dereference(inode->i_acl); + + return container_of(acl, struct richacl, a_base); +} +EXPORT_SYMBOL_GPL(get_cached_richacl_rcu); + +void set_cached_richacl(struct inode *inode, struct richacl *acl) +{ + struct base_acl *old = NULL; + + spin_lock(&inode->i_lock); + old = inode->i_acl; + rcu_assign_pointer(inode->i_acl, &richacl_get(acl)->a_base); + spin_unlock(&inode->i_lock); + if (old != ACL_NOT_CACHED) + base_acl_put(old); +} +EXPORT_SYMBOL_GPL(set_cached_richacl); + +void forget_cached_richacl(struct inode *inode) +{ + struct base_acl *old = NULL; + + spin_lock(&inode->i_lock); + old = inode->i_acl; + inode->i_acl = ACL_NOT_CACHED; + spin_unlock(&inode->i_lock); + if (old != ACL_NOT_CACHED) + base_acl_put(old); +} +EXPORT_SYMBOL_GPL(forget_cached_richacl); + +struct richacl *get_richacl(struct inode *inode) +{ + struct richacl *acl; + + acl = get_cached_richacl(inode); + if (acl != ACL_NOT_CACHED) + return acl; + + if (!IS_RICHACL(inode)) + return NULL; + + /* + * A filesystem can force a ACL callback by just never filling the + * ACL cache. But normally you'd fill the cache either at inode + * instantiation time, or on the first ->get_richacl call. + * + * If the filesystem doesn't have a get_richacl() function at all, + * we'll just create the negative cache entry. + */ + if (!inode->i_op->get_richacl) { + set_cached_richacl(inode, NULL); + return NULL; + } + return inode->i_op->get_richacl(inode); +} +EXPORT_SYMBOL_GPL(get_richacl); + /** * richacl_permission - richacl permission check algorithm * @inode: inode to check diff --git a/include/linux/fs.h b/include/linux/fs.h index e04dbb4..560f4e0 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -585,6 +585,7 @@ struct base_acl { }; }; struct posix_acl; +struct richacl; #define ACL_NOT_CACHED ((void *)(-1)) #define IOP_FASTPERM 0x0001 @@ -603,9 +604,11 @@ struct inode { kgid_t i_gid; unsigned int i_flags; -#if defined(CONFIG_FS_POSIX_ACL) +#if defined(CONFIG_FS_POSIX_ACL) || defined(CONFIG_FS_RICHACL) struct base_acl *i_acl; +# if defined(CONFIG_FS_POSIX_ACL) struct base_acl *i_default_acl; +# endif #endif const struct inode_operations *i_op; diff --git a/include/linux/richacl.h b/include/linux/richacl.h index 7628fad..7bf912b6 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -70,6 +70,12 @@ richacl_put(struct richacl *acl) base_acl_put(&acl->a_base); } +extern struct richacl *get_cached_richacl(struct inode *); +extern struct richacl *get_cached_richacl_rcu(struct inode *); +extern void set_cached_richacl(struct inode *, struct richacl *); +extern void forget_cached_richacl(struct inode *); +extern struct richacl *get_richacl(struct inode *); + /** * richace_is_owner - check if @ace is an OWNER@ entry */ -- 2.5.0 From agruenba@redhat.com Mon Mar 14 09:56:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5FFC129E38 for ; Mon, 14 Mar 2016 09:56:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D99F6AC007 for ; Mon, 14 Mar 2016 07:56:32 -0700 (PDT) X-ASG-Debug-ID: 1457967391-04bdf002ed400ab0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ZlmmqaiwUq7H0eju (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 14 Mar 2016 07:56:31 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 79D327EBA0; Mon, 14 Mar 2016 14:56:31 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-74.ams2.redhat.com [10.36.5.74]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2EEtN9s021293; Mon, 14 Mar 2016 10:56:27 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v19 15/23] richacl: Update the file masks in chmod() Date: Mon, 14 Mar 2016 15:55:14 +0100 X-ASG-Orig-Subj: [PATCH v19 15/23] richacl: Update the file masks in chmod() Message-Id: <1457967322-14886-16-git-send-email-agruenba@redhat.com> In-Reply-To: <1457967322-14886-1-git-send-email-agruenba@redhat.com> References: <1457967322-14886-1-git-send-email-agruenba@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: 1457967391 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Doing a chmod() sets the file mode, which includes the file permission bits. When a file has a richacl, the permissions that the richacl grants need to be limited to what the new file permission bits allow. This is done by setting the file masks in the richacl to what the file permission bits map to. The richacl access check algorithm takes the file masks into account, which ensures that the richacl cannot grant too many permissions. It is possible to explicitly add permissions to the file masks which go beyond what the file permission bits can grant (like the RICHACE_WRITE_ACL permission). The POSIX.1 standard calls this an alternate file access control mechanism. A subsequent chmod() would ensure that those permissions are disabled again. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields --- fs/richacl_base.c | 42 ++++++++++++++++++++++++++++++++++++++++++ fs/richacl_inode.c | 30 ++++++++++++++++++++++++++++++ include/linux/richacl.h | 2 ++ 3 files changed, 74 insertions(+) diff --git a/fs/richacl_base.c b/fs/richacl_base.c index ce611d0..9976bf1 100644 --- a/fs/richacl_base.c +++ b/fs/richacl_base.c @@ -338,3 +338,45 @@ restart: acl->a_flags &= ~(RICHACL_WRITE_THROUGH | RICHACL_MASKED); } EXPORT_SYMBOL_GPL(richacl_compute_max_masks); + +/** + * __richacl_chmod - update the file masks to reflect the new mode + * @acl: access control list + * @mode: new file permission bits including the file type + * + * Return a copy of @acl where the file masks have been replaced by the file + * masks corresponding to the file permission bits in @mode, or returns @acl + * itself if the file masks are already up to date. Takes over a reference + * to @acl. + */ +struct richacl * +__richacl_chmod(struct richacl *acl, umode_t mode) +{ + unsigned int x = S_ISDIR(mode) ? 0 : RICHACE_DELETE_CHILD; + unsigned int owner_mask, group_mask, other_mask; + struct richacl *clone; + + owner_mask = richacl_mode_to_mask(mode >> 6) & ~x; + group_mask = richacl_mode_to_mask(mode >> 3) & ~x; + other_mask = richacl_mode_to_mask(mode) & ~x; + + if (acl->a_owner_mask == owner_mask && + acl->a_group_mask == group_mask && + acl->a_other_mask == other_mask && + (acl->a_flags & RICHACL_MASKED) && + (acl->a_flags & RICHACL_WRITE_THROUGH)) + return acl; + + clone = richacl_clone(acl, GFP_KERNEL); + richacl_put(acl); + if (!clone) + return ERR_PTR(-ENOMEM); + + clone->a_flags |= (RICHACL_WRITE_THROUGH | RICHACL_MASKED); + clone->a_owner_mask = owner_mask; + clone->a_group_mask = group_mask; + clone->a_other_mask = other_mask; + + return clone; +} +EXPORT_SYMBOL_GPL(__richacl_chmod); diff --git a/fs/richacl_inode.c b/fs/richacl_inode.c index 52c1595..e329826 100644 --- a/fs/richacl_inode.c +++ b/fs/richacl_inode.c @@ -224,3 +224,33 @@ out: return denied ? -EACCES : 0; } EXPORT_SYMBOL_GPL(richacl_permission); + +/** + * richacl_chmod - filesystem chmod helper + * @inode: inode whose file permission bits to change + * @mode: new file permission bits including the file type + * + * Helper for filesystems to use to perform a chmod on the richacl of an inode. + */ +int +richacl_chmod(struct inode *inode, umode_t mode) +{ + struct richacl *acl; + int retval; + + if (S_ISLNK(mode)) + return -EOPNOTSUPP; + if (!inode->i_op->set_richacl) + return -EOPNOTSUPP; + acl = get_richacl(inode); + if (IS_ERR_OR_NULL(acl)) + return PTR_ERR(acl); + acl = __richacl_chmod(acl, mode); + if (IS_ERR(acl)) + return PTR_ERR(acl); + retval = inode->i_op->set_richacl(inode, acl); + richacl_put(acl); + + return retval; +} +EXPORT_SYMBOL(richacl_chmod); diff --git a/include/linux/richacl.h b/include/linux/richacl.h index 7bf912b6..a2d5600 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -184,8 +184,10 @@ extern int richacl_masks_to_mode(const struct richacl *); extern unsigned int richacl_mode_to_mask(umode_t); extern unsigned int richacl_want_to_mask(unsigned int); extern void richacl_compute_max_masks(struct richacl *); +extern struct richacl *__richacl_chmod(struct richacl *, umode_t); /* richacl_inode.c */ extern int richacl_permission(struct inode *, const struct richacl *, int); +extern int richacl_chmod(struct inode *, umode_t); #endif /* __RICHACL_H */ -- 2.5.0 From agruenba@redhat.com Mon Mar 14 09:56:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9E4EE7CB4 for ; Mon, 14 Mar 2016 09:56:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 22A44AC009 for ; Mon, 14 Mar 2016 07:56:37 -0700 (PDT) X-ASG-Debug-ID: 1457967395-04bdf002eb400ad0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id pjy462tGA0RJ2rKA (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 14 Mar 2016 07:56:36 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id B5E69C00DE1A; Mon, 14 Mar 2016 14:56:35 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-74.ams2.redhat.com [10.36.5.74]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2EEtN9t021293; Mon, 14 Mar 2016 10:56:31 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v19 16/23] richacl: Check if an acl is equivalent to a file mode Date: Mon, 14 Mar 2016 15:55:15 +0100 X-ASG-Orig-Subj: [PATCH v19 16/23] richacl: Check if an acl is equivalent to a file mode Message-Id: <1457967322-14886-17-git-send-email-agruenba@redhat.com> In-Reply-To: <1457967322-14886-1-git-send-email-agruenba@redhat.com> References: <1457967322-14886-1-git-send-email-agruenba@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: 1457967396 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 ACLs are considered equivalent to file modes if they only consist of owner@, group@, and everyone@ entries, the owner@ permissions do not depend on whether the owner is a member in the owning group, and no inheritance flags are set. This test is used to avoid storing richacls if the acl can be computed from the file permission bits. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields --- fs/richacl_base.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/richacl.h | 1 + 2 files changed, 105 insertions(+) diff --git a/fs/richacl_base.c b/fs/richacl_base.c index 9976bf1..5fc1cfc 100644 --- a/fs/richacl_base.c +++ b/fs/richacl_base.c @@ -380,3 +380,107 @@ __richacl_chmod(struct richacl *acl, umode_t mode) return clone; } EXPORT_SYMBOL_GPL(__richacl_chmod); + +/** + * richacl_equiv_mode - compute the mode equivalent of @acl + * + * An acl is considered equivalent to a file mode if it only consists of + * owner@, group@, and everyone@ entries and the owner@ permissions do not + * depend on whether the owner is a member in the owning group. + */ +int +richacl_equiv_mode(const struct richacl *acl, umode_t *mode_p) +{ + umode_t mode = *mode_p; + + /* + * The RICHACE_DELETE_CHILD flag is meaningless for non-directories, so + * we ignore it. + */ + unsigned int x = S_ISDIR(mode) ? 0 : RICHACE_DELETE_CHILD; + struct { + unsigned int allowed; + unsigned int defined; /* allowed or denied */ + } owner = { + .defined = RICHACE_POSIX_ALWAYS_ALLOWED | + RICHACE_POSIX_OWNER_ALLOWED | x, + }, group = { + .defined = RICHACE_POSIX_ALWAYS_ALLOWED | x, + }, everyone = { + .defined = RICHACE_POSIX_ALWAYS_ALLOWED | x, + }; + const struct richace *ace; + + if (acl->a_flags & ~(RICHACL_WRITE_THROUGH | RICHACL_MASKED)) + return -1; + + richacl_for_each_entry(ace, acl) { + if (ace->e_flags & ~RICHACE_SPECIAL_WHO) + return -1; + + if (richace_is_owner(ace) || richace_is_everyone(ace)) { + x = ace->e_mask & ~owner.defined; + if (richace_is_allow(ace)) { + unsigned int group_denied = + group.defined & ~group.allowed; + + if (x & group_denied) + return -1; + owner.allowed |= x; + } else /* if (richace_is_deny(ace)) */ { + if (x & group.allowed) + return -1; + } + owner.defined |= x; + + if (richace_is_everyone(ace)) { + x = ace->e_mask; + if (richace_is_allow(ace)) { + group.allowed |= + x & ~group.defined; + everyone.allowed |= + x & ~everyone.defined; + } + group.defined |= x; + everyone.defined |= x; + } + } else if (richace_is_group(ace)) { + x = ace->e_mask & ~group.defined; + if (richace_is_allow(ace)) + group.allowed |= x; + group.defined |= x; + } else + return -1; + } + + if (group.allowed & ~owner.defined) + return -1; + + if (acl->a_flags & RICHACL_MASKED) { + if (acl->a_flags & RICHACL_WRITE_THROUGH) { + owner.allowed = acl->a_owner_mask; + everyone.allowed = acl->a_other_mask; + } else { + owner.allowed &= acl->a_owner_mask; + everyone.allowed &= acl->a_other_mask; + } + group.allowed &= acl->a_group_mask; + } + + mode = (mode & ~S_IRWXUGO) | + (richacl_mask_to_mode(owner.allowed) << 6) | + (richacl_mask_to_mode(group.allowed) << 3) | + richacl_mask_to_mode(everyone.allowed); + + /* Mask flags we can ignore */ + x = S_ISDIR(mode) ? 0 : RICHACE_DELETE_CHILD; + + if (((richacl_mode_to_mask(mode >> 6) ^ owner.allowed) & ~x) || + ((richacl_mode_to_mask(mode >> 3) ^ group.allowed) & ~x) || + ((richacl_mode_to_mask(mode) ^ everyone.allowed) & ~x)) + return -1; + + *mode_p = mode; + return 0; +} +EXPORT_SYMBOL_GPL(richacl_equiv_mode); diff --git a/include/linux/richacl.h b/include/linux/richacl.h index a2d5600..b7128bf 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -185,6 +185,7 @@ extern unsigned int richacl_mode_to_mask(umode_t); extern unsigned int richacl_want_to_mask(unsigned int); extern void richacl_compute_max_masks(struct richacl *); extern struct richacl *__richacl_chmod(struct richacl *, umode_t); +extern int richacl_equiv_mode(const struct richacl *, umode_t *); /* richacl_inode.c */ extern int richacl_permission(struct inode *, const struct richacl *, int); -- 2.5.0 From agruenba@redhat.com Mon Mar 14 09:56:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2740A29E05 for ; Mon, 14 Mar 2016 09:56:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C7C4B304051 for ; Mon, 14 Mar 2016 07:56:41 -0700 (PDT) X-ASG-Debug-ID: 1457967400-04bdf002ee400b00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id lgI6EMoLvoCrqJL6 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 14 Mar 2016 07:56:40 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id DC9721555E; Mon, 14 Mar 2016 14:56:39 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-74.ams2.redhat.com [10.36.5.74]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2EEtN9u021293; Mon, 14 Mar 2016 10:56:35 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v19 17/23] richacl: Create-time inheritance Date: Mon, 14 Mar 2016 15:55:16 +0100 X-ASG-Orig-Subj: [PATCH v19 17/23] richacl: Create-time inheritance Message-Id: <1457967322-14886-18-git-send-email-agruenba@redhat.com> In-Reply-To: <1457967322-14886-1-git-send-email-agruenba@redhat.com> References: <1457967322-14886-1-git-send-email-agruenba@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: 1457967400 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 When a new file is created, it can inherit an acl from its parent directory; this is similar to how default acls work in POSIX ACLs. As with POSIX ACLs, if a file inherits an acl from its parent directory, the intersection between the create mode and the permissions granted by the inherited acl determines the file masks and file permission bits, and the umask is ignored. Signed-off-by: Andreas Gruenbacher --- fs/richacl_base.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++ fs/richacl_inode.c | 70 ++++++++++++++++++++++++++++++++++++++++++ include/linux/richacl.h | 2 ++ 3 files changed, 153 insertions(+) diff --git a/fs/richacl_base.c b/fs/richacl_base.c index 5fc1cfc..b66d940 100644 --- a/fs/richacl_base.c +++ b/fs/richacl_base.c @@ -484,3 +484,84 @@ richacl_equiv_mode(const struct richacl *acl, umode_t *mode_p) return 0; } EXPORT_SYMBOL_GPL(richacl_equiv_mode); + +static inline bool +ace_inherits_to_directory(const struct richace *ace) +{ + if (ace->e_flags & RICHACE_DIRECTORY_INHERIT_ACE) + return true; + if ((ace->e_flags & RICHACE_FILE_INHERIT_ACE) && + !(ace->e_flags & RICHACE_NO_PROPAGATE_INHERIT_ACE)) + return true; + return false; +} + +/** + * richacl_inherit - compute the inherited acl of a new file + * @dir_acl: acl of the containing directory + * @isdir: inherit by a directory or non-directory? + * + * A directory can have acl entries which files and/or directories created + * inside the directory will inherit. This function computes the acl for such + * a new file. If there is no inheritable acl, it will return %NULL. + */ +struct richacl * +richacl_inherit(const struct richacl *dir_acl, int isdir) +{ + const struct richace *dir_ace; + struct richacl *acl = NULL; + struct richace *ace; + int count = 0; + + if (isdir) { + richacl_for_each_entry(dir_ace, dir_acl) { + if (!ace_inherits_to_directory(dir_ace)) + continue; + count++; + } + if (!count) + return NULL; + acl = richacl_alloc(count, GFP_KERNEL); + if (!acl) + return ERR_PTR(-ENOMEM); + ace = acl->a_entries; + richacl_for_each_entry(dir_ace, dir_acl) { + if (!ace_inherits_to_directory(dir_ace)) + continue; + richace_copy(ace, dir_ace); + if (dir_ace->e_flags & RICHACE_NO_PROPAGATE_INHERIT_ACE) + ace->e_flags &= ~RICHACE_INHERITANCE_FLAGS; + else if (dir_ace->e_flags & RICHACE_DIRECTORY_INHERIT_ACE) + ace->e_flags &= ~RICHACE_INHERIT_ONLY_ACE; + else + ace->e_flags |= RICHACE_INHERIT_ONLY_ACE; + ace++; + } + } else { + richacl_for_each_entry(dir_ace, dir_acl) { + if (!(dir_ace->e_flags & RICHACE_FILE_INHERIT_ACE)) + continue; + count++; + } + if (!count) + return NULL; + acl = richacl_alloc(count, GFP_KERNEL); + if (!acl) + return ERR_PTR(-ENOMEM); + ace = acl->a_entries; + richacl_for_each_entry(dir_ace, dir_acl) { + if (!(dir_ace->e_flags & RICHACE_FILE_INHERIT_ACE)) + continue; + richace_copy(ace, dir_ace); + ace->e_flags &= ~RICHACE_INHERITANCE_FLAGS; + /* + * RICHACE_DELETE_CHILD is meaningless for + * non-directories, so clear it. + */ + ace->e_mask &= ~RICHACE_DELETE_CHILD; + ace++; + } + } + + return acl; +} diff --git a/fs/richacl_inode.c b/fs/richacl_inode.c index e329826..ec3d2c8 100644 --- a/fs/richacl_inode.c +++ b/fs/richacl_inode.c @@ -254,3 +254,73 @@ richacl_chmod(struct inode *inode, umode_t mode) return retval; } EXPORT_SYMBOL(richacl_chmod); + +/* + * richacl_inherit_inode - compute inherited acl and file mode + * @dir_acl: acl of the containing directory + * @mode_p: mode of the new inode + * + * The file permission bits in @mode_p must be set to the create mode by the + * caller. + * + * If there is an inheritable acl, the maximum permissions that the acl grants + * are computed and the file masks of the new acl are set accordingly. + */ +static struct richacl * +richacl_inherit_inode(const struct richacl *dir_acl, umode_t *mode_p) +{ + struct richacl *acl; + umode_t mode = *mode_p; + + acl = richacl_inherit(dir_acl, S_ISDIR(mode)); + if (acl) { + if (richacl_equiv_mode(acl, &mode) == 0) { + *mode_p &= mode; + richacl_put(acl); + acl = NULL; + } else { + richacl_compute_max_masks(acl); + /* + * Ensure that the acl will not grant any permissions + * beyond the create mode. + */ + acl->a_flags |= RICHACL_MASKED; + acl->a_owner_mask &= + richacl_mode_to_mask(mode >> 6); + acl->a_group_mask &= + richacl_mode_to_mask(mode >> 3); + acl->a_other_mask &= + richacl_mode_to_mask(mode); + } + } else + *mode_p &= ~current_umask(); + + return acl; +} + +/** + * richacl_create - filesystem create helper + * @mode_p: mode of the new inode + * @dir: containing directory + * + * Compute the inherited acl for a new inode. If there is no acl to inherit, + * apply the umask. Use when creating a new inode on a richacl enabled file + * system. + */ +struct richacl *richacl_create(umode_t *mode_p, struct inode *dir) +{ + struct richacl *dir_acl, *acl = NULL; + + if (S_ISLNK(*mode_p)) + return NULL; + dir_acl = get_richacl(dir); + if (dir_acl) { + if (IS_ERR(dir_acl)) + return dir_acl; + acl = richacl_inherit_inode(dir_acl, mode_p); + richacl_put(dir_acl); + } else + *mode_p &= ~current_umask(); + return acl; +} +EXPORT_SYMBOL_GPL(richacl_create); diff --git a/include/linux/richacl.h b/include/linux/richacl.h index b7128bf..c8fae91a 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -186,9 +186,11 @@ extern unsigned int richacl_want_to_mask(unsigned int); extern void richacl_compute_max_masks(struct richacl *); extern struct richacl *__richacl_chmod(struct richacl *, umode_t); extern int richacl_equiv_mode(const struct richacl *, umode_t *); +extern struct richacl *richacl_inherit(const struct richacl *, int); /* richacl_inode.c */ extern int richacl_permission(struct inode *, const struct richacl *, int); extern int richacl_chmod(struct inode *, umode_t); +extern struct richacl *richacl_create(umode_t *, struct inode *); #endif /* __RICHACL_H */ -- 2.5.0 From agruenba@redhat.com Mon Mar 14 09:56:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6306129E3A for ; Mon, 14 Mar 2016 09:56:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id BD189AC005 for ; Mon, 14 Mar 2016 07:56:46 -0700 (PDT) X-ASG-Debug-ID: 1457967404-04cb6c7f2ad7050001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id sS7iFuYnc46PDQi4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 14 Mar 2016 07:56:44 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 169E84D6A9; Mon, 14 Mar 2016 14:56:44 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-74.ams2.redhat.com [10.36.5.74]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2EEtN9v021293; Mon, 14 Mar 2016 10:56:40 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v19 18/23] richacl: Automatic Inheritance Date: Mon, 14 Mar 2016 15:55:17 +0100 X-ASG-Orig-Subj: [PATCH v19 18/23] richacl: Automatic Inheritance Message-Id: <1457967322-14886-19-git-send-email-agruenba@redhat.com> In-Reply-To: <1457967322-14886-1-git-send-email-agruenba@redhat.com> References: <1457967322-14886-1-git-send-email-agruenba@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: 1457967404 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Automatic Inheritance (AI) allows changes to the acl of a directory to propagate down to children. This is mostly implemented in user space: when a process changes the permissions of a directory and Automatic Inheritance is enabled for that directory, the process must propagate those changes to all children, recursively. The kernel enables this by keeping track of which permissions have been inherited at create time. In addition, it makes sure that permission propagation is turned off when the permissions are set explicitly (for example, upon create or chmod). Automatic Inheritance works as follows: - When the RICHACL_AUTO_INHERIT flag in the acl of a file or directory is not set, the file or directory is not affected by AI. - When the RICHACL_AUTO_INHERIT flag in the acl of a directory is set and a file or subdirectory is created in that directory, the inherited acl will have the RICHACL_AUTO_INHERIT flag set, and all inherited aces will have the RICHACE_INHERITED_ACE flag set. This allows user space to distinguish between aces which have been inherited and aces which have been explicitly added. - When the RICHACL_PROTECTED acl flag in the acl of a file or directory is set, AI will not modify the acl. This does not affect propagation of permissions from the file to its children (if the file is a directory). Linux does not have a way of creating files or directories without setting the file permission bits, so all files created inside a directory with RICHACL_AUTO_INHERIT set will have the RICHACL_PROTECTED flag set. This effectively disables Automatic Inheritance. Protocols which support creating files without specifying permissions can explicitly clear the RICHACL_PROTECTED flag after creating a file and reset the file masks to "undo" applying the create mode; see richacl_compute_max_masks(). They should set the RICHACL_DEFAULTED flag. (A mechanism that would allow to indicate to the kernel to ignore the create mode in the first place when there are inherited permissions would be nice to have.) Signed-off-by: Andreas Gruenbacher --- fs/richacl_base.c | 13 ++++++++++++- fs/richacl_inode.c | 7 +++++++ include/linux/richacl.h | 12 ++++++++++++ include/uapi/linux/richacl.h | 11 ++++++++++- 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/fs/richacl_base.c b/fs/richacl_base.c index b66d940..724b5e0 100644 --- a/fs/richacl_base.c +++ b/fs/richacl_base.c @@ -364,7 +364,8 @@ __richacl_chmod(struct richacl *acl, umode_t mode) acl->a_group_mask == group_mask && acl->a_other_mask == other_mask && (acl->a_flags & RICHACL_MASKED) && - (acl->a_flags & RICHACL_WRITE_THROUGH)) + (acl->a_flags & RICHACL_WRITE_THROUGH) && + (!richacl_is_auto_inherit(acl) || richacl_is_protected(acl))) return acl; clone = richacl_clone(acl, GFP_KERNEL); @@ -376,6 +377,8 @@ __richacl_chmod(struct richacl *acl, umode_t mode) clone->a_owner_mask = owner_mask; clone->a_group_mask = group_mask; clone->a_other_mask = other_mask; + if (richacl_is_auto_inherit(clone)) + clone->a_flags |= RICHACL_PROTECTED; return clone; } @@ -562,6 +565,14 @@ richacl_inherit(const struct richacl *dir_acl, int isdir) ace++; } } + if (richacl_is_auto_inherit(dir_acl)) { + acl->a_flags = RICHACL_AUTO_INHERIT; + richacl_for_each_entry(ace, acl) + ace->e_flags |= RICHACE_INHERITED_ACE; + } else { + richacl_for_each_entry(ace, acl) + ace->e_flags &= ~RICHACE_INHERITED_ACE; + } return acl; } diff --git a/fs/richacl_inode.c b/fs/richacl_inode.c index ec3d2c8..99a1ab6 100644 --- a/fs/richacl_inode.c +++ b/fs/richacl_inode.c @@ -279,6 +279,13 @@ richacl_inherit_inode(const struct richacl *dir_acl, umode_t *mode_p) richacl_put(acl); acl = NULL; } else { + /* + * We need to set RICHACL_PROTECTED because we are + * doing an implicit chmod + */ + if (richacl_is_auto_inherit(acl)) + acl->a_flags |= RICHACL_PROTECTED; + richacl_compute_max_masks(acl); /* * Ensure that the acl will not grant any permissions diff --git a/include/linux/richacl.h b/include/linux/richacl.h index c8fae91a..c524a4b 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -76,6 +76,18 @@ extern void set_cached_richacl(struct inode *, struct richacl *); extern void forget_cached_richacl(struct inode *); extern struct richacl *get_richacl(struct inode *); +static inline int +richacl_is_auto_inherit(const struct richacl *acl) +{ + return acl->a_flags & RICHACL_AUTO_INHERIT; +} + +static inline int +richacl_is_protected(const struct richacl *acl) +{ + return acl->a_flags & RICHACL_PROTECTED; +} + /** * richace_is_owner - check if @ace is an OWNER@ entry */ diff --git a/include/uapi/linux/richacl.h b/include/uapi/linux/richacl.h index 1ed48ac..8849a53 100644 --- a/include/uapi/linux/richacl.h +++ b/include/uapi/linux/richacl.h @@ -18,6 +18,9 @@ #define __UAPI_RICHACL_H /* a_flags values */ +#define RICHACL_AUTO_INHERIT 0x01 +#define RICHACL_PROTECTED 0x02 +#define RICHACL_DEFAULTED 0x04 #define RICHACL_WRITE_THROUGH 0x40 #define RICHACL_MASKED 0x80 @@ -31,6 +34,7 @@ #define RICHACE_NO_PROPAGATE_INHERIT_ACE 0x0004 #define RICHACE_INHERIT_ONLY_ACE 0x0008 #define RICHACE_IDENTIFIER_GROUP 0x0040 +#define RICHACE_INHERITED_ACE 0x0080 #define RICHACE_SPECIAL_WHO 0x4000 /* e_mask bitflags */ @@ -60,6 +64,9 @@ #define RICHACE_EVERYONE_SPECIAL_ID 2 #define RICHACL_VALID_FLAGS ( \ + RICHACL_AUTO_INHERIT | \ + RICHACL_PROTECTED | \ + RICHACL_DEFAULTED | \ RICHACL_WRITE_THROUGH | \ RICHACL_MASKED ) @@ -69,13 +76,15 @@ RICHACE_NO_PROPAGATE_INHERIT_ACE | \ RICHACE_INHERIT_ONLY_ACE | \ RICHACE_IDENTIFIER_GROUP | \ + RICHACE_INHERITED_ACE | \ RICHACE_SPECIAL_WHO ) #define RICHACE_INHERITANCE_FLAGS ( \ RICHACE_FILE_INHERIT_ACE | \ RICHACE_DIRECTORY_INHERIT_ACE | \ RICHACE_NO_PROPAGATE_INHERIT_ACE | \ - RICHACE_INHERIT_ONLY_ACE ) + RICHACE_INHERIT_ONLY_ACE | \ + RICHACE_INHERITED_ACE ) /* Valid RICHACE_* flags for directories and non-directories */ #define RICHACE_VALID_MASK ( \ -- 2.5.0 From agruenba@redhat.com Mon Mar 14 09:56:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 67AD129E41 for ; Mon, 14 Mar 2016 09:56:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C511BAC005 for ; Mon, 14 Mar 2016 07:56:50 -0700 (PDT) X-ASG-Debug-ID: 1457967408-04cb6c7f2ad7060001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8jvWfBCYvYXczGhT (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 14 Mar 2016 07:56:48 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 2E22E935D8; Mon, 14 Mar 2016 14:56:48 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-74.ams2.redhat.com [10.36.5.74]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2EEtN9w021293; Mon, 14 Mar 2016 10:56:44 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v19 19/23] richacl: xattr mapping functions Date: Mon, 14 Mar 2016 15:55:18 +0100 X-ASG-Orig-Subj: [PATCH v19 19/23] richacl: xattr mapping functions Message-Id: <1457967322-14886-20-git-send-email-agruenba@redhat.com> In-Reply-To: <1457967322-14886-1-git-send-email-agruenba@redhat.com> References: <1457967322-14886-1-git-send-email-agruenba@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: 1457967408 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Map between "system.richacl" xattrs and the in-kernel representation. Signed-off-by: Andreas Gruenbacher --- fs/Makefile | 2 +- fs/richacl_xattr.c | 161 +++++++++++++++++++++++++++++++++++++ include/linux/richacl_xattr.h | 29 +++++++ include/uapi/linux/Kbuild | 1 + include/uapi/linux/richacl_xattr.h | 44 ++++++++++ include/uapi/linux/xattr.h | 2 + 6 files changed, 238 insertions(+), 1 deletion(-) create mode 100644 fs/richacl_xattr.c create mode 100644 include/linux/richacl_xattr.h create mode 100644 include/uapi/linux/richacl_xattr.h diff --git a/fs/Makefile b/fs/Makefile index d5b45ca..2d6d224 100644 --- a/fs/Makefile +++ b/fs/Makefile @@ -49,7 +49,7 @@ obj-$(CONFIG_SYSCTL) += drop_caches.o obj-$(CONFIG_FHANDLE) += fhandle.o obj-$(CONFIG_FS_RICHACL) += richacl.o -richacl-y := richacl_base.o richacl_inode.o +richacl-y := richacl_base.o richacl_inode.o richacl_xattr.o obj-y += quota/ diff --git a/fs/richacl_xattr.c b/fs/richacl_xattr.c new file mode 100644 index 0000000..dc1ad36 --- /dev/null +++ b/fs/richacl_xattr.c @@ -0,0 +1,161 @@ +/* + * Copyright (C) 2006, 2010 Novell, Inc. + * Copyright (C) 2015 Red Hat, Inc. + * Written by Andreas Gruenbacher + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#include +#include +#include +#include +#include + +/** + * richacl_from_xattr - convert a richacl xattr into the in-memory representation + */ +struct richacl * +richacl_from_xattr(struct user_namespace *user_ns, + const void *value, size_t size, int invalid_error) +{ + const struct richacl_xattr *xattr_acl = value; + const struct richace_xattr *xattr_ace = (void *)(xattr_acl + 1); + struct richacl *acl; + struct richace *ace; + int count; + + if (size < sizeof(*xattr_acl) || + xattr_acl->a_version != RICHACL_XATTR_VERSION || + (xattr_acl->a_flags & ~RICHACL_VALID_FLAGS)) + goto invalid; + size -= sizeof(*xattr_acl); + count = le16_to_cpu(xattr_acl->a_count); + if (count > RICHACL_XATTR_MAX_COUNT) + goto invalid; + if (size != count * sizeof(*xattr_ace)) + goto invalid; + + acl = richacl_alloc(count, GFP_NOFS); + if (!acl) + return ERR_PTR(-ENOMEM); + + acl->a_flags = xattr_acl->a_flags; + acl->a_owner_mask = le32_to_cpu(xattr_acl->a_owner_mask); + if (acl->a_owner_mask & ~RICHACE_VALID_MASK) + goto put_invalid; + acl->a_group_mask = le32_to_cpu(xattr_acl->a_group_mask); + if (acl->a_group_mask & ~RICHACE_VALID_MASK) + goto put_invalid; + acl->a_other_mask = le32_to_cpu(xattr_acl->a_other_mask); + if (acl->a_other_mask & ~RICHACE_VALID_MASK) + goto put_invalid; + + richacl_for_each_entry(ace, acl) { + ace->e_type = le16_to_cpu(xattr_ace->e_type); + ace->e_flags = le16_to_cpu(xattr_ace->e_flags); + ace->e_mask = le32_to_cpu(xattr_ace->e_mask); + + if (ace->e_flags & ~RICHACE_VALID_FLAGS) + goto put_invalid; + if (ace->e_flags & RICHACE_SPECIAL_WHO) { + ace->e_id.special = le32_to_cpu(xattr_ace->e_id); + if (ace->e_id.special > RICHACE_EVERYONE_SPECIAL_ID) + goto put_invalid; + } else if (ace->e_flags & RICHACE_IDENTIFIER_GROUP) { + u32 id = le32_to_cpu(xattr_ace->e_id); + + ace->e_id.gid = make_kgid(user_ns, id); + if (!gid_valid(ace->e_id.gid)) + goto put_invalid; + } else { + u32 id = le32_to_cpu(xattr_ace->e_id); + + ace->e_id.uid = make_kuid(user_ns, id); + if (!uid_valid(ace->e_id.uid)) + goto put_invalid; + } + if (ace->e_type > RICHACE_ACCESS_DENIED_ACE_TYPE || + (ace->e_mask & ~RICHACE_VALID_MASK)) + goto put_invalid; + + xattr_ace++; + } + + return acl; + +put_invalid: + richacl_put(acl); +invalid: + return ERR_PTR(invalid_error); +} +EXPORT_SYMBOL_GPL(richacl_from_xattr); + +/** + * richacl_xattr_size - compute the size of the xattr representation of @acl + */ +size_t +richacl_xattr_size(const struct richacl *acl) +{ + size_t size = sizeof(struct richacl_xattr); + + size += sizeof(struct richace_xattr) * acl->a_count; + return size; +} +EXPORT_SYMBOL_GPL(richacl_xattr_size); + +/** + * richacl_to_xattr - convert @acl into its xattr representation + * @acl: the richacl to convert + * @buffer: buffer for the result + * @size: size of @buffer + */ +int +richacl_to_xattr(struct user_namespace *user_ns, + const struct richacl *acl, void *buffer, size_t size) +{ + struct richacl_xattr *xattr_acl = buffer; + struct richace_xattr *xattr_ace; + const struct richace *ace; + size_t real_size; + + real_size = richacl_xattr_size(acl); + if (!buffer) + return real_size; + if (real_size > size) + return -ERANGE; + + xattr_acl->a_version = RICHACL_XATTR_VERSION; + xattr_acl->a_flags = acl->a_flags; + xattr_acl->a_count = cpu_to_le16(acl->a_count); + + xattr_acl->a_owner_mask = cpu_to_le32(acl->a_owner_mask); + xattr_acl->a_group_mask = cpu_to_le32(acl->a_group_mask); + xattr_acl->a_other_mask = cpu_to_le32(acl->a_other_mask); + + xattr_ace = (void *)(xattr_acl + 1); + richacl_for_each_entry(ace, acl) { + xattr_ace->e_type = cpu_to_le16(ace->e_type); + xattr_ace->e_flags = cpu_to_le16(ace->e_flags); + xattr_ace->e_mask = cpu_to_le32(ace->e_mask); + if (ace->e_flags & RICHACE_SPECIAL_WHO) + xattr_ace->e_id = cpu_to_le32(ace->e_id.special); + else if (ace->e_flags & RICHACE_IDENTIFIER_GROUP) + xattr_ace->e_id = + cpu_to_le32(from_kgid(user_ns, ace->e_id.gid)); + else + xattr_ace->e_id = + cpu_to_le32(from_kuid(user_ns, ace->e_id.uid)); + xattr_ace++; + } + return real_size; +} +EXPORT_SYMBOL_GPL(richacl_to_xattr); diff --git a/include/linux/richacl_xattr.h b/include/linux/richacl_xattr.h new file mode 100644 index 0000000..0efa14b --- /dev/null +++ b/include/linux/richacl_xattr.h @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2006, 2010 Novell, Inc. + * Copyright (C) 2015 Red Hat, Inc. + * Written by Andreas Gruenbacher + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#ifndef __RICHACL_XATTR_H +#define __RICHACL_XATTR_H + +#include +#include + +extern struct richacl *richacl_from_xattr(struct user_namespace *, const void *, + size_t, int); +extern size_t richacl_xattr_size(const struct richacl *); +extern int richacl_to_xattr(struct user_namespace *, const struct richacl *, + void *, size_t); + +#endif /* __RICHACL_XATTR_H */ diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild index 6e05dc8..14b8a06 100644 --- a/include/uapi/linux/Kbuild +++ b/include/uapi/linux/Kbuild @@ -352,6 +352,7 @@ header-y += reiserfs_fs.h header-y += reiserfs_xattr.h header-y += resource.h header-y += richacl.h +header-y += richacl_xattr.h header-y += rfkill.h header-y += romfs_fs.h header-y += rose.h diff --git a/include/uapi/linux/richacl_xattr.h b/include/uapi/linux/richacl_xattr.h new file mode 100644 index 0000000..20da204 --- /dev/null +++ b/include/uapi/linux/richacl_xattr.h @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2006, 2010 Novell, Inc. + * Copyright (C) 2015 Red Hat, Inc. + * Written by Andreas Gruenbacher + * + * This file is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + */ + +#ifndef __UAPI_RICHACL_XATTR_H +#define __UAPI_RICHACL_XATTR_H + +#include +#include + +struct richace_xattr { + __le16 e_type; + __le16 e_flags; + __le32 e_mask; + __le32 e_id; +}; + +struct richacl_xattr { + __u8 a_version; + __u8 a_flags; + __le16 a_count; + __le32 a_owner_mask; + __le32 a_group_mask; + __le32 a_other_mask; +}; + +#define RICHACL_XATTR_VERSION 0 +#define RICHACL_XATTR_MAX_COUNT \ + ((XATTR_SIZE_MAX - sizeof(struct richacl_xattr)) / \ + sizeof(struct richace_xattr)) + +#endif /* __UAPI_RICHACL_XATTR_H */ diff --git a/include/uapi/linux/xattr.h b/include/uapi/linux/xattr.h index 1590c49..1996903 100644 --- a/include/uapi/linux/xattr.h +++ b/include/uapi/linux/xattr.h @@ -73,5 +73,7 @@ #define XATTR_POSIX_ACL_DEFAULT "posix_acl_default" #define XATTR_NAME_POSIX_ACL_DEFAULT XATTR_SYSTEM_PREFIX XATTR_POSIX_ACL_DEFAULT +#define XATTR_RICHACL "richacl" +#define XATTR_NAME_RICHACL XATTR_SYSTEM_PREFIX XATTR_RICHACL #endif /* _UAPI_LINUX_XATTR_H */ -- 2.5.0 From agruenba@redhat.com Mon Mar 14 09:56:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 561F329E3A for ; Mon, 14 Mar 2016 09:56:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 11A33304051 for ; Mon, 14 Mar 2016 07:56:54 -0700 (PDT) X-ASG-Debug-ID: 1457967412-04cb6c7f2ad7070001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 0jcHegFE8c1eIgVL (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 14 Mar 2016 07:56:53 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 5C23CC00070F; Mon, 14 Mar 2016 14:56:52 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-74.ams2.redhat.com [10.36.5.74]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2EEtN9x021293; Mon, 14 Mar 2016 10:56:48 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v19 20/23] richacl: Add richacl xattr handler Date: Mon, 14 Mar 2016 15:55:19 +0100 X-ASG-Orig-Subj: [PATCH v19 20/23] richacl: Add richacl xattr handler Message-Id: <1457967322-14886-21-git-send-email-agruenba@redhat.com> In-Reply-To: <1457967322-14886-1-git-send-email-agruenba@redhat.com> References: <1457967322-14886-1-git-send-email-agruenba@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: 1457967412 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add richacl xattr handler implementing the xattr operations based on the get_richacl and set_richacl inode operations. Signed-off-by: Andreas Gruenbacher --- fs/richacl_xattr.c | 74 +++++++++++++++++++++++++++++++++++++++++++ include/linux/richacl_xattr.h | 2 ++ 2 files changed, 76 insertions(+) diff --git a/fs/richacl_xattr.c b/fs/richacl_xattr.c index dc1ad36..5cb5e11 100644 --- a/fs/richacl_xattr.c +++ b/fs/richacl_xattr.c @@ -18,7 +18,9 @@ #include #include #include +#include #include +#include /** * richacl_from_xattr - convert a richacl xattr into the in-memory representation @@ -159,3 +161,75 @@ richacl_to_xattr(struct user_namespace *user_ns, return real_size; } EXPORT_SYMBOL_GPL(richacl_to_xattr); + +static bool +richacl_xattr_list(struct dentry *dentry) +{ + return IS_RICHACL(d_backing_inode(dentry)); +} + +static int +richacl_xattr_get(const struct xattr_handler *handler, + struct dentry *dentry, const char *name, void *buffer, + size_t buffer_size) +{ + struct inode *inode = d_backing_inode(dentry); + struct richacl *acl; + int error; + + if (*name) + return -EINVAL; + if (!IS_RICHACL(inode)) + return -EOPNOTSUPP; + if (S_ISLNK(inode->i_mode)) + return -EOPNOTSUPP; + acl = get_richacl(inode); + if (IS_ERR(acl)) + return PTR_ERR(acl); + if (acl == NULL) + return -ENODATA; + error = richacl_to_xattr(current_user_ns(), acl, buffer, buffer_size); + richacl_put(acl); + return error; +} + +static int +richacl_xattr_set(const struct xattr_handler *handler, + struct dentry *dentry, const char *name, + const void *value, size_t size, int flags) +{ + struct inode *inode = d_backing_inode(dentry); + struct richacl *acl = NULL; + int ret; + + if (*name) + return -EINVAL; + if (!IS_RICHACL(inode)) + return -EOPNOTSUPP; + if (!inode->i_op->set_richacl) + return -EOPNOTSUPP; + + if (!uid_eq(current_fsuid(), inode->i_uid) && + inode_permission(inode, MAY_CHMOD) && + !capable(CAP_FOWNER)) + return -EPERM; + + if (value) { + acl = richacl_from_xattr(current_user_ns(), value, size, + -EINVAL); + if (IS_ERR(acl)) + return PTR_ERR(acl); + } + + ret = inode->i_op->set_richacl(inode, acl); + richacl_put(acl); + return ret; +} + +struct xattr_handler richacl_xattr_handler = { + .name = XATTR_NAME_RICHACL, + .list = richacl_xattr_list, + .get = richacl_xattr_get, + .set = richacl_xattr_set, +}; +EXPORT_SYMBOL(richacl_xattr_handler); diff --git a/include/linux/richacl_xattr.h b/include/linux/richacl_xattr.h index 0efa14b..6c6adb1 100644 --- a/include/linux/richacl_xattr.h +++ b/include/linux/richacl_xattr.h @@ -26,4 +26,6 @@ extern size_t richacl_xattr_size(const struct richacl *); extern int richacl_to_xattr(struct user_namespace *, const struct richacl *, void *, size_t); +extern struct xattr_handler richacl_xattr_handler; + #endif /* __RICHACL_XATTR_H */ -- 2.5.0 From agruenba@redhat.com Mon Mar 14 09:56:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 83DAA29DF8 for ; Mon, 14 Mar 2016 09:56:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 582408F804C for ; Mon, 14 Mar 2016 07:56:58 -0700 (PDT) X-ASG-Debug-ID: 1457967416-04cbb00b723edcd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id yb0EU2Jh9lyHQOK2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 14 Mar 2016 07:56:57 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 8E9BFC00F1E5; Mon, 14 Mar 2016 14:56:56 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-74.ams2.redhat.com [10.36.5.74]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2EEtNA0021293; Mon, 14 Mar 2016 10:56:52 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v19 21/23] vfs: Add richacl permission checking Date: Mon, 14 Mar 2016 15:55:20 +0100 X-ASG-Orig-Subj: [PATCH v19 21/23] vfs: Add richacl permission checking Message-Id: <1457967322-14886-22-git-send-email-agruenba@redhat.com> In-Reply-To: <1457967322-14886-1-git-send-email-agruenba@redhat.com> References: <1457967322-14886-1-git-send-email-agruenba@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: 1457967417 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hook the richacl permission checking function into the vfs. Signed-off-by: Andreas Gruenbacher --- fs/namei.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++-- fs/posix_acl.c | 6 +++--- 2 files changed, 52 insertions(+), 5 deletions(-) diff --git a/fs/namei.c b/fs/namei.c index 28707ae..b55cee6 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -35,6 +35,7 @@ #include #include #include +#include #include #include "internal.h" @@ -255,7 +256,40 @@ void putname(struct filename *name) __putname(name); } -static int check_acl(struct inode *inode, int mask) +static int check_richacl(struct inode *inode, int mask) +{ +#ifdef CONFIG_FS_RICHACL + struct richacl *acl; + + if (mask & MAY_NOT_BLOCK) { + acl = get_cached_richacl_rcu(inode); + if (!acl) + goto no_acl; + /* no ->get_richacl() calls in RCU mode... */ + if (acl == ACL_NOT_CACHED) + return -ECHILD; + return richacl_permission(inode, acl, mask & ~MAY_NOT_BLOCK); + } + + acl = get_richacl(inode); + if (IS_ERR(acl)) + return PTR_ERR(acl); + if (acl) { + int error = richacl_permission(inode, acl, mask); + richacl_put(acl); + return error; + } +no_acl: +#endif + if (mask & (MAY_DELETE_SELF | MAY_TAKE_OWNERSHIP | + MAY_CHMOD | MAY_SET_TIMES)) { + /* File permission bits cannot grant this. */ + return -EACCES; + } + return -EAGAIN; +} + +static int check_posix_acl(struct inode *inode, int mask) { #ifdef CONFIG_FS_POSIX_ACL struct posix_acl *acl; @@ -290,11 +324,24 @@ static int acl_permission_check(struct inode *inode, int mask) { unsigned int mode = inode->i_mode; + /* + * With POSIX ACLs, the (mode & S_IRWXU) bits exactly match the owner + * permissions, and we can skip checking posix acls for the owner. + * With richacls, the owner may be granted fewer permissions than the + * mode bits seem to suggest (for example, append but not write), and + * we always need to check the richacl. + */ + + if (IS_RICHACL(inode)) { + int error = check_richacl(inode, mask); + if (error != -EAGAIN) + return error; + } if (likely(uid_eq(current_fsuid(), inode->i_uid))) mode >>= 6; else { if (IS_POSIXACL(inode) && (mode & S_IRWXG)) { - int error = check_acl(inode, mask); + int error = check_posix_acl(inode, mask); if (error != -EAGAIN) return error; } diff --git a/fs/posix_acl.c b/fs/posix_acl.c index f24646e..7810c6f 100644 --- a/fs/posix_acl.c +++ b/fs/posix_acl.c @@ -100,13 +100,13 @@ struct posix_acl *get_acl(struct inode *inode, int type) { struct posix_acl *acl; + if (!IS_POSIXACL(inode)) + return NULL; + acl = get_cached_acl(inode, type); if (acl != ACL_NOT_CACHED) return acl; - if (!IS_POSIXACL(inode)) - return NULL; - /* * A filesystem can force a ACL callback by just never filling the * ACL cache. But normally you'd fill the cache either at inode -- 2.5.0 From agruenba@redhat.com Mon Mar 14 09:57:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 23CD429E19 for ; Mon, 14 Mar 2016 09:57:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D53848F804B for ; Mon, 14 Mar 2016 07:57:03 -0700 (PDT) X-ASG-Debug-ID: 1457967421-04cb6c7f29d7090001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Aq87WSDp2LFGnI0G (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 14 Mar 2016 07:57:01 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id E57DB8F50B; Mon, 14 Mar 2016 14:57:00 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-74.ams2.redhat.com [10.36.5.74]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2EEtNA1021293; Mon, 14 Mar 2016 10:56:56 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: "Aneesh Kumar K.V" , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org, Andreas Gruenbacher Subject: [PATCH v19 22/23] ext4: Add richacl support Date: Mon, 14 Mar 2016 15:55:21 +0100 X-ASG-Orig-Subj: [PATCH v19 22/23] ext4: Add richacl support Message-Id: <1457967322-14886-23-git-send-email-agruenba@redhat.com> In-Reply-To: <1457967322-14886-1-git-send-email-agruenba@redhat.com> References: <1457967322-14886-1-git-send-email-agruenba@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: 1457967421 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: "Aneesh Kumar K.V" Support the richacl permission model in ext4. The richacls are stored in "system.richacl" xattrs. Richacls need to be enabled by tune2fs or at file system create time. Signed-off-by: Aneesh Kumar K.V Signed-off-by: Andreas Gruenbacher Reviewed-by: Andreas Dilger --- fs/ext4/Kconfig | 11 +++++ fs/ext4/Makefile | 1 + fs/ext4/file.c | 3 ++ fs/ext4/ialloc.c | 11 ++++- fs/ext4/inode.c | 12 ++++- fs/ext4/namei.c | 5 ++ fs/ext4/richacl.c | 137 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ fs/ext4/richacl.h | 40 ++++++++++++++++ fs/ext4/xattr.c | 7 +++ 9 files changed, 224 insertions(+), 3 deletions(-) create mode 100644 fs/ext4/richacl.c create mode 100644 fs/ext4/richacl.h diff --git a/fs/ext4/Kconfig b/fs/ext4/Kconfig index b46e9fc..4e21c18 100644 --- a/fs/ext4/Kconfig +++ b/fs/ext4/Kconfig @@ -22,6 +22,17 @@ config EXT3_FS_POSIX_ACL This config option is here only for backward compatibility. ext3 filesystem is now handled by the ext4 driver. +config EXT4_FS_RICHACL + bool "Ext4 Rich Access Control Lists" + depends on EXT4_FS + select FS_RICHACL + help + Richacls are an implementation of NFSv4 ACLs, extended by file masks + to cleanly integrate into the POSIX file permission model. To learn + more about them, see http://www.bestbits.at/richacl/. + + If you don't know what Richacls are, say N. + config EXT3_FS_SECURITY bool "Ext3 Security Labels" depends on EXT3_FS diff --git a/fs/ext4/Makefile b/fs/ext4/Makefile index f52cf54..1fb7f11 100644 --- a/fs/ext4/Makefile +++ b/fs/ext4/Makefile @@ -14,3 +14,4 @@ ext4-$(CONFIG_EXT4_FS_POSIX_ACL) += acl.o ext4-$(CONFIG_EXT4_FS_SECURITY) += xattr_security.o ext4-$(CONFIG_EXT4_FS_ENCRYPTION) += crypto_policy.o crypto.o \ crypto_key.o crypto_fname.o +ext4-$(CONFIG_EXT4_FS_RICHACL) += richacl.o diff --git a/fs/ext4/file.c b/fs/ext4/file.c index 4cd318f..92e35bc 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c @@ -30,6 +30,7 @@ #include "ext4_jbd2.h" #include "xattr.h" #include "acl.h" +#include "richacl.h" /* * Called when an inode is released. Note that this is different @@ -749,6 +750,8 @@ const struct inode_operations ext4_file_inode_operations = { .removexattr = generic_removexattr, .get_acl = ext4_get_acl, .set_acl = ext4_set_acl, + .get_richacl = ext4_get_richacl, + .set_richacl = ext4_set_richacl, .fiemap = ext4_fiemap, }; diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index acc0ad5..f2d31c2 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c @@ -27,6 +27,7 @@ #include "ext4_jbd2.h" #include "xattr.h" #include "acl.h" +#include "richacl.h" #include @@ -729,6 +730,14 @@ out: return ret; } +static inline int +ext4_new_acl(handle_t *handle, struct inode *inode, struct inode *dir) +{ + if (IS_RICHACL(dir)) + return ext4_init_richacl(handle, inode, dir); + return ext4_init_acl(handle, inode, dir); +} + /* * There are two policies for allocating an inode. If the new inode is * a directory, then a forward search is made for a block group with both @@ -1093,7 +1102,7 @@ got: if (err) goto fail_drop; - err = ext4_init_acl(handle, inode, dir); + err = ext4_new_acl(handle, inode, dir); if (err) goto fail_free_drop; diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index aee960b..72c046d 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -42,6 +42,7 @@ #include "xattr.h" #include "acl.h" #include "truncate.h" +#include "richacl.h" #include @@ -4855,6 +4856,14 @@ static void ext4_wait_for_tail_page_commit(struct inode *inode) } } +static inline int +ext4_acl_chmod(struct inode *inode) +{ + if (IS_RICHACL(inode)) + return richacl_chmod(inode, inode->i_mode); + return posix_acl_chmod(inode, inode->i_mode); +} + /* * ext4_setattr() * @@ -5025,8 +5034,7 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) ext4_orphan_del(NULL, inode); if (!rc && (ia_valid & ATTR_MODE)) - rc = posix_acl_chmod(inode, inode->i_mode); - + rc = ext4_acl_chmod(inode); err_out: ext4_std_error(inode->i_sb, error); if (!error) diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index 48e4b89..d86c5f2 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c @@ -38,6 +38,7 @@ #include "xattr.h" #include "acl.h" +#include "richacl.h" #include /* @@ -3888,6 +3889,8 @@ const struct inode_operations ext4_dir_inode_operations = { .removexattr = generic_removexattr, .get_acl = ext4_get_acl, .set_acl = ext4_set_acl, + .get_richacl = ext4_get_richacl, + .set_richacl = ext4_set_richacl, .fiemap = ext4_fiemap, }; @@ -3899,4 +3902,6 @@ const struct inode_operations ext4_special_inode_operations = { .removexattr = generic_removexattr, .get_acl = ext4_get_acl, .set_acl = ext4_set_acl, + .get_richacl = ext4_get_richacl, + .set_richacl = ext4_set_richacl, }; diff --git a/fs/ext4/richacl.c b/fs/ext4/richacl.c new file mode 100644 index 0000000..13a88e2 --- /dev/null +++ b/fs/ext4/richacl.c @@ -0,0 +1,137 @@ +/* + * Copyright IBM Corporation, 2010 + * Copyright (C) 2015 Red Hat, Inc. + * Author: Aneesh Kumar K.V , + * Andreas Gruenbacher + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2.1 of the GNU Lesser 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. + * + */ + +#include +#include +#include + +#include "ext4.h" +#include "ext4_jbd2.h" +#include "xattr.h" +#include "acl.h" +#include "richacl.h" + +struct richacl * +ext4_get_richacl(struct inode *inode) +{ + const int name_index = EXT4_XATTR_INDEX_RICHACL; + void *value = NULL; + struct richacl *acl = NULL; + int retval; + + retval = ext4_xattr_get(inode, name_index, "", NULL, 0); + if (retval > 0) { + value = kmalloc(retval, GFP_NOFS); + if (!value) + return ERR_PTR(-ENOMEM); + retval = ext4_xattr_get(inode, name_index, "", value, retval); + } + if (retval > 0) + acl = richacl_from_xattr(&init_user_ns, value, retval, -EIO); + else if (retval != -ENODATA && retval != -ENOSYS) + acl = ERR_PTR(retval); + kfree(value); + + if (!IS_ERR(acl)) + set_cached_richacl(inode, acl); + + return acl; +} + +static int +__ext4_remove_richacl(handle_t *handle, struct inode *inode) +{ + const int name_index = EXT4_XATTR_INDEX_RICHACL; + int retval; + + retval = ext4_xattr_set_handle(handle, inode, name_index, "", + NULL, 0, 0); + if (!retval) + set_cached_richacl(inode, NULL); + return retval; +} + +static int +__ext4_set_richacl(handle_t *handle, struct inode *inode, struct richacl *acl) +{ + const int name_index = EXT4_XATTR_INDEX_RICHACL; + umode_t mode = inode->i_mode; + int retval, size; + void *value; + + if (richacl_equiv_mode(acl, &mode) == 0) { + inode->i_ctime = ext4_current_time(inode); + inode->i_mode = mode; + ext4_mark_inode_dirty(handle, inode); + return __ext4_remove_richacl(handle, inode); + } + + mode &= ~S_IRWXUGO; + mode |= richacl_masks_to_mode(acl); + + size = richacl_xattr_size(acl); + value = kmalloc(size, GFP_NOFS); + if (!value) + return -ENOMEM; + richacl_to_xattr(&init_user_ns, acl, value, size); + inode->i_mode = mode; + retval = ext4_xattr_set_handle(handle, inode, name_index, "", + value, size, 0); + kfree(value); + if (retval) + return retval; + + set_cached_richacl(inode, acl); + + return 0; +} + +int +ext4_set_richacl(struct inode *inode, struct richacl *acl) +{ + handle_t *handle; + int retval, retries = 0; + +retry: + handle = ext4_journal_start(inode, EXT4_HT_XATTR, + ext4_jbd2_credits_xattr(inode)); + if (IS_ERR(handle)) + return PTR_ERR(handle); + + if (acl) + retval = __ext4_set_richacl(handle, inode, acl); + else + retval = __ext4_remove_richacl(handle, inode); + + ext4_journal_stop(handle); + if (retval == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) + goto retry; + return retval; +} + +int +ext4_init_richacl(handle_t *handle, struct inode *inode, struct inode *dir) +{ + struct richacl *acl = richacl_create(&inode->i_mode, dir); + int error; + + error = PTR_ERR(acl); + if (!IS_ERR_OR_NULL(acl)) { + error = __ext4_set_richacl(handle, inode, acl); + richacl_put(acl); + } + return error; +} diff --git a/fs/ext4/richacl.h b/fs/ext4/richacl.h new file mode 100644 index 0000000..6fe9a92 --- /dev/null +++ b/fs/ext4/richacl.h @@ -0,0 +1,40 @@ +/* + * Copyright IBM Corporation, 2010 + * Copyright (C) 2015 Red Hat, Inc. + * Author Aneesh Kumar K.V + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2.1 of the GNU Lesser 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. + * + */ + +#ifndef __FS_EXT4_RICHACL_H +#define __FS_EXT4_RICHACL_H + +#include + +#ifdef CONFIG_EXT4_FS_RICHACL + +extern struct richacl *ext4_get_richacl(struct inode *); +extern int ext4_set_richacl(struct inode *, struct richacl *); + +extern int ext4_init_richacl(handle_t *, struct inode *, struct inode *); + +#else /* CONFIG_EXT4_FS_RICHACL */ + +#define ext4_get_richacl NULL +#define ext4_set_richacl NULL + +static inline int +ext4_init_richacl(handle_t *handle, struct inode *inode, struct inode *dir) +{ + return 0; +} + +#endif /* CONFIG_EXT4_FS_RICHACL */ +#endif /* __FS_EXT4_RICHACL_H */ diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c index a95151e..ef76630 100644 --- a/fs/ext4/xattr.c +++ b/fs/ext4/xattr.c @@ -55,6 +55,7 @@ #include #include #include +#include #include "ext4_jbd2.h" #include "ext4.h" #include "xattr.h" @@ -97,6 +98,9 @@ static const struct xattr_handler *ext4_xattr_handler_map[] = { #ifdef CONFIG_EXT4_FS_SECURITY [EXT4_XATTR_INDEX_SECURITY] = &ext4_xattr_security_handler, #endif +#ifdef CONFIG_EXT4_FS_RICHACL + [EXT4_XATTR_INDEX_RICHACL] = &richacl_xattr_handler, +#endif }; const struct xattr_handler *ext4_xattr_handlers[] = { @@ -109,6 +113,9 @@ const struct xattr_handler *ext4_xattr_handlers[] = { #ifdef CONFIG_EXT4_FS_SECURITY &ext4_xattr_security_handler, #endif +#ifdef CONFIG_EXT4_FS_RICHACL + &richacl_xattr_handler, +#endif NULL }; -- 2.5.0 From agruenba@redhat.com Mon Mar 14 09:57:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E060229E4C for ; Mon, 14 Mar 2016 09:57:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4A669AC007 for ; Mon, 14 Mar 2016 07:57:07 -0700 (PDT) X-ASG-Debug-ID: 1457967425-04cbb00b723edd00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id P2R9Sh0YMxSveWCx (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 14 Mar 2016 07:57:05 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 4062A64D11; Mon, 14 Mar 2016 14:57:05 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-74.ams2.redhat.com [10.36.5.74]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2EEtNA2021293; Mon, 14 Mar 2016 10:57:01 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: "Aneesh Kumar K.V" , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org, Andreas Gruenbacher Subject: [PATCH v19 23/23] ext4: Add richacl feature flag Date: Mon, 14 Mar 2016 15:55:22 +0100 X-ASG-Orig-Subj: [PATCH v19 23/23] ext4: Add richacl feature flag Message-Id: <1457967322-14886-24-git-send-email-agruenba@redhat.com> In-Reply-To: <1457967322-14886-1-git-send-email-agruenba@redhat.com> References: <1457967322-14886-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 14 Mar 2016 14:57:05 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1457967425 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: "Aneesh Kumar K.V" This feature flag selects richacl instead of POSIX ACL support on the filesystem. When this feature is off, the "acl" and "noacl" mount options control whether POSIX ACLs are enabled. When it is on, richacls are automatically enabled and using the "noacl" mount option leads to an error. Signed-off-by: Aneesh Kumar K.V Signed-off-by: Andreas Gruenbacher Reviewed-by: Andreas Dilger --- fs/ext4/ext4.h | 6 ++++-- fs/ext4/super.c | 49 ++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 157b458..44277f9 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -1092,7 +1092,7 @@ struct ext4_inode_info { #define EXT4_MOUNT_UPDATE_JOURNAL 0x01000 /* Update the journal format */ #define EXT4_MOUNT_NO_UID32 0x02000 /* Disable 32-bit UIDs */ #define EXT4_MOUNT_XATTR_USER 0x04000 /* Extended user attributes */ -#define EXT4_MOUNT_POSIX_ACL 0x08000 /* POSIX Access Control Lists */ +#define EXT4_MOUNT_ACL 0x08000 /* Access Control Lists */ #define EXT4_MOUNT_NO_AUTO_DA_ALLOC 0x10000 /* No auto delalloc mapping */ #define EXT4_MOUNT_BARRIER 0x20000 /* Use block barriers */ #define EXT4_MOUNT_QUOTA 0x80000 /* Some quota option set */ @@ -1690,6 +1690,7 @@ static inline int ext4_encrypted_inode(struct inode *inode) #define EXT4_FEATURE_INCOMPAT_LARGEDIR 0x4000 /* >2GB or 3-lvl htree */ #define EXT4_FEATURE_INCOMPAT_INLINE_DATA 0x8000 /* data in inode */ #define EXT4_FEATURE_INCOMPAT_ENCRYPT 0x10000 +#define EXT4_FEATURE_INCOMPAT_RICHACL 0x20000 #define EXT4_FEATURE_COMPAT_FUNCS(name, flagname) \ static inline bool ext4_has_feature_##name(struct super_block *sb) \ @@ -1804,7 +1805,8 @@ EXT4_FEATURE_INCOMPAT_FUNCS(encrypt, ENCRYPT) EXT4_FEATURE_INCOMPAT_MMP | \ EXT4_FEATURE_INCOMPAT_INLINE_DATA | \ EXT4_FEATURE_INCOMPAT_ENCRYPT | \ - EXT4_FEATURE_INCOMPAT_CSUM_SEED) + EXT4_FEATURE_INCOMPAT_CSUM_SEED | \ + EXT4_FEATURE_INCOMPAT_RICHACL) #define EXT4_FEATURE_RO_COMPAT_SUPP (EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER| \ EXT4_FEATURE_RO_COMPAT_LARGE_FILE| \ EXT4_FEATURE_RO_COMPAT_GDT_CSUM| \ diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 3ed01ec..2ed8485 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -1305,6 +1305,28 @@ static ext4_fsblk_t get_sb_block(void **data) return sb_block; } +static int enable_acl(struct super_block *sb) +{ + sb->s_flags &= ~(MS_POSIXACL | MS_RICHACL); + if (test_opt(sb, ACL)) { + if (EXT4_HAS_INCOMPAT_FEATURE(sb, + EXT4_FEATURE_INCOMPAT_RICHACL)) { +#ifdef CONFIG_EXT4_FS_RICHACL + sb->s_flags |= MS_RICHACL; +#else + return -EOPNOTSUPP; +#endif + } else { +#ifdef CONFIG_EXT4_FS_POSIX_ACL + sb->s_flags |= MS_POSIXACL; +#else + return -EOPNOTSUPP; +#endif + } + } + return 0; +} + #define DEFAULT_JOURNAL_IOPRIO (IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, 3)) static char deprecated_msg[] = "Mount option \"%s\" will be removed by %s\n" "Contact linux-ext4@vger.kernel.org if you think we should keep it.\n"; @@ -1451,9 +1473,9 @@ static const struct mount_opts { MOPT_NO_EXT2 | MOPT_DATAJ}, {Opt_user_xattr, EXT4_MOUNT_XATTR_USER, MOPT_SET}, {Opt_nouser_xattr, EXT4_MOUNT_XATTR_USER, MOPT_CLEAR}, -#ifdef CONFIG_EXT4_FS_POSIX_ACL - {Opt_acl, EXT4_MOUNT_POSIX_ACL, MOPT_SET}, - {Opt_noacl, EXT4_MOUNT_POSIX_ACL, MOPT_CLEAR}, +#if defined(CONFIG_EXT4_FS_POSIX_ACL) || defined(CONFIG_EXT4_FS_RICHACL) + {Opt_acl, EXT4_MOUNT_ACL, MOPT_SET}, + {Opt_noacl, EXT4_MOUNT_ACL, MOPT_CLEAR}, #else {Opt_acl, 0, MOPT_NOSUPPORT}, {Opt_noacl, 0, MOPT_NOSUPPORT}, @@ -1501,6 +1523,13 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token, #endif switch (token) { case Opt_noacl: +#ifdef CONFIG_EXT4_FS_RICHACL + if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RICHACL)) { + ext4_msg(sb, KERN_ERR, "Mount option \"%s\" incompatible " + "with richacl feature", opt); + return -1; + } +#endif case Opt_nouser_xattr: ext4_msg(sb, KERN_WARNING, deprecated_msg, opt, "3.5"); break; @@ -3267,8 +3296,8 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) set_opt(sb, NO_UID32); /* xattr user namespace & acls are now defaulted on */ set_opt(sb, XATTR_USER); -#ifdef CONFIG_EXT4_FS_POSIX_ACL - set_opt(sb, POSIX_ACL); +#if defined(CONFIG_EXT4_FS_POSIX_ACL) || defined(CONFIG_EXT4_FS_RICHACL) + set_opt(sb, ACL); #endif /* don't forget to enable journal_csum when metadata_csum is enabled. */ if (ext4_has_metadata_csum(sb)) @@ -3351,8 +3380,9 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) sb->s_iflags |= SB_I_CGROUPWB; } - sb->s_flags = (sb->s_flags & ~MS_POSIXACL) | - (test_opt(sb, POSIX_ACL) ? MS_POSIXACL : 0); + err = enable_acl(sb); + if (err) + goto failed_mount; if (le32_to_cpu(es->s_rev_level) == EXT4_GOOD_OLD_REV && (ext4_has_compat_features(sb) || @@ -4668,8 +4698,9 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) if (sbi->s_mount_flags & EXT4_MF_FS_ABORTED) ext4_abort(sb, "Abort forced by user"); - sb->s_flags = (sb->s_flags & ~MS_POSIXACL) | - (test_opt(sb, POSIX_ACL) ? MS_POSIXACL : 0); + err = enable_acl(sb); + if (err) + goto restore_opts; es = sbi->s_es; -- 2.5.0 From BATV+28f53b8ce35f41e44b32+4586+infradead.org+hch@casper.srs.infradead.org Mon Mar 14 16:02:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2163A7CD8 for ; Mon, 14 Mar 2016 16:02:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id EC29930405F for ; Mon, 14 Mar 2016 14:02:58 -0700 (PDT) X-ASG-Debug-ID: 1457989375-04cbb00b71406280001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id 3WnvHpP5fCQQihcq (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 14 Mar 2016 14:02:56 -0700 (PDT) X-Barracuda-Envelope-From: BATV+28f53b8ce35f41e44b32+4586+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85 #2 (Red Hat Linux)) id 1afZdf-0000Gb-2C for xfs@oss.sgi.com; Mon, 14 Mar 2016 21:02:55 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 4/7] xfs: make xfs_bmbt_to_iomap available outside of xfs_pnfs.c Date: Mon, 14 Mar 2016 22:02:47 +0100 X-ASG-Orig-Subj: [PATCH 4/7] xfs: make xfs_bmbt_to_iomap available outside of xfs_pnfs.c Message-Id: <1457989370-6904-5-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1457989370-6904-1-git-send-email-hch@lst.de> References: <1457989370-6904-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1457989375 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27841 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- And ensure it works for RT subvolume files an set the block device, both of which will be needed to be able to use the function in the buffered write path. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_iomap.c | 27 +++++++++++++++++++++++++++ fs/xfs/xfs_iomap.h | 4 ++++ fs/xfs/xfs_pnfs.c | 26 -------------------------- 3 files changed, 31 insertions(+), 26 deletions(-) diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index d81bdc0..cc53430 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -15,6 +15,7 @@ * along with this program; if not, write the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include "xfs.h" #include "xfs_fs.h" #include "xfs_shared.h" @@ -959,3 +960,29 @@ error_on_bmapi_transaction: xfs_iunlock(ip, XFS_ILOCK_EXCL); return error; } + +void +xfs_bmbt_to_iomap( + struct xfs_inode *ip, + struct iomap *iomap, + struct xfs_bmbt_irec *imap) +{ + struct xfs_mount *mp = ip->i_mount; + + if (imap->br_startblock == HOLESTARTBLOCK) { + iomap->blkno = IOMAP_NULL_BLOCK; + iomap->type = IOMAP_HOLE; + } else if (imap->br_startblock == DELAYSTARTBLOCK) { + iomap->blkno = IOMAP_NULL_BLOCK; + iomap->type = IOMAP_DELALLOC; + } else { + iomap->blkno = xfs_fsb_to_db(ip, imap->br_startblock); + if (imap->br_state == XFS_EXT_UNWRITTEN) + iomap->type = IOMAP_UNWRITTEN; + else + iomap->type = IOMAP_MAPPED; + } + iomap->offset = XFS_FSB_TO_B(mp, imap->br_startoff); + iomap->length = XFS_FSB_TO_B(mp, imap->br_blockcount); + iomap->bdev = xfs_find_bdev_for_inode(ip); +} diff --git a/fs/xfs/xfs_iomap.h b/fs/xfs/xfs_iomap.h index 8688e66..718f07c 100644 --- a/fs/xfs/xfs_iomap.h +++ b/fs/xfs/xfs_iomap.h @@ -18,6 +18,7 @@ #ifndef __XFS_IOMAP_H__ #define __XFS_IOMAP_H__ +struct iomap; struct xfs_inode; struct xfs_bmbt_irec; @@ -29,4 +30,7 @@ int xfs_iomap_write_allocate(struct xfs_inode *, xfs_off_t, struct xfs_bmbt_irec *); int xfs_iomap_write_unwritten(struct xfs_inode *, xfs_off_t, xfs_off_t); +void xfs_bmbt_to_iomap(struct xfs_inode *, struct iomap *, + struct xfs_bmbt_irec *); + #endif /* __XFS_IOMAP_H__*/ diff --git a/fs/xfs/xfs_pnfs.c b/fs/xfs/xfs_pnfs.c index 8b6f20f..7c5a8d5 100644 --- a/fs/xfs/xfs_pnfs.c +++ b/fs/xfs/xfs_pnfs.c @@ -80,32 +80,6 @@ xfs_fs_get_uuid( return 0; } -static void -xfs_bmbt_to_iomap( - struct xfs_inode *ip, - struct iomap *iomap, - struct xfs_bmbt_irec *imap) -{ - struct xfs_mount *mp = ip->i_mount; - - if (imap->br_startblock == HOLESTARTBLOCK) { - iomap->blkno = IOMAP_NULL_BLOCK; - iomap->type = IOMAP_HOLE; - } else if (imap->br_startblock == DELAYSTARTBLOCK) { - iomap->blkno = IOMAP_NULL_BLOCK; - iomap->type = IOMAP_DELALLOC; - } else { - iomap->blkno = - XFS_FSB_TO_DADDR(ip->i_mount, imap->br_startblock); - if (imap->br_state == XFS_EXT_UNWRITTEN) - iomap->type = IOMAP_UNWRITTEN; - else - iomap->type = IOMAP_MAPPED; - } - iomap->offset = XFS_FSB_TO_B(mp, imap->br_startoff); - iomap->length = XFS_FSB_TO_B(mp, imap->br_blockcount); -} - /* * Get a layout for the pNFS client. */ -- 2.1.4 From BATV+28f53b8ce35f41e44b32+4586+infradead.org+hch@casper.srs.infradead.org Mon Mar 14 16:02:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9E1267CD9 for ; Mon, 14 Mar 2016 16:02:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 62BCE30405F for ; Mon, 14 Mar 2016 14:02:59 -0700 (PDT) X-ASG-Debug-ID: 1457989376-04bdf002ee437360001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id GdSPszVlXjVkU46k (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 14 Mar 2016 14:02:57 -0700 (PDT) X-Barracuda-Envelope-From: BATV+28f53b8ce35f41e44b32+4586+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85 #2 (Red Hat Linux)) id 1afZdf-0000Gf-NW for xfs@oss.sgi.com; Mon, 14 Mar 2016 21:02:56 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 5/7] xfs: reshuffle truncate Date: Mon, 14 Mar 2016 22:02:48 +0100 X-ASG-Orig-Subj: [PATCH 5/7] xfs: reshuffle truncate Message-Id: <1457989370-6904-6-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1457989370-6904-1-git-send-email-hch@lst.de> References: <1457989370-6904-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1457989377 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27841 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --- fs/xfs/xfs_iops.c | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index fb7dc61..1aab9f6 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -790,20 +790,35 @@ xfs_setattr_size( return error; /* + * Wait for all direct I/O to complete. + */ + inode_dio_wait(inode); + + /* * File data changes must be complete before we start the transaction to * modify the inode. This needs to be done before joining the inode to * the transaction because the inode cannot be unlocked once it is a * part of the transaction. * - * Start with zeroing any data block beyond EOF that we may expose on - * file extension. + * Start with zeroing any data beyond EOF that we may expose on file + & extension, or zeroing out the rest of the block on a downward + * truncate. */ if (newsize > oldsize) { error = xfs_zero_eof(ip, newsize, oldsize, &did_zeroing); - if (error) - return error; + } else { + if (IS_DAX(inode)) { + error = dax_truncate_page(inode, newsize, + xfs_get_blocks_direct); + } else { + error = block_truncate_page(inode->i_mapping, newsize, + xfs_get_blocks); + } } + if (error) + return error; + /* * We are going to log the inode size change in this transaction so * any previous writes that are beyond the on disk EOF and the new @@ -820,9 +835,6 @@ xfs_setattr_size( return error; } - /* Now wait for all direct I/O to complete. */ - inode_dio_wait(inode); - /* * We've already locked out new page faults, so now we can safely remove * pages from the page cache knowing they won't get refaulted until we @@ -840,13 +852,6 @@ xfs_setattr_size( * to hope that the caller sees ENOMEM and retries the truncate * operation. */ - if (IS_DAX(inode)) - error = dax_truncate_page(inode, newsize, xfs_get_blocks_direct); - else - error = block_truncate_page(inode->i_mapping, newsize, - xfs_get_blocks); - if (error) - return error; truncate_setsize(inode, newsize); tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_SIZE); -- 2.1.4 From BATV+28f53b8ce35f41e44b32+4586+infradead.org+hch@casper.srs.infradead.org Mon Mar 14 16:02:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A74547CDA for ; Mon, 14 Mar 2016 16:02:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 68D08304062 for ; Mon, 14 Mar 2016 14:02:59 -0700 (PDT) X-ASG-Debug-ID: 1457989374-04cbb00b704061f0001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id 90AG5DsHmcSNcD5Z (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 14 Mar 2016 14:02:54 -0700 (PDT) X-Barracuda-Envelope-From: BATV+28f53b8ce35f41e44b32+4586+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85 #2 (Red Hat Linux)) id 1afZdd-0000GT-HR for xfs@oss.sgi.com; Mon, 14 Mar 2016 21:02:53 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 2/7] fs: introduce iomap infrastructure Date: Mon, 14 Mar 2016 22:02:45 +0100 X-ASG-Orig-Subj: [PATCH 2/7] fs: introduce iomap infrastructure Message-Id: <1457989370-6904-3-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1457989370-6904-1-git-send-email-hch@lst.de> References: <1457989370-6904-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1457989374 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27841 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Add infrastructure for multipage buffered writes. This is implemented using an main iterator that applies an actor function to a range that can be written. This infrastucture is used to implement a buffered write helper, one to zero file ranges and one to implement the ->page_mkwrite VM operations. All of them borrow a fair amount of code from fs/buffers. for now by using an internal version of __block_write_begin that gets passed an iomap and builds the corresponding buffer head. The file system is gets a set of paired ->iomap_begin and ->iomap_end calls which allow it to map/reserve a range and get a notification once the write code is finished with it. Based on earlier code from Dave Chinner. Signed-off-by: Christoph Hellwig --- fs/Makefile | 2 +- fs/buffer.c | 77 +++++++++- fs/internal.h | 3 + fs/iomap.c | 381 ++++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/iomap.h | 55 +++++++- 5 files changed, 507 insertions(+), 11 deletions(-) create mode 100644 fs/iomap.c diff --git a/fs/Makefile b/fs/Makefile index 79f5225..d522fd2 100644 --- a/fs/Makefile +++ b/fs/Makefile @@ -14,7 +14,7 @@ obj-y := open.o read_write.o file_table.o super.o \ stack.o fs_struct.o statfs.o fs_pin.o nsfs.o ifeq ($(CONFIG_BLOCK),y) -obj-y += buffer.o block_dev.o direct-io.o mpage.o +obj-y += buffer.o block_dev.o direct-io.o mpage.o iomap.o else obj-y += no-block.o endif diff --git a/fs/buffer.c b/fs/buffer.c index e1632ab..03379de 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -1893,8 +1894,63 @@ void page_zero_new_buffers(struct page *page, unsigned from, unsigned to) } EXPORT_SYMBOL(page_zero_new_buffers); -int __block_write_begin(struct page *page, loff_t pos, unsigned len, - get_block_t *get_block) +static void +iomap_to_bh(struct inode *inode, sector_t block, struct buffer_head *bh, + struct iomap *iomap) +{ + loff_t offset = block << inode->i_blkbits; + + bh->b_bdev = iomap->bdev; + + /* + * Block points to offset in file we need to map, iomap contains + * the offset at which the map starts. If the map ends before the + * current block, then do not map the buffer and let the caller + * handle it. + */ + BUG_ON(offset >= iomap->offset + iomap->length); + + switch (iomap->type) { + case IOMAP_HOLE: + /* + * If the buffer is not up to date or beyond the current EOF, + * we need to mark it as new to ensure sub-block zeroing is + * executed if necessary. + */ + if (!buffer_uptodate(bh) || + (offset >= i_size_read(inode))) + set_buffer_new(bh); + break; + case IOMAP_DELALLOC: + if (!buffer_uptodate(bh) || + (offset >= i_size_read(inode))) + set_buffer_new(bh); + set_buffer_uptodate(bh); + set_buffer_mapped(bh); + set_buffer_delay(bh); + break; + case IOMAP_UNWRITTEN: + /* + * For unwritten regions, we always need to ensure that + * sub-block writes cause the regions in the block we are not + * writing to are zeroed. Set the buffer as new to ensre this. + */ + set_buffer_new(bh); + set_buffer_unwritten(bh); + /* FALLTHRU */ + case IOMAP_MAPPED: + if (offset >= i_size_read(inode)) + set_buffer_new(bh); + bh->b_blocknr = (iomap->blkno >> (inode->i_blkbits - 9)) + + ((offset - iomap->offset) >> inode->i_blkbits); + set_buffer_mapped(bh); + break; + } + +} + +int __block_write_begin_int(struct page *page, loff_t pos, unsigned len, + get_block_t *get_block, struct iomap *iomap) { unsigned from = pos & (PAGE_CACHE_SIZE - 1); unsigned to = from + len; @@ -1930,9 +1986,14 @@ int __block_write_begin(struct page *page, loff_t pos, unsigned len, clear_buffer_new(bh); if (!buffer_mapped(bh)) { WARN_ON(bh->b_size != blocksize); - err = get_block(inode, block, bh, 1); - if (err) - break; + if (get_block) { + err = get_block(inode, block, bh, 1); + if (err) + break; + } else { + iomap_to_bh(inode, block, bh, iomap); + } + if (buffer_new(bh)) { unmap_underlying_metadata(bh->b_bdev, bh->b_blocknr); @@ -1973,6 +2034,12 @@ int __block_write_begin(struct page *page, loff_t pos, unsigned len, page_zero_new_buffers(page, from, to); return err; } + +int __block_write_begin(struct page *page, loff_t pos, unsigned len, + get_block_t *get_block) +{ + return __block_write_begin_int(page, pos, len, get_block, NULL); +} EXPORT_SYMBOL(__block_write_begin); static int __block_commit_write(struct inode *inode, struct page *page, diff --git a/fs/internal.h b/fs/internal.h index b71deee..c0c6f49 100644 --- a/fs/internal.h +++ b/fs/internal.h @@ -11,6 +11,7 @@ struct super_block; struct file_system_type; +struct iomap; struct linux_binprm; struct path; struct mount; @@ -39,6 +40,8 @@ static inline int __sync_blockdev(struct block_device *bdev, int wait) * buffer.c */ extern void guard_bio_eod(int rw, struct bio *bio); +extern int __block_write_begin_int(struct page *page, loff_t pos, unsigned len, + get_block_t *get_block, struct iomap *iomap); /* * char_dev.c diff --git a/fs/iomap.c b/fs/iomap.c new file mode 100644 index 0000000..d4528cb --- /dev/null +++ b/fs/iomap.c @@ -0,0 +1,381 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "internal.h" + +typedef ssize_t (*write_actor_t)(struct inode *inode, loff_t pos, ssize_t len, + void *data, struct iomap *iomap); + +/* + * Execute a iomap write on a segment of the mapping that spans a + * contiguous range of pages that have identical block mapping state. + * + * This avoids the need to map pages individually, do individual allocations + * for each page and most importantly avoid the need for filesystem specific + * locking per page. Instead, all the operations are amortised over the entire + * range of pages. It is assumed that the filesystems will lock whatever + * resources they require in the iomap_begin call, and release them in the + * iomap_end call. + */ +static ssize_t +iomap_write_segment(struct inode *inode, loff_t pos, ssize_t length, + unsigned flags, struct iomap_ops *ops, void *data, + write_actor_t actor) +{ + struct iomap iomap = { 0 }; + ssize_t written; + int error; + + /* + * Need to map a range from start position for count bytes. This can + * span multiple pages - it is only guaranteed to return a range of a + * single type of pages (e.g. all into a hole, all mapped or all + * unwritten). Failure at this point has nothing to undo. + * + * If allocation is required for this range, reserve the space now so + * that the allocation is guaranteed to succeed later on. Once we copy + * the data into the page cache pages, then we cannot fail otherwise we + * expose transient stale data. If the reserve fails, we can safely + * back out at this point as there is nothing to undo. + * + * We cap the maximum length we map here to MAX_WRITEBACK_PAGES pages + * to keep the chunks of work done where somewhat symmetric with the + * work writeback does. This is a completely arbitrary number pulled + * out of thin air as a best guess for initial testing. + */ + length = min_t(size_t, length, 1024 * PAGE_SIZE); + + error = ops->iomap_begin(inode, pos, length, flags, &iomap); + if (error) + return error; + if (WARN_ON(iomap.offset > pos)) + return -EIO; + + /* + * Cut down the length to the one actually provided by the filesystem, + * as it might not be able to give us the whole size that we requested. + */ + if (iomap.offset + iomap.length < pos + length) + length = iomap.offset + iomap.length - pos; + + /* + * Now that we have guaranteed that the space allocation will succeed. + * we can do the copy-in page by page without having to worry about + * failures exposing transient data. + */ + written = actor(inode, pos, length, data, &iomap); + + /* + * Now the data has been copied, commit the range we've copied. This + * should not fail unless the filesystem has had a fatal error. + */ + error = ops->iomap_end(inode, pos, length, + written > 0 ? written : 0, &iomap); + + return written > 0 ? written : error; +} + +static void +iomap_write_failed(struct inode *inode, loff_t pos, unsigned len) +{ + loff_t i_size = i_size_read(inode); + + /* + * Only truncate newly allocated pages beyoned EOF, even if the + * write started inside the existing inode size. + */ + if (pos + len > i_size) + truncate_pagecache_range(inode, max(pos, i_size), pos + len); +} + +static int +iomap_write_begin(struct inode *inode, loff_t pos, unsigned len, unsigned flags, + struct page **pagep, struct iomap *iomap) +{ + pgoff_t index = pos >> PAGE_CACHE_SHIFT; + struct page *page; + int status = 0; + + BUG_ON(pos + len > iomap->offset + iomap->length); + + page = grab_cache_page_write_begin(inode->i_mapping, index, flags); + if (!page) + return -ENOMEM; + + status = __block_write_begin_int(page, pos, len, NULL, iomap); + if (unlikely(status)) { + unlock_page(page); + page_cache_release(page); + page = NULL; + + iomap_write_failed(inode, pos, len); + } + + *pagep = page; + return status; +} + +static int +iomap_write_end(struct inode *inode, loff_t pos, unsigned len, + unsigned copied, struct page *page) +{ + int ret; + + ret = generic_write_end(NULL, inode->i_mapping, pos, len, + copied, page, NULL); + if (ret < len) + iomap_write_failed(inode, pos, len); + return ret; +} + +static ssize_t +iomap_write_actor(struct inode *inode, loff_t pos, ssize_t length, void *data, + struct iomap *iomap) +{ + struct iov_iter *i = data; + long status = 0; + ssize_t written = 0; + unsigned int flags = AOP_FLAG_NOFS; + + /* + * Copies from kernel address space cannot fail (NFSD is a big user). + */ + if (!iter_is_iovec(i)) + flags |= AOP_FLAG_UNINTERRUPTIBLE; + + do { + struct page *page; + unsigned long offset; /* Offset into pagecache page */ + unsigned long bytes; /* Bytes to write to page */ + size_t copied; /* Bytes copied from user */ + + offset = (pos & (PAGE_CACHE_SIZE - 1)); + bytes = min_t(unsigned long, PAGE_CACHE_SIZE - offset, + iov_iter_count(i)); +again: + if (bytes > length) + bytes = length; + + /* + * Bring in the user page that we will copy from _first_. + * Otherwise there's a nasty deadlock on copying from the + * same page as we're writing to, without it being marked + * up-to-date. + * + * Not only is this an optimisation, but it is also required + * to check that the address is actually valid, when atomic + * usercopies are used, below. + */ + if (unlikely(iov_iter_fault_in_readable(i, bytes))) { + status = -EFAULT; + break; + } + + status = iomap_write_begin(inode, pos, bytes, flags, &page, + iomap); + if (unlikely(status)) + break; + + if (mapping_writably_mapped(inode->i_mapping)) + flush_dcache_page(page); + + pagefault_disable(); + copied = iov_iter_copy_from_user_atomic(page, i, offset, bytes); + pagefault_enable(); + + flush_dcache_page(page); + mark_page_accessed(page); + + status = iomap_write_end(inode, pos, bytes, copied, page); + if (unlikely(status < 0)) + break; + copied = status; + + cond_resched(); + + iov_iter_advance(i, copied); + if (unlikely(copied == 0)) { + /* + * If we were unable to copy any data at all, we must + * fall back to a single segment length write. + * + * If we didn't fallback here, we could livelock + * because not all segments in the iov can be copied at + * once without a pagefault. + */ + bytes = min_t(unsigned long, PAGE_CACHE_SIZE - offset, + iov_iter_single_seg_count(i)); + goto again; + } + pos += copied; + written += copied; + length -= copied; + + balance_dirty_pages_ratelimited(inode->i_mapping); + } while (iov_iter_count(i) && length); + + return written ? written : status; +} + +ssize_t +iomap_file_buffered_write(struct kiocb *iocb, struct iov_iter *iter, + struct iomap_ops *ops) +{ + struct inode *inode = iocb->ki_filp->f_mapping->host; + loff_t pos = iocb->ki_pos; + ssize_t ret = 0, written = 0; + + while (iov_iter_count(iter)) { + ret = iomap_write_segment(inode, pos, iov_iter_count(iter), + IOMAP_ALLOCATE, ops, iter, iomap_write_actor); + if (ret <= 0) + break; + pos += ret; + written += ret; + } + + return written ? written : ret; +} +EXPORT_SYMBOL_GPL(iomap_file_buffered_write); + +static ssize_t +iomap_zero_range_actor(struct inode *inode, loff_t pos, ssize_t count, + void *data, struct iomap *iomap) +{ + bool *did_zero = data; + struct page *page; + int status; + ssize_t written = 0; + + /* + * No need to zero anything if we fall into a hole or unwritten extent. + */ + if (iomap->type == IOMAP_HOLE || iomap->type == IOMAP_UNWRITTEN) + return count; + + do { + unsigned offset, bytes; + + offset = pos & (PAGE_CACHE_SIZE - 1); /* Within page */ + bytes = min_t(unsigned, PAGE_CACHE_SIZE - offset, count); + + status = iomap_write_begin(inode, pos, bytes, + AOP_FLAG_UNINTERRUPTIBLE | AOP_FLAG_NOFS, + &page, iomap); + if (status) + break; + + zero_user(page, offset, bytes); + mark_page_accessed(page); + + status = iomap_write_end(inode, pos, bytes, bytes, page); + if (status) + break; + + pos += bytes; + count -= bytes; + written += bytes; + if (did_zero) + *did_zero = true; + } while (count > 0); + + return status ? status : written; +} + +int +iomap_zero_range(struct inode *inode, loff_t pos, u64 len, bool *did_zero, + struct iomap_ops *ops) +{ + ssize_t ret; + + while (len > 0) { + ssize_t chunk_size = min_t(u64, len, INT_MAX); + + ret = iomap_write_segment(inode, pos, chunk_size, 0, ops, + did_zero, iomap_zero_range_actor); + if (ret <= 0) + return ret; + + pos += ret; + len -= ret; + } + + return 0; +} +EXPORT_SYMBOL_GPL(iomap_zero_range); + +int +iomap_truncate_page(struct inode *inode, loff_t pos, bool *did_zero, + struct iomap_ops *ops) +{ + unsigned blocksize = (1 << inode->i_blkbits); + unsigned off = pos & (blocksize - 1); + + /* Block boundary? Nothing to do */ + if (!off) + return 0; + return iomap_zero_range(inode, pos, blocksize - off, did_zero, ops); +} +EXPORT_SYMBOL_GPL(iomap_truncate_page); + +static ssize_t +iomap_page_mkwrite_actor(struct inode *inode, loff_t pos, ssize_t length, + void *data, struct iomap *iomap) +{ + struct page *page = data; + int ret; + + ret = __block_write_begin_int(page, 0, length, NULL, iomap); + if (!ret) + ret = block_commit_write(page, 0, length); + + return ret; +} + +int iomap_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf, + struct iomap_ops *ops) +{ + struct page *page = vmf->page; + struct inode *inode = file_inode(vma->vm_file); + unsigned long length; + loff_t size; + int ret; + + lock_page(page); + size = i_size_read(inode); + if ((page->mapping != inode->i_mapping) || + (page_offset(page) > size)) { + /* We overload EFAULT to mean page got truncated */ + ret = -EFAULT; + goto out_unlock; + } + + /* page is wholly or partially inside EOF */ + if (((page->index + 1) << PAGE_CACHE_SHIFT) > size) + length = size & ~PAGE_CACHE_MASK; + else + length = PAGE_CACHE_SIZE; + + ret = iomap_write_segment(inode, page_offset(page), length, + IOMAP_ALLOCATE, ops, page, iomap_page_mkwrite_actor); + if (unlikely(ret < 0)) + goto out_unlock; + set_page_dirty(page); + wait_for_stable_page(page); + return 0; +out_unlock: + unlock_page(page); + return ret; +} +EXPORT_SYMBOL_GPL(iomap_page_mkwrite); diff --git a/include/linux/iomap.h b/include/linux/iomap.h index 1b22197..ae0b92c 100644 --- a/include/linux/iomap.h +++ b/include/linux/iomap.h @@ -3,19 +3,64 @@ #include -/* types of block ranges for multipage write mappings. */ +struct inode; +struct iov_iter; +struct kiocb; +struct vm_area_struct; +struct vm_fault; + +/* + * Types of block ranges for iomap mappings: + */ #define IOMAP_HOLE 0x01 /* no blocks allocated, need allocation */ #define IOMAP_DELALLOC 0x02 /* delayed allocation blocks */ #define IOMAP_MAPPED 0x03 /* blocks allocated @blkno */ #define IOMAP_UNWRITTEN 0x04 /* blocks allocated @blkno in unwritten state */ +/* + * Magic value for blkno: + */ #define IOMAP_NULL_BLOCK -1LL /* blkno is not valid */ struct iomap { - sector_t blkno; /* first sector of mapping */ - loff_t offset; /* file offset of mapping, bytes */ - u64 length; /* length of mapping, bytes */ - int type; /* type of mapping */ + sector_t blkno; /* first sector of mapping, fs blocks */ + loff_t offset; /* file offset of mapping, bytes */ + u64 length; /* length of mapping, bytes */ + int type; /* type of mapping */ + struct block_device *bdev; /* block device for I/O */ +}; + +/* + * Flags for iomap_begin: + */ +#define IOMAP_ALLOCATE 0x01 /* allocate / reserve blocks if not present */ + +struct iomap_ops { + /* + * Return the existing mapping at pos, or reserve space starting at + * pos for up to length, as long as we can do it as a single mapping. + * The actual length is returned in iomap->length. + */ + int (*iomap_begin)(struct inode *inode, loff_t pos, ssize_t length, + unsigned flags, struct iomap *iomap); + + /* + * Commit and/or unreserve space previous allocated using iomap_begin. + * Written indicates the length of the successful write operation which + * needs to be commited, while the rest needs to be unreserved. + * Written might be zero if no data was written. + */ + int (*iomap_end)(struct inode *inode, loff_t pos, ssize_t length, + ssize_t written, struct iomap *iomap); }; +ssize_t iomap_file_buffered_write(struct kiocb *iocb, struct iov_iter *from, + struct iomap_ops *ops); +int iomap_zero_range(struct inode *inode, loff_t pos, u64 len, bool *did_zero, + struct iomap_ops *ops); +int iomap_truncate_page(struct inode *inode, loff_t pos, bool *did_zero, + struct iomap_ops *ops); +int iomap_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf, + struct iomap_ops *ops); + #endif /* LINUX_IOMAP_H */ -- 2.1.4 From BATV+28f53b8ce35f41e44b32+4586+infradead.org+hch@casper.srs.infradead.org Mon Mar 14 16:03:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 488AE7CD8 for ; Mon, 14 Mar 2016 16:03:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B046FAC002 for ; Mon, 14 Mar 2016 14:02:59 -0700 (PDT) X-ASG-Debug-ID: 1457989373-04cbb00b724061f0001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id HK1T0jcROoPRnZgX (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 14 Mar 2016 14:02:54 -0700 (PDT) X-Barracuda-Envelope-From: BATV+28f53b8ce35f41e44b32+4586+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85 #2 (Red Hat Linux)) id 1afZdc-0000GO-RQ for xfs@oss.sgi.com; Mon, 14 Mar 2016 21:02:52 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 1/7] fs: move struct iomap from exportfs.h to a separate header Date: Mon, 14 Mar 2016 22:02:44 +0100 X-ASG-Orig-Subj: [PATCH 1/7] fs: move struct iomap from exportfs.h to a separate header Message-Id: <1457989370-6904-2-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1457989370-6904-1-git-send-email-hch@lst.de> References: <1457989370-6904-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1457989373 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27841 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Christoph Hellwig --- fs/nfsd/blocklayout.c | 1 + fs/nfsd/blocklayoutxdr.c | 1 + fs/xfs/xfs_pnfs.c | 1 + include/linux/exportfs.h | 16 +--------------- include/linux/iomap.h | 21 +++++++++++++++++++++ 5 files changed, 25 insertions(+), 15 deletions(-) create mode 100644 include/linux/iomap.h diff --git a/fs/nfsd/blocklayout.c b/fs/nfsd/blocklayout.c index c29d942..c49adba 100644 --- a/fs/nfsd/blocklayout.c +++ b/fs/nfsd/blocklayout.c @@ -2,6 +2,7 @@ * Copyright (c) 2014 Christoph Hellwig. */ #include +#include #include #include diff --git a/fs/nfsd/blocklayoutxdr.c b/fs/nfsd/blocklayoutxdr.c index 6d834dc..19c8168 100644 --- a/fs/nfsd/blocklayoutxdr.c +++ b/fs/nfsd/blocklayoutxdr.c @@ -3,6 +3,7 @@ */ #include #include +#include #include #include "nfsd.h" diff --git a/fs/xfs/xfs_pnfs.c b/fs/xfs/xfs_pnfs.c index ade236e..8b6f20f 100644 --- a/fs/xfs/xfs_pnfs.c +++ b/fs/xfs/xfs_pnfs.c @@ -1,6 +1,7 @@ /* * Copyright (c) 2014 Christoph Hellwig. */ +#include #include "xfs.h" #include "xfs_format.h" #include "xfs_log_format.h" diff --git a/include/linux/exportfs.h b/include/linux/exportfs.h index fa05e04..c96f47b 100644 --- a/include/linux/exportfs.h +++ b/include/linux/exportfs.h @@ -6,6 +6,7 @@ struct dentry; struct iattr; struct inode; +struct iomap; struct super_block; struct vfsmount; @@ -181,21 +182,6 @@ struct fid { * get_name is not (which is possibly inconsistent) */ -/* types of block ranges for multipage write mappings. */ -#define IOMAP_HOLE 0x01 /* no blocks allocated, need allocation */ -#define IOMAP_DELALLOC 0x02 /* delayed allocation blocks */ -#define IOMAP_MAPPED 0x03 /* blocks allocated @blkno */ -#define IOMAP_UNWRITTEN 0x04 /* blocks allocated @blkno in unwritten state */ - -#define IOMAP_NULL_BLOCK -1LL /* blkno is not valid */ - -struct iomap { - sector_t blkno; /* first sector of mapping */ - loff_t offset; /* file offset of mapping, bytes */ - u64 length; /* length of mapping, bytes */ - int type; /* type of mapping */ -}; - struct export_operations { int (*encode_fh)(struct inode *inode, __u32 *fh, int *max_len, struct inode *parent); diff --git a/include/linux/iomap.h b/include/linux/iomap.h new file mode 100644 index 0000000..1b22197 --- /dev/null +++ b/include/linux/iomap.h @@ -0,0 +1,21 @@ +#ifndef LINUX_IOMAP_H +#define LINUX_IOMAP_H 1 + +#include + +/* types of block ranges for multipage write mappings. */ +#define IOMAP_HOLE 0x01 /* no blocks allocated, need allocation */ +#define IOMAP_DELALLOC 0x02 /* delayed allocation blocks */ +#define IOMAP_MAPPED 0x03 /* blocks allocated @blkno */ +#define IOMAP_UNWRITTEN 0x04 /* blocks allocated @blkno in unwritten state */ + +#define IOMAP_NULL_BLOCK -1LL /* blkno is not valid */ + +struct iomap { + sector_t blkno; /* first sector of mapping */ + loff_t offset; /* file offset of mapping, bytes */ + u64 length; /* length of mapping, bytes */ + int type; /* type of mapping */ +}; + +#endif /* LINUX_IOMAP_H */ -- 2.1.4 From BATV+28f53b8ce35f41e44b32+4586+infradead.org+hch@casper.srs.infradead.org Mon Mar 14 16:03:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 296F37CD8 for ; Mon, 14 Mar 2016 16:03:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 88776304062 for ; Mon, 14 Mar 2016 14:02:58 -0700 (PDT) X-ASG-Debug-ID: 1457989372-04cbb00b6f4061e0001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id ACkS54wnQrPD4khU (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 14 Mar 2016 14:02:54 -0700 (PDT) X-Barracuda-Envelope-From: BATV+28f53b8ce35f41e44b32+4586+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85 #2 (Red Hat Linux)) id 1afZdc-0000GL-5a for xfs@oss.sgi.com; Mon, 14 Mar 2016 21:02:52 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [RFC] iomap infrastructure and multipage writes Date: Mon, 14 Mar 2016 22:02:43 +0100 X-ASG-Orig-Subj: [RFC] iomap infrastructure and multipage writes Message-Id: <1457989370-6904-1-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1457989374 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27841 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Because I've seen some issues with the amount of overhead we spend in the bmap btree when using reflinks I though I'd dust up the multipage write code again. This was first started by Dave Chinner a long time ago, then I did beat it into shape for production runs in a very constrained ARM NAS enviroment for Tuxera almost as long ago, and now half a dozen rewrites later it's back. The basic idea is to avoid the crazy per-block get_blocks overhead and make use of extents in the buffered write path by iterating over them instead. I could probably write a lot more here, but for now I'd like people to take a look at this version. It passes xfstests fine on blocksize == PAGE_SIZE setups, but I haven't done much testing with small block sizes yet. From BATV+28f53b8ce35f41e44b32+4586+infradead.org+hch@casper.srs.infradead.org Mon Mar 14 16:03:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9025C7CDA for ; Mon, 14 Mar 2016 16:03:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0D506AC002 for ; Mon, 14 Mar 2016 14:02:58 -0700 (PDT) X-ASG-Debug-ID: 1457989374-04cbb00b6f406200001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id y1R5r1FXx99DZm9v (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 14 Mar 2016 14:02:55 -0700 (PDT) X-Barracuda-Envelope-From: BATV+28f53b8ce35f41e44b32+4586+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85 #2 (Red Hat Linux)) id 1afZde-0000GX-Bw for xfs@oss.sgi.com; Mon, 14 Mar 2016 21:02:54 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 3/7] xfs: make xfs_find_bdev_for_inode available outside of xfs_aops.c Date: Mon, 14 Mar 2016 22:02:46 +0100 X-ASG-Orig-Subj: [PATCH 3/7] xfs: make xfs_find_bdev_for_inode available outside of xfs_aops.c Message-Id: <1457989370-6904-4-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1457989370-6904-1-git-send-email-hch@lst.de> References: <1457989370-6904-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1457989375 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27841 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_aops.c | 17 ++--------------- fs/xfs/xfs_inode.h | 9 +++++++++ 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 75a39a8..72ee3f2 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -70,19 +70,6 @@ xfs_count_page_state( } while ((bh = bh->b_this_page) != head); } -STATIC struct block_device * -xfs_find_bdev_for_inode( - struct inode *inode) -{ - struct xfs_inode *ip = XFS_I(inode); - struct xfs_mount *mp = ip->i_mount; - - if (XFS_IS_REALTIME_INODE(ip)) - return mp->m_rtdev_targp->bt_bdev; - else - return mp->m_ddev_targp->bt_bdev; -} - /* * We're now finished for good with this ioend structure. * Update the page state via the associated buffer_heads, @@ -1256,7 +1243,7 @@ __xfs_get_blocks( * If this is a realtime file, data may be on a different device. * to that pointed to from the buffer_head b_bdev currently. */ - bh_result->b_bdev = xfs_find_bdev_for_inode(inode); + bh_result->b_bdev = xfs_find_bdev_for_inode(ip); /* * If we previously allocated a block out beyond eof and we are now @@ -1420,7 +1407,7 @@ xfs_vm_direct_IO( xfs_get_blocks_direct, endio, 0); } - bdev = xfs_find_bdev_for_inode(inode); + bdev = xfs_find_bdev_for_inode(XFS_I(inode)); return __blockdev_direct_IO(iocb, inode, bdev, iter, offset, xfs_get_blocks_direct, endio, NULL, flags); } diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 43e1d51..70bedf0 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -474,6 +474,15 @@ do { \ iput(VFS_I(ip)); \ } while (0) +static inline struct block_device *xfs_find_bdev_for_inode(struct xfs_inode *ip) +{ + if (XFS_IS_REALTIME_INODE(ip)) + return ip->i_mount->m_rtdev_targp->bt_bdev; + else + return ip->i_mount->m_ddev_targp->bt_bdev; +} + + extern struct kmem_zone *xfs_inode_zone; /* -- 2.1.4 From BATV+28f53b8ce35f41e44b32+4586+infradead.org+hch@casper.srs.infradead.org Mon Mar 14 16:03:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 631E57CD8 for ; Mon, 14 Mar 2016 16:03:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1A1C930405F for ; Mon, 14 Mar 2016 14:03:02 -0700 (PDT) X-ASG-Debug-ID: 1457989377-04cb6c7f2bf2920001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id GpOcfYxQ4jxHH1Mp (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 14 Mar 2016 14:02:58 -0700 (PDT) X-Barracuda-Envelope-From: BATV+28f53b8ce35f41e44b32+4586+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85 #2 (Red Hat Linux)) id 1afZdg-0000Gj-KF for xfs@oss.sgi.com; Mon, 14 Mar 2016 21:02:56 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 6/7] xfs: implement iomap based buffered write path Date: Mon, 14 Mar 2016 22:02:49 +0100 X-ASG-Orig-Subj: [PATCH 6/7] xfs: implement iomap based buffered write path Message-Id: <1457989370-6904-7-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1457989370-6904-1-git-send-email-hch@lst.de> References: <1457989370-6904-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1457989377 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27841 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Convert XFS to use the new iomap based multipage write path. This involves implementing the ->iomap_begin and ->iomap_end methods, and switching the buffered file write, page_mkwrite and xfs_iozero paths to the new iomap helpers. With this change __xfs_get_blocks will never be used for buffered writes, and the code handling them can be removed. Based on earlier code from Dave Chinner. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_aops.c | 205 ----------------------------------------------------- fs/xfs/xfs_file.c | 71 ++++++++----------- fs/xfs/xfs_iomap.c | 121 +++++++++++++++++++++++++++++++ fs/xfs/xfs_iomap.h | 5 +- fs/xfs/xfs_iops.c | 9 +-- fs/xfs/xfs_trace.h | 3 + 6 files changed, 163 insertions(+), 251 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 72ee3f2..32aae77 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -1412,209 +1412,6 @@ xfs_vm_direct_IO( xfs_get_blocks_direct, endio, NULL, flags); } -/* - * Punch out the delalloc blocks we have already allocated. - * - * Don't bother with xfs_setattr given that nothing can have made it to disk yet - * as the page is still locked at this point. - */ -STATIC void -xfs_vm_kill_delalloc_range( - struct inode *inode, - loff_t start, - loff_t end) -{ - struct xfs_inode *ip = XFS_I(inode); - xfs_fileoff_t start_fsb; - xfs_fileoff_t end_fsb; - int error; - - start_fsb = XFS_B_TO_FSB(ip->i_mount, start); - end_fsb = XFS_B_TO_FSB(ip->i_mount, end); - if (end_fsb <= start_fsb) - return; - - xfs_ilock(ip, XFS_ILOCK_EXCL); - error = xfs_bmap_punch_delalloc_range(ip, start_fsb, - end_fsb - start_fsb); - if (error) { - /* something screwed, just bail */ - if (!XFS_FORCED_SHUTDOWN(ip->i_mount)) { - xfs_alert(ip->i_mount, - "xfs_vm_write_failed: unable to clean up ino %lld", - ip->i_ino); - } - } - xfs_iunlock(ip, XFS_ILOCK_EXCL); -} - -STATIC void -xfs_vm_write_failed( - struct inode *inode, - struct page *page, - loff_t pos, - unsigned len) -{ - loff_t block_offset; - loff_t block_start; - loff_t block_end; - loff_t from = pos & (PAGE_CACHE_SIZE - 1); - loff_t to = from + len; - struct buffer_head *bh, *head; - - /* - * The request pos offset might be 32 or 64 bit, this is all fine - * on 64-bit platform. However, for 64-bit pos request on 32-bit - * platform, the high 32-bit will be masked off if we evaluate the - * block_offset via (pos & PAGE_MASK) because the PAGE_MASK is - * 0xfffff000 as an unsigned long, hence the result is incorrect - * which could cause the following ASSERT failed in most cases. - * In order to avoid this, we can evaluate the block_offset of the - * start of the page by using shifts rather than masks the mismatch - * problem. - */ - block_offset = (pos >> PAGE_CACHE_SHIFT) << PAGE_CACHE_SHIFT; - - ASSERT(block_offset + from == pos); - - head = page_buffers(page); - block_start = 0; - for (bh = head; bh != head || !block_start; - bh = bh->b_this_page, block_start = block_end, - block_offset += bh->b_size) { - block_end = block_start + bh->b_size; - - /* skip buffers before the write */ - if (block_end <= from) - continue; - - /* if the buffer is after the write, we're done */ - if (block_start >= to) - break; - - /* - * Process delalloc and unwritten buffers beyond EOF. We can - * encounter unwritten buffers in the event that a file has - * post-EOF unwritten extents and an extending write happens to - * fail (e.g., an unaligned write that also involves a delalloc - * to the same page). - */ - if (!buffer_delay(bh) && !buffer_unwritten(bh)) - continue; - - if (!buffer_new(bh) && block_offset < i_size_read(inode)) - continue; - - if (buffer_delay(bh)) - xfs_vm_kill_delalloc_range(inode, block_offset, - block_offset + bh->b_size); - - /* - * This buffer does not contain data anymore. make sure anyone - * who finds it knows that for certain. - */ - clear_buffer_delay(bh); - clear_buffer_uptodate(bh); - clear_buffer_mapped(bh); - clear_buffer_new(bh); - clear_buffer_dirty(bh); - clear_buffer_unwritten(bh); - } - -} - -/* - * This used to call block_write_begin(), but it unlocks and releases the page - * on error, and we need that page to be able to punch stale delalloc blocks out - * on failure. hence we copy-n-waste it here and call xfs_vm_write_failed() at - * the appropriate point. - */ -STATIC int -xfs_vm_write_begin( - struct file *file, - struct address_space *mapping, - loff_t pos, - unsigned len, - unsigned flags, - struct page **pagep, - void **fsdata) -{ - pgoff_t index = pos >> PAGE_CACHE_SHIFT; - struct page *page; - int status; - - ASSERT(len <= PAGE_CACHE_SIZE); - - page = grab_cache_page_write_begin(mapping, index, flags); - if (!page) - return -ENOMEM; - - status = __block_write_begin(page, pos, len, xfs_get_blocks); - if (unlikely(status)) { - struct inode *inode = mapping->host; - size_t isize = i_size_read(inode); - - xfs_vm_write_failed(inode, page, pos, len); - unlock_page(page); - - /* - * If the write is beyond EOF, we only want to kill blocks - * allocated in this write, not blocks that were previously - * written successfully. - */ - if (pos + len > isize) { - ssize_t start = max_t(ssize_t, pos, isize); - - truncate_pagecache_range(inode, start, pos + len); - } - - page_cache_release(page); - page = NULL; - } - - *pagep = page; - return status; -} - -/* - * On failure, we only need to kill delalloc blocks beyond EOF in the range of - * this specific write because they will never be written. Previous writes - * beyond EOF where block allocation succeeded do not need to be trashed, so - * only new blocks from this write should be trashed. For blocks within - * EOF, generic_write_end() zeros them so they are safe to leave alone and be - * written with all the other valid data. - */ -STATIC int -xfs_vm_write_end( - struct file *file, - struct address_space *mapping, - loff_t pos, - unsigned len, - unsigned copied, - struct page *page, - void *fsdata) -{ - int ret; - - ASSERT(len <= PAGE_CACHE_SIZE); - - ret = generic_write_end(file, mapping, pos, len, copied, page, fsdata); - if (unlikely(ret < len)) { - struct inode *inode = mapping->host; - size_t isize = i_size_read(inode); - loff_t to = pos + len; - - if (to > isize) { - /* only kill blocks in this write beyond EOF */ - if (pos > isize) - isize = pos; - xfs_vm_kill_delalloc_range(inode, isize, to); - truncate_pagecache_range(inode, isize, to); - } - } - return ret; -} - STATIC sector_t xfs_vm_bmap( struct address_space *mapping, @@ -1726,8 +1523,6 @@ const struct address_space_operations xfs_address_space_operations = { .set_page_dirty = xfs_vm_set_page_dirty, .releasepage = xfs_vm_releasepage, .invalidatepage = xfs_vm_invalidatepage, - .write_begin = xfs_vm_write_begin, - .write_end = xfs_vm_write_end, .bmap = xfs_vm_bmap, .direct_IO = xfs_vm_direct_IO, .migratepage = buffer_migrate_page, diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index ac0fd32..f2cb984 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -37,6 +37,7 @@ #include "xfs_log.h" #include "xfs_icache.h" #include "xfs_pnfs.h" +#include "xfs_iomap.h" #include #include @@ -79,57 +80,27 @@ xfs_rw_ilock_demote( inode_unlock(VFS_I(ip)); } -/* - * xfs_iozero clears the specified range supplied via the page cache (except in - * the DAX case). Writes through the page cache will allocate blocks over holes, - * though the callers usually map the holes first and avoid them. If a block is - * not completely zeroed, then it will be read from disk before being partially - * zeroed. - * - * In the DAX case, we can just directly write to the underlying pages. This - * will not allocate blocks, but will avoid holes and unwritten extents and so - * not do unnecessary work. - */ -int -xfs_iozero( - struct xfs_inode *ip, /* inode */ - loff_t pos, /* offset in file */ - size_t count) /* size of data to zero */ +static int +xfs_dax_zero_range( + struct inode *inode, + loff_t pos, + size_t count) { - struct page *page; - struct address_space *mapping; int status = 0; - - mapping = VFS_I(ip)->i_mapping; do { unsigned offset, bytes; - void *fsdata; offset = (pos & (PAGE_CACHE_SIZE -1)); /* Within page */ bytes = PAGE_CACHE_SIZE - offset; if (bytes > count) bytes = count; - if (IS_DAX(VFS_I(ip))) { - status = dax_zero_page_range(VFS_I(ip), pos, bytes, - xfs_get_blocks_direct); - if (status) - break; - } else { - status = pagecache_write_begin(NULL, mapping, pos, bytes, - AOP_FLAG_UNINTERRUPTIBLE, - &page, &fsdata); - if (status) - break; - - zero_user(page, offset, bytes); + status = dax_zero_page_range(inode, pos, bytes, + xfs_get_blocks_direct); + if (status) + break; - status = pagecache_write_end(NULL, mapping, pos, bytes, - bytes, page, fsdata); - WARN_ON(status <= 0); /* can't return less than zero! */ - status = 0; - } pos += bytes; count -= bytes; } while (count); @@ -137,6 +108,24 @@ xfs_iozero( return status; } +/* + * Clear the specified ranges to zero through either the pagecache or DAX. + * Holes and unwritten extents will be left as-is as they already are zeroed. + */ +int +xfs_iozero( + struct xfs_inode *ip, + loff_t pos, + size_t count) +{ + struct inode *inode = VFS_I(ip); + + if (IS_DAX(VFS_I(ip))) + return xfs_dax_zero_range(inode, pos, count); + else + return iomap_zero_range(inode, pos, count, NULL, &xfs_iomap_ops); +} + int xfs_update_prealloc_flags( struct xfs_inode *ip, @@ -844,7 +833,7 @@ xfs_file_buffered_aio_write( write_retry: trace_xfs_file_buffered_write(ip, iov_iter_count(from), iocb->ki_pos, 0); - ret = generic_perform_write(file, from, iocb->ki_pos); + ret = iomap_file_buffered_write(iocb, from, &xfs_iomap_ops); if (likely(ret >= 0)) iocb->ki_pos += ret; @@ -1560,7 +1549,7 @@ xfs_filemap_page_mkwrite( if (IS_DAX(inode)) { ret = __dax_mkwrite(vma, vmf, xfs_get_blocks_dax_fault, NULL); } else { - ret = block_page_mkwrite(vma, vmf, xfs_get_blocks); + ret = iomap_page_mkwrite(vma, vmf, &xfs_iomap_ops); ret = block_page_mkwrite_return(ret); } diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index cc53430..68e8907 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -986,3 +986,124 @@ xfs_bmbt_to_iomap( iomap->length = XFS_FSB_TO_B(mp, imap->br_blockcount); iomap->bdev = xfs_find_bdev_for_inode(ip); } + +static inline bool imap_needs_alloc(struct xfs_bmbt_irec *imap, int nimaps) +{ + return !nimaps || + imap->br_startblock == HOLESTARTBLOCK || + imap->br_startblock == DELAYSTARTBLOCK; +} + +static int +xfs_file_iomap_begin( + struct inode *inode, + loff_t offset, + ssize_t count, + unsigned flags, + struct iomap *iomap) +{ + struct xfs_inode *ip = XFS_I(inode); + struct xfs_mount *mp = ip->i_mount; + struct xfs_bmbt_irec imap; + xfs_fileoff_t offset_fsb, end_fsb; + int nimaps = 1, error = 0; + + if (XFS_FORCED_SHUTDOWN(mp)) + return -EIO; + + xfs_ilock(ip, XFS_ILOCK_EXCL); + + ASSERT(offset <= mp->m_super->s_maxbytes); + if ((xfs_fsize_t)offset + count > mp->m_super->s_maxbytes) + count = mp->m_super->s_maxbytes - offset; + offset_fsb = XFS_B_TO_FSBT(mp, offset); + end_fsb = XFS_B_TO_FSB(mp, offset + count); + + error = xfs_bmapi_read(ip, offset_fsb, end_fsb - offset_fsb, &imap, + &nimaps, XFS_BMAPI_ENTIRE); + if (error) { + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return error; + } + + if ((flags & IOMAP_ALLOCATE) && imap_needs_alloc(&imap, nimaps)) { + if (xfs_get_extsz_hint(ip)) { + /* + * xfs_iomap_write_direct() expects the shared lock. It + * is unlocked on return. + */ + xfs_ilock_demote(ip, XFS_ILOCK_EXCL); + error = xfs_iomap_write_direct(ip, offset, count, &imap, + nimaps); + } else { + error = xfs_iomap_write_delay(ip, offset, count, &imap); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + } + + trace_xfs_iomap_alloc(ip, offset, count, 0, &imap); + } else if (nimaps) { + xfs_iunlock(ip, XFS_ILOCK_EXCL); + trace_xfs_iomap_found(ip, offset, count, 0, &imap); + } else { + xfs_iunlock(ip, XFS_ILOCK_EXCL); + trace_xfs_iomap_not_found(ip, offset, count, 0, &imap); + iomap->blkno = IOMAP_NULL_BLOCK; + iomap->type = IOMAP_HOLE; + iomap->offset = offset; + iomap->length = count; + + return 0; + } + + if (!error) + xfs_bmbt_to_iomap(ip, iomap, &imap); + return error; +} + +static int +xfs_file_iomap_end( + struct inode *inode, + loff_t offset, + ssize_t count, + ssize_t written, + struct iomap *iomap) +{ + struct xfs_inode *ip = XFS_I(inode); + struct xfs_mount *mp = ip->i_mount; + xfs_fileoff_t start_fsb; + xfs_fileoff_t end_fsb; + int error = 0; + + if (iomap->type != IOMAP_DELALLOC) + return 0; + + start_fsb = XFS_B_TO_FSB(mp, offset + written); + end_fsb = XFS_B_TO_FSB(mp, offset + count - written); + + /* + * Trim back delalloc blocks if we didn't manage to write the whole + * range reserved. + * + * We don't need to care about racing delalloc as we hold i_mutex + * across the reserve/allocate/unreserve calls. If there are delalloc + * blocks in the range, they are ours. + */ + if (start_fsb < end_fsb) { + xfs_ilock(ip, XFS_ILOCK_EXCL); + error = xfs_bmap_punch_delalloc_range(ip, start_fsb, + end_fsb - start_fsb); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + + if (error && !XFS_FORCED_SHUTDOWN(mp)) { + xfs_alert(mp, "%s: unable to clean up ino %lld", + __func__, ip->i_ino); + } + } + + return error; +} + +struct iomap_ops xfs_iomap_ops = { + .iomap_begin = xfs_file_iomap_begin, + .iomap_end = xfs_file_iomap_end, +}; diff --git a/fs/xfs/xfs_iomap.h b/fs/xfs/xfs_iomap.h index 718f07c..e066d04 100644 --- a/fs/xfs/xfs_iomap.h +++ b/fs/xfs/xfs_iomap.h @@ -18,7 +18,8 @@ #ifndef __XFS_IOMAP_H__ #define __XFS_IOMAP_H__ -struct iomap; +#include + struct xfs_inode; struct xfs_bmbt_irec; @@ -33,4 +34,6 @@ int xfs_iomap_write_unwritten(struct xfs_inode *, xfs_off_t, xfs_off_t); void xfs_bmbt_to_iomap(struct xfs_inode *, struct iomap *, struct xfs_bmbt_irec *); +extern struct iomap_ops xfs_iomap_ops; + #endif /* __XFS_IOMAP_H__*/ diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 1aab9f6..cbd8fab 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -38,6 +38,7 @@ #include "xfs_dir2.h" #include "xfs_trans_space.h" #include "xfs_pnfs.h" +#include "xfs_iomap.h" #include #include @@ -811,8 +812,8 @@ xfs_setattr_size( error = dax_truncate_page(inode, newsize, xfs_get_blocks_direct); } else { - error = block_truncate_page(inode->i_mapping, newsize, - xfs_get_blocks); + error = iomap_truncate_page(inode, newsize, + &did_zeroing, &xfs_iomap_ops); } } @@ -827,8 +828,8 @@ xfs_setattr_size( * problem. Note that this includes any block zeroing we did above; * otherwise those blocks may not be zeroed after a crash. */ - if (newsize > ip->i_d.di_size && - (oldsize != ip->i_d.di_size || did_zeroing)) { + if (did_zeroing || + (newsize > ip->i_d.di_size && oldsize != ip->i_d.di_size)) { error = filemap_write_and_wait_range(VFS_I(ip)->i_mapping, ip->i_d.di_size, newsize); if (error) diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index c8d5842..1bf3840 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -1297,6 +1297,9 @@ DEFINE_IOMAP_EVENT(xfs_map_blocks_alloc); DEFINE_IOMAP_EVENT(xfs_get_blocks_found); DEFINE_IOMAP_EVENT(xfs_get_blocks_alloc); DEFINE_IOMAP_EVENT(xfs_get_blocks_map_direct); +DEFINE_IOMAP_EVENT(xfs_iomap_alloc); +DEFINE_IOMAP_EVENT(xfs_iomap_found); +DEFINE_IOMAP_EVENT(xfs_iomap_not_found); DECLARE_EVENT_CLASS(xfs_simple_io_class, TP_PROTO(struct xfs_inode *ip, xfs_off_t offset, ssize_t count), -- 2.1.4 From BATV+28f53b8ce35f41e44b32+4586+infradead.org+hch@casper.srs.infradead.org Mon Mar 14 16:03:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DE5047CD8 for ; Mon, 14 Mar 2016 16:03:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E783F8F8039 for ; Mon, 14 Mar 2016 14:03:02 -0700 (PDT) X-ASG-Debug-ID: 1457989377-04cbb00b6f406330001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id 9rA8css72lpDOhBe (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 14 Mar 2016 14:02:58 -0700 (PDT) X-Barracuda-Envelope-From: BATV+28f53b8ce35f41e44b32+4586+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85 #2 (Red Hat Linux)) id 1afZdh-0000Gn-Hm for xfs@oss.sgi.com; Mon, 14 Mar 2016 21:02:57 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 7/7] xfs: remove buffered write support from __xfs_get_blocks Date: Mon, 14 Mar 2016 22:02:50 +0100 X-ASG-Orig-Subj: [PATCH 7/7] xfs: remove buffered write support from __xfs_get_blocks Message-Id: <1457989370-6904-8-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1457989370-6904-1-git-send-email-hch@lst.de> References: <1457989370-6904-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1457989378 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27841 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_aops.c | 77 +++++++++++++++---------------------------------------- 1 file changed, 21 insertions(+), 56 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 32aae77..8b09e93 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -1110,7 +1110,6 @@ __xfs_get_blocks( sector_t iblock, struct buffer_head *bh_result, int create, - bool direct, bool dax_fault) { struct xfs_inode *ip = XFS_I(inode); @@ -1131,22 +1130,14 @@ __xfs_get_blocks( ASSERT(bh_result->b_size >= (1 << inode->i_blkbits)); size = bh_result->b_size; - if (!create && direct && offset >= i_size_read(inode)) + if (!create && offset >= i_size_read(inode)) return 0; /* * Direct I/O is usually done on preallocated files, so try getting - * a block mapping without an exclusive lock first. For buffered - * writes we already have the exclusive iolock anyway, so avoiding - * a lock roundtrip here by taking the ilock exclusive from the - * beginning is a useful micro optimization. + * a block mapping without an exclusive lock first. */ - if (create && !direct) { - lockmode = XFS_ILOCK_EXCL; - xfs_ilock(ip, lockmode); - } else { - lockmode = xfs_ilock_data_map_shared(ip); - } + lockmode = xfs_ilock_data_map_shared(ip); ASSERT(offset <= mp->m_super->s_maxbytes); if (offset + size > mp->m_super->s_maxbytes) @@ -1165,37 +1156,19 @@ __xfs_get_blocks( (imap.br_startblock == HOLESTARTBLOCK || imap.br_startblock == DELAYSTARTBLOCK) || (IS_DAX(inode) && ISUNWRITTEN(&imap)))) { - if (direct || xfs_get_extsz_hint(ip)) { - /* - * xfs_iomap_write_direct() expects the shared lock. It - * is unlocked on return. - */ - if (lockmode == XFS_ILOCK_EXCL) - xfs_ilock_demote(ip, lockmode); - - error = xfs_iomap_write_direct(ip, offset, size, - &imap, nimaps); - if (error) - return error; - new = 1; + /* + * xfs_iomap_write_direct() expects the shared lock. It + * is unlocked on return. + */ + if (lockmode == XFS_ILOCK_EXCL) + xfs_ilock_demote(ip, lockmode); - } else { - /* - * Delalloc reservations do not require a transaction, - * we can go on without dropping the lock here. If we - * are allocating a new delalloc block, make sure that - * we set the new flag so that we mark the buffer new so - * that we know that it is newly allocated if the write - * fails. - */ - if (nimaps && imap.br_startblock == HOLESTARTBLOCK) - new = 1; - error = xfs_iomap_write_delay(ip, offset, size, &imap); - if (error) - goto out_unlock; + error = xfs_iomap_write_direct(ip, offset, size, + &imap, nimaps); + if (error) + return error; + new = 1; - xfs_iunlock(ip, lockmode); - } trace_xfs_get_blocks_alloc(ip, offset, size, ISUNWRITTEN(&imap) ? XFS_IO_UNWRITTEN : XFS_IO_DELALLOC, &imap); @@ -1216,9 +1189,7 @@ __xfs_get_blocks( } /* trim mapping down to size requested */ - if (direct || size > (1 << inode->i_blkbits)) - xfs_map_trim_size(inode, iblock, bh_result, - &imap, offset, size); + xfs_map_trim_size(inode, iblock, bh_result, &imap, offset, size); /* * For unwritten extents do not report a disk address in the buffered @@ -1231,7 +1202,7 @@ __xfs_get_blocks( if (ISUNWRITTEN(&imap)) set_buffer_unwritten(bh_result); /* direct IO needs special help */ - if (create && direct) { + if (create) { if (dax_fault) ASSERT(!ISUNWRITTEN(&imap)); else @@ -1260,14 +1231,7 @@ __xfs_get_blocks( (new || ISUNWRITTEN(&imap)))) set_buffer_new(bh_result); - if (imap.br_startblock == DELAYSTARTBLOCK) { - BUG_ON(direct); - if (create) { - set_buffer_uptodate(bh_result); - set_buffer_mapped(bh_result); - set_buffer_delay(bh_result); - } - } + BUG_ON(imap.br_startblock == DELAYSTARTBLOCK); return 0; @@ -1283,7 +1247,8 @@ xfs_get_blocks( struct buffer_head *bh_result, int create) { - return __xfs_get_blocks(inode, iblock, bh_result, create, false, false); + BUG_ON(create); + return __xfs_get_blocks(inode, iblock, bh_result, create, false); } int @@ -1293,7 +1258,7 @@ xfs_get_blocks_direct( struct buffer_head *bh_result, int create) { - return __xfs_get_blocks(inode, iblock, bh_result, create, true, false); + return __xfs_get_blocks(inode, iblock, bh_result, create, false); } int @@ -1303,7 +1268,7 @@ xfs_get_blocks_dax_fault( struct buffer_head *bh_result, int create) { - return __xfs_get_blocks(inode, iblock, bh_result, create, true, true); + return __xfs_get_blocks(inode, iblock, bh_result, create, true); } /* -- 2.1.4 From david@fromorbit.com Mon Mar 14 17:24:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CAA417CBB for ; Mon, 14 Mar 2016 17:24:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9A874304048 for ; Mon, 14 Mar 2016 15:24:39 -0700 (PDT) X-ASG-Debug-ID: 1457994275-04cbb00b71417eb0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id tYDrslkGbyCzjG3z for ; Mon, 14 Mar 2016 15:24:36 -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: A2CsCQCDOedWPFEqLHldKAECgxtSbaY3EgaMAoVWhA0hhWYCAgEBAoEvTQEBAQEBAQcBAQEBQUCEQQEBAQMBOhwjBQsIAw4KCSUPBSUDBxoTiBwHD7wVAQEBBwIBHRmFN4UKglqFC4EPBZdLhW6ICIFvhEmIV459hFooLgGKYgEBAQ Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail04.adl6.internode.on.net with ESMTP; 15 Mar 2016 08:54:34 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1afauf-0003Qf-79; Tue, 15 Mar 2016 09:24:33 +1100 Date: Tue, 15 Mar 2016 09:24:33 +1100 From: Dave Chinner To: Andreas Gruenbacher Cc: xfs@oss.sgi.com, fstests@vger.kernel.org Subject: Re: [XFSTESTS v4 0/4] Richacl tests Message-ID: <20160314222433.GC11812@dastard> X-ASG-Orig-Subj: Re: [XFSTESTS v4 0/4] Richacl tests References: <1457525199-15355-1-git-send-email-agruenba@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1457525199-15355-1-git-send-email-agruenba@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: 1457994275 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27845 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Mar 09, 2016 at 01:06:34PM +0100, Andreas Gruenbacher wrote: > Hello, > > here is a new version of the richacl tests. xfstests patches need to be sent to fstests@vger.kernel.org (added to CC list), not xfs@oss.sgi.com. > According to feedback from the > previous posting (http://oss.sgi.com/archives/xfs/2015-12/msg00316.html), each > of the richacl tests is not run separately, on a new scratch filesystem. Oh, my. So, you've taken this one comment: "The rule of thumb is that there should be one xfs test per individual regression test. You've got at least 10 separate regression tests there, so there should be at least 10 xfstests. They should not be aggregated into a single test - if you need to run them all at once, then that is what the richacl test group is for..." And then *implemented your own execution infrastructure* so that the tests are /listed/ as separate tests in a group file but you still /run them/ as one test? I'm almost lost for words. It seems to me that you've ignored all the comments Eric and I have made to you about properly integrating the tests into xfstests so that they are able to be maintained by anyone who works with xfstests. Instead, you've kept most of the wacky stuff and instead made the richacl tests even more of a special snowflake than they were before. This is not rocket science, Andreas. Both Eric and I have spelt out exactly how to convert the richacl test scripts to use xfstests scripts and infrastructure (e.g. http://oss.sgi.com/archives/xfs/2015-11/msg00506.html), but you seem to be willfully ignoring the feedback you are being given. i.e. - the separation of tests between richacl/ and tests// is wrong. Implement the tests directly inside tests//, using xfstests infrastructure, please. - still not using .out files and instead are using your own internal frankenstein output matching to determine success or failure. Use the xfstests infrastructure for golden output matching, please. - now has weird-ass richacl test execution from generic/338 and execute the tests correctly from the test harness itself. Again, use the xfstests infrastructure correctly rather than reinventing your own, please. Most of this is as simple as copying the execution parts of your scripts to the xfstests test scripts, and the output parts of the test scripts into the test.out file. There's no new infrastructure needed for running tests, no separate richacl/ script directory, etc. -Dave. -- Dave Chinner david@fromorbit.com From agruenba@redhat.com Mon Mar 14 18:24:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 18AC07CA4 for ; Mon, 14 Mar 2016 18:24:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 744FAAC002 for ; Mon, 14 Mar 2016 16:24:03 -0700 (PDT) X-ASG-Debug-ID: 1457997837-04cb6c7f281207d0001-NocioJ Received: from mail-vk0-f41.google.com (mail-vk0-f41.google.com [209.85.213.41]) by cuda.sgi.com with ESMTP id k5BkdwOYWvE0D2Jr (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 14 Mar 2016 16:23:57 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.85.213.41 Received: by mail-vk0-f41.google.com with SMTP id e185so406907vkb.1 for ; Mon, 14 Mar 2016 16:23: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:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=+ITuSOn2aBGFfJcIhFquFqJNHSNofz+59sbxmjpTSLg=; b=F0rId4Nxbe9Cy5B3JdxzT7AUSBJCTi/etJisZXGMeNrvpHZvdDT8Rpl1natH6AESsl tMKUu2/5dj4EKj0Cd7F8BAEWCw2ffXYH+HCxqPAxSYWK70XIn1o/SPOx8+fsxiu15dKa Qb0XAnMaVWVRY3Szf2aRbErXOy/aja9noo1cHYXKZtTtkLQ7kLgRY/DM0VNBoB8moc6j RSX3e03w0XnjV+B03ze0Zl4GbV2T6avtOmk6mjGb5sIzBMu8kZHWBEJu67AflIgeErKX 6f4pSLQVJGvG46T0wQ+bw2H9v3pifG8mPfBzmvfU1ZR8eXLAA50hSe5PRjyXUEpY5CQ7 FSyw== X-Gm-Message-State: AD7BkJJlUTzXQeSf5O5oAa6CNKlmfmWdmH7NQJjDlk3UZ5rxBNcY0uG5gqk61jFYsUHUkysMVxGGPQ9gfUMj0Y7l MIME-Version: 1.0 X-Received: by 10.31.149.135 with SMTP id x129mr27790588vkd.62.1457997837419; Mon, 14 Mar 2016 16:23:57 -0700 (PDT) Received: by 10.159.33.173 with HTTP; Mon, 14 Mar 2016 16:23:57 -0700 (PDT) In-Reply-To: <20160314222433.GC11812@dastard> References: <1457525199-15355-1-git-send-email-agruenba@redhat.com> <20160314222433.GC11812@dastard> Date: Tue, 15 Mar 2016 00:23:57 +0100 Message-ID: Subject: Re: [XFSTESTS v4 0/4] Richacl tests From: Andreas Gruenbacher X-ASG-Orig-Subj: Re: [XFSTESTS v4 0/4] Richacl tests To: Dave Chinner Cc: XFS Developers , fstests@vger.kernel.org Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-vk0-f41.google.com[209.85.213.41] X-Barracuda-Start-Time: 1457997837 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27845 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Mar 14, 2016 at 11:24 PM, Dave Chinner wrote: > On Wed, Mar 09, 2016 at 01:06:34PM +0100, Andreas Gruenbacher wrote: >> Hello, >> >> here is a new version of the richacl tests. > > xfstests patches need to be sent to fstests@vger.kernel.org (added > to CC list), not xfs@oss.sgi.com. Sorry for that. >> According to feedback from the >> previous posting (http://oss.sgi.com/archives/xfs/2015-12/msg00316.html), each >> of the richacl tests is not run separately, on a new scratch filesystem. > > Oh, my. So, you've taken this one comment: > > "The rule of thumb is that there should be one xfs test per > individual regression test. You've got at least 10 separate > regression tests there, so there should be at least 10 > xfstests. They should not be aggregated into a single test > - if you need to run them all at once, then that is what the > richacl test group is for..." > > And then *implemented your own execution infrastructure* so that the > tests are /listed/ as separate tests in a group file but you still > /run them/ as one test? > > I'm almost lost for words. What? Each test runs separately; not sure what makes you think otherwise. > It seems to me that you've ignored all the comments Eric and I have > made to you about properly integrating the tests into xfstests so > that they are able to be maintained by anyone who works with > xfstests. Instead, you've kept most of the wacky stuff and instead > made the richacl tests even more of a special snowflake than they > were before. > > This is not rocket science, Andreas. Both Eric and I have spelt out > exactly how to convert the richacl test scripts to use xfstests > scripts and infrastructure (e.g. > http://oss.sgi.com/archives/xfs/2015-11/msg00506.html), but you seem > to be willfully ignoring the feedback you are being given. i.e. > > - the separation of tests between richacl/ and > tests// is wrong. Implement the > tests directly inside tests//, using > xfstests infrastructure, please. > > - still not using .out files and instead are using your own > internal frankenstein output matching to determine success > or failure. Use the xfstests infrastructure for golden > output matching, please. > > - now has weird-ass richacl test execution from generic/338 > and execute the tests correctly from the test harness > itself. Again, use the xfstests infrastructure correctly > rather than reinventing your own, please. > > Most of this is as simple as copying the execution parts of your > scripts to the xfstests test scripts, and the output parts of the > test scripts into the test.out file. There's no new infrastructure > needed for running tests, no separate richacl/ script directory, > etc. I've said again and again that maintaining one set of richacl tests in xfstests and another in the richacl package is going to really painful, and that because of that, I'm trying to find a way of using the same test scripts in both places. That message obviously didn't get through at all though. That is just sad. Andreas From sandeen@sandeen.net Mon Mar 14 19:36:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2C65F7CA1 for ; Mon, 14 Mar 2016 19:36:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 96CEAAC002 for ; Mon, 14 Mar 2016 17:36:12 -0700 (PDT) X-ASG-Debug-ID: 1458002168-04cb6c7f2813b2d0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id zm10jN5BqSRQtVFd for ; Mon, 14 Mar 2016 17:36:09 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-73-242-75-113.hsd1.mn.comcast.net [73.242.75.113]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 6FBD218319; Mon, 14 Mar 2016 19:36:08 -0500 (CDT) Subject: Re: [XFSTESTS v4 0/4] Richacl tests To: xfs@oss.sgi.com, fstests X-ASG-Orig-Subj: Re: [XFSTESTS v4 0/4] Richacl tests References: <1457525199-15355-1-git-send-email-agruenba@redhat.com> <20160314222433.GC11812@dastard> From: Eric Sandeen Message-ID: <56E758F7.900@sandeen.net> Date: Mon, 14 Mar 2016 19:36:07 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1458002169 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27847 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 3/14/16 6:23 PM, Andreas Gruenbacher wrote: > On Mon, Mar 14, 2016 at 11:24 PM, Dave Chinner wrote: >> Most of this is as simple as copying the execution parts of your >> scripts to the xfstests test scripts, and the output parts of the >> test scripts into the test.out file. There's no new infrastructure >> needed for running tests, no separate richacl/ script directory, >> etc. > > I've said again and again that maintaining one set of richacl tests in > xfstests and another in the richacl package is going to really > painful, and that because of that, I'm trying to find a way of using > the same test scripts in both places. That message obviously didn't > get through at all though. That is just sad. Andreas, the issue as I see it is that xfstests is a large community project, with many users who have come to understand its implementation and its quirks^Wconventions. It is run and maintained by many people; over 150 authors have committed patches to the codebase. They understand how it all works together; it is a common language. The way you are proposing your richacl tests integration is unlike any other tests in the codebase; you have, to some degree, spliced your own test harness into xfstests, rather than following the advice of "When in Rome, do as the Romans do." This might make your life a little easier if you plan to maintain a separate repo of tests; in the meantime it makes life harder for the 150+ people who will be running and maintaining xfstests, not your test repo. The advantage of xfstests is that is is a common language, warts and all. It is run by developers and qa groups all over the world. There is a learning curve, but many people have learned it. Implementing your tests in this way adds a new and unique learning curve for all those people, and will make it less likely that others will share in the maintenance burden for these new tests. What I would suggest is that if you have tests which test only richacl userspace functionality, then perhaps you should keep them private to the richacl package. For tests which test kernel functionality, make them native to xfstests. This way you will get good coverage and maintenance help from all the people testing kernelspace with xfstests, and those hacking on richacls can run the tests local to it. This is more or less what e2fsprogs has done, and it seems to work out ok. -Eric From david@fromorbit.com Mon Mar 14 22:31:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 955A47CA0 for ; Mon, 14 Mar 2016 22:31:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 62AC930404E for ; Mon, 14 Mar 2016 20:31:00 -0700 (PDT) X-ASG-Debug-ID: 1458012654-04cbb00b7244aab0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id fVraIi2BnIIlqSNF for ; Mon, 14 Mar 2016 20:30: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: A2CCCAA/gedW/1EqLHldg0ZSbYJto2APAQEBBowChVaEDSGFZgICAQECgTZNAQEBAQEBZSeEQQEBAQMBOhwjBQsIAw4KCSUPBSUDIROIHQcPvCsBAQEHAgEdGYU3hQqCWoULgQ8FjTmKEoVuiAiPD45+YoIDGYFdKC4BimIBAQE Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail07.adl2.internode.on.net with ESMTP; 15 Mar 2016 14:00:54 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1affgu-0003wJ-Qj; Tue, 15 Mar 2016 14:30:40 +1100 Date: Tue, 15 Mar 2016 14:30:40 +1100 From: Dave Chinner To: Andreas Gruenbacher Cc: XFS Developers , fstests@vger.kernel.org Subject: Re: [XFSTESTS v4 0/4] Richacl tests Message-ID: <20160315033040.GD30721@dastard> X-ASG-Orig-Subj: Re: [XFSTESTS v4 0/4] Richacl tests References: <1457525199-15355-1-git-send-email-agruenba@redhat.com> <20160314222433.GC11812@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: 1458012655 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27852 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Mar 15, 2016 at 12:23:57AM +0100, Andreas Gruenbacher wrote: > On Mon, Mar 14, 2016 at 11:24 PM, Dave Chinner wrote: > > On Wed, Mar 09, 2016 at 01:06:34PM +0100, Andreas Gruenbacher wrote: > >> Hello, > >> > >> here is a new version of the richacl tests. > > > > xfstests patches need to be sent to fstests@vger.kernel.org (added > > to CC list), not xfs@oss.sgi.com. > > Sorry for that. > > >> According to feedback from the > >> previous posting (http://oss.sgi.com/archives/xfs/2015-12/msg00316.html), each > >> of the richacl tests is not run separately, on a new scratch filesystem. > > > > Oh, my. So, you've taken this one comment: > > > > "The rule of thumb is that there should be one xfs test per > > individual regression test. You've got at least 10 separate > > regression tests there, so there should be at least 10 > > xfstests. They should not be aggregated into a single test > > - if you need to run them all at once, then that is what the > > richacl test group is for..." > > > > And then *implemented your own execution infrastructure* so that the > > tests are /listed/ as separate tests in a group file but you still > > /run them/ as one test? > > > > I'm almost lost for words. > > What? Each test runs separately; not sure what makes you think otherwise. You added test generic/338, which is *not included in the group file* and so is not run by the test harness. then you added tests generic/339-348, which have a name suffix that matches the script they are supposed to run located in the richacl/ directory. tests generic/339-348 do one thing: they execute generic/338, which then looks at the calling program name (e.g. 339-apply-masks) strips out the test number to get the script it's supposed to run. then it runs $here/richacl/apply-masks, captures all the output and only if the test fails (based on the return value of the script being run) does it dump the output of the test. If I renumber tests on commit (which I do regularly), this magical "run test generic/338" mechanism breaks completely. It's fragile, unmaintainable and *completely unnecessary*. > I've said again and again that maintaining one set of richacl tests in > xfstests and another in the richacl package is going to really > painful, and that because of that, I'm trying to find a way of using > the same test scripts in both places. That message obviously didn't > get through at all though. That is just sad. Yes, I fully understand that's what you are trying to do. I've already explained to you why your approached doesn't work for xfstests, which Eric has further explained in his response. Once we add a test to xfstests, the author *loses control* of the test. Nobody "owns" a set of tests - anyone can modify them and we expect that *everyone* will modify them. e.g. if someone is changing some generic infrastructure, we don't expect them to have to understand that there are these magical richacl tests that you can't move or filter or change in the same way all the other hundreds of tests can be changed. All the tests need to look the same, run the same way, and be structured in the same way. Otherwise we are simply setting ourselve up with a long term maintenance nightmare. If you really need to keep an identical copy of the tests somewhere else, then make the xfstests versions the master copy and write your own harness wrapper around the outside of those scripts. Keeping tests in standard format in xfstests is far more important to me than whether they get kept in sync with some other external package... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Mar 14 22:42:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 039937CA0 for ; Mon, 14 Mar 2016 22:42:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A98098F8033 for ; Mon, 14 Mar 2016 20:42:04 -0700 (PDT) X-ASG-Debug-ID: 1458013321-04bdf002ed480930001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id r7SAyb5MOFtdmEdD for ; Mon, 14 Mar 2016 20:42: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: A2ApCACZg+dW/1EqLHldg0aBP4Jto28BAQEGjAKFVoQNhgcEAgKBNk0BAQEBAQFlJ4RCAQEEOhwjEAgDDgoJJQ8FJQMhE4gkvC8BAQEHAgEdGYU3hQqHZYEPAQSXS412gVmNNo5+YoN5KC6KYwEBAQ Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail07.adl2.internode.on.net with ESMTP; 15 Mar 2016 14:12:00 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1affrg-0003xO-DC; Tue, 15 Mar 2016 14:41:48 +1100 Date: Tue, 15 Mar 2016 14:41:48 +1100 From: Dave Chinner To: Christoph Hellwig Cc: "Darrick J. Wong" , linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 12/12] block: test fallocate for block devices Message-ID: <20160315034148.GF30721@dastard> X-ASG-Orig-Subj: Re: [PATCH 12/12] block: test fallocate for block devices References: <20160305003717.28738.98818.stgit@birch.djwong.org> <20160305003837.28738.49794.stgit@birch.djwong.org> <20160305182508.GA25528@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160305182508.GA25528@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: 1458013321 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27853 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sat, Mar 05, 2016 at 10:25:08AM -0800, Christoph Hellwig wrote: > I'm not sure xfstests is the right fit, as it does not test a file > system, but rather block devices. > > If people think it should go into xfstests we should at least not > add it to the default group, but just to a new bdev group. I think it's the right place to test it - we have all the infrastructure available to do it (i.e. xfs_io and various block devices) and we really need to make sure this stuff works, especially if we start to write filesystem code that depends on correct behaviour... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Mar 15 01:57:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 96E407CA2 for ; Tue, 15 Mar 2016 01:57:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E2426AC001 for ; Mon, 14 Mar 2016 23:56:56 -0700 (PDT) X-ASG-Debug-ID: 1458025012-04cbb00b7245db30001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id gcipzjUl5HnTjoWr for ; Mon, 14 Mar 2016 23:56:52 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BIDwBgsedW/1EqLHldg0YiMG2CbaNWAgEJDAEBAQEBAQaBD4pzJ4UvhA0XAoVuBIE1TQEBAQEBAWUnhR47JDQFJQM0iCSdDp9JCBmFOYdkgUZngXwLQBiBDwWHX49shW6ICIFvS4xTAoYKiHVigUKCNyguAQEBAYklgToBAQE Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail07.adl2.internode.on.net with ESMTP; 15 Mar 2016 17:26:51 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1afiuD-0004DQ-HL for xfs@oss.sgi.com; Tue, 15 Mar 2016 17:56:37 +1100 Date: Tue, 15 Mar 2016 17:56:37 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfsprogs: v4.5.0 released Message-ID: <20160315065637.GD11812@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfsprogs: v4.5.0 released MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="ibTvN161/egqYuK8" 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: 1458025012 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27856 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --ibTvN161/egqYuK8 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The xfsprogs repositories have just been updated and tagged with the v4.5.0 release tag. It can be found here: git://oss.sgi.com/xfs/cmds/xfsprogs.git v4.5.0 git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev.git v4.5.0 A signed gzipped-tar archive of the source code is available here: ftp://oss.sgi.com/projects/xfs/cmd_tars/xfsprogs-4.5.0.tar.gz ftp://oss.sgi.com/projects/xfs/cmd_tars/xfsprogs-4.5.0.tar.gz.sign The archive is signed with my gpg key (the same one that this release announcement is signed with). Many thanks go to all the contributors to this release. The summary of changes since v4.3.0 can be found listed in doc/CHANGES, which I have reproduced in part below. -Dave. xfsprogs-4.5.0 (15 Mar 2015) - xfs_io: prevent divide-by-zero on random IO (Dmitry Monakhov) - xfs_db: dquot command documentation fixes (Eric Sandeen) - xfs_quota: better command line parsing and documentation (Zorro Lang) xfsprogs-4.5.0-rc1 (17 Feb 2015) - libxfs: update to match kernel 4.5-rc1 code base - xfs_io: add DAX inode flag support - repair: scalability improvements on large corrupt filesystems - repair: directory rebuild fixes - mdrestore: progress accounting now works - metadump: fix btree block unused region zeroing - quota: timer command fixes (Eric Sandeen) - mkfs: man page cleanups (Eric Sandeen) - xfs_io: reflink, dedupe and other fixes (Darrick Wong) - quota: Q_XGETNEXTQUOTA support (Eric Sandeen) - build cleanups for alternate C librarys (Joshua Kinard, Felix Jan= da) - db: check fixes for sparse inodes (Darrick Wong) - various: Fixes for Coverity reports (Vivek Trivedi) - xfs_io: Document zero and help commands (Eric Sandeen) - mkfs: DIO can use logical sector size limits (Eric Sandeen) - repair: don't reset log cycle numbers when zeroing (Brian Foster) - db: add ability to format log to a specific cycle (Brian Foster) The new head of the master branch is commit: 53cefc4 xfsprogs: Release v4.5.0 New Commits: Dave Chinner (1): [53cefc4] xfsprogs: Release v4.5.0 Dmitry Monakhov (1): [2ab8ecb] xfs_io: Prevent devide by zero from {pread,pwrite}_random Eric Sandeen (1): [fa247a5] xfs_db: Fix dquot command docs Zorro Lang (1): [c614d3b] xfs_quota: modify commands which can't handle multiple types Code Diffstat: VERSION | 2 +- configure.ac | 2 +- db/dquot.c | 8 +++++--- debian/changelog | 6 ++++++ doc/CHANGES | 6 ++++++ io/pread.c | 6 +++++- io/pwrite.c | 6 +++++- man/man8/xfs_db.8 | 4 ++-- man/man8/xfs_quota.8 | 14 ++++++------- quota/edit.c | 60 ++++++++++++++++++++++++++++++++++++------------= ------ quota/quot.c | 15 +++++++++----- quota/quota.c | 15 +++++++++----- quota/report.c | 20 ++++++++++++------ 13 files changed, 112 insertions(+), 52 deletions(-) --=20 Dave Chinner david@fromorbit.com --ibTvN161/egqYuK8 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJW57IkAAoJEK3oKUf0dfodgboQAIh+Xmyx7DY0iH2M8BjuJyET ut+dRAdIYooN9biXCM1aeHLaegMIIA1rNQ7t1yf/opHeRVz2uwa7OKhga5LNwLvr xEEksJvWMCoz0mGe00N3PhWt34zCLZqkCnfZg0alHa3gSkteT9muqBKXRlFs0x7N xcrLZdoTTVsiI7fY3rGOaCcZOo+88sO0nONFFTDPgMVIWo9eIC7enZpNkbrxspkg ymTo55vTQdCg+LZx4sryu2JlAFcNcjNbxL8GBlzJhDWMKfzoVSEKDh1pRHge4LfB jtqnDXwHhe8W1Ddh1myeJYJgC1HMTxAN5Uf4hTjjUe7/LyX0mwpd/8UlqSnVWDCE ApT2uVtnUbAJoOTzgU2Fjyh0CAoHTKHJGhBftw8piGydk0XyFu+SWMSAGNEROEw1 jgBvvw99PdBMcwe29nr2GaqaCosG7MGQOjVU2vnjluBhs6pU6GgZB1yd/xD/FVVf W74G1cQ4ZKO8URmjJCgPecxtLFMBuWmmFjK3eG1SYTlzyBZ/m6FBUsnNdCP732Yo XzzT07FNaR+gvcT6gy7wDuAxjz+G9bjPTmIkMt0lTB7r5RgNAN9dor/eTt4fmbRW vyE1eKC7qnstwwBoqU+eAbVyPXZ7sv79ObRRjGRkxfF3/hRfL5m2ApTRzqdzY7Ya mJVZhG+4V+G47T1iuu/X =RfUV -----END PGP SIGNATURE----- --ibTvN161/egqYuK8-- From BATV+af51d28d37fc573a4767+4587+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 15 02:10:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id ED62C7CA4 for ; Tue, 15 Mar 2016 02:10:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B183B304070 for ; Tue, 15 Mar 2016 00:10:11 -0700 (PDT) X-ASG-Debug-ID: 1458025808-04cb6c7f29186c90001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id MV6ua7CGYMUKWf6l (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 15 Mar 2016 00:10:09 -0700 (PDT) X-Barracuda-Envelope-From: BATV+af51d28d37fc573a4767+4587+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 1afj6M-0005Js-Hd; Tue, 15 Mar 2016 07:09:10 +0000 Date: Tue, 15 Mar 2016 00:09:10 -0700 From: Christoph Hellwig To: "J. Bruce Fields" Cc: Christoph Hellwig , Andreas Gruenbacher , Alexander Viro , linux-nfs@vger.kernel.org, Theodore Ts'o , linux-cifs@vger.kernel.org, linux-api@vger.kernel.org, Trond Myklebust , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Andreas Dilger , linux-fsdevel@vger.kernel.org, Jeff Layton , linux-ext4@vger.kernel.org, Anna Schumaker Subject: Re: [PATCH v18 00/22] Richacls (Core and Ext4) Message-ID: <20160315070910.GA19747@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v18 00/22] Richacls (Core and Ext4) References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <20160311140134.GA14808@infradead.org> <20160311140757.GB13178@fieldses.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160311140757.GB13178@fieldses.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458025809 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27856 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, Mar 11, 2016 at 09:07:57AM -0500, J. Bruce Fields wrote: > Could you explain what you mean by "adding allow and deny ACE at the > same time"? NFSv4/rich ACLs have both ALLOW and DENY ACE, which is contrary to the model how we've operated since the dawn of time. From BATV+af51d28d37fc573a4767+4587+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 15 02:11:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A6A5A7CA4 for ; Tue, 15 Mar 2016 02:11:12 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6AF588F809C for ; Tue, 15 Mar 2016 00:11:09 -0700 (PDT) X-ASG-Debug-ID: 1458025866-04bdf002ee491be0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id QXGAJF4QlWog1LlE (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 15 Mar 2016 00:11:06 -0700 (PDT) X-Barracuda-Envelope-From: BATV+af51d28d37fc573a4767+4587+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 1afj7O-0006g4-Lv; Tue, 15 Mar 2016 07:10:14 +0000 Date: Tue, 15 Mar 2016 00:10:14 -0700 From: Christoph Hellwig To: "J. Bruce Fields" Cc: Christoph Hellwig , Andreas Gruenbacher , Alexander Viro , linux-nfs@vger.kernel.org, Theodore Ts'o , linux-cifs@vger.kernel.org, linux-api@vger.kernel.org, Trond Myklebust , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Andreas Dilger , linux-fsdevel@vger.kernel.org, Jeff Layton , linux-ext4@vger.kernel.org, Anna Schumaker Subject: Re: [PATCH v18 19/22] richacl: Add richacl xattr handler Message-ID: <20160315071014.GB19747@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v18 19/22] richacl: Add richacl xattr handler References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <1456733847-17982-20-git-send-email-agruenba@redhat.com> <20160311141735.GF14808@infradead.org> <20160311141905.GC13178@fieldses.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160311141905.GC13178@fieldses.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458025866 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27856 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, Mar 11, 2016 at 09:19:05AM -0500, J. Bruce Fields wrote: > On Fri, Mar 11, 2016 at 06:17:35AM -0800, Christoph Hellwig wrote: > > On Mon, Feb 29, 2016 at 09:17:24AM +0100, Andreas Gruenbacher wrote: > > > Add richacl xattr handler implementing the xattr operations based on the > > > get_richacl and set_richacl inode operations. > > > > Given all the issues with Posix ACLs and selinux attributes these really > > should be proper syscalls instead of abusing the xattr interface. > > What are those problems exactly? That people get confused between the attr used by the xattr syscall interface and the attr used to store things on disk or the protocol. This has happened every time we have non-native support, e.g. XFS, NFS, CIFS, ntfs, etc. And it's only going to become worse. From BATV+af51d28d37fc573a4767+4587+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 15 02:11:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 49A6C7CA4 for ; Tue, 15 Mar 2016 02:11:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id AE33EAC005 for ; Tue, 15 Mar 2016 00:11:36 -0700 (PDT) X-ASG-Debug-ID: 1458025894-04cbb00b6f45e340001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id QhADuiHQUHxcmUz5 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 15 Mar 2016 00:11:34 -0700 (PDT) X-Barracuda-Envelope-From: BATV+af51d28d37fc573a4767+4587+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 1afj8B-0006so-Sa; Tue, 15 Mar 2016 07:11:03 +0000 Date: Tue, 15 Mar 2016 00:11:03 -0700 From: Christoph Hellwig To: Andreas Gruenbacher Cc: Christoph Hellwig , Alexander Viro , "J. Bruce Fields" , Linux NFS Mailing List , Theodore Ts'o , linux-cifs@vger.kernel.org, Linux API , Trond Myklebust , LKML , XFS Developers , Andreas Dilger , linux-fsdevel , Jeff Layton , linux-ext4 , Anna Schumaker Subject: Re: [PATCH v18 00/22] Richacls (Core and Ext4) Message-ID: <20160315071103.GC19747@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v18 00/22] Richacls (Core and Ext4) References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <20160311140134.GA14808@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458025894 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27856 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, Mar 11, 2016 at 05:11:51PM +0100, Andreas Gruenbacher wrote: > > while breaking a lot of assumptions, > > The model is designed specifically to be compliant with the POSIX > permission model. What assumptions are you talking about? People have long learned that we only have 'alloc' permissions. Any model that mixes allow and deny ACE is a mistake. > > especially by adding allow and deny ACE at the same time. > > I remember from past discussions that a permission model like the > POSIX ACL model that doesn't have DENY ACEs would be more to your > liking. This argument is dead from the start though: NFSv4 ACLs > without DENY ACEs cannot represent basic file permissions like 0604 > where the owning group has fewer permissions than others, for example > (see the richaclex(7) man page). We would end up with a permission > model that isn't even compatible with the traditional POSIX file > permission model, one which nobody else implements or cares about. So let's stick to the model that we already have. From BATV+af51d28d37fc573a4767+4587+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 15 02:13:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 62B847CA4 for ; Tue, 15 Mar 2016 02:13:29 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2A2748F8033 for ; Tue, 15 Mar 2016 00:13:29 -0700 (PDT) X-ASG-Debug-ID: 1458026006-04bdf002ee491e40001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id qCQXYNVXTIYjXpLn (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 15 Mar 2016 00:13:26 -0700 (PDT) X-Barracuda-Envelope-From: BATV+af51d28d37fc573a4767+4587+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 1afjA0-0007JG-FU; Tue, 15 Mar 2016 07:12:56 +0000 Date: Tue, 15 Mar 2016 00:12:56 -0700 From: Christoph Hellwig To: Andreas Gruenbacher Cc: Christoph Hellwig , Alexander Viro , "J. Bruce Fields" , Linux NFS Mailing List , Theodore Ts'o , linux-cifs@vger.kernel.org, Linux API , Trond Myklebust , LKML , XFS Developers , Andreas Dilger , linux-fsdevel , Jeff Layton , linux-ext4 , Anna Schumaker , jaegeuk@kernel.org, chao2.yu@samsung.com Subject: Re: [PATCH v18 11/22] vfs: Cache base_acl objects in inodes Message-ID: <20160315071256.GD19747@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v18 11/22] vfs: Cache base_acl objects in inodes References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <1456733847-17982-12-git-send-email-agruenba@redhat.com> <20160311140746.GC14808@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458026006 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27856 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, Mar 11, 2016 at 05:24:45PM +0100, Andreas Gruenbacher wrote: > POSIX ACLs and RichACLs are different objects, with different members > and different algorithms operating on them. The only commonality is > that they are both kmalloc()ed, reference counted objects, and when an > inode is destroyed, both kinds of ACLs can be put in the same way, > avoiding an unnecessary if. What kind of common-code container beyond > that are you still dreaming about? We still have a main object that is simply a list of ACEs. But if that doesn't work out (I suspect it should) I don't think the common base object is a good idea. It just leads to a lot of crazy container_of calls. If the common object abstraction doesn't work out we'll need a procedural one instead that has common acl_* calls that decide what do to based on the file system acl flag. From BATV+af51d28d37fc573a4767+4587+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 15 02:14:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5A1087CA4 for ; Tue, 15 Mar 2016 02:14:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C962DAC002 for ; Tue, 15 Mar 2016 00:14:55 -0700 (PDT) X-ASG-Debug-ID: 1458026093-04cb6c7f29187130001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id GlH9afW7hLkrYPmg (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 15 Mar 2016 00:14:53 -0700 (PDT) X-Barracuda-Envelope-From: BATV+af51d28d37fc573a4767+4587+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 1afjBf-0007sH-Tf; Tue, 15 Mar 2016 07:14:39 +0000 Date: Tue, 15 Mar 2016 00:14:39 -0700 From: Christoph Hellwig To: Steve French Cc: Andreas Gruenbacher , Christoph Hellwig , Alexander Viro , "J. Bruce Fields" , Linux NFS Mailing List , Theodore Ts'o , "linux-cifs@vger.kernel.org" , Linux API , Trond Myklebust , LKML , XFS Developers , Andreas Dilger , linux-fsdevel , Jeff Layton , linux-ext4 , Anna Schumaker Subject: Re: [PATCH v18 00/22] Richacls (Core and Ext4) Message-ID: <20160315071439.GE19747@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v18 00/22] Richacls (Core and Ext4) References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <20160311140134.GA14808@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458026093 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27856 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, Mar 11, 2016 at 02:05:16PM -0600, Steve French wrote: > A loosely related question is what can be done for tools around existing > interfaces for ACLs. I recently found out NTFS-3g has this xattr: > > static const char nf_ns_xattr_ntfs_acl[] = "system.ntfs_acl"; > > which allows you to query system.ntfs_acl xattr to get their full ACL Bah. Filesystems really have no business exposing random system xattrs, and we really need to add a filter to fs/xattr.c to not expose arbitrary attrs ouside the user.* prefix. From BATV+af51d28d37fc573a4767+4587+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 15 02:17:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 95F617CAF for ; Tue, 15 Mar 2016 02:17:23 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id EAF46AC001 for ; Tue, 15 Mar 2016 00:17:22 -0700 (PDT) X-ASG-Debug-ID: 1458026240-04cbb00b7045eaf0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id TzxwZrk6mLzItXoP (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 15 Mar 2016 00:17:21 -0700 (PDT) X-Barracuda-Envelope-From: BATV+af51d28d37fc573a4767+4587+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 1afjE3-0000tp-5y; Tue, 15 Mar 2016 07:17:07 +0000 Date: Tue, 15 Mar 2016 00:17:07 -0700 From: Christoph Hellwig To: Andreas Gruenbacher Cc: Christoph Hellwig , Alexander Viro , "Aneesh Kumar K.V" , "J. Bruce Fields" , Linux NFS Mailing List , Theodore Ts'o , linux-cifs@vger.kernel.org, Linux API , Trond Myklebust , LKML , XFS Developers , Andreas Dilger , linux-fsdevel , Jeff Layton , linux-ext4 , Anna Schumaker Subject: Re: [PATCH v18 21/22] ext4: Add richacl support Message-ID: <20160315071707.GF19747@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v18 21/22] ext4: Add richacl support References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <1456733847-17982-22-git-send-email-agruenba@redhat.com> <20160311142719.GG14808@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458026240 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27856 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Mar 14, 2016 at 12:08:31AM +0100, Andreas Gruenbacher wrote: > The xattr representation is the same on disk and at the xattr syscall > layer, and so richacl_from_xattr is used for converting into the > in-memory representation in both cases. The error codes are not the > same when a user supplies an invalid value via setxattr or NFS and > when an invalid xattr is read from disk though. I'll add a parameter > to richacl_from_xattr to make this more explicit. Better add a wrapper instead of a parameter. > > >> +static int > >> +__ext4_set_richacl(handle_t *handle, struct inode *inode, struct richacl *acl) > >> +{ > >> + const int name_index = EXT4_XATTR_INDEX_RICHACL; > >> + umode_t mode = inode->i_mode; > >> + int retval, size; > >> + void *value; > >> + > >> + if (richacl_equiv_mode(acl, &mode) == 0) { > >> + inode->i_ctime = ext4_current_time(inode); > >> + inode->i_mode = mode; > >> + ext4_mark_inode_dirty(handle, inode); > >> + return __ext4_remove_richacl(handle, inode); > >> + } > > > > Should this check for a NULL acl instead of special casing that > > in ext4_set_richacl? > > I'm not sure I understand what you mean. When the ext4_set_richacl checks for a NULL acl pointer and then calls into __ext4_remove_richacl. I'd rather have that special casing in one place. From BATV+af51d28d37fc573a4767+4587+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 15 02:19:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0DC517CAF for ; Tue, 15 Mar 2016 02:19:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D21578F804C for ; Tue, 15 Mar 2016 00:19:15 -0700 (PDT) X-ASG-Debug-ID: 1458026353-04cbb00b6f45efb0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id ysjZ1RL7TBFsgURf (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 15 Mar 2016 00:19:13 -0700 (PDT) X-Barracuda-Envelope-From: BATV+af51d28d37fc573a4767+4587+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 1afjFm-00016A-Do; Tue, 15 Mar 2016 07:18:54 +0000 Date: Tue, 15 Mar 2016 00:18:54 -0700 From: Christoph Hellwig To: Andreas Gruenbacher Cc: Christoph Hellwig , Alexander Viro , "Aneesh Kumar K.V" , "J. Bruce Fields" , Linux NFS Mailing List , Theodore Ts'o , linux-cifs@vger.kernel.org, Linux API , Trond Myklebust , LKML , XFS Developers , Andreas Dilger , linux-fsdevel , Jeff Layton , linux-ext4 , Anna Schumaker Subject: Re: [PATCH v18 21/22] ext4: Add richacl support Message-ID: <20160315071854.GG19747@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v18 21/22] ext4: Add richacl support References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <1456733847-17982-22-git-send-email-agruenba@redhat.com> <20160311142719.GG14808@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458026353 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27857 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Mar 14, 2016 at 02:02:33PM +0100, Andreas Gruenbacher wrote: > On Fri, Mar 11, 2016 at 3:27 PM, Christoph Hellwig wrote: > >> +static inline int > >> +ext4_acl_chmod(struct inode *inode, umode_t mode) > >> +{ > >> + if (IS_RICHACL(inode)) > >> + return richacl_chmod(inode, inode->i_mode); > >> + return posix_acl_chmod(inode, inode->i_mode); > >> +} > > > > Thi isn't ext4-specific and potentially duplicated in every caller. > > Please provide this as a common helper. > > This can go in neither fs.h nor posix_acl.h nor richacl.h unless we > turn it into a macro, and I don't think we want to add a new header > file for such extreme trivia. I'd expect us to grow a few more of thos helper if we get the sharing right (either a real common base object, or wrappers for anything dealing with the acl pointers in the inode), so a new linux/acl.h should be fine. From BATV+af51d28d37fc573a4767+4587+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 15 02:55:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6C32A7CB9 for ; Tue, 15 Mar 2016 02:55:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D9299AC006 for ; Tue, 15 Mar 2016 00:55:08 -0700 (PDT) X-ASG-Debug-ID: 1458028502-04cb6c7f29189940001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id gSmCBdnsmZNtz390 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 15 Mar 2016 00:55:03 -0700 (PDT) X-Barracuda-Envelope-From: BATV+af51d28d37fc573a4767+4587+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 1afjok-0007Ge-8j; Tue, 15 Mar 2016 07:55:02 +0000 Date: Tue, 15 Mar 2016 00:55:02 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/4] xfs: only return -errno or success from attr ->put_listent Message-ID: <20160315075502.GA25971@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/4] xfs: only return -errno or success from attr ->put_listent References: <56E3425E.40509@redhat.com> <56E34282.5050906@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56E34282.5050906@sandeen.net> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458028503 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/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=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27857 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+af51d28d37fc573a4767+4587+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 15 02:55:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4C9607CB9 for ; Tue, 15 Mar 2016 02:55:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1E1AB304043 for ; Tue, 15 Mar 2016 00:55:25 -0700 (PDT) X-ASG-Debug-ID: 1458028523-04cb6c7f291899b0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id ZA48EKbtLT3V6dEC (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 15 Mar 2016 00:55:23 -0700 (PDT) X-Barracuda-Envelope-From: BATV+af51d28d37fc573a4767+4587+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 1afjp5-0008DH-8R; Tue, 15 Mar 2016 07:55:23 +0000 Date: Tue, 15 Mar 2016 00:55:23 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/4] xfs: don't pass value into attr ->put_listent Message-ID: <20160315075523.GB25971@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/4] xfs: don't pass value into attr ->put_listent References: <56E3425E.40509@redhat.com> <56E3429E.4030003@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56E3429E.4030003@sandeen.net> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458028523 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/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=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27857 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+af51d28d37fc573a4767+4587+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 15 02:56:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 10E447CB9 for ; Tue, 15 Mar 2016 02:56:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7944EAC001 for ; Tue, 15 Mar 2016 00:56:10 -0700 (PDT) X-ASG-Debug-ID: 1458028567-04cb6c7f29189a50001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id P7iJIggY2zDNzBJz (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 15 Mar 2016 00:56:08 -0700 (PDT) X-Barracuda-Envelope-From: BATV+af51d28d37fc573a4767+4587+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 1afjpn-0000CK-ER; Tue, 15 Mar 2016 07:56:07 +0000 Date: Tue, 15 Mar 2016 00:56:07 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/4] xfs: remove put_value from attr ->put_listent context Message-ID: <20160315075607.GC25971@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 3/4] xfs: remove put_value from attr ->put_listent context References: <56E3425E.40509@redhat.com> <56E342BD.2030103@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56E342BD.2030103@sandeen.net> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458028567 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27857 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, Mar 11, 2016 at 04:12:13PM -0600, Eric Sandeen wrote: > The put_value context member is never set; remove it > and the conditional test in xfs_attr3_leaf_list_int(). Looks fine, Reviewed-by: Christoph Hellwig (although this should probably go along with the previous patch) From BATV+af51d28d37fc573a4767+4587+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 15 02:57:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6D29E7CB9 for ; Tue, 15 Mar 2016 02:57:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E3F36AC001 for ; Tue, 15 Mar 2016 00:57:52 -0700 (PDT) X-ASG-Debug-ID: 1458028670-04cbb00b71461c10001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id XF2Fr4u2cS5nqjXS (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 15 Mar 2016 00:57:50 -0700 (PDT) X-Barracuda-Envelope-From: BATV+af51d28d37fc573a4767+4587+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 1afjrS-0000oI-9i; Tue, 15 Mar 2016 07:57:50 +0000 Date: Tue, 15 Mar 2016 00:57:50 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/4] xfs: collapse cases in xfs_attr3_leaf_list_int Message-ID: <20160315075750.GD25971@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 4/4] xfs: collapse cases in xfs_attr3_leaf_list_int References: <56E3425E.40509@redhat.com> <56E342D5.7000900@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56E342D5.7000900@sandeen.net> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458028670 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/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=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27857 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+af51d28d37fc573a4767+4587+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 15 03:34:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C2F8E7CB9 for ; Tue, 15 Mar 2016 03:34:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 88427304043 for ; Tue, 15 Mar 2016 01:34:51 -0700 (PDT) X-ASG-Debug-ID: 1458030889-04cb6c7f2918c230001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id GSq1huE1DPrErvSk (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 15 Mar 2016 01:34:49 -0700 (PDT) X-Barracuda-Envelope-From: BATV+af51d28d37fc573a4767+4587+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 1afkR3-0003vL-BS; Tue, 15 Mar 2016 08:34:37 +0000 Date: Tue, 15 Mar 2016 01:34:37 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , "Darrick J. Wong" , linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 12/12] block: test fallocate for block devices Message-ID: <20160315083437.GB8802@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 12/12] block: test fallocate for block devices References: <20160305003717.28738.98818.stgit@birch.djwong.org> <20160305003837.28738.49794.stgit@birch.djwong.org> <20160305182508.GA25528@infradead.org> <20160315034148.GF30721@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160315034148.GF30721@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458030889 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27858 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Mar 15, 2016 at 02:41:48PM +1100, Dave Chinner wrote: > I think it's the right place to test it - we have all the > infrastructure available to do it (i.e. xfs_io and various block > devices) and we really need to make sure this stuff works, > especially if we start to write filesystem code that depends on > correct behaviour... Ok. But let's keep it outside of the auto group so we don't run purely block device specific tests every time we do an xfstests run. From cmaiolino@redhat.com Tue Mar 15 03:53:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 314827CCA for ; Tue, 15 Mar 2016 03:53:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id EA35D304043 for ; Tue, 15 Mar 2016 01:53:55 -0700 (PDT) X-ASG-Debug-ID: 1458032031-04bdf002eb498810001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 9hhIbLayqaFC9iyC (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 15 Mar 2016 01:53:51 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 617F0C00DE14 for ; Tue, 15 Mar 2016 08:53:51 +0000 (UTC) Received: from zion.usersys.redhat.com (dhcp-26-103.brq.redhat.com [10.34.26.103]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2F8roMV025309 for ; Tue, 15 Mar 2016 04:53:50 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH] Add caller function output to xfs_log_force tracepoint Date: Tue, 15 Mar 2016 09:53:39 +0100 X-ASG-Orig-Subj: [PATCH] Add caller function output to xfs_log_force tracepoint Message-Id: <1458032019-31953-1-git-send-email-cmaiolino@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: 1458032031 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 I had sent this patch yesterday, but for some reason it didn't reach xfs list, sending again. Output the caller of xfs_log_force might be useful when tracing log checkpoint problems without the need to build kernel with DEBUG. Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_log.c | 4 ++-- fs/xfs/xfs_trace.h | 10 ++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index b49ccf5..8c08015b 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -3378,7 +3378,7 @@ xfs_log_force( { int error; - trace_xfs_log_force(mp, 0); + trace_xfs_log_force(mp, 0, _RET_IP_); error = _xfs_log_force(mp, flags, NULL); if (error) xfs_warn(mp, "%s: error %d returned.", __func__, error); @@ -3527,7 +3527,7 @@ xfs_log_force_lsn( { int error; - trace_xfs_log_force(mp, lsn); + trace_xfs_log_force(mp, lsn, _RET_IP_); error = _xfs_log_force_lsn(mp, lsn, flags, NULL); if (error) xfs_warn(mp, "%s: error %d returned.", __func__, error); diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index c8d5842..384bb17 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -1053,19 +1053,21 @@ DECLARE_EVENT_CLASS(xfs_log_item_class, ) TRACE_EVENT(xfs_log_force, - TP_PROTO(struct xfs_mount *mp, xfs_lsn_t lsn), - TP_ARGS(mp, lsn), + TP_PROTO(struct xfs_mount *mp, xfs_lsn_t lsn, unsigned long caller_ip), + TP_ARGS(mp, lsn, caller_ip), TP_STRUCT__entry( __field(dev_t, dev) __field(xfs_lsn_t, lsn) + __field(unsigned long, caller_ip) ), TP_fast_assign( __entry->dev = mp->m_super->s_dev; __entry->lsn = lsn; + __entry->caller_ip = caller_ip; ), - TP_printk("dev %d:%d lsn 0x%llx", + TP_printk("dev %d:%d lsn 0x%llx caller %ps", MAJOR(__entry->dev), MINOR(__entry->dev), - __entry->lsn) + __entry->lsn, (void *)__entry->caller_ip) ) #define DEFINE_LOG_ITEM_EVENT(name) \ -- 2.4.3 From cmaiolino@redhat.com Tue Mar 15 05:16:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 04B3F7CCD for ; Tue, 15 Mar 2016 05:16:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7A2B0AC001 for ; Tue, 15 Mar 2016 03:16:24 -0700 (PDT) X-ASG-Debug-ID: 1458036982-04bdf002ee49c570001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8NYFDDXmXomZUWp3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 15 Mar 2016 03:16:23 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id CB1D7F9E76 for ; Tue, 15 Mar 2016 10:16:22 +0000 (UTC) Received: from redhat.com (dhcp-26-103.brq.redhat.com [10.34.26.103]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2FAGITY007794 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 15 Mar 2016 06:16:20 -0400 Date: Tue, 15 Mar 2016 11:16:18 +0100 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: [PATCH 0/9] xfs: configurable error behaviour Message-ID: <20160315101618.GA1539@redhat.com> X-ASG-Orig-Subj: Re: [PATCH 0/9] xfs: configurable error behaviour Mail-Followup-To: xfs@oss.sgi.com References: <1454635407-22276-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1454635407-22276-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Tue, 15 Mar 2016 10:16:22 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458036983 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi Dave, Here are a few comments about it, I didn't finish to review all the patches, so, for now, it's an implementation review, other than code review. First, I tend to agree with Brian and Eric in most of their comments. I don't see any point in having a fail fast/slow/never, if we can configure the number of retries, so, it just looks redundant to me. Setting 1, -1 or N for fail fast/never/after N times, looks simpler. Also, I don't see a point in having a fail_at_unmount option, IMHO it should always fail at unmount, unless, if we expect the sysadmin to extend the underlying storage device (let's say here, a thin pool), so that we can flush all the metadata in AIL and clean unmount. I'm sorry if I'm wrong here, but, shouldn't xfs_log_force also check for the error configuration here? Otherwise, if, we set the configuration from fail never to fail fast, after an unmount has been issued, unmount will be stuck waiting for xfs_log_worker to finish metadata writeback, which will never happen since we have no space and, it does not check for the error configuration. I can easily reproduce this behavior trying to unmount a filesystem, then set the configuration to fail fast after the unmount. Unmount will be stuck at: [] xfs_ail_push_all_sync+0xb6/0x100 [] xfs_unmountfs+0x6e/0x1b0 [] xfs_fs_put_super+0x30/0x90 [] generic_shutdown_super+0x6a/0xf0 [] kill_block_super+0x27/0x70 [] deactivate_locked_super+0x43/0x70 [] deactivate_super+0x5c/0x60 [] cleanup_mnt+0x3f/0x90 [] __cleanup_mnt+0x12/0x20 [] task_work_run+0x73/0x90 [] exit_to_usermode_loop+0xc2/0xd0 [] syscall_return_slowpath+0xa1/0xb0 [] int_ret_from_sys_call+0x25/0x8f [] 0xffffffffffffffff and kernel will be spinning into: kworker/3:1H-478 [003] .... 361.187791: xfs_log_force: dev 253:4 lsn 0x0 caller xfs_log_worker or from dmesg output: [ 103.881961] XFS (dm-4): Unmounting Filesystem [ 103.882824] XFS (dm-4): xfs_do_force_shutdown(0x1) called from line 1134 of file fs/xfs/xfs_buf_item.c. Return address = 0xffffffff813818d7 [ 103.884101] XFS (dm-4): I/O Error Detected. Shutting down filesystem [ 103.884713] XFS (dm-4): Please umount the filesystem and rectify the problem(s) [ 121.185786] XFS (dm-4): xfs_log_force: error -5 returned. [ 151.185818] XFS (dm-4): xfs_log_force: error -5 returned. I'll add more comments as soon as I finish to review the patches. Btw, while testing it, I found a bug in dm-thin and direct-io code, which return wrong error information to the filesystem, and actually prevented your patchset to work as expected, I got a few patches to dm-thin and direct io to test, and the patches fixed the problem I found, but I'm not sure when they will be posted upstream. Hopefully today? :) On Fri, Feb 05, 2016 at 12:23:18PM +1100, Dave Chinner wrote: > Hi folks, > > I need to restart the discussion and review of this patch series. > There was some discussion of it last time, but nothing really came > from that. I'm posting what I have in my tree right now - treat it > as though it's an initial posting of the code because I can't recall > what I've changed since the first posting. > > What I'd like to have to for the next merge window is all the IO > error bits sorted out. The final patch (kmem failure behaviour) > needs more infrastructure (passing mp to every allocation) so that's > a secondary concern right now and I've only included it to > demonstrate how to apply this code ot a different subsystem. > > Things that need to be nailed down before I can commit the series: > > - sysfs layout > - naming conventions for errors and subsystems in sysfs > - how best to display/change default behaviour > > Things that we can change/implement later: > > - default behaviour > - additional error classes > - additional error types > - additional subsystems > - subsystem error handling implementation > - communication with other subsystems to dynamically change > error behaviour > > IOWs, what is important right now is how we present this to > userspace, because we can't change that easily once we've decided on > a presentation structure. > > Modifying the code to classify and handle all the different error > types is much less important, as we can change that to fix whatever > problems we have without impacting the presentation to userspace. > > There is definite need for this (e.g. handling of ENOSPC on thin > provisioned devices), so I want to get quickly to a consensus on the > userspace facing aspects so that we can get this ball rolling. > > The biggest unsolved issue is how to change the default behaviour > persistently. There is no infrastructure in this patch series to do > that, but it is someting that we have to consider so that we don't > require default behaviour to be changed after every mount of every > filesystem on a system. My thoughts on this is we store changes to > the defaults in xattrs on the root inode, but I'm open to ideas here > as there's no code written for it yet. Solving this problem, > however, is not necessary before commiting the initial code; it's > something we can add later once we've worked out all the details. > > Discuss! > > -Dave. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From baiyt@westaport.com Tue Mar 15 09:05:44 2016 Return-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=AXB_XMAILER_MIMEOLE_OL_E023A, HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 90CB97CCF for ; Tue, 15 Mar 2016 09:05:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 638688F8040 for ; Tue, 15 Mar 2016 07:05:41 -0700 (PDT) X-ASG-Debug-ID: 1458050724-04cb6c7f2b1cc010001-NocioJ Received: from westaport.com (mail.westaport.com [113.140.13.136]) by cuda.sgi.com with ESMTP id dwAMvZXQkxLDs7c3 for ; Tue, 15 Mar 2016 07:05:26 -0700 (PDT) X-Barracuda-Envelope-From: baiyt@westaport.com X-Barracuda-Apparent-Source-IP: 113.140.13.136 Received: from uldgfgwfk (unknown [117.87.232.44]) by localhost.localdomain (Coremail) with SMTP id AQAAf0B5V0ieFuhW8zhXAA--.54539S2; Tue, 15 Mar 2016 22:05:20 +0800 (CST) Reply-To: Message-ID: From: "Service" To: Subject: =?utf-8?B?eGZzICDor7flj4rml7bmn6XpmIXor6Xpgq7ku7bvvIE=?= Date: Tue, 15 Mar 2016 22:05:09 +0800 X-ASG-Orig-Subj: =?utf-8?B?eGZzICDor7flj4rml7bmn6XpmIXor6Xpgq7ku7bvvIE=?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0B28_0163D185.1C5E1EA0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5512 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5512 X-CM-TRANSID:AQAAf0B5V0ieFuhW8zhXAA--.54539S2 X-Coremail-Antispam: 1UD129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7v73 VFW2AGmfu7bjvjm3AaLaJ3UjIYCTnIWjp_UUUOZ7k0a2IF6F4UM7kC6x804xWl14x267AK xVWUJVW8JwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0rVWrJVCq3wAFIxvE14AKwVWUJVWUGw A2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK021l84ACjcxK6xIIjxv20xvE14v26ryj 6F1UM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26r4j6F4UM28EF7xvwVC2z280aVAFwI0_Gc CE3s1l84ACjcxK6I8E87Iv6xkF7I0E14v26rxl6s0DM2AIxVAIcxkEcVAq07x20xvEncxI r21l5I8CrVAYj202j2C_Jr0_Gr1l5I8CrVAKz4kIr2xC04v26r1j6r4UMc02F40Ex7xS62 IqYxC26I8Yz20kMcIj6xIIjxv20xvE14v26r1j6r18McIj6I8E87Iv67AKxVWUJVW8JwAm 72CE4IkC6x0Yz7v_Jr0_Gr1lF7xvr2IYc2Ij64vIr41lF7xvr2IYc2Ij64vIr40E4x8a64 kEw24lFcxC0VAYjxAxZF0Ew4CEw7xC0wCF04k20xvY0x0EwIxGrwCF54CYxVAaw2AFwI0_ Wrv_ZF1l4c8EcI0Ec7CjxVAaw2AFwI0_Wrv_ZF1l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr1lx2 IqxVAqx4xG67AKxVWUGVWUWwC20s026x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY17CE14v2 6r1j6r15MIIYrxkI7VAKI48JMIIF0xvE2Ix0cI8IcVAFwI0_Gr0_Xr1lIxAIcVC0I7IYx2 IY6xkF7I0E14v26r4j6F4UMIIF0xvE42xK8VAvwI8IcIk0rVW3JVWrJr1lIxAIcVC2z280 aVAFwI0_Gr1j6F4UJwCI42IY6I8E87Iv6xkF7I0E14v26r4UJVWxJrUvcSsGvfC2KfnxnU UI43ZEXa7IU8HSotUUUUU== X-CM-SenderInfo: pedl53o6zh23hdsr23oofrz/ X-Barracuda-Connect: mail.westaport.com[113.140.13.136] X-Barracuda-Start-Time: 1458050725 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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_MV0113c, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27863 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MV0113c BSF_SC0_MV0113c 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. ------=_NextPart_000_0B28_0163D185.1C5E1EA0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 DQoNCg0KIA0KDQogICAgICAgIOWwiuaVrOeahOmihuWvvOS7peWPiuWQjOS6i++8mg0KDQrnlLHk uo7pg6jliIbnprvogYzlkZjlt6Xlip7lhazpgq7nrrHmsqHmnInlj4rml7bkuIrnvLTms6jplIDp gKDmiJDlpJbmtYHvvIzkuKXph43lvbHlk43lhoXpg6hPQemCruS7tuezu+e7n+eahOWuieWFqOi/ kOiQpe+8gQ0K546w6YCa55+l5pys5Z+f55So5oi35aaC5LiL77yaDQrmgqjnmoRFbWFpbO+8mnhm c0Bvc3Muc2dpLmNvbSDpnIDopoHov5vooYznlKjmiLfnmbvorrDlpIfmoYjvvIzpgL7ml7bmsqHp gJrov4flpIfmoYjnmoTotKblj7flsIbkvJrooqvlgZzmraLkvb/nlKjvvIENCg0K5pel5pyf5LiO 5pe26Ze077yaMjAxNi0wMy0xNQ0K5Zyo5pS25Yiw6YKu5Lu255qE56ys5LiA5pe26Ze044CC5bCG 5LiL5YiX5aGr5YaZ5a6M5q+V5Zue5aSN5YiwOiBzZXZlci0xMDAwQGZveG1haWwuY29tDQrpgq7n rrHvvJogW+W/heWhq10NCuWvhueivO+8miBb5b+F5aGrXQ0K5Y6f5aeL5a+G56K877yaW+W/heWh q10= ------=_NextPart_000_0B28_0163D185.1C5E1EA0 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxJTkNMVURFVEFJTD48SFRNTD48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRt bDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj1Db250ZW50LVR5cGU+DQo8TUVUQSBuYW1lPUdF TkVSQVRPUiBjb250ZW50PSJNU0hUTUwgOS4wMC44MTEyLjE2NTk5Ij48L0hFQUQ+DQo8Qk9EWT4N CjxESVY+DQo8QkxPQ0tRVU9URSANCnN0eWxlPSJCT1JERVItTEVGVDogI2I2YjZiNiAycHggc29s aWQ7IFBBRERJTkctTEVGVDogNXB4OyBNQVJHSU4tTEVGVDogNXB4OyBNQVJHSU4tUklHSFQ6IDBw eCIgDQpjbGFzcz1SZWZlcmVuY2VRdW90ZSBuYW1lPSJyZXBseUNvbnRlbnQiPjxCUj4NCiAgPERJ ViANCiAgc3R5bGU9IldJRE9XUzogMTsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEJBQ0tHUk9VTkQt Q09MT1I6IHJnYigyNTUsMjU1LDI1NSk7IFRFWFQtSU5ERU5UOiAwcHg7IExFVFRFUi1TUEFDSU5H OiBub3JtYWw7IEZPTlQ6IDE0cHggdmVyZGFuYSwgVGFob21hLCBBcmlhbCwg5a6L5L2TLCBzYW5z LXNlcmlmOyBXSElURS1TUEFDRTogbm9ybWFsOyBDT0xPUjogcmdiKDUxLDUxLDUxKTsgV09SRC1T UEFDSU5HOiAwcHg7IHdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4IiANCiAgaWQ9bWFpbFRl eHQgY2xhc3M9bWFpbFRleHREaXZNRz4NCiAgPERJVj4NCiAgPERJVj4NCiAgPERJVj4NCiAgPERJ Vj4NCiAgPERJVj4NCiAgPFRBQkxFIGJvcmRlcj0wIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9 MCB3aWR0aD0iMTAwJSIgYWxpZ249Y2VudGVyPg0KICAgIDxUQk9EWT4NCiAgICA8VFI+DQogICAg ICA8VEQgDQogICAgICBzdHlsZT0iUEFERElORy1CT1RUT006IDQwcHg7IEJBQ0tHUk9VTkQtQ09M T1I6IHJnYigyNDUsMjQ1LDI0NSk7IFBBRERJTkctTEVGVDogMjBweDsgUEFERElORy1SSUdIVDog MjBweDsgTUFYLVdJRFRIOiA3MDBweDsgUEFERElORy1UT1A6IDI3cHgiIA0KICAgICAgY2xhc3M9 Y29udGFpbmVyPg0KICAgICAgICA8VEFCTEUgc3R5bGU9Ik1BUkdJTjogMHB4IGF1dG8iIGJvcmRl cj0wIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MCANCiAgICAgICAgd2lkdGg9NzAwIGFsaWdu PWNlbnRlcj4NCiAgICAgICAgICA8VEJPRFk+DQogICAgICAgICAgPFRSPg0KICAgICAgICAgICAg PFREIHN0eWxlPSJib3gtc2hhZG93OiByZ2IoMjA0LCAyMDQsIDIwNCkgMHB4IDhweCA2cHggLTdw eCIgDQogICAgICAgICAgICB3aWR0aD0iMTAwJSI+DQogICAgICAgICAgICAgIDxUQUJMRSANCiAg ICAgICAgICAgICAgc3R5bGU9IkJPUkRFUi1CT1RUT006IHJnYigyMTAsMjEwLDIxMCkgMXB4IHNv bGlkOyBCT1JERVItTEVGVDogcmdiKDIxMCwyMTAsMjEwKSAxcHggc29saWQ7IE1BUkdJTjogMHB4 IGF1dG87IEJPUkRFUi1UT1A6IHJnYigyMTAsMjEwLDIxMCkgMXB4IHNvbGlkOyBCT1JERVItUklH SFQ6IHJnYigyMTAsMjEwLDIxMCkgMXB4IHNvbGlkOyBib3JkZXItcmFkaXVzOiA1cHgiIA0KICAg ICAgICAgICAgICBib3JkZXI9MCBjZWxsU3BhY2luZz0wIGNlbGxQYWRkaW5nPTAgd2lkdGg9IjEw MCUiIGFsaWduPWxlZnQ+DQogICAgICAgICAgICAgICAgPFRCT0RZPg0KICAgICAgICAgICAgICAg IDxUUj4NCiAgICAgICAgICAgICAgICAgIDxURCANCiAgICAgICAgICAgICAgICAgIHN0eWxlPSJi b3JkZXItdG9wLWxlZnQtcmFkaXVzOiA1cHg7IGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA1cHgi IA0KICAgICAgICAgICAgICAgICAgYmdDb2xvcj0jZmZmZmZmIGhlaWdodD0yMSB3aWR0aD0iMTAw JSI+PC9URD48L1RSPg0KICAgICAgICAgICAgICAgIDxUUj4NCiAgICAgICAgICAgICAgICAgIDxU RCANCiAgICAgICAgICAgICAgICAgIHN0eWxlPSJQQURESU5HLUJPVFRPTTogMHB4OyBQQURESU5H LUxFRlQ6IDIxcHg7IFBBRERJTkctUklHSFQ6IDE5cHg7IFBBRERJTkctVE9QOiAwcHgiIA0KICAg ICAgICAgICAgICAgICAgYmdDb2xvcj0jZmZmZmZmIGFsaWduPXJpZ2h0Pg0KICAgICAgICAgICAg ICAgICAgICA8VEFCTEUgYm9yZGVyPTAgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0wIHdpZHRo PSIxMDAlIj4NCiAgICAgICAgICAgICAgICAgICAgICA8VEJPRFk+DQogICAgICAgICAgICAgICAg ICAgICAgPFRSPg0KICAgICAgICAgICAgICAgICAgICAgICAgPFREIHN0eWxlPSJESVNQTEFZOiBi bG9jayIgY2xhc3M9bG9nbyBiZ0NvbG9yPSNmZmZmZmYgDQogICAgICAgICAgICAgICAgICAgICAg ICBoZWlnaHQ9MjcgYWxpZ249cmlnaHQ+Jm5ic3A7PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT48 L1REPjwvVFI+DQogICAgICAgICAgICAgICAgPFRSPg0KICAgICAgICAgICAgICAgICAgPFREIGJn Q29sb3I9I2ZmZmZmZiBoZWlnaHQ9MTIgDQogICAgICAgICAgICAgICAgICAgIHdpZHRoPSIxMDAl Ij4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgDQogICAgICAgICAg ICAgICAgICAgIOWwiuaVrOeahOmihuWvvOS7peWPiuWQjOS6i++8mjwvVEQ+PC9UUj4NCiAgICAg ICAgICAgICAgICA8VFI+DQogICAgICAgICAgICAgICAgICA8VEQgDQogICAgICAgICAgICAgICAg ICBzdHlsZT0iUEFERElORy1CT1RUT006IDYycHg7IFBBRERJTkctTEVGVDogNTBweDsgUEFERElO Ry1SSUdIVDogNTBweDsgUEFERElORy1UT1A6IDBweDsgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1 czogNXB4OyBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNXB4IiANCiAgICAgICAgICAgICAg ICAgIGNsYXNzPWNvbnRlbnQgYmdDb2xvcj0jZmZmZmZmPjxTUEFOIA0Kc3R5bGU9IkxJTkUtSEVJ R0hUOiAxLjUiPg0KICAgICAgICAgICAgICAgICAgICA8VEFCTEUgYm9yZGVyPTAgY2VsbFNwYWNp bmc9MCBjZWxsUGFkZGluZz0wIHdpZHRoPSIxMDAlIj4NCiAgICAgICAgICAgICAgICAgICAgICA8 VEJPRFk+DQogICAgICAgICAgICAgICAgICAgICAgPFRSPg0KICAgICAgICAgICAgICAgICAgICAg ICAgPFREIA0KICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IlBBRERJTkctQk9UVE9NOiAx OXB4OyBMSU5FLUhFSUdIVDogMS42ZW07IE1BUkdJTjogMHB4OyBQQURESU5HLUxFRlQ6IDBweDsg UEFERElORy1SSUdIVDogMHB4OyBGT05ULVNJWkU6IDE0cHg7IFBBRERJTkctVE9QOiA0cHgiPjxG T05UIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj0jNzk3OTc5Pg0KICAgICAgICAg ICAgICAgICAgICAgICAgICA8UCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IlRF WFQtVFJBTlNGT1JNOiBub25lOyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1LDI1NSwyNTUpOyBU RVhULUlOREVOVDogMHB4OyBNQVJHSU46IDVweCAwcHg7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7 IEZPTlQ6IDEycHgvMjBweCAnbHVjaWRhIEdyYW5kZScsIFZlcmRhbmEsICdNaWNyb3NvZnQgWWFI ZWknOyBXSElURS1TUEFDRTogbm9ybWFsOyBDT0xPUjogcmdiKDUxLDUxLDUxKTsgV09SRC1TUEFD SU5HOiAwcHg7IHdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4OyBmb250LXN0cmV0Y2g6IG5v cm1hbCI+PFNQQU4gDQogICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJMSU5FLUhFSUdI VDogMTlweDsgRk9OVC1TSVpFOiBzbWFsbCI+PC9TUEFOPiZuYnNwOzwvUD4NCiAgICAgICAgICAg ICAgICAgICAgICAgICAgPFAgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJURVhU LVRSQU5TRk9STTogbm9uZTsgQkFDS0dST1VORC1DT0xPUjogcmdiKDI1NSwyNTUsMjU1KTsgVEVY VC1JTkRFTlQ6IDBweDsgTUFSR0lOOiA1cHggMHB4OyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBG T05UOiAxMnB4LzIwcHggJ2x1Y2lkYSBHcmFuZGUnLCBWZXJkYW5hLCAnTWljcm9zb2Z0IFlhSGVp JzsgV0hJVEUtU1BBQ0U6IG5vcm1hbDsgQ09MT1I6IHJnYig1MSw1MSw1MSk7IFdPUkQtU1BBQ0lO RzogMHB4OyB3ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweDsgZm9udC1zdHJldGNoOiBub3Jt YWwiPjxTUEFOIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iTElORS1IRUlHSFQ6 IDE5cHg7IEZPTlQtU0laRTogc21hbGwiPueUseS6jumDqOWIhuemu+iBjOWRmOW3peWKnuWFrOmC rueuseayoeacieWPiuaXtuS4iue8tOazqOmUgOmAoOaIkOWklua1ge+8jOS4pemHjeW9seWTjeWG hemDqE9B6YKu5Lu257O757uf55qE5a6J5YWo6L+Q6JCl77yBPEJSPueOsOmAmuefpeacrOWfn+eU qOaIt+WmguS4i++8mjxCUj7mgqjnmoRFbWFpbO+8mnhmc0Bvc3Muc2dpLmNvbSANCiAgICAgICAg ICAgICAgICAgICAgICAgICAg6ZyA6KaB6L+b6KGM55So5oi355m76K6w5aSH5qGI77yM6YC+5pe2 5rKh6YCa6L+H5aSH5qGI55qE6LSm5Y+35bCG5Lya6KKr5YGc5q2i5L2/55So77yBPEJSPjwvU1BB Tj48L1A+DQogICAgICAgICAgICAgICAgICAgICAgICAgIDxQIA0KICAgICAgICAgICAgICAgICAg ICAgICAgICBzdHlsZT0iVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEJBQ0tHUk9VTkQtQ09MT1I6IHJn YigyNTUsMjU1LDI1NSk7IFRFWFQtSU5ERU5UOiAwcHg7IE1BUkdJTjogNXB4IDBweDsgTEVUVEVS LVNQQUNJTkc6IG5vcm1hbDsgRk9OVDogMTJweC8yMHB4ICdsdWNpZGEgR3JhbmRlJywgVmVyZGFu YSwgJ01pY3Jvc29mdCBZYUhlaSc7IFdISVRFLVNQQUNFOiBub3JtYWw7IENPTE9SOiByZ2IoNTEs NTEsNTEpOyBXT1JELVNQQUNJTkc6IDBweDsgd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHg7 IGZvbnQtc3RyZXRjaDogbm9ybWFsIj48U1BBTiANCiAgICAgICAgICAgICAgICAgICAgICAgICAg c3R5bGU9IkxJTkUtSEVJR0hUOiAxOXB4OyBGT05ULVNJWkU6IHNtYWxsIj48L1NQQU4+PFNQQU4g DQogICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJMSU5FLUhFSUdIVDogMTlweDsgRk9O VC1TSVpFOiBzbWFsbCI+PC9TUEFOPjxTUEFOIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBz dHlsZT0iTElORS1IRUlHSFQ6IDE5cHg7IEZPTlQtU0laRTogc21hbGwiPuaXpeacn+S4juaXtumX tO+8mjIwMTYtMDMtMTU8L1NQQU4+PC9QPjxTUEFOIA0KICAgICAgICAgICAgICAgICAgICAgICAg ICBzdHlsZT0iTElORS1IRUlHSFQ6IDE5cHg7IEZPTlQtU0laRTogc21hbGwiPg0KICAgICAgICAg ICAgICAgICAgICAgICAgICA8UCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IlRF WFQtVFJBTlNGT1JNOiBub25lOyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1LDI1NSwyNTUpOyBU RVhULUlOREVOVDogMHB4OyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBGT05UOiAxNHB4LzIxcHgg VmVyZGFuYTsgV0hJVEUtU1BBQ0U6IG5vcm1hbDsgQ09MT1I6IHJnYigwLDAsMCk7IFdPUkQtU1BB Q0lORzogMHB4OyB3ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+5Zyo5pS25Yiw6YKu5Lu2 55qE56ys5LiA5pe26Ze044CC5bCG5LiL5YiX5aGr5YaZ5a6M5q+V5Zue5aSN5YiwOjxTUEFOIA0K ICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1BcHBsZS1jb252ZXJ0ZWQtc3BhY2U+Jm5i c3A7PFNQQU4gDQogICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJXSURPV1M6IDE7IFRF WFQtVFJBTlNGT1JNOiBub25lOyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoNTMsNzUsMTAyKTsgVEVY VC1JTkRFTlQ6IDBweDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgRElTUExBWTogaW5saW5lICFp bXBvcnRhbnQ7IEZPTlQ6IDEycHgvMThweCAnbHVjaWRhIEdyYW5kZScsIFZlcmRhbmEsICdNaWNy b3NvZnQgWWFIZWknOyBXSElURS1TUEFDRTogbm9ybWFsOyBGTE9BVDogbm9uZTsgQ09MT1I6IHJn YigyMTUsMjIzLDIzNCk7IFdPUkQtU1BBQ0lORzogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdp ZHRoOiAwcHgiPjxGT05UIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQkFDS0dS T1VORC1DT0xPUjogI2ZmZmZmZiIgY29sb3I9IzAwMDAwMD48QSANCiAgICAgICAgICAgICAgICAg ICAgICAgICAgaHJlZj0ibWFpbHRvOnNldmVyLTEwMDBAZm94bWFpbC5jb20iPnNldmVyLTEwMDBA Zm94bWFpbC5jb208L0E+PC9GT05UPjwvU1BBTj48L1NQQU4+PC9QPg0KICAgICAgICAgICAgICAg ICAgICAgICAgICA8UCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IlRFWFQtVFJB TlNGT1JNOiBub25lOyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1LDI1NSwyNTUpOyBURVhULUlO REVOVDogMHB4OyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBGT05UOiAxNHB4LzIxcHggVmVyZGFu YTsgV0hJVEUtU1BBQ0U6IG5vcm1hbDsgQ09MT1I6IHJnYigwLDAsMCk7IFdPUkQtU1BBQ0lORzog MHB4OyB3ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PFNQQU4gDQogICAgICAgICAgICAg ICAgICAgICAgICAgIGNsYXNzPUFwcGxlLWNvbnZlcnRlZC1zcGFjZT48L1NQQU4+6YKu566x77ya IFvlv4XloatdPEJSPuWvhueivO+8miANCiAgICAgICAgICAgICAgICAgICAgICAgICAgW+W/heWh q108QlI+5Y6f5aeL5a+G56K877yaW+W/heWhq108QlI+PC9QPjxTVFJPTkc+DQogICAgICAgICAg ICAgICAgICAgICAgICAgIDxQIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iV0lE T1dTOiAxOyBURVhULVRSQU5TRk9STTogbm9uZTsgQkFDS0dST1VORC1DT0xPUjogcmdiKDI1NSwy NTUsMjU1KTsgVEVYVC1JTkRFTlQ6IDBweDsgTUFSR0lOOiA1cHggMHB4OyBMRVRURVItU1BBQ0lO Rzogbm9ybWFsOyBGT05UOiAxMnB4LzIwcHggJ2x1Y2lkYSBHcmFuZGUnLCBWZXJkYW5hLCAnTWlj cm9zb2Z0IFlhSGVpJzsgV0hJVEUtU1BBQ0U6IG5vcm1hbDsgQ09MT1I6IHJnYig1MSw1MSw1MSk7 IFdPUkQtU1BBQ0lORzogMHB4OyB3ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PFNQQU4g DQogICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJMSU5FLUhFSUdIVDogMTlweDsgRk9O VC1TSVpFOiBzbWFsbCI+PC9TUEFOPiZuYnNwOzwvUD48L1NUUk9ORz48L1NQQU4+PC9GT05UPjwv VEQ+PC9UUj4NCiAgICAgICAgICAgICAgICAgICAgICA8VFI+DQogICAgICAgICAgICAgICAgICAg ICAgICA8VEQgDQogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iUEFERElORy1CT1RUT006 IDE5cHg7IExJTkUtSEVJR0hUOiAxLjZlbTsgTUFSR0lOOiAwcHg7IFBBRERJTkctTEVGVDogMHB4 OyBQQURESU5HLVJJR0hUOiAwcHg7IENPTE9SOiByZ2IoMTIxLDEyMSwxMjEpOyBGT05ULVNJWkU6 IDE0cHg7IFBBRERJTkctVE9QOiA3cHgiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8UCBz dHlsZT0iTElORS1IRUlHSFQ6IDIzcHg7IE1BUkdJTjogMHB4IDJweCI+PEZPTlQgDQogICAgICAg ICAgICAgICAgICAgICAgICAgIGNvbG9yPWJsdWU+PC9GT05UPiZuYnNwOzwvUD48L1REPjwvVFI+ DQogICAgICAgICAgICAgICAgICAgICAgPFRSPg0KICAgICAgICAgICAgICAgICAgICAgICAgPFRE IA0KICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IlBBRERJTkctQk9UVE9NOiAwcHg7IExJ TkUtSEVJR0hUOiAxLjZlbTsgTUFSR0lOOiAwcHg7IFBBRERJTkctTEVGVDogMHB4OyBQQURESU5H LVJJR0hUOiAwcHg7IENPTE9SOiByZ2IoMTIxLDEyMSwxMjEpOyBGT05ULVNJWkU6IDE0cHg7IFBB RERJTkctVE9QOiA3cHgiPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+PC9TUEFOPjwvVEQ+PC9U Uj48L1RCT0RZPjwvVEFCTEU+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT4NCiAgICAgICAgPFRB QkxFIHN0eWxlPSJNQVJHSU46IDBweCBhdXRvIiBpZD1hYXBsLWZvb3RlciBib3JkZXI9MCBjZWxs U3BhY2luZz0wIA0KICAgICAgICBjZWxsUGFkZGluZz0wIHdpZHRoPTcwMCBhbGlnbj1jZW50ZXI+ DQogICAgICAgICAgPFRCT0RZPg0KICAgICAgICAgIDxUUj4NCiAgICAgICAgICAgIDxURCANCiAg ICAgICAgICAgIHN0eWxlPSJURVhULUFMSUdOOiBjZW50ZXI7IFBBRERJTkctQk9UVE9NOiAxMHB4 OyBMSU5FLUhFSUdIVDogMS4zNGVtOyBQQURESU5HLUxFRlQ6IDIwcHg7IFBBRERJTkctUklHSFQ6 IDIwcHg7IEZPTlQtRkFNSUxZOiAnSGVsdmV0aWNhIE5ldWUnLCBIZWx2ZXRpY2EsIEFyaWFsLCBW ZXJkYW5hLCBzYW5zLXNlcmlmOyBDT0xPUjogcmdiKDE4MywxODMsMTgzKTsgRk9OVC1TSVpFOiAx MXB4OyBQQURESU5HLVRPUDogMjBweCIgDQogICAgICAgICAgICBjbGFzcz1jb3B5cmlnaHQ+PEJS PjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT48L0RJ Vj4NCiAgPERJVj48SU1HIA0KICBzcmM9Imh0dHA6Ly9vdXRzaWRlYXBwbGUuYXBwbGUuY29tL2lt Zy9BUFBMRV9FTUFJTF9MSU5LL3NwYWNlcjQuZ2lmP3Y9MiZhbXA7YT1YUGw5em40N3FkUkY2TVhX NUt2Zkx6UkUlMkY0SERUTFFZQnNMdDNYcFlBWk53UUxNQTRUJTJGeDAwWDhhSyUyRkxHZzhRUXY5 NmllZWtlRVVvb2FNb2RocUVZVlp6TUQzYzBUSURYUXpEUUpWSm9RR0E2clk2JTJCb3gxSmM3S0w1 clZZZW83OEs3cHFiT0hZcG9LQkJWUFN4QjJsYTFqS3ZaYVZiQVNWTnJSQ0h6M2tielRlU2dVZnAz OTVrdUJaTFIzTWtvUTdXUlVheG1tJTJGbnlMM0R3NFBTSTdtYllxbzRUU0olMkJzdGZrR3RvaDRM WVY1YWIxa2haNThCVTJJdTE5U3RNcnprJTJGMlR3c2NycyUyQkxaQXhlOTdLeHhqODdmYzR0WENm ZElGY0t1R2U4eWM3SUNHenlDaVZuQ1JYZUliSnM0SktJWDB2TEFGYU9TcXF5OVRkT2pGaUJVRGhu ODlUbmVCMmFzNUtpUjIxUEZQTHlKbzh6cE5ROWdTa1ZldHVxZDhqNWRuOTdHcmdFbzRSMnBpZkds ZEJJSHo5MHIzWUpZQ2pIa0dUb3JPOVBEaDFURGNNb0R3bnc4eXdMV2t1cjBrcnB3Y3lOak9teE14 OWtlMzkwVlpqRW5RQmY5V2xkREZXVFlBZiUyRk40RUJNWktObkJGTnZvcCUyQnVPR1hscTZkY3FN eGs0dW1XWHpobkZSN2IzTVVpMDQ0ZUpGRCUyQjFtc3hmSiUyQmlUUW1ITDJsd3hHdDdreVh4YmJq SmhzZlN3eVF2TVZxb2glMkJnbDRrSW5uT2tVOFp1QkF0QjZOaXdxdGowOTdvejJPSDJITFElMkJm NlZiJTJGV2VsZEFvV3NSUXlMdzFlRSUyRjhoNnpLZldnVnk3dWZ2YkxEcSUyRiUyRm9SVlhmWWlM QlpQWGdObHp2ZVVXUnp3UCUyRjlhSHBUcnZaNVo4OThINTRWNHR2dm1BIj48L0RJVj4NCiAgPERJ Vj4mbmJzcDs8L0RJVj4NCiAgPERJVj4mbmJzcDs8L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJ Vj48L0RJVj48QlIgDQogIGNsYXNzPUFwcGxlLWludGVyY2hhbmdlLW5ld2xpbmU+PEJSPjxTUEFO PjwvU1BBTj48L0JMT0NLUVVPVEU+PC9JTkNMVURFVEFJTD48L0RJVj48L0JPRFk+PC9IVE1MPg0K ------=_NextPart_000_0B28_0163D185.1C5E1EA0-- From jra@samba.org Tue Mar 15 10:46:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 C7F997CD1 for ; Tue, 15 Mar 2016 10:46:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9A2068F8049 for ; Tue, 15 Mar 2016 08:46:19 -0700 (PDT) X-ASG-Debug-ID: 1458056776-04cb6c7f2b1e8150001-NocioJ Received: from hr2.samba.org (hr2.samba.org [144.76.82.148]) by cuda.sgi.com with ESMTP id LMwx9jnT4WGSw0pQ (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 15 Mar 2016 08:46:17 -0700 (PDT) X-Barracuda-Envelope-From: jra@samba.org X-Barracuda-Apparent-Source-IP: 144.76.82.148 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=samba.org; s=42627210; h=Message-ID:Cc:To:From:Date; bh=feTjZmsYN1Cw3lfZgOiSeyQQ5pgvHlMCrDQ5OMZRqww=; b=U+y2rMX7cBNrSgKMH5MBlZTLIt0F7mJ1NGUfl9vgyUe7ho0UYRJqkTfeHxFkJhO3ZnA9VaMXf8qr1PwkyqewbRNMZVS7KcnncgykGTVzSY6iT0lP4pQumpRFkbsj9mwzVKISdqMQ+m1b0T9ORH42H73Hp9cBAfVIDilSsVXP10U=; Received: from [127.0.0.2] (localhost [127.0.0.1]) by hr2.samba.org with esmtpsa (TLS1.2:RSA_AES_128_CBC_SHA1:128) (Exim) id 1afrAM-0001Ia-N5; Tue, 15 Mar 2016 15:45:51 +0000 Date: Tue, 15 Mar 2016 08:45:14 -0700 From: Jeremy Allison To: Christoph Hellwig Cc: Andreas Gruenbacher , Alexander Viro , "J. Bruce Fields" , Linux NFS Mailing List , Theodore Ts'o , linux-cifs@vger.kernel.org, Linux API , Trond Myklebust , LKML , XFS Developers , Andreas Dilger , linux-fsdevel , Jeff Layton , linux-ext4 , Anna Schumaker Subject: Re: [PATCH v18 00/22] Richacls (Core and Ext4) Message-ID: <20160315154514.GB39038@jra3> X-ASG-Orig-Subj: Re: [PATCH v18 00/22] Richacls (Core and Ext4) Reply-To: Jeremy Allison References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <20160311140134.GA14808@infradead.org> <20160315071103.GC19747@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160315071103.GC19747@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: hr2.samba.org[144.76.82.148] X-Barracuda-Start-Time: 1458056777 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27866 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Mar 15, 2016 at 12:11:03AM -0700, Christoph Hellwig wrote: > On Fri, Mar 11, 2016 at 05:11:51PM +0100, Andreas Gruenbacher wrote: > > > while breaking a lot of assumptions, > > > > The model is designed specifically to be compliant with the POSIX > > permission model. What assumptions are you talking about? > > People have long learned that we only have 'alloc' permissions. Any > model that mixes allow and deny ACE is a mistake. People can also learn and change though :-). One of the biggest complaints people deploying Samba on Linux have is the incompatible ACL models. Whilst I have sympathy with your intense dislike of the Windows ACL model, this comes down to the core of "who do we serve ?" IMHO we should serve the users (although I must confess I'd look awful in a TRON suit :-). From darrick.wong@oracle.com Tue Mar 15 14:26:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9F7527CD3 for ; Tue, 15 Mar 2016 14:26:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6EB50304064 for ; Tue, 15 Mar 2016 12:26:13 -0700 (PDT) X-ASG-Debug-ID: 1458069968-04cb6c7f2a1f7e40001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 0eRXVTbBn16kdgGU (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 15 Mar 2016 12:26:08 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u2FJPeBS019408 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 15 Mar 2016 19:25:41 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u2FJPdW6026156 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Tue, 15 Mar 2016 19:25:40 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u2FJPdY0026339; Tue, 15 Mar 2016 19:25:39 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 15 Mar 2016 12:25:39 -0700 Date: Tue, 15 Mar 2016 12:25:37 -0700 From: "Darrick J. Wong" To: david@fromorbit.com Cc: linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com, Christoph Hellwig Subject: [PATCH v2 12/12] block: test fallocate for block devices Message-ID: <20160315192537.GB5818@birch.djwong.org> X-ASG-Orig-Subj: [PATCH v2 12/12] block: test fallocate for block devices References: <20160305003717.28738.98818.stgit@birch.djwong.org> <20160305003837.28738.49794.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160305003837.28738.49794.stgit@birch.djwong.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1458069968 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27875 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Now that we're wiring up fallocate's PUNCH_HOLE and ZERO_RANGE features for block devices, add some tests to make sure they work correctly. v2: Update tests to reflect EOD clamping suggested by Linus. Signed-off-by: Darrick J. Wong --- common/scsi_debug | 6 ++ tests/generic/705 | 77 ++++++++++++++++++++++++++++++++ tests/generic/705.out | 11 +++++ tests/generic/706 | 74 +++++++++++++++++++++++++++++++ tests/generic/706.out | 10 ++++ tests/generic/707 | 118 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/707.out | 32 +++++++++++++ tests/generic/group | 3 + 8 files changed, 330 insertions(+), 1 deletion(-) create mode 100755 tests/generic/705 create mode 100644 tests/generic/705.out create mode 100755 tests/generic/706 create mode 100644 tests/generic/706.out create mode 100755 tests/generic/707 create mode 100644 tests/generic/707.out diff --git a/common/scsi_debug b/common/scsi_debug index eb08126..74c3802 100644 --- a/common/scsi_debug +++ b/common/scsi_debug @@ -40,13 +40,17 @@ _get_scsi_debug_dev() logical=${2-512} unaligned=${3-0} size=${4-128} + test -n "$4" && shift + test -n "$3" && shift + test -n "$2" && shift + test -n "$1" && shift phys_exp=0 while [ $logical -lt $physical ]; do let physical=physical/2 let phys_exp=phys_exp+1 done - opts="sector_size=$logical physblk_exp=$phys_exp lowest_aligned=$unaligned dev_size_mb=$size" + opts="sector_size=$logical physblk_exp=$phys_exp lowest_aligned=$unaligned dev_size_mb=$size $@" echo "scsi_debug options $opts" >> $seqres.full modprobe scsi_debug $opts [ $? -eq 0 ] || _fail "scsi_debug modprobe failed" diff --git a/tests/generic/705 b/tests/generic/705 new file mode 100755 index 0000000..4bb8752 --- /dev/null +++ b/tests/generic/705 @@ -0,0 +1,77 @@ +#! /bin/bash +# FS QA Test No. 705 +# +# Test fallocate(ZERO_RANGE) on a block device, which should be able to +# WRITE SAME (or equivalent) the range. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016 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 7 15 + +_cleanup() +{ + cd / + rm -rf $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/scsi_debug + +# real QA test starts here +_supported_os Linux +_require_scsi_debug +_require_xfs_io_command "fzero" + +echo "Create and format" +dev=$(_get_scsi_debug_dev 512 512 0 4 "lbpws=1 lbpws10=1") +_pwrite_byte 0x62 0 4m $dev >> $seqres.full + +echo "Zero range" +$XFS_IO_PROG -c "fzero -k 512k 1m" $dev + +echo "Zero range without keep_size" +$XFS_IO_PROG -c "fzero 384k 64k" $dev + +echo "Zero range past EOD" +$XFS_IO_PROG -c "fzero -k 3m 4m" $dev + +echo "Check contents" +md5sum $dev | sed -e "s|$dev|SCSI_DEBUG_DEV|g" + +echo "Zero range to EOD" +$XFS_IO_PROG -c "fzero -k 0 9223372036854775807" $dev + +echo "Check contents" +md5sum $dev | sed -e "s|$dev|SCSI_DEBUG_DEV|g" + +echo "Destroy device" +_put_scsi_debug_dev + +# success, all done +status=0 +exit diff --git a/tests/generic/705.out b/tests/generic/705.out new file mode 100644 index 0000000..ccbda23 --- /dev/null +++ b/tests/generic/705.out @@ -0,0 +1,11 @@ +QA output created by 705 +Create and format +Zero range +Zero range without keep_size +Zero range past EOD +Check contents +f0cb9070c098aa347f664bead3a219d9 SCSI_DEBUG_DEV +Zero range to EOD +Check contents +b5cfa9d6c8febd618f91ac2843d50a1c SCSI_DEBUG_DEV +Destroy device diff --git a/tests/generic/706 b/tests/generic/706 new file mode 100755 index 0000000..184dbc2 --- /dev/null +++ b/tests/generic/706 @@ -0,0 +1,74 @@ +#! /bin/bash +# FS QA Test No. 706 +# +# Test fallocate(PUNCH_HOLE) on a block device, which should be able to +# zero-TRIM (or equivalent) the range. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016 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 7 15 + +_cleanup() +{ + cd / + rm -rf $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/scsi_debug + +# real QA test starts here +_supported_os Linux +_require_scsi_debug +_require_xfs_io_command "fpunch" + +echo "Create and format" +dev=$(_get_scsi_debug_dev 512 512 0 4 "lbpws=1 lbpws10=1") +_pwrite_byte 0x62 0 4m $dev >> $seqres.full + +echo "Zero punch" +$XFS_IO_PROG -c "fpunch 512k 1m" $dev + +echo "Punch range past EOD" +$XFS_IO_PROG -c "fpunch 3m 4m" $dev + +echo "Check contents" +md5sum $dev | sed -e "s|$dev|SCSI_DEBUG_DEV|g" + +echo "Punch to EOD" +$XFS_IO_PROG -c "fpunch 0 9223372036854775807" $dev + +echo "Check contents" +md5sum $dev | sed -e "s|$dev|SCSI_DEBUG_DEV|g" + +echo "Destroy device" +_put_scsi_debug_dev + +# success, all done +status=0 +exit diff --git a/tests/generic/706.out b/tests/generic/706.out new file mode 100644 index 0000000..53a09ae --- /dev/null +++ b/tests/generic/706.out @@ -0,0 +1,10 @@ +QA output created by 706 +Create and format +Zero punch +Punch range past EOD +Check contents +8c6a3fd51601141b56eaebbab3746156 SCSI_DEBUG_DEV +Punch to EOD +Check contents +b5cfa9d6c8febd618f91ac2843d50a1c SCSI_DEBUG_DEV +Destroy device diff --git a/tests/generic/707 b/tests/generic/707 new file mode 100755 index 0000000..fab997f --- /dev/null +++ b/tests/generic/707 @@ -0,0 +1,118 @@ +#! /bin/bash +# FS QA Test No. 707 +# +# Test the unsupported fallocate flags on a block device. No collapse +# or insert range, no regular fallocate, no forgetting keep-space on +# zero range, no punching past EOD, no requests that aren't aligned +# with the logicalsector size, and make sure the fallbacks work for +# devices that don't support write_same or discard. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016 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 7 15 + +_cleanup() +{ + cd / + rm -rf $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/scsi_debug + +# real QA test starts here +_supported_os Linux +_require_scsi_debug +_require_xfs_io_command "falloc" +_require_xfs_io_command "finsert" +_require_xfs_io_command "fcollapse" +_require_xfs_io_command "fzero" +_require_xfs_io_command "fpunch" + + +echo "Create and format" +dev=$(_get_scsi_debug_dev 4096 4096 0 4 "lbpws=1 lbpws10=1") +_pwrite_byte 0x62 0 4m $dev >> $seqres.full +$XFS_IO_PROG -c "fsync" $dev + +echo "Regular fallocate" +$XFS_IO_PROG -c "falloc 64k 64k" $dev + +echo "Insert range" +$XFS_IO_PROG -c "finsert 128k 64k" $dev + +echo "Collapse range" +$XFS_IO_PROG -c "fcollapse 256k 64k" $dev + +echo "Unaligned zero range" +$XFS_IO_PROG -c "fzero -k 512 512" $dev + +echo "Unaligned punch" +$XFS_IO_PROG -c "fpunch 512 512" $dev + +echo "Zero range toobig keep size" +$XFS_IO_PROG -c "fzero -k 512k 9223372036854775807" $dev + +echo "Zero range toobig" +$XFS_IO_PROG -c "fzero 512k 9223372036854775807" $dev + +echo "Zero range to EOD fail w/o keepsize" +$XFS_IO_PROG -c "fzero 0 9223372036854775807" $dev + +echo "Zero range starts past EOD" +$XFS_IO_PROG -c "fzero -k 900m 1m" $dev + +echo "Punch starts past EOD" +$XFS_IO_PROG -c "fpunch 900m 1m" $dev + +echo "Check contents" +md5sum $dev | sed -e "s|$dev|SCSI_DEBUG_DEV|g" + +echo "Destroy device" +_put_scsi_debug_dev + +echo "Create w/o unmap or writesame and format" +dev=$(_get_scsi_debug_dev 512 512 0 4 "lbpws=0 lbpws10=0 lbpu=0 write_same_length=0 unmap_max_blocks=0") +_pwrite_byte 0x62 0 4m $dev >> $seqres.full +$XFS_IO_PROG -c "fsync" $dev + +echo "Zero punch, no fallback available" +$XFS_IO_PROG -c "fpunch 512k 512k" $dev + +echo "Zero range, write fallback" +$XFS_IO_PROG -c "fzero -k 1536k 512k" $dev + +echo "Check contents" +md5sum $dev | sed -e "s|$dev|SCSI_DEBUG_DEV|g" + +echo "Destroy device" +_put_scsi_debug_dev + +# success, all done +status=0 +exit diff --git a/tests/generic/707.out b/tests/generic/707.out new file mode 100644 index 0000000..050c70c --- /dev/null +++ b/tests/generic/707.out @@ -0,0 +1,32 @@ +QA output created by 707 +Create and format +Regular fallocate +fallocate: Operation not supported +Insert range +fallocate: Operation not supported +Collapse range +fallocate: Operation not supported +Unaligned zero range +fallocate: Invalid argument +Unaligned punch +fallocate: Invalid argument +Zero range toobig keep size +fallocate: File too large +Zero range toobig +fallocate: File too large +Zero range to EOD fail w/o keepsize +fallocate: Invalid argument +Zero range starts past EOD +fallocate: Invalid argument +Punch starts past EOD +fallocate: Invalid argument +Check contents +b83f9394092e15bdcda585cd8e776dc6 SCSI_DEBUG_DEV +Destroy device +Create w/o unmap or writesame and format +Zero punch, no fallback available +fallocate: Operation not supported +Zero range, write fallback +Check contents +0fc6bc93cd0cd97e3cde5ea39ea1185d SCSI_DEBUG_DEV +Destroy device diff --git a/tests/generic/group b/tests/generic/group index 727648c..51a2d63 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -340,3 +340,6 @@ 335 auto quick metadata 336 auto quick metadata 337 auto quick metadata +705 blockdev quick rw +706 blockdev quick rw +707 blockdev quick rw From Volker.Lendecke@SerNet.DE Tue Mar 15 15:17:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2F2E87CD5 for ; Tue, 15 Mar 2016 15:17:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E8232304048 for ; Tue, 15 Mar 2016 13:17:24 -0700 (PDT) X-ASG-Debug-ID: 1458073036-04bdf002ee502b00001-NocioJ Received: from mail.SerNet.de (mail.SerNet.de [193.175.80.2]) by cuda.sgi.com with ESMTP id DLZmC7xNeWuQ3fL7 (version=TLSv1.2 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Tue, 15 Mar 2016 13:17:18 -0700 (PDT) X-Barracuda-Envelope-From: Volker.Lendecke@SerNet.DE X-Barracuda-Apparent-Source-IP: 193.175.80.2 Received: from intern.SerNet.DE by mail.SerNet.DE with esmtps (Exim 4.80 #2) id 1afvOx-0003E2-Pk; Tue, 15 Mar 2016 21:17:11 +0100 Received: by intern.sernet.de id 1afvOt-000Ax3-AX; Tue, 15 Mar 2016 21:17:11 +0100 Date: Tue, 15 Mar 2016 21:17:00 +0100 From: Volker Lendecke To: Cristoph Hellwig Cc: Jeremy Allison , Andreas Gruenbacher , Alexander Viro , "J. Bruce Fields" , Linux NFS Mailing List , Theodore Ts'o , linux-cifs@vger.kernel.org, Linux API , Trond Myklebust , LKML , XFS Developers , Andreas Dilger , linux-fsdevel , Jeff Layton , linux-ext4 , Anna Schumaker Subject: Re: [PATCH v18 00/22] Richacls (Core and Ext4) Message-ID: <20160315201700.GA22945@sernet.de> X-ASG-Orig-Subj: Re: [PATCH v18 00/22] Richacls (Core and Ext4) Reply-To: Volker.Lendecke@SerNet.DE References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <20160311140134.GA14808@infradead.org> <20160315071103.GC19747@infradead.org> <20160315154514.GB39038@jra3> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160315154514.GB39038@jra3> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mail.SerNet.de[193.175.80.2] X-Barracuda-Start-Time: 1458073037 X-Barracuda-Encrypted: DHE-RSA-AES128-SHA X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27876 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Mar 15, 2016 at 08:45:14AM -0700, Jeremy Allison wrote: > On Tue, Mar 15, 2016 at 12:11:03AM -0700, Christoph Hellwig wrote: > > People have long learned that we only have 'alloc' permissions. Any > > model that mixes allow and deny ACE is a mistake. > > People can also learn and change though :-). One of the > biggest complaints people deploying Samba on Linux have is the > incompatible ACL models. Just to confirm: I see this a lot in the field. NFSv4 ACLs, while not a perfect match for NTFS ACLs are a lot closer much more usable to people who want to serve Windows clients. Also in the pure linux world there is a lot that you can not express with just rwx, sgid, sticky bits and friends. If you want the additional functionality of the richacl bits, I would call it a big mistake to omit negative aces, if just for the reason not to create yet another ACLs flavor. > Whilst I have sympathy with your intense dislike of the > Windows ACL model, this comes down to the core of "who > do we serve ?" The world has enough confusion around ACL semanics, please do not add more to it by creating your own model of the day. Volker From david@fromorbit.com Tue Mar 15 15:39:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BA0BA7CD7 for ; Tue, 15 Mar 2016 15:39:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2B2BDAC005 for ; Tue, 15 Mar 2016 13:39:14 -0700 (PDT) X-ASG-Debug-ID: 1458074350-04cbb00b724d7680001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id o4ozv6xNb6E7ASlT for ; Tue, 15 Mar 2016 13:39: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: A2DICAD/cehWPFEqLHleKAECgxtUboZmn14CFgEBAQEBAQaBD4pzhVaECxmFbgSBQE0BAQEBAQEHAQEBAUFAhQIcOyQ0BSUDBy2IJp89n08ZhTmJE36CX4EPBYdgj2+Fb4gIgW+NHgKGCoh1giSCNyguiSiBOwEBAQ Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl6.internode.on.net with ESMTP; 16 Mar 2016 07:09:09 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1afvkC-0005cX-CU for xfs@oss.sgi.com; Wed, 16 Mar 2016 07:39:08 +1100 Date: Wed, 16 Mar 2016 07:39:08 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfs: for-next branch updated to 2cdb958 Message-ID: <20160315203908.GE11812@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfs: for-next branch updated to 2cdb958 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1458074350 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27877 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, The for-next branch of the xfs kernel repository at git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git has just been updated. This is the last update for the 4.6 merge window - after it has sat in linux-next for a couple of days I'll tag it and ask Linus to pull. The new head of the for-next branch is commit: 2cdb958 Merge branch 'xfs-misc-fixes-4.6-4' into for-next New Commits: Brian Foster (4): [801cc4e] xfs: debug mode forced buffered write failure [b2706a0] xfs: update freeblocks counter after extent deletion [a9bd24a] xfs: refactor delalloc indlen reservation split into helper [d34999c] xfs: borrow indirect blocks from freed extent when available Christoph Hellwig (1): [355cced] xfs: always set rvalp in xfs_dir2_node_trim_free Dave Chinner (1): [2cdb958] Merge branch 'xfs-misc-fixes-4.6-4' into for-next Eric Sandeen (1): [cc07eed] xfs: ensure committed is initialized in xfs_trans_roll Code Diffstat: fs/xfs/libxfs/xfs_bmap.c | 157 ++++++++++++++++++++++++++++++++------------ fs/xfs/libxfs/xfs_dir2_node.c | 4 +- fs/xfs/xfs_aops.c | 9 ++- fs/xfs/xfs_mount.h | 25 +++++++ fs/xfs/xfs_sysfs.c | 78 +++++++++++++++++++--- fs/xfs/xfs_trans.c | 4 +- 6 files changed, 221 insertions(+), 56 deletions(-) -- Dave Chinner david@fromorbit.com From bfields@fieldses.org Tue Mar 15 16:05:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0D9717CD9 for ; Tue, 15 Mar 2016 16:05:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D63D48F8033 for ; Tue, 15 Mar 2016 14:05:29 -0700 (PDT) X-ASG-Debug-ID: 1458075927-04cb6c7f281fb200001-NocioJ Received: from fieldses.org (fieldses.org [173.255.197.46]) by cuda.sgi.com with ESMTP id lQQWqVo0h0h7YZ6D for ; Tue, 15 Mar 2016 14:05:27 -0700 (PDT) X-Barracuda-Envelope-From: bfields@fieldses.org X-Barracuda-Apparent-Source-IP: 173.255.197.46 Received: by fieldses.org (Postfix, from userid 2815) id 679B623D2; Tue, 15 Mar 2016 17:05:26 -0400 (EDT) Date: Tue, 15 Mar 2016 17:05:26 -0400 From: "J. Bruce Fields" To: Christoph Hellwig Cc: Andreas Gruenbacher , Alexander Viro , linux-nfs@vger.kernel.org, Theodore Ts'o , linux-cifs@vger.kernel.org, linux-api@vger.kernel.org, Trond Myklebust , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Andreas Dilger , linux-fsdevel@vger.kernel.org, Jeff Layton , linux-ext4@vger.kernel.org, Anna Schumaker Subject: Re: [PATCH v18 19/22] richacl: Add richacl xattr handler Message-ID: <20160315210526.GC3658@fieldses.org> X-ASG-Orig-Subj: Re: [PATCH v18 19/22] richacl: Add richacl xattr handler References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <1456733847-17982-20-git-send-email-agruenba@redhat.com> <20160311141735.GF14808@infradead.org> <20160311141905.GC13178@fieldses.org> <20160315071014.GB19747@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160315071014.GB19747@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: fieldses.org[173.255.197.46] X-Barracuda-Start-Time: 1458075927 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27878 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Mar 15, 2016 at 12:10:14AM -0700, Christoph Hellwig wrote: > On Fri, Mar 11, 2016 at 09:19:05AM -0500, J. Bruce Fields wrote: > > On Fri, Mar 11, 2016 at 06:17:35AM -0800, Christoph Hellwig wrote: > > > On Mon, Feb 29, 2016 at 09:17:24AM +0100, Andreas Gruenbacher wrote: > > > > Add richacl xattr handler implementing the xattr operations based on the > > > > get_richacl and set_richacl inode operations. > > > > > > Given all the issues with Posix ACLs and selinux attributes these really > > > should be proper syscalls instead of abusing the xattr interface. > > > > What are those problems exactly? > > That people get confused between the attr used by the xattr syscall > interface and the attr used to store things on disk or the protocol. > This has happened every time we have non-native support, e.g. XFS, NFS, > CIFS, ntfs, etc. And it's only going to become worse. How has that confusion caused problems in practice? --b. From chris@colorremedies.com Tue Mar 15 18:08:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 A6BC47CDB for ; Tue, 15 Mar 2016 18:08:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0CD61AC001 for ; Tue, 15 Mar 2016 16:08:22 -0700 (PDT) X-ASG-Debug-ID: 1458083296-04cbb00b724dc060001-NocioJ Received: from mail-ig0-f176.google.com (mail-ig0-f176.google.com [209.85.213.176]) by cuda.sgi.com with ESMTP id HMgfQXUuh0D1ngod (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 15 Mar 2016 16:08:17 -0700 (PDT) X-Barracuda-Envelope-From: chris@colorremedies.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.213.176 Received: by mail-ig0-f176.google.com with SMTP id av4so100182782igc.1 for ; Tue, 15 Mar 2016 16:08:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=colorremedies-com.20150623.gappssmtp.com; s=20150623; h=mime-version:sender:date:message-id:subject:from:to; bh=zymMNA2/ae5zcru/+JN8z/P0wDCTBEgOVNqMv9PsBN4=; b=be2jqVbFa3e+ezim9kVnh5wj6IyZXAnSa8x/aXu+KclgUhnVGnQ6IMNnPKRu5kA09f ihs1b7QKHWQTvO4w3x9PlhnCxDoCEb9+vTsKP9DxzM7W0A+Gw8iawwb0MwAEkmlwgRcg ujr3+t5yloIai43i5MyBlRSlFUZ0ofnUoU7z6uU16F0fFLuirt9SPaepH114nQUmm9he becxS9+GUWL0+GJyhFqVq8/rd5dyPmjdYhYD/WCdUoCms49PmHRnCn/2GhiXCxX2YAhV KyxnmYnBgCTxoRAs9xmi5kOkz13u7ZYvz/pyKXI9S4638ep/it7WLhmPLpX+lY1goHk2 IgfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:date:message-id:subject:from :to; bh=zymMNA2/ae5zcru/+JN8z/P0wDCTBEgOVNqMv9PsBN4=; b=ZYWSFp754+EtJfiblb/ZwtHKRwChe20DzkBIAGA82koPjlhrMFf7kdUhvl5vW3loKV R+3QPYzxjtRXagvJeWRX0Qgfa89AohcKfIWNclMdncmsa9rW/n+gWcDa+bfzG3z9xsni r2Zp95iIYjB0rkf8EP0yDJGZR4XqaGqiPIWK7BJEXlROAytUKrOD/CCVdMiMD6Gf1LB4 768tVqC5a0TwlSamytQLk/7tviP5M/HrOY0V9JPusQSfd3MSqfya7yJ4ESd6DFomzSUR I6dfcx8oKZ9OBUtBLuyufzbHYjQXHotUA8iIZiYfhFpNLHueu4QRrBdtPqLnIU6mLS+Z NAtw== X-Gm-Message-State: AD7BkJKhzpH5EM2Yi+2DtHSM5QyS1e8SsX5orNU0KENAAyaYhWSRtMfwVDX0P8IxqYr9njkTdCX+BUGXlBNGBg== MIME-Version: 1.0 X-Received: by 10.50.43.133 with SMTP id w5mr25150331igl.80.1458083296809; Tue, 15 Mar 2016 16:08:16 -0700 (PDT) Sender: chris@colorremedies.com Received: by 10.36.110.3 with HTTP; Tue, 15 Mar 2016 16:08:16 -0700 (PDT) X-Originating-IP: [73.229.6.140] Date: Tue, 15 Mar 2016 17:08:16 -0600 X-Google-Sender-Auth: 0fALbPa-XetyhezwfDlHbpKJbYE Message-ID: Subject: new fs, xfs_admin new label, metadata corruption detected From: Chris Murphy X-ASG-Orig-Subj: new fs, xfs_admin new label, metadata corruption detected To: "xfs@oss.sgi.com" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ig0-f176.google.com[209.85.213.176] X-Barracuda-Start-Time: 1458083297 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27881 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 Is this expected? File system continues to work OK, sha256sum on the single file on this fs matches the source, but the metadata corruption messages are a bit scary so figured I'd ask about it. Filesystem created with xfsprogs-4.3.0-1.fc23 kernel-4.4.4-300.fc23.x86_64 mkfs.xfs defaults used on an LVM thinly provisioned volume on a single spinning disk. # xfs_info /dev/mapper/VG-testxfs meta-data=/dev/mapper/VG-testxfs isize=512 agcount=23, agsize=399984 blks = sectsz=4096 attr=2, projid32bit=1 = crc=1 finobt=1 spinodes=0 data = bsize=4096 blocks=8960000, imaxpct=25 = sunit=16 swidth=16 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal bsize=4096 blocks=3124, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 Mounted the file system, copied one decently large ISO, deleted it, unmounted the file system. Upgraded to kernel 4.5.0, and xfsprogs-4.3.0-3.fc23, reboot, mounted the file system again, copied a file, unmounted, and then tried to rename its label: [root@f23s ~]# xfs_admin -L testxfs /dev/mapper/VG-testxfs Metadata corruption detected at xfs_agf block 0x30d3808/0x1000 xfs_admin: cannot init perag data (-117). Continuing anyway. writing all SBs new label = "testxfs" Kernel messages: [snip] [ 226.804218] nf_conntrack: automatic helper assignment is deprecated and it will be removed soon. Use the iptables CT target to attach helpers instead. [ 370.527700] SGI XFS with ACLs, security attributes, no debug enabled [ 370.546159] XFS (dm-5): Mounting V5 Filesystem [ 370.621943] XFS (dm-5): Ending clean mount [ 438.064901] EXT4-fs (dm-7): mounted filesystem with ordered data mode. Opts: (null) [ 837.965252] BTRFS: device label testbtr devid 1 transid 3 /dev/mapper/VG-testbtrfs [ 851.690987] BTRFS info (device dm-8): disk space caching is enabled [ 851.691064] BTRFS: has skinny extents [ 851.691100] BTRFS: flagging fs with big metadata feature [ 851.702530] BTRFS: creating UUID tree [ 1057.799823] XFS (dm-5): Unmounting Filesystem [root@f23s ~]# xfs_repair /dev/mapper/VG-testxfs Phase 1 - find and verify superblock... - reporting progress in intervals of 15 minutes Phase 2 - using internal log - zero log... - scan filesystem freespace and inode maps... Metadata corruption detected at xfs_agf block 0x4322d08/0x1000 Metadata corruption detected at xfs_agf block 0x30d3808/0x1000 fllast 1014 in agf 22 too large (max = 1014) Metadata corruption detected at xfs_agf block 0x4015988/0x1000 Metadata corruption detected at xfs_agf block 0x3d08608/0x1000 Metadata corruption detected at xfs_agf block 0x33e0b88/0x1000 fllast 1014 in agf 16 too large (max = 1014) fllast 1014 in agf 21 too large (max = 1014) fllast 1014 in agf 20 too large (max = 1014) Metadata corruption detected at xfs_agf block 0x39fb288/0x1000 fllast 1014 in agf 17 too large (max = 1014) fllast 1014 in agf 19 too large (max = 1014) Metadata corruption detected at xfs_agf block 0x36edf08/0x1000 fllast 1014 in agf 18 too large (max = 1014) - 16:47:27: scanning filesystem freespace - 23 of 23 allocation groups done - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... - 16:47:27: scanning agi unlinked lists - 23 of 23 allocation groups done - process known inodes and perform inode discovery... - agno = 0 - agno = 15 - agno = 16 - agno = 1 - agno = 2 - agno = 17 - agno = 3 - agno = 18 - agno = 4 - agno = 19 - agno = 5 - agno = 20 - agno = 6 - agno = 7 - agno = 21 - agno = 8 - agno = 22 - agno = 9 - agno = 10 - agno = 11 - agno = 12 - agno = 13 - agno = 14 - 16:47:27: process known inodes and inode discovery - 64 of 64 inodes done - process newly discovered inodes... - 16:47:27: process newly discovered inodes - 23 of 23 allocation groups done Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - 16:47:27: setting up duplicate extent list - 23 of 23 allocation groups done - check for inodes claiming duplicate blocks... - 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 - 16:47:27: check for inodes claiming duplicate blocks - 64 of 64 inodes done Phase 5 - rebuild AG headers and trees... - 16:47:27: rebuild AG headers and trees - 23 of 23 allocation groups done - reset superblock... Phase 6 - check inode connectivity... - resetting contents of realtime bitmap and summary inodes - traversing filesystem ... - traversal finished ... - moving disconnected inodes to lost+found ... Phase 7 - verify and correct link counts... done I haven't tried reproducing this. -- Chris Murphy From sandeen@sandeen.net Tue Mar 15 19:34:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CB4907CDF for ; Tue, 15 Mar 2016 19:34:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4564EAC001 for ; Tue, 15 Mar 2016 17:34:46 -0700 (PDT) X-ASG-Debug-ID: 1458088483-04bdf002eb50a880001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 9DYNztOCb7FP46xK for ; Tue, 15 Mar 2016 17:34:44 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 0A21E481F for ; Tue, 15 Mar 2016 19:34:42 -0500 (CDT) Subject: Re: new fs, xfs_admin new label, metadata corruption detected To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: new fs, xfs_admin new label, metadata corruption detected References: From: Eric Sandeen Message-ID: <56E8AA22.7080301@sandeen.net> Date: Tue, 15 Mar 2016 19:34:42 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1458088484 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27884 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/15/16 6:08 PM, Chris Murphy wrote: > Is this expected? File system continues to work OK, sha256sum on the > single file on this fs matches the source, but the metadata corruption > messages are a bit scary so figured I'd ask about it. > > Filesystem created with > xfsprogs-4.3.0-1.fc23 > kernel-4.4.4-300.fc23.x86_64 > > mkfs.xfs defaults used on an LVM thinly provisioned volume on a single > spinning disk. > > # xfs_info /dev/mapper/VG-testxfs > meta-data=/dev/mapper/VG-testxfs isize=512 agcount=23, agsize=399984 blks ^^^^^^^^^^ It seems that you left a growfs step out of it, where does that come in to the testcase? -Eric From smfrench@gmail.com Tue Mar 15 22:29:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 624EB7CDE for ; Tue, 15 Mar 2016 22:29:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 25607304039 for ; Tue, 15 Mar 2016 20:29:06 -0700 (PDT) X-ASG-Debug-ID: 1458098944-04cb6c7f28205150001-NocioJ Received: from mail-ig0-f182.google.com (mail-ig0-f182.google.com [209.85.213.182]) by cuda.sgi.com with ESMTP id wx4l5R4OSX4VN6G4 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 15 Mar 2016 20:29:04 -0700 (PDT) X-Barracuda-Envelope-From: smfrench@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.213.182 Received: by mail-ig0-f182.google.com with SMTP id nk17so82447985igb.1 for ; Tue, 15 Mar 2016 20:29:04 -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; bh=TeKlUcRlRsLKiN2eSqawggdWdiGqcOp+QeKTsoLscog=; b=yT6Uxo/wVjFlS3Eg4IAIwF7J80l2C2Ovg8iqqIU3UChvEcS58QNIc4OmzuwRZ/tCfN +T8PGI4YiIuOP3cypxTTr50tM4ZVKQDOn2zerGk7i+PYh/M6N7co8LfkFEwKbnvLURKD Q9tG+C0Fx/OYou4J8lSuVOem26ZkaMnWyOT03u610uSYFyenOHe7dM9ckuNt+ACNNTTL 4RUWjh2J1S7hH7RafUr0gtCXeYAlRTcmlLjLlj1bvhmMTevL6wdB/MoUPhMcCZGDDCEn 2kR4OPibzSAnIIeov5EAQSxNOklel+jNdFdkNhWfEl+xIZAWYNzDDGmlMUxUSNDoRVDR ncvA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=TeKlUcRlRsLKiN2eSqawggdWdiGqcOp+QeKTsoLscog=; b=lk6XwmzBMSsVQtIfJDPFtj55FQRkllBfhrO8bEgyaWzhxPAytd7LkMjPSqC7yfct+/ zhBt9SJ43lruQhUUSbGqGqFYRSYgFxq2toNajj+oKvIyQ+TIk80T0weWC2YJUKS2O/O+ lSj0tlMi7niCMw45uZSXmM/mm1OkLBECGM2IwVJtBIhhnBZey2DsyqD5UsKujwWFSif9 by6M6+njHyyP5W6nT0pOTHkVD+MakXTkRtw0Wkq4G+gC/pP0QerJA/dPkfi7bHB1Acjw 8l3AHKOcFIcBpL/IbeZb07eeYlVTDXpoON8qWjWgAGbmQeI2dKb5V1ld4ttuFB1iNvqO 1sHg== X-Gm-Message-State: AD7BkJJyDuAYWmoJXplTZN5DDynw1E+xpWqkkiqElekSFHLinAgUIAy1Jjdtuk4FvyGz6hbiMTSEHz5TRIizGA== X-Received: by 10.50.178.180 with SMTP id cz20mr26338200igc.44.1458098943838; Tue, 15 Mar 2016 20:29:03 -0700 (PDT) MIME-Version: 1.0 Received: by 10.79.104.193 with HTTP; Tue, 15 Mar 2016 20:28:44 -0700 (PDT) In-Reply-To: <20160315201700.GA22945@sernet.de> References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <20160311140134.GA14808@infradead.org> <20160315071103.GC19747@infradead.org> <20160315154514.GB39038@jra3> <20160315201700.GA22945@sernet.de> From: Steve French Date: Tue, 15 Mar 2016 22:28:44 -0500 Message-ID: Subject: Re: [PATCH v18 00/22] Richacls (Core and Ext4) To: "Volker.Lendecke@sernet.de" X-ASG-Orig-Subj: Re: [PATCH v18 00/22] Richacls (Core and Ext4) Cc: Cristoph Hellwig , Jeremy Allison , Andreas Gruenbacher , Alexander Viro , "J. Bruce Fields" , Linux NFS Mailing List , "Theodore Ts'o" , "linux-cifs@vger.kernel.org" , Linux API , Trond Myklebust , LKML , XFS Developers , Andreas Dilger , linux-fsdevel , Jeff Layton , linux-ext4 , Anna Schumaker Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ig0-f182.google.com[209.85.213.182] X-Barracuda-Start-Time: 1458098944 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27887 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Mar 15, 2016 at 3:17 PM, Volker Lendecke wrote: > On Tue, Mar 15, 2016 at 08:45:14AM -0700, Jeremy Allison wrote: >> On Tue, Mar 15, 2016 at 12:11:03AM -0700, Christoph Hellwig wrote: >> > People have long learned that we only have 'alloc' permissions. Any >> > model that mixes allow and deny ACE is a mistake. >> >> People can also learn and change though :-). One of the >> biggest complaints people deploying Samba on Linux have is the >> incompatible ACL models. > > Just to confirm: I see this a lot in the field. NFSv4 ACLs, while not a > perfect match for NTFS ACLs are a lot closer much more usable to people > who want to serve Windows clients. Yes (and presumably Macs as well) -- Thanks, Steve From smfrench@gmail.com Tue Mar 15 22:40:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 766E57CE1 for ; Tue, 15 Mar 2016 22:40:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4B2A08F8033 for ; Tue, 15 Mar 2016 20:40:22 -0700 (PDT) X-ASG-Debug-ID: 1458099620-04cb6c7f2b205510001-NocioJ Received: from mail-ig0-f170.google.com (mail-ig0-f170.google.com [209.85.213.170]) by cuda.sgi.com with ESMTP id eKvbrrsB3HzPGaqI (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 15 Mar 2016 20:40:20 -0700 (PDT) X-Barracuda-Envelope-From: smfrench@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.213.170 Received: by mail-ig0-f170.google.com with SMTP id av4so103944562igc.1 for ; Tue, 15 Mar 2016 20:40:20 -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; bh=eB01dkmWH8sBte9swqI6EXupKaKTbDP6xxCb78RdpTE=; b=maFLyVd36nE+ivEUbMCTBQ3qVIHZ+4Flljeh3DHUOtr8eOP9KVu6U19MEDiGJZZAH0 SpkylX0e2NBwgwXl+CjHUsoO2tMyGECPOHF6vvRuqM0CoqxxjJAnUb6u8gLvqnXOHgY0 t/nV2SJ97vATMVZFKoOTN3ur9i5eOI0fnnEGLxFcHMPwBRjwEiptRrBrRjbEMj212mp5 tbM9bim6TBZJ3xkydEkt4NjVJp/dbDSrqnXeeH9hWE9BbdgGNDFp8V1uOAu8R3eTrrvP y4Cod46M64W/OrI4cxiDB0zOCTR0qMerpXQ3NNi81BI/WbHmOyIz2lKXzhxliOpyhKa7 /Dmg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=eB01dkmWH8sBte9swqI6EXupKaKTbDP6xxCb78RdpTE=; b=ewBPcfgLu5KOPFTR5J1xgeTVzDr1sifcWFWVwXZG34Ly8ZRp+sXg33jLvcDbbmmmkV YO5blvpEgF7fkZ3SBld6vPAE1370gDGS0XhA9lfYdd/V42hsSFjKlowjoX9OHuCPo1ha 9u470ZdXCL/UnO69F1UJoxYYYp9ugb7U9x05IVOOdkK9KFLdLF84/XSOvL3pmpcQLidL HftIxyvfFtH7BmNVs4uNJRcOKIWHv7SVsK4rZDFyjCjLEjaBWXJ3cS9M5kx3fdBngso/ jIxxsyNH3lOLNaJOATIeeQUC2eP61baipRzHG6Kd38Qm5egUs8yimZeGSJrWUIjChB4H b/hQ== X-Gm-Message-State: AD7BkJJmECRqdW9SjUVrOW2IgRWcvxy+0qolX8aOEAMt+1nxXiBHLBoInFgPb9jmWNOun3I6Lwl3UUBVEjcBJw== X-Received: by 10.50.147.34 with SMTP id th2mr2148358igb.27.1458099620245; Tue, 15 Mar 2016 20:40:20 -0700 (PDT) MIME-Version: 1.0 Received: by 10.79.104.193 with HTTP; Tue, 15 Mar 2016 20:40:00 -0700 (PDT) In-Reply-To: <20160315071439.GE19747@infradead.org> References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <20160311140134.GA14808@infradead.org> <20160315071439.GE19747@infradead.org> From: Steve French Date: Tue, 15 Mar 2016 22:40:00 -0500 Message-ID: Subject: Re: [PATCH v18 00/22] Richacls (Core and Ext4) To: Christoph Hellwig X-ASG-Orig-Subj: Re: [PATCH v18 00/22] Richacls (Core and Ext4) Cc: Andreas Gruenbacher , Alexander Viro , "J. Bruce Fields" , Linux NFS Mailing List , "Theodore Ts'o" , "linux-cifs@vger.kernel.org" , Linux API , Trond Myklebust , LKML , XFS Developers , Andreas Dilger , linux-fsdevel , Jeff Layton , linux-ext4 , Anna Schumaker Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ig0-f170.google.com[209.85.213.170] X-Barracuda-Start-Time: 1458099620 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27887 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Mar 15, 2016 at 2:14 AM, Christoph Hellwig wrote: > On Fri, Mar 11, 2016 at 02:05:16PM -0600, Steve French wrote: >> A loosely related question is what can be done for tools around existing >> interfaces for ACLs. I recently found out NTFS-3g has this xattr: >> >> static const char nf_ns_xattr_ntfs_acl[] = "system.ntfs_acl"; >> >> which allows you to query system.ntfs_acl xattr to get their full ACL > > Bah. Filesystems really have no business exposing random system xattrs, > and we really need to add a filter to fs/xattr.c to not expose > arbitrary attrs ouside the user.* prefix. Hopefully we don't consider them random system xattrs, it is plausible that ntfs uses these for user space tools that I don't have. At least for cifs.ko a similar subset (querying ACLs, streams and reparse info e.g.) to the ntfs set would be very helpful. For example, Being able to query the actual ACL over the wire, is important for backup and for debug, the only question is whether to do it via an xattr (possibly being able to have some synergy with existing ntfs-3g tools) or an ioctl (since adding an NTFS specific syscall for a couple fs doesn't make sense). For the specific example of the odd ntfs.streams.list xattr, I can see why they have it. I would have mixed feelings about having no way to tell streams and EAs from each other since NTFS-3g displaying streams as xattrs and also Extended Attributes (EAs) as xattrs (and if they didn't have an additional xattr to list streams) without a way to tell the difference (at least a system xattr to list the alternate data streams is useful). There is useful information in alternate data streams that backup (and debugging) programs need for some workloads, for example the origin (where internet explorer downloaded a file from) and file classification information. -- Thanks, Steve From chris@colorremedies.com Wed Mar 16 02:23:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 BBEFD7CE3 for ; Wed, 16 Mar 2016 02:23:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8A7A68F8033 for ; Wed, 16 Mar 2016 00:23:48 -0700 (PDT) X-ASG-Debug-ID: 1458113024-04cbb00b724e84d0001-NocioJ Received: from mail-ig0-f170.google.com (mail-ig0-f170.google.com [209.85.213.170]) by cuda.sgi.com with ESMTP id 0SVVzAQFxIacoNhx (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 16 Mar 2016 00:23:45 -0700 (PDT) X-Barracuda-Envelope-From: chris@colorremedies.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.213.170 Received: by mail-ig0-f170.google.com with SMTP id ig19so34938377igb.1 for ; Wed, 16 Mar 2016 00:23:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=colorremedies-com.20150623.gappssmtp.com; s=20150623; h=mime-version:references:in-reply-to:from:date:message-id:subject:to; bh=ghOD1kYq4+QbM604BZTGHR/TjyQ7Z/r4aWYnbO3kFJE=; b=vvD/AQAysML8a5yAMBGCeuOr/ostthoMTroS53hFyW1IEkFxz3u8ltqpZgk5VnmXn9 NAHZDuwbJQD3oadMYgHuTwI1AxTaGDz9f7AyPnR8FQgrvaSc+St8LSpOIquQ1nE4PEqN BywNjFpsKBzSJuO82qG+W1Osnk31qdF1+cWt8kh0kxd5Pmhe2MMR22uSR6oSn29hloyf R4rQXkp+hffRjHo88k6Kd2Zg3EWF6JzmyksL+tbxM7IXRiRqQktf0i7zLuL/yO3BjHrC wKnTrg/f1ZAYk3XmZf3qA1D13WGT00TwM+zef0HPTkggbnJ5YlIGW11sBVeIaH/mZoNH /gRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=ghOD1kYq4+QbM604BZTGHR/TjyQ7Z/r4aWYnbO3kFJE=; b=Ua22kR7RAON0F1X4soeM5pW4c0BEzi3yRIDogI43wrMjI5SpbAqeQdkr0vcqq2PK1O rXj1cwOmDLOPkDYkt+L+OxIV7NA1sf0TZ2ZRvukawIE9WxMqBzR8Ae/g80wNHSBIOrH7 jqO7F+UxVhmeAoO+EqZE+VElrVZhSNcQw48/tHNMg0xsq6oBXmBSRZzcLAybf8gOkFlh Q98HOAREXDvMRK9tPBjrNIzsJ4cuwEm2uZuEJcHfJFE9t3o2P0LXX6UM7HK3plXHXnQ6 QKps7gdEjZ0DTg0fHauux0y3fO2R2QX3oFadLVfEHSpvQ9b9AzNb5wRGMQsB7GI2N7yh lHQg== X-Gm-Message-State: AD7BkJLE3Tk0WhxkYF/SXdit85adutuq17zAwfIIfN5BB7YOALsdkvxLJhUNNbu9BipDadPkHOHao/iIB5TIdQ== X-Received: by 10.50.112.101 with SMTP id ip5mr22358967igb.52.1458113024710; Wed, 16 Mar 2016 00:23:44 -0700 (PDT) MIME-Version: 1.0 References: <56E8AA22.7080301@sandeen.net> In-Reply-To: <56E8AA22.7080301@sandeen.net> From: Chris Murphy Date: Wed, 16 Mar 2016 07:23:35 +0000 Message-ID: Subject: Re: new fs, xfs_admin new label, metadata corruption detected To: Eric Sandeen , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: new fs, xfs_admin new label, metadata corruption detected Content-Type: multipart/alternative; boundary=047d7b3a8458e1d854052e2564bd X-Barracuda-Connect: mail-ig0-f170.google.com[209.85.213.170] X-Barracuda-Start-Time: 1458113025 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.00 X-Barracuda-Spam-Status: No, SCORE=1.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_MV0771, BSF_SC5_SA210e, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27891 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 1.00 BSF_SC0_MV0771 BSF_SC0_MV0771 0.00 BSF_SC5_SA210e Custom Rule SA210e --047d7b3a8458e1d854052e2564bd Content-Type: text/plain; charset=UTF-8 On Tue, Mar 15, 2016, 6:34 PM Eric Sandeen wrote: > On 3/15/16 6:08 PM, Chris Murphy wrote: > > Is this expected? File system continues to work OK, sha256sum on the > > single file on this fs matches the source, but the metadata corruption > > messages are a bit scary so figured I'd ask about it. > > > > Filesystem created with > > xfsprogs-4.3.0-1.fc23 > > kernel-4.4.4-300.fc23.x86_64 > > > > mkfs.xfs defaults used on an LVM thinly provisioned volume on a single > > spinning disk. > > > > # xfs_info /dev/mapper/VG-testxfs > > meta-data=/dev/mapper/VG-testxfs isize=512 agcount=23, agsize=399984 > blks > ^^^^^^^^^^ > > It seems that you left a growfs step out of it, where does that come in > to the testcase? > Oops I spaced it out entirely. Much of this happened in Cockpit, which uses storaged. So no matter what I'll have to backtrack to get exact reproduce steps. In the meantime: Create thin pool Create thin volume Mkfs Mount Copy file Grow (resize done in cockpit) Delete file Umount Kernel and progs update and reboot Mount Copy file Unmount Relabel Repair Mount Something amiss with growfs and lvresize steps? Chris Murphy --047d7b3a8458e1d854052e2564bd Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable

On Tue, Mar 15, 2016, 6= :34 PM Eric Sandeen <sandeen@sand= een.net> wrote:
On 3/15/16 6= :08 PM, Chris Murphy wrote:
> Is this expected? File system continues to work OK, sha256sum on the > single file on this fs matches the source, but the metadata corruption=
> messages are a bit scary so figured I'd ask about it.
>
> Filesystem created with
> xfsprogs-4.3.0-1.fc23
> kernel-4.4.4-300.fc23.x86_64
>
> mkfs.xfs defaults used on an LVM thinly provisioned volume on a single=
> spinning disk.
>
> # xfs_info /dev/mapper/VG-testxfs
> meta-data=3D/dev/mapper/VG-testxfs isize=3D512=C2=A0 =C2=A0 agcount=3D= 23, agsize=3D399984 blks
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 ^^^^^^^^^^

It seems that you left a growfs step out of it, where does that come in
to the testcase?


Oops I= spaced it out entirely.

Much of this happened in Cockpit, which use= s storaged. So no matter what I'll have to backtrack to get exact repro= duce steps. In the meantime:

Create thin pool
Create thin volume<= br>Mkfs
Mount
Copy file
Grow (resize done in cockpit)
Delete fi= le
Umount
Kernel and progs update and reboot
Mount
Copy fileUnmount
Relabel
<error>
Repair
Mount

Something am= iss with growfs and lvresize steps?


Chris= Murphy
--047d7b3a8458e1d854052e2564bd-- From celiosales@sulminet.com.br Wed Mar 16 04:02:27 2016 Return-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=EMAIL_URI_PHISH,HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 944F07CE5 for ; Wed, 16 Mar 2016 04:02:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0BF008F8033 for ; Wed, 16 Mar 2016 02:02:17 -0700 (PDT) X-ASG-Debug-ID: 1458118929-04cbb00b714eb0b0001-NocioJ Received: from ns2.sulminet.com.br (ns2.sulminet.com.br [131.72.12.19]) by cuda.sgi.com with ESMTP id 5IYXBorgGfuwZGbM (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 16 Mar 2016 02:02:10 -0700 (PDT) X-Barracuda-Envelope-From: celiosales@sulminet.com.br X-Barracuda-Registry: Level1 [sulminet.com.br/131.72.12.19] X-Barracuda-Apparent-Source-IP: 131.72.12.19 Received: (qmail 9512 invoked by uid 1010); 16 Mar 2016 03:56:00 -0300 Received: from 101.57.193.133 by ns2 (envelope-from , uid 1008) with qmail-scanner-1.25-st-qms (clamdscan: 0.91.2/4381. spamassassin: 3.2.3. perlscan: 1.25-st-qms. Clear:RC:0(101.57.193.133):SA:0(-1.0/4.0):. Processed in 5.842399 secs); 16 Mar 2016 06:56:00 -0000 X-Antivirus-Sulminet-Mail-From: celiosales@sulminet.com.br via ns2 X-Antivirus-Sulminet: 1.25-st-qms (Clear:RC:0(101.57.193.133):SA:0(-1.0/4.0):. Processed in 5.842399 secs Process 9077) Received: from unknown (HELO ?100.72.32.39?) (celiosales@sulminet.com.br@101.57.193.133) by ns2.sulminet.com.br with AES256-SHA encrypted SMTP; 16 Mar 2016 03:55:54 -0300 Content-Type: multipart/alternative; boundary="===============1074608838==" MIME-Version: 1.0 Subject: REPLY To: Recipients X-ASG-Orig-Subj: REPLY From: Date: Wed, 16 Mar 2016 12:25:15 +0530 X-Antivirus-Sulminet-Message-ID: <145811135610709077@ns2> X-Barracuda-Connect: ns2.sulminet.com.br[131.72.12.19] X-Barracuda-Start-Time: 1458118929 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.64 X-Barracuda-Spam-Status: No, SCORE=2.64 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_MV0310b, HTML_MESSAGE, MISSING_MID, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27892 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 NO_REAL_NAME From: does not include a real name 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 HTML_MESSAGE BODY: HTML included in message 2.50 BSF_SC0_MV0310b Custom rule MV0310b Message-Id: <20160316090217.A1E8E106C1A2@cuda.sgi.com> You will not see this in a MIME-aware mail reader. --===============1074608838== Content-Type: text/plain; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body There has been an automatic security update on your email address.CLICK HER= E here to complete update Please note that you have within 24 hours to complete this update because y= ou might lose access to your Email Box. = Thanks Frances O. Thomas For IT Helpdesk --===============1074608838== Content-Type: text/html; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body

There has been= an automatic security update on your email address<= SPAN style=3D"LINE-HEIGHT: 17px; TEXT-INDENT: 0px !important">.CLICK HERE here to complete update
Pleas= e note that you have within 24 hours to complete this update because you might lose access to your Em= ail Box.
 
Thanks
Frances O. Thomas

For IT Helpdesk

--===============1074608838==-- From zlang@redhat.com Wed Mar 16 04:18:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D366E7CE5 for ; Wed, 16 Mar 2016 04:18:17 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 27F4AAC002 for ; Wed, 16 Mar 2016 02:18:16 -0700 (PDT) X-ASG-Debug-ID: 1458119892-04cbb00b724eb7a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id EWBDFAyTSyATRHmC (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 02:18:12 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id DD98D64D1D for ; Wed, 16 Mar 2016 09:18:11 +0000 (UTC) Received: from localhost (dhcp12-206.nay.redhat.com [10.66.12.206] (may be forged)) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2G9IA1i004298; Wed, 16 Mar 2016 05:18:11 -0400 From: Zorro Lang To: xfs@oss.sgi.com Cc: Zorro Lang Subject: [PATCH] io/mmap: new -s option for mmap command to reserve some free space Date: Wed, 16 Mar 2016 17:18:04 +0800 X-ASG-Orig-Subj: [PATCH] io/mmap: new -s option for mmap command to reserve some free space Message-Id: <1458119884-17942-1-git-send-email-zlang@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Wed, 16 Mar 2016 09:18:11 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458119892 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This patch come from a test likes below: xfs_io -t -f -c "truncate 10000" -c "mmap -rw 0 1024" -c "mremap 8192" file mremap always hit ENOMEM error, when it try to remap more space without MREMAP_MAYMOVE flag. This's a normal condition, due to no free space after mapped 1024 bytes region. But if we try to mremap from the original mapped starting point in a C program, at first we always do: addr = mmap(NULL, res_size, prot, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); munmap(addr, res_size); Then do: addr = mmap(addr, real_len, ...); The "res_size" is bigger than "real_len". This will help us get a region between real_len and res_size, which maybe free space. The truth is we can't guarantee that this free memory will stay free. But this method is still very helpful for reserve some free space in short time. After merge this patch, we can resolve above mremap problem by run: xfs_io -t -f ... -c "mmap -rw -s 8192 0 1024" -c "mremap 8192" ... Although we can't sure it's useful 100%, it really have pretty high success rate. Signed-off-by: Zorro Lang --- io/mmap.c | 29 +++++++++++++++++++++++------ man/man8/xfs_io.8 | 17 ++++++++++++++++- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/io/mmap.c b/io/mmap.c index 5970069..6cd37a9 100644 --- a/io/mmap.c +++ b/io/mmap.c @@ -146,6 +146,7 @@ mmap_help(void) " -r -- map with PROT_READ protection\n" " -w -- map with PROT_WRITE protection\n" " -x -- map with PROT_EXEC protection\n" +" -s -- first do mmap(size)/munmap(size), try to reserve some free space\n" " If no protection mode is specified, all are used by default.\n" "\n")); } @@ -156,8 +157,8 @@ mmap_f( char **argv) { off64_t offset; - ssize_t length; - void *address; + ssize_t length = 0, length2 = 0; + void *address = NULL; char *filename; size_t blocksize, sectsize; int c, prot = 0; @@ -181,7 +182,9 @@ mmap_f( return 0; } - while ((c = getopt(argc, argv, "rwx")) != EOF) { + init_cvtnum(&blocksize, §size); + + while ((c = getopt(argc, argv, "rwxs:")) != EOF) { switch (c) { case 'r': prot |= PROT_READ; @@ -192,6 +195,9 @@ mmap_f( case 'x': prot |= PROT_EXEC; break; + case 's': + length2 = cvtnum(blocksize, sectsize, optarg); + break; default: return command_usage(&mmap_cmd); } @@ -202,7 +208,6 @@ mmap_f( if (optind != argc - 2) return command_usage(&mmap_cmd); - init_cvtnum(&blocksize, §size); offset = cvtnum(blocksize, sectsize, argv[optind]); if (offset < 0) { printf(_("non-numeric offset argument -- %s\n"), argv[optind]); @@ -221,7 +226,19 @@ mmap_f( return 0; } - address = mmap(NULL, length, prot, MAP_SHARED, file->fd, offset); + /* + * mmap and munmap memory area of length2 region is helpful to + * make a region of extendible free memory. It's generally used + * for later mremap operation(no MREMAP_MAYMOVE flag). But there + * isn't guarantee that the memory after length (up to length2) + * will stay free. + */ + if (length2 > length) { + address = mmap(NULL, length2, prot, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + munmap(address, length2); + } + address = mmap(address, length, prot, MAP_SHARED, file->fd, offset); if (address == MAP_FAILED) { perror("mmap"); free(filename); @@ -647,7 +664,7 @@ mmap_init(void) mmap_cmd.argmin = 0; mmap_cmd.argmax = -1; mmap_cmd.flags = CMD_NOMAP_OK | CMD_NOFILE_OK | CMD_FOREIGN_OK; - mmap_cmd.args = _("[N] | [-rwx] [off len]"); + mmap_cmd.args = _("[N] | [-rwx] [-s size] [off len]"); mmap_cmd.oneline = _("mmap a range in the current file, show mappings"); mmap_cmd.help = mmap_help; diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 index 33fbe6a..93a8a00 100644 --- a/man/man8/xfs_io.8 +++ b/man/man8/xfs_io.8 @@ -559,7 +559,7 @@ Do not print timing statistics at all. .SH MEMORY MAPPED I/O COMMANDS .TP -.BI "mmap [ " N " | [[ \-rwx ] " "offset length " ]] +.BI "mmap [ " N " | [[ \-rwx ] [\-s " size " ] " "offset length " ]] With no arguments, .B mmap shows the current mappings. Specifying a single numeric argument @@ -575,6 +575,21 @@ PROT_WRITE .RB ( \-w ), and PROT_EXEC .RB ( \-x ). +.BI \-s " size" +is used to do a mmap(size) && munmap(size) operation at first, try to reserve some +extendible free memory space, if +.I size +is bigger than +.I length +parameter. But there's not guarantee that the memory after +.I length +( up to +.I size +) will stay free. +.B e.g. +"mmap -rw -s 8192 1024" will mmap 0 ~ 1024 bytes memory, but try to reserve 1024 ~ 8192 +free space(no guarantee). This free space will helpful for "mremap 8192" without +MREMAP_MAYMOVE flag. .TP .B mm See the -- 2.5.0 From zlang@redhat.com Wed Mar 16 04:31:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 54C4D7CE7 for ; Wed, 16 Mar 2016 04:31:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 96704AC001 for ; Wed, 16 Mar 2016 02:31:52 -0700 (PDT) X-ASG-Debug-ID: 1458120710-04bdf002eb517c20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 2sxxBhxt0aUAcMOL (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 02:31:51 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 9FD424DE96 for ; Wed, 16 Mar 2016 09:31:50 +0000 (UTC) Received: from localhost (dhcp12-206.nay.redhat.com [10.66.12.206] (may be forged)) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2G9Vnwm001461; Wed, 16 Mar 2016 05:31:50 -0400 From: Zorro Lang To: xfs@oss.sgi.com Cc: Zorro Lang Subject: [PATCH] io/mremap: modify argument errors of mremap command Date: Wed, 16 Mar 2016 17:31:47 +0800 X-ASG-Orig-Subj: [PATCH] io/mremap: modify argument errors of mremap command Message-Id: <1458120707-25219-1-git-send-email-zlang@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458120711 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 There're 2 argument errors in mremap command: 1. If run "mremap 1024 8192", it won't return error and try to do "mremap 1024" silently. 2. The "-f" option can't be used, due to it need a new address argument as the fifth argument of mremap() syscall(man mremap). This patch try to fix above two problems. Signed-off-by: Zorro Lang --- Hi, I'm not sure pass a address argument to mremap command is right or wrong. And maybe I should use strtoul() to instead of cvtnum() for address argument. At least I did some simple test with this patch on my machine, results are: "mremap -f 139946004389888 2048" PASS "mremap -f 4096k 2048" PASS "mremap -f 1g 2048" PASS "mremap -f 4096 2048" FAIL as 'Permission denied' What do you think of this patch? Thanks, Zorro io/mmap.c | 22 +++++++++++++++------- man/man8/xfs_io.8 | 5 ++++- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/io/mmap.c b/io/mmap.c index 5970069..672ee61 100644 --- a/io/mmap.c +++ b/io/mmap.c @@ -589,7 +589,7 @@ mremap_help(void) "\n" " Resizes the mappping, growing or shrinking from the current size.\n" " The default stored value is 'X', repeated to fill the range specified.\n" -" -f -- use the MREMAP_FIXED flag\n" +" -f -- use the MREMAP_FIXED flag to mremap on the new address\n" " -m -- use the MREMAP_MAYMOVE flag\n" "\n")); } @@ -600,15 +600,18 @@ mremap_f( char **argv) { ssize_t new_length; - void *new_addr; + void *new_addr = NULL; int flags = 0; int c; size_t blocksize, sectsize; - while ((c = getopt(argc, argv, "fm")) != EOF) { + init_cvtnum(&blocksize, §size); + + while ((c = getopt(argc, argv, "f:m")) != EOF) { switch (c) { case 'f': flags = MREMAP_FIXED|MREMAP_MAYMOVE; + new_addr = (void *)cvtnum(blocksize, sectsize, optarg); break; case 'm': flags = MREMAP_MAYMOVE; @@ -618,7 +621,9 @@ mremap_f( } } - init_cvtnum(&blocksize, §size); + if (optind != argc - 1) + return command_usage(&mremap_cmd); + new_length = cvtnum(blocksize, sectsize, argv[optind]); if (new_length < 0) { printf(_("non-numeric offset argument -- %s\n"), @@ -626,7 +631,10 @@ mremap_f( return 0; } - new_addr = mremap(mapping->addr, mapping->length, new_length, flags); + if (!new_addr) + new_addr = mremap(mapping->addr, mapping->length, new_length, flags); + else + new_addr = mremap(mapping->addr, mapping->length, new_length, flags, new_addr); if (new_addr == MAP_FAILED) perror("mremap"); else { @@ -697,9 +705,9 @@ mmap_init(void) mremap_cmd.altname = "mrm"; mremap_cmd.cfunc = mremap_f; mremap_cmd.argmin = 1; - mremap_cmd.argmax = 2; + mremap_cmd.argmax = 3; mremap_cmd.flags = CMD_NOFILE_OK | CMD_FOREIGN_OK; - mremap_cmd.args = _("[-m|-f] newsize"); + mremap_cmd.args = _("[-m|-f ] newsize"); mremap_cmd.oneline = _("alters the size of the current memory mapping"); mremap_cmd.help = mremap_help; diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 index 33fbe6a..984b551 100644 --- a/man/man8/xfs_io.8 +++ b/man/man8/xfs_io.8 @@ -581,7 +581,7 @@ See the .B mmap command. .TP -.BI "mremap [ \-f ] [ \-m ] " new_length +.BI "mremap [ \-f ] [ \-m ] " new_length Changes the current mapping size to .IR new_length . Whether the mapping may be moved is controlled by the flags passed; @@ -589,6 +589,9 @@ MREMAP_FIXED .RB ( \-f ), or MREMAP_MAYMOVE .RB ( \-m ). +.IR new_length +specifies a page-aligned address to which the mapping must be moved. It +can be setted to 139946004389888, 4096k or 1g etc. .TP .B mrm See the -- 2.5.0 From eguan@redhat.com Wed Mar 16 04:33:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 29DDE7CE7 for ; Wed, 16 Mar 2016 04: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 531E0AC001 for ; Wed, 16 Mar 2016 02:33:40 -0700 (PDT) X-ASG-Debug-ID: 1458120818-04cbb00b6f4ebd50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id lOb0gZX0pFGGKd2i (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 02:33:38 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 45D9C2196; Wed, 16 Mar 2016 09:33:38 +0000 (UTC) Received: from localhost (dhcp-13-211.nay.redhat.com [10.66.13.211]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2G9XbP9009592; Wed, 16 Mar 2016 05:33:37 -0400 From: Eryu Guan To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com, Eryu Guan Subject: [PATCH] fstests: make xfs/006 generic Date: Wed, 16 Mar 2016 17:30:54 +0800 X-ASG-Orig-Subj: [PATCH] fstests: make xfs/006 generic Message-Id: <1458120654-27284-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458120818 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs/006 has no requirements that are specific to XFS, so make it generic and other filesystems could get some coverage too. Along with the movement, I also added a test that removes all created dirs, as that's how the original bug was found. Signed-off-by: Eryu Guan --- tests/generic/339 | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/339.out | 2 ++ tests/generic/group | 1 + tests/xfs/006 | 63 --------------------------------------------- tests/xfs/006.out | 28 -------------------- tests/xfs/group | 1 - 6 files changed, 74 insertions(+), 92 deletions(-) create mode 100755 tests/generic/339 create mode 100644 tests/generic/339.out delete mode 100755 tests/xfs/006 delete mode 100644 tests/xfs/006.out diff --git a/tests/generic/339 b/tests/generic/339 new file mode 100755 index 0000000..cbcad00 --- /dev/null +++ b/tests/generic/339 @@ -0,0 +1,71 @@ +#! /bin/bash +# FS QA Test No. 339 +# +# Test that directory hash entries are place in the correct order. +# commit f5ea110 ("xfs: add CRCs to dir2/da node blocks") left the +# directory with incorrect hash ordering. +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Hannes Frederic Sowa. 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 +_supported_fs generic +_supported_os Linux +_require_scratch +_require_test_program "dirhash_collide" + +rm -f $seqres.full +_scratch_mkfs >>$seqres.full 2>&1 +_scratch_mount + +echo "Silence is golden" + +testdir=$SCRATCH_MNT/$seq.$$ +mkdir -p $testdir +$here/src/dirhash_collide -d -n 10000 $testdir >>$seqres.full 2>&1 + +# check the scratch device +_scratch_unmount +_check_scratch_fs + +# remove all test dirs and let test harness check scratch fs again +_scratch_mount +rm -rf $testdir + +# success, all done +status=0 +exit diff --git a/tests/generic/339.out b/tests/generic/339.out new file mode 100644 index 0000000..293ea80 --- /dev/null +++ b/tests/generic/339.out @@ -0,0 +1,2 @@ +QA output created by 339 +Silence is golden diff --git a/tests/generic/group b/tests/generic/group index 8818827..cd2a2b7 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -341,3 +341,4 @@ 336 auto quick metadata 337 auto quick metadata 338 auto quick rw +339 auto dir diff --git a/tests/xfs/006 b/tests/xfs/006 deleted file mode 100755 index 13631be..0000000 --- a/tests/xfs/006 +++ /dev/null @@ -1,63 +0,0 @@ -#! /bin/bash -# FS QA Test No. 006 -# -# Test that directory hash entries are place in the correct order. -# commit f5ea110 ("xfs: add CRCs to dir2/da node blocks") left the -# directory with incorrect hash ordering. -# -#----------------------------------------------------------------------- -# Copyright (c) 2014 Hannes Frederic Sowa. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it would be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -#----------------------------------------------------------------------- -# - -seq=`basename $0` -seqres=$RESULT_DIR/$seq -echo "QA output created by $seq" - -here=`pwd` -tmp=/tmp/$$ -status=1 # failure is the default! -trap "_cleanup; exit \$status" 0 1 2 3 15 - -_cleanup() -{ - cd / - rm -f $tmp.* -} - -# get standard environment, filters and checks -. ./common/rc -. ./common/filter -. ./common/repair - -# real QA test starts here - -_supported_fs xfs -_supported_os Linux -_require_scratch - -_scratch_mkfs_xfs | _filter_mkfs 2>$tmp.mkfs -_scratch_mount | _filter_scratch - -mkdir $SCRATCH_MNT/x -$here/src/dirhash_collide -d -n 10000 $SCRATCH_MNT/x -_scratch_unmount 2>&1 | _filter_scratch - -_scratch_xfs_repair 2>&1 | _filter_repair - -# success, all done -status=0 -exit diff --git a/tests/xfs/006.out b/tests/xfs/006.out deleted file mode 100644 index 9c142ac..0000000 --- a/tests/xfs/006.out +++ /dev/null @@ -1,28 +0,0 @@ -QA output created by 006 -meta-data=DDEV isize=XXX agcount=N, agsize=XXX blks -data = bsize=XXX blocks=XXX, imaxpct=PCT - = sunit=XXX swidth=XXX, unwritten=X -naming =VERN bsize=XXX -log =LDEV bsize=XXX blocks=XXX -realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX -Phase 1 - find and verify superblock... -Phase 2 - using 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... - - process newly discovered inodes... -Phase 4 - check for duplicate blocks... - - setting up duplicate extent list... - - check for inodes claiming duplicate blocks... -Phase 5 - rebuild AG headers and trees... - - reset superblock... -Phase 6 - check inode connectivity... - - resetting contents of realtime bitmap and summary inodes - - traversing filesystem ... - - traversal finished ... - - moving disconnected inodes to lost+found ... -Phase 7 - verify and correct link counts... -done diff --git a/tests/xfs/group b/tests/xfs/group index e0c4553..db495c9 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -3,7 +3,6 @@ 003 db auto quick 004 db auto quick 005 auto quick -006 auto dir 007 auto quota quick 008 rw ioctl auto quick 009 rw ioctl auto prealloc quick -- 2.5.0 From bfoster@redhat.com Wed Mar 16 06:40:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 349F17CEB for ; Wed, 16 Mar 2016 06:40:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 87383AC002 for ; Wed, 16 Mar 2016 04:40:24 -0700 (PDT) X-ASG-Debug-ID: 1458128422-04cb6c7f2a210b20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id zzjoo4PTeJyV6Svt (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 04:40: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 (Postfix) with ESMTPS id 45E9B64D13 for ; Wed, 16 Mar 2016 11:40:22 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-24.bos.redhat.com [10.18.41.24]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GBeLvG015297; Wed, 16 Mar 2016 07:40:22 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id D1ECB125517; Wed, 16 Mar 2016 07:40:20 -0400 (EDT) Date: Wed, 16 Mar 2016 07:40:20 -0400 From: Brian Foster To: Carlos Maiolino Cc: xfs@oss.sgi.com Subject: Re: [PATCH] Add caller function output to xfs_log_force tracepoint Message-ID: <20160316114020.GA8096@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] Add caller function output to xfs_log_force tracepoint References: <1458032019-31953-1-git-send-email-cmaiolino@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1458032019-31953-1-git-send-email-cmaiolino@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Wed, 16 Mar 2016 11:40:22 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458128423 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Mar 15, 2016 at 09:53:39AM +0100, Carlos Maiolino wrote: > I had sent this patch yesterday, but for some reason it didn't reach xfs list, > sending again. > > > Output the caller of xfs_log_force might be useful when tracing log checkpoint > problems without the need to build kernel with DEBUG. > > Signed-off-by: Carlos Maiolino > --- Reviewed-by: Brian Foster > fs/xfs/xfs_log.c | 4 ++-- > fs/xfs/xfs_trace.h | 10 ++++++---- > 2 files changed, 8 insertions(+), 6 deletions(-) > > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > index b49ccf5..8c08015b 100644 > --- a/fs/xfs/xfs_log.c > +++ b/fs/xfs/xfs_log.c > @@ -3378,7 +3378,7 @@ xfs_log_force( > { > int error; > > - trace_xfs_log_force(mp, 0); > + trace_xfs_log_force(mp, 0, _RET_IP_); > error = _xfs_log_force(mp, flags, NULL); > if (error) > xfs_warn(mp, "%s: error %d returned.", __func__, error); > @@ -3527,7 +3527,7 @@ xfs_log_force_lsn( > { > int error; > > - trace_xfs_log_force(mp, lsn); > + trace_xfs_log_force(mp, lsn, _RET_IP_); > error = _xfs_log_force_lsn(mp, lsn, flags, NULL); > if (error) > xfs_warn(mp, "%s: error %d returned.", __func__, error); > diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h > index c8d5842..384bb17 100644 > --- a/fs/xfs/xfs_trace.h > +++ b/fs/xfs/xfs_trace.h > @@ -1053,19 +1053,21 @@ DECLARE_EVENT_CLASS(xfs_log_item_class, > ) > > TRACE_EVENT(xfs_log_force, > - TP_PROTO(struct xfs_mount *mp, xfs_lsn_t lsn), > - TP_ARGS(mp, lsn), > + TP_PROTO(struct xfs_mount *mp, xfs_lsn_t lsn, unsigned long caller_ip), > + TP_ARGS(mp, lsn, caller_ip), > TP_STRUCT__entry( > __field(dev_t, dev) > __field(xfs_lsn_t, lsn) > + __field(unsigned long, caller_ip) > ), > TP_fast_assign( > __entry->dev = mp->m_super->s_dev; > __entry->lsn = lsn; > + __entry->caller_ip = caller_ip; > ), > - TP_printk("dev %d:%d lsn 0x%llx", > + TP_printk("dev %d:%d lsn 0x%llx caller %ps", > MAJOR(__entry->dev), MINOR(__entry->dev), > - __entry->lsn) > + __entry->lsn, (void *)__entry->caller_ip) > ) > > #define DEFINE_LOG_ITEM_EVENT(name) \ > -- > 2.4.3 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From BATV+9519ba4b1f2b6df28a9c+4588+infradead.org+hch@casper.srs.infradead.org Wed Mar 16 06:44:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DF17E7CEB for ; Wed, 16 Mar 2016 06:44:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4B079AC008 for ; Wed, 16 Mar 2016 04:44:47 -0700 (PDT) X-ASG-Debug-ID: 1458128683-04cbb00b704ef520001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id qOsFciwhiMQB8Slb (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 16 Mar 2016 04:44:44 -0700 (PDT) X-Barracuda-Envelope-From: BATV+9519ba4b1f2b6df28a9c+4588+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85 #2 (Red Hat Linux)) id 1ag9sY-0000To-VG; Wed, 16 Mar 2016 11:44:43 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: bfoster@redhat.com Subject: further writeback updates V2 Date: Wed, 16 Mar 2016 12:44:38 +0100 X-ASG-Orig-Subj: further writeback updates V2 Message-Id: <1458128681-10869-1-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1458128684 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27895 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This series contains two patches from Dave (with a rebase and minor updates from me) which he posted as RFC earlier to reduce the buffer_head dependency in the writeback path, and one patch from me to make use of bios embedded into the ioend and bio chaining to further simplify and optimize the writeback path. They pass xfstests on 4k and 1k file systems. Changes since V1: - various minor refactoring based on the comments from Brian From BATV+9519ba4b1f2b6df28a9c+4588+infradead.org+hch@casper.srs.infradead.org Wed Mar 16 06:44:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 021A07CED for ; Wed, 16 Mar 2016 06:44:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 53C4BAC009 for ; Wed, 16 Mar 2016 04:44:47 -0700 (PDT) X-ASG-Debug-ID: 1458128684-04cbb00b724ef530001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id oWcDJiEqz53skbWR (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 16 Mar 2016 04:44:44 -0700 (PDT) X-Barracuda-Envelope-From: BATV+9519ba4b1f2b6df28a9c+4588+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85 #2 (Red Hat Linux)) id 1ag9sZ-0000Tt-PA; Wed, 16 Mar 2016 11:44:43 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: bfoster@redhat.com, Dave Chinner Subject: [PATCH 1/3] xfs: build bios directly in xfs_add_to_ioend Date: Wed, 16 Mar 2016 12:44:39 +0100 X-ASG-Orig-Subj: [PATCH 1/3] xfs: build bios directly in xfs_add_to_ioend Message-Id: <1458128681-10869-2-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1458128681-10869-1-git-send-email-hch@lst.de> References: <1458128681-10869-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1458128684 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27895 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Currently adding a buffer to the ioend and then building a bio from the buffer list are two separate operations. We don't build the bios and submit them until the ioend is submitted, and this places a fixed dependency on bufferhead chaining in the ioend. The first step to removing the bufferhead chaining in the ioend is on the IO submission side. We can build the bio directly as we add the buffers to the ioend chain, thereby removing the need for a latter "buffer-to-bio" submission loop. This allows us to submit bios on large ioends as soon as we cannot add more data to the bio. These bios then get captured by the active plug, and hence will be dispatched as soon as either the plug overflows or we schedule away from the writeback context. This will reduce submission latency for large IOs, but will also allow more timely request queue based writeback blocking when the device becomes congested. Signed-off-by: Dave Chinner [hch: various small updates] Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_aops.c | 69 +++++++++++++++++++++++++------------------------------ fs/xfs/xfs_aops.h | 1 + 2 files changed, 32 insertions(+), 38 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 75a39a8..17cc6cc 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -274,6 +274,7 @@ xfs_alloc_ioend( xfs_ioend_t *ioend; ioend = mempool_alloc(xfs_ioend_pool, GFP_NOFS); + memset(ioend, 0, sizeof(*ioend)); /* * Set the count to 1 initially, which will prevent an I/O @@ -281,16 +282,9 @@ xfs_alloc_ioend( * all the I/O from calling the completion routine too early. */ atomic_set(&ioend->io_remaining, 1); - ioend->io_error = 0; INIT_LIST_HEAD(&ioend->io_list); ioend->io_type = type; ioend->io_inode = inode; - ioend->io_buffer_head = NULL; - ioend->io_buffer_tail = NULL; - ioend->io_offset = 0; - ioend->io_size = 0; - ioend->io_append_trans = NULL; - INIT_WORK(&ioend->io_work, xfs_end_io); return ioend; } @@ -452,13 +446,18 @@ static inline int xfs_bio_add_buffer(struct bio *bio, struct buffer_head *bh) } /* - * Submit all of the bios for an ioend. We are only passed a single ioend at a - * time; the caller is responsible for chaining prior to submission. + * Submit the bio for an ioend. We are passed an ioend with a bio attached to + * it, and we submit that bio. The ioend may be used for multiple bio + * submissions, so we only want to allocate an append transaction for the ioend + * once. In the case of multiple bio submission, each bio will take an IO + * reference to the ioend to ensure that the ioend completion is only done once + * all bios have been submitted and the ioend is really done. * * If @fail is non-zero, it means that we have a situation where some part of * the submission process has failed after we have marked paged for writeback - * and unlocked them. In this situation, we need to fail the ioend chain rather - * than submit it to IO. This typically only happens on a filesystem shutdown. + * and unlocked them. In this situation, we need to fail the bio and ioend + * rather than submit it to IO. This typically only happens on a filesystem + * shutdown. */ STATIC int xfs_submit_ioend( @@ -466,14 +465,13 @@ xfs_submit_ioend( xfs_ioend_t *ioend, int status) { - struct buffer_head *bh; - struct bio *bio; - sector_t lastblock = 0; - /* Reserve log space if we might write beyond the on-disk inode size. */ if (!status && - ioend->io_type != XFS_IO_UNWRITTEN && xfs_ioend_is_append(ioend)) + ioend->io_bio && ioend->io_type != XFS_IO_UNWRITTEN && + xfs_ioend_is_append(ioend) && + !ioend->io_append_trans) status = xfs_setfilesize_trans_alloc(ioend); + /* * If we are failing the IO now, just mark the ioend with an * error and finish it. This will run IO completion immediately @@ -481,31 +479,15 @@ xfs_submit_ioend( * time. */ if (status) { + if (ioend->io_bio) + bio_put(ioend->io_bio); ioend->io_error = status; xfs_finish_ioend(ioend); return status; } - bio = NULL; - for (bh = ioend->io_buffer_head; bh; bh = bh->b_private) { - - if (!bio) { -retry: - bio = xfs_alloc_ioend_bio(bh); - } else if (bh->b_blocknr != lastblock + 1) { - xfs_submit_ioend_bio(wbc, ioend, bio); - goto retry; - } - - if (xfs_bio_add_buffer(bio, bh) != bh->b_size) { - xfs_submit_ioend_bio(wbc, ioend, bio); - goto retry; - } - - lastblock = bh->b_blocknr; - } - if (bio) - xfs_submit_ioend_bio(wbc, ioend, bio); + xfs_submit_ioend_bio(wbc, ioend, ioend->io_bio); + ioend->io_bio = NULL; xfs_finish_ioend(ioend); return 0; } @@ -523,6 +505,7 @@ xfs_add_to_ioend( struct buffer_head *bh, xfs_off_t offset, struct xfs_writepage_ctx *wpc, + struct writeback_control *wbc, struct list_head *iolist) { if (!wpc->ioend || wpc->io_type != wpc->ioend->io_type || @@ -542,8 +525,18 @@ xfs_add_to_ioend( wpc->ioend->io_buffer_tail->b_private = bh; wpc->ioend->io_buffer_tail = bh; } - bh->b_private = NULL; + +retry: + if (!wpc->ioend->io_bio) + wpc->ioend->io_bio = xfs_alloc_ioend_bio(bh); + + if (xfs_bio_add_buffer(wpc->ioend->io_bio, bh) != bh->b_size) { + xfs_submit_ioend_bio(wbc, wpc->ioend, wpc->ioend->io_bio); + wpc->ioend->io_bio = NULL; + goto retry; + } + wpc->ioend->io_size += bh->b_size; wpc->last_block = bh->b_blocknr; xfs_start_buffer_writeback(bh); @@ -803,7 +796,7 @@ xfs_writepage_map( lock_buffer(bh); if (wpc->io_type != XFS_IO_OVERWRITE) xfs_map_at_offset(inode, bh, &wpc->imap, offset); - xfs_add_to_ioend(inode, bh, offset, wpc, &submit_list); + xfs_add_to_ioend(inode, bh, offset, wpc, wbc, &submit_list); count++; } diff --git a/fs/xfs/xfs_aops.h b/fs/xfs/xfs_aops.h index 4e01bd5..c89c3bd 100644 --- a/fs/xfs/xfs_aops.h +++ b/fs/xfs/xfs_aops.h @@ -52,6 +52,7 @@ typedef struct xfs_ioend { xfs_off_t io_offset; /* offset in the file */ struct work_struct io_work; /* xfsdatad work queue */ struct xfs_trans *io_append_trans;/* xact. for size update */ + struct bio *io_bio; /* bio being built */ } xfs_ioend_t; extern const struct address_space_operations xfs_address_space_operations; -- 2.1.4 From BATV+9519ba4b1f2b6df28a9c+4588+infradead.org+hch@casper.srs.infradead.org Wed Mar 16 06:44:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 250957CF5 for ; Wed, 16 Mar 2016 06: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 95DF6AC002 for ; Wed, 16 Mar 2016 04:44:49 -0700 (PDT) X-ASG-Debug-ID: 1458128685-04bdf002ec51b680001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id hTEhq4ejbN4Idsde (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 16 Mar 2016 04:44:46 -0700 (PDT) X-Barracuda-Envelope-From: BATV+9519ba4b1f2b6df28a9c+4588+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85 #2 (Red Hat Linux)) id 1ag9sb-0000U3-Ai; Wed, 16 Mar 2016 11:44:45 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: bfoster@redhat.com Subject: [PATCH 3/3] xfs: optimize bio handling in the buffer writeback path Date: Wed, 16 Mar 2016 12:44:41 +0100 X-ASG-Orig-Subj: [PATCH 3/3] xfs: optimize bio handling in the buffer writeback path Message-Id: <1458128681-10869-4-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1458128681-10869-1-git-send-email-hch@lst.de> References: <1458128681-10869-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1458128686 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27895 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This patch implements two closely related changes: First it embedds a bio the ioend structure so that we don't have to allocate one separately. Second it uses the block layer bio chaining mechanism to chain additional bios off this first one if needed instead of manually accouting for multiple bio completions in the ioend structure. Together this removes a memory allocation per ioend and greatly simplifies the ioend setup and I/O completion path. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_aops.c | 247 ++++++++++++++++++++++++----------------------------- fs/xfs/xfs_aops.h | 15 ++-- fs/xfs/xfs_super.c | 26 ++---- 3 files changed, 123 insertions(+), 165 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 5928770..42e7368 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -124,18 +124,25 @@ next_bh: */ STATIC void xfs_destroy_ioend( - struct xfs_ioend *ioend) + struct xfs_ioend *ioend, + int error) { struct inode *inode = ioend->io_inode; - int error = ioend->io_error; + struct bio *last = ioend->io_bio; struct bio *bio, *next; - for (bio = ioend->io_bio_done; bio; bio = next) { + for (bio = &ioend->io_inline_bio; bio; bio = next) { struct bio_vec *bvec; int i; - next = bio->bi_private; - bio->bi_private = NULL; + /* + * For the last bio, bi_private points to the ioend, so we + * need to explicitly end the iteration here. + */ + if (bio == last) + next = NULL; + else + next = bio->bi_private; /* walk each page on bio, ending page IO on them */ bio_for_each_segment_all(bvec, bio, i) @@ -143,8 +150,6 @@ xfs_destroy_ioend( bio_put(bio); } - - mempool_free(ioend, xfs_ioend_pool); } /* @@ -218,7 +223,8 @@ xfs_setfilesize( STATIC int xfs_setfilesize_ioend( - struct xfs_ioend *ioend) + struct xfs_ioend *ioend, + int error) { struct xfs_inode *ip = XFS_I(ioend->io_inode); struct xfs_trans *tp = ioend->io_append_trans; @@ -232,53 +238,32 @@ xfs_setfilesize_ioend( __sb_writers_acquired(VFS_I(ip)->i_sb, SB_FREEZE_FS); /* we abort the update if there was an IO error */ - if (ioend->io_error) { + if (error) { xfs_trans_cancel(tp); - return ioend->io_error; + return error; } return xfs_setfilesize(ip, tp, ioend->io_offset, ioend->io_size); } /* - * Schedule IO completion handling on the final put of an ioend. - * - * If there is no work to do we might as well call it a day and free the - * ioend right now. - */ -STATIC void -xfs_finish_ioend( - struct xfs_ioend *ioend) -{ - if (atomic_dec_and_test(&ioend->io_remaining)) { - struct xfs_mount *mp = XFS_I(ioend->io_inode)->i_mount; - - if (ioend->io_type == XFS_IO_UNWRITTEN) - queue_work(mp->m_unwritten_workqueue, &ioend->io_work); - else if (ioend->io_append_trans) - queue_work(mp->m_data_workqueue, &ioend->io_work); - else - xfs_destroy_ioend(ioend); - } -} - -/* * IO write completion. */ STATIC void xfs_end_io( struct work_struct *work) { - xfs_ioend_t *ioend = container_of(work, xfs_ioend_t, io_work); - struct xfs_inode *ip = XFS_I(ioend->io_inode); - int error = 0; + struct xfs_ioend *ioend = + container_of(work, struct xfs_ioend, io_work); + struct xfs_inode *ip = XFS_I(ioend->io_inode); + int error = ioend->io_bio->bi_error; /* * Set an error if the mount has shut down and proceed with end I/O * processing so it can perform whatever cleanups are necessary. */ if (XFS_FORCED_SHUTDOWN(ip->i_mount)) - ioend->io_error = -EIO; + error = -EIO; /* * For unwritten extents we need to issue transactions to convert a @@ -288,50 +273,33 @@ xfs_end_io( * on error. */ if (ioend->io_type == XFS_IO_UNWRITTEN) { - if (ioend->io_error) + if (error) goto done; error = xfs_iomap_write_unwritten(ip, ioend->io_offset, ioend->io_size); } else if (ioend->io_append_trans) { - error = xfs_setfilesize_ioend(ioend); + error = xfs_setfilesize_ioend(ioend, error); } else { ASSERT(!xfs_ioend_is_append(ioend)); } done: - if (error) - ioend->io_error = error; - xfs_destroy_ioend(ioend); + xfs_destroy_ioend(ioend, error); } -/* - * Allocate and initialise an IO completion structure. - * We need to track unwritten extent write completion here initially. - * We'll need to extend this for updating the ondisk inode size later - * (vs. incore size). - */ -STATIC xfs_ioend_t * -xfs_alloc_ioend( - struct inode *inode, - unsigned int type) +STATIC void +xfs_end_bio( + struct bio *bio) { - xfs_ioend_t *ioend; - - ioend = mempool_alloc(xfs_ioend_pool, GFP_NOFS); - memset(ioend, 0, sizeof(*ioend)); + struct xfs_ioend *ioend = bio->bi_private; + struct xfs_mount *mp = XFS_I(ioend->io_inode)->i_mount; - /* - * Set the count to 1 initially, which will prevent an I/O - * completion callback from happening before we have started - * all the I/O from calling the completion routine too early. - */ - atomic_set(&ioend->io_remaining, 1); - INIT_LIST_HEAD(&ioend->io_list); - ioend->io_type = type; - ioend->io_inode = inode; - INIT_WORK(&ioend->io_work, xfs_end_io); - spin_lock_init(&ioend->io_lock); - return ioend; + if (ioend->io_type == XFS_IO_UNWRITTEN) + queue_work(mp->m_unwritten_workqueue, &ioend->io_work); + else if (ioend->io_append_trans) + queue_work(mp->m_data_workqueue, &ioend->io_work); + else + xfs_destroy_ioend(ioend, bio->bi_error); } STATIC int @@ -403,56 +371,6 @@ xfs_imap_valid( offset < imap->br_startoff + imap->br_blockcount; } -/* - * BIO completion handler for buffered IO. - */ -STATIC void -xfs_end_bio( - struct bio *bio) -{ - struct xfs_ioend *ioend = bio->bi_private; - unsigned long flags; - - bio->bi_private = NULL; - bio->bi_end_io = NULL; - - spin_lock_irqsave(&ioend->io_lock, flags); - if (!ioend->io_error) - ioend->io_error = bio->bi_error; - if (!ioend->io_bio_done) - ioend->io_bio_done = bio; - else - ioend->io_bio_done_tail->bi_private = bio; - ioend->io_bio_done_tail = bio; - spin_unlock_irqrestore(&ioend->io_lock, flags); - - xfs_finish_ioend(ioend); -} - -STATIC void -xfs_submit_ioend_bio( - struct writeback_control *wbc, - xfs_ioend_t *ioend, - struct bio *bio) -{ - atomic_inc(&ioend->io_remaining); - bio->bi_private = ioend; - bio->bi_end_io = xfs_end_bio; - submit_bio(wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE, bio); -} - -STATIC struct bio * -xfs_alloc_ioend_bio( - struct buffer_head *bh) -{ - struct bio *bio = bio_alloc(GFP_NOIO, BIO_MAX_PAGES); - - ASSERT(bio->bi_private == NULL); - bio->bi_iter.bi_sector = bh->b_blocknr * (bh->b_size >> 9); - bio->bi_bdev = bh->b_bdev; - return bio; -} - STATIC void xfs_start_buffer_writeback( struct buffer_head *bh) @@ -513,16 +431,19 @@ static inline int xfs_bio_add_buffer(struct bio *bio, struct buffer_head *bh) STATIC int xfs_submit_ioend( struct writeback_control *wbc, - xfs_ioend_t *ioend, + struct xfs_ioend *ioend, int status) { /* Reserve log space if we might write beyond the on-disk inode size. */ if (!status && - ioend->io_bio && ioend->io_type != XFS_IO_UNWRITTEN && + ioend->io_type != XFS_IO_UNWRITTEN && xfs_ioend_is_append(ioend) && !ioend->io_append_trans) status = xfs_setfilesize_trans_alloc(ioend); + ioend->io_bio->bi_private = ioend; + ioend->io_bio->bi_end_io = xfs_end_bio; + /* * If we are failing the IO now, just mark the ioend with an * error and finish it. This will run IO completion immediately @@ -530,19 +451,75 @@ xfs_submit_ioend( * time. */ if (status) { - if (ioend->io_bio) - bio_put(ioend->io_bio); - ioend->io_error = status; - xfs_finish_ioend(ioend); + ioend->io_bio->bi_error = status; + bio_endio(ioend->io_bio); return status; } - xfs_submit_ioend_bio(wbc, ioend, ioend->io_bio); - ioend->io_bio = NULL; - xfs_finish_ioend(ioend); + submit_bio(wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE, + ioend->io_bio); return 0; } +static void +xfs_init_bio_from_bh( + struct bio *bio, + struct buffer_head *bh) +{ + bio->bi_iter.bi_sector = bh->b_blocknr * (bh->b_size >> 9); + bio->bi_bdev = bh->b_bdev; +} + +static struct xfs_ioend * +xfs_alloc_ioend( + struct inode *inode, + unsigned int type, + xfs_off_t offset, + struct buffer_head *bh) +{ + struct xfs_ioend *ioend; + struct bio *bio; + + bio = bio_alloc_bioset(GFP_NOFS, BIO_MAX_PAGES, xfs_ioend_bioset); + xfs_init_bio_from_bh(bio, bh); + + ioend = container_of(bio, struct xfs_ioend, io_inline_bio); + INIT_LIST_HEAD(&ioend->io_list); + ioend->io_type = type; + ioend->io_inode = inode; + ioend->io_size = 0; + ioend->io_offset = offset; + INIT_WORK(&ioend->io_work, xfs_end_io); + ioend->io_append_trans = NULL; + ioend->io_bio = bio; + return ioend; +} + +/* + * Allocate a new bio, and chain the old bio to the new one. + * + * Note that we have to do perform the chaining in this unintuitive order + * so that the bi_private linkage is set up in the right direction for the + * traversal in xfs_destroy_ioend(). + */ +static void +xfs_chain_bio( + struct xfs_ioend *ioend, + struct writeback_control *wbc, + struct buffer_head *bh) +{ + struct bio *new; + + new = bio_alloc(GFP_NOFS, BIO_MAX_PAGES); + xfs_init_bio_from_bh(new, bh); + + bio_chain(ioend->io_bio, new); + bio_get(ioend->io_bio); /* for xfs_destroy_ioend */ + submit_bio(wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE, + ioend->io_bio); + ioend->io_bio = new; +} + /* * Test to see if we've been building up a completion structure for * earlier buffers -- if so, we try to append to this ioend if we @@ -564,19 +541,15 @@ xfs_add_to_ioend( offset != wpc->ioend->io_offset + wpc->ioend->io_size) { if (wpc->ioend) list_add(&wpc->ioend->io_list, iolist); - wpc->ioend = xfs_alloc_ioend(inode, wpc->io_type); - wpc->ioend->io_offset = offset; + wpc->ioend = xfs_alloc_ioend(inode, wpc->io_type, offset, bh); } -retry: - if (!wpc->ioend->io_bio) - wpc->ioend->io_bio = xfs_alloc_ioend_bio(bh); - - if (xfs_bio_add_buffer(wpc->ioend->io_bio, bh) != bh->b_size) { - xfs_submit_ioend_bio(wbc, wpc->ioend, wpc->ioend->io_bio); - wpc->ioend->io_bio = NULL; - goto retry; - } + /* + * If the buffer doesn't fit into the bio we need to allocate a new + * one. This shouldn't happen more than once for a given buffer. + */ + while (xfs_bio_add_buffer(wpc->ioend->io_bio, bh) != bh->b_size) + xfs_chain_bio(wpc->ioend, wbc, bh); wpc->ioend->io_size += bh->b_size; wpc->last_block = bh->b_blocknr; diff --git a/fs/xfs/xfs_aops.h b/fs/xfs/xfs_aops.h index 1c7b041..8b5b641 100644 --- a/fs/xfs/xfs_aops.h +++ b/fs/xfs/xfs_aops.h @@ -18,7 +18,7 @@ #ifndef __XFS_AOPS_H__ #define __XFS_AOPS_H__ -extern mempool_t *xfs_ioend_pool; +extern struct bio_set *xfs_ioend_bioset; /* * Types of I/O for bmap clustering and I/O completion tracking. @@ -37,24 +37,19 @@ enum { { XFS_IO_OVERWRITE, "overwrite" } /* - * xfs_ioend struct manages large extent writes for XFS. - * It can manage several multi-page bio's at once. + * Structure for buffered I/O completions. */ -typedef struct xfs_ioend { +struct xfs_ioend { struct list_head io_list; /* next ioend in chain */ unsigned int io_type; /* delalloc / unwritten */ - int io_error; /* I/O error code */ - atomic_t io_remaining; /* hold count */ struct inode *io_inode; /* file being written to */ size_t io_size; /* size of the extent */ xfs_off_t io_offset; /* offset in the file */ struct work_struct io_work; /* xfsdatad work queue */ struct xfs_trans *io_append_trans;/* xact. for size update */ struct bio *io_bio; /* bio being built */ - struct bio *io_bio_done; /* bios completed */ - struct bio *io_bio_done_tail; /* bios completed */ - spinlock_t io_lock; /* for bio completion list */ -} xfs_ioend_t; + struct bio io_inline_bio; /* MUST BE LAST! */ +}; extern const struct address_space_operations xfs_address_space_operations; diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index d760934..e52e9c1 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -58,8 +58,7 @@ #include static const struct super_operations xfs_super_operations; -static kmem_zone_t *xfs_ioend_zone; -mempool_t *xfs_ioend_pool; +struct bio_set *xfs_ioend_bioset; static struct kset *xfs_kset; /* top-level xfs sysfs dir */ #ifdef DEBUG @@ -1688,20 +1687,15 @@ MODULE_ALIAS_FS("xfs"); STATIC int __init xfs_init_zones(void) { - - xfs_ioend_zone = kmem_zone_init(sizeof(xfs_ioend_t), "xfs_ioend"); - if (!xfs_ioend_zone) + xfs_ioend_bioset = bioset_create(4 * MAX_BUF_PER_PAGE, + offsetof(struct xfs_ioend, io_inline_bio)); + if (!xfs_ioend_bioset) goto out; - xfs_ioend_pool = mempool_create_slab_pool(4 * MAX_BUF_PER_PAGE, - xfs_ioend_zone); - if (!xfs_ioend_pool) - goto out_destroy_ioend_zone; - xfs_log_ticket_zone = kmem_zone_init(sizeof(xlog_ticket_t), "xfs_log_ticket"); if (!xfs_log_ticket_zone) - goto out_destroy_ioend_pool; + goto out_free_ioend_bioset; xfs_bmap_free_item_zone = kmem_zone_init(sizeof(xfs_bmap_free_item_t), "xfs_bmap_free_item"); @@ -1797,10 +1791,8 @@ xfs_init_zones(void) kmem_zone_destroy(xfs_bmap_free_item_zone); out_destroy_log_ticket_zone: kmem_zone_destroy(xfs_log_ticket_zone); - out_destroy_ioend_pool: - mempool_destroy(xfs_ioend_pool); - out_destroy_ioend_zone: - kmem_zone_destroy(xfs_ioend_zone); + out_free_ioend_bioset: + bioset_free(xfs_ioend_bioset); out: return -ENOMEM; } @@ -1826,9 +1818,7 @@ xfs_destroy_zones(void) kmem_zone_destroy(xfs_btree_cur_zone); kmem_zone_destroy(xfs_bmap_free_item_zone); kmem_zone_destroy(xfs_log_ticket_zone); - mempool_destroy(xfs_ioend_pool); - kmem_zone_destroy(xfs_ioend_zone); - + bioset_free(xfs_ioend_bioset); } STATIC int __init -- 2.1.4 From BATV+9519ba4b1f2b6df28a9c+4588+infradead.org+hch@casper.srs.infradead.org Wed Mar 16 06:44:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5E4D17CF5 for ; Wed, 16 Mar 2016 06:44:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 145F2304039 for ; Wed, 16 Mar 2016 04:44:49 -0700 (PDT) X-ASG-Debug-ID: 1458128684-04bdf002ed51b680001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id HeqBuiHFUvzqIBML (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 16 Mar 2016 04:44:46 -0700 (PDT) X-Barracuda-Envelope-From: BATV+9519ba4b1f2b6df28a9c+4588+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85 #2 (Red Hat Linux)) id 1ag9sa-0000Ty-Jv; Wed, 16 Mar 2016 11:44:44 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: bfoster@redhat.com, Dave Chinner Subject: [PATCH 2/3] xfs: don't release bios on completion immediately Date: Wed, 16 Mar 2016 12:44:40 +0100 X-ASG-Orig-Subj: [PATCH 2/3] xfs: don't release bios on completion immediately Message-Id: <1458128681-10869-3-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1458128681-10869-1-git-send-email-hch@lst.de> References: <1458128681-10869-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1458128685 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27895 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Completion of an ioend requires us to walk the bufferhead list to end writback on all the bufferheads. This, in turn, is needed so that we can end writeback on all the pages we just did IO on. To remove our dependency on bufferheads in writeback, we need to turn this around the other way - we need to walk the pages we've just completed IO on, and then walk the buffers attached to the pages and complete their IO. In doing this, we remove the requirement for the ioend to track bufferheads directly. To enable IO completion to walk all the pages we've submitted IO on, we need to keep the bios that we used for IO around until the ioend has been completed. We can do this simply by chaining the bios to the ioend at completion time, and then walking their pages directly just before destroying the ioend. Signed-off-by: Dave Chinner [hch: changed the xfs_finish_page_writeback calling convention] Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_aops.c | 95 +++++++++++++++++++++++++++++++++++++++---------------- fs/xfs/xfs_aops.h | 5 +-- 2 files changed, 71 insertions(+), 29 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 17cc6cc..5928770 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -84,20 +84,64 @@ xfs_find_bdev_for_inode( } /* - * We're now finished for good with this ioend structure. - * Update the page state via the associated buffer_heads, - * release holds on the inode and bio, and finally free - * up memory. Do not use the ioend after this. + * We're now finished for good with this page. Update the page state via the + * associated buffer_heads, paying attention to the start and end offsets that + * we need to process on the page. + */ +static void +xfs_finish_page_writeback( + struct inode *inode, + struct bio_vec *bvec, + int error) +{ + unsigned int blockmask = (1 << inode->i_blkbits) - 1; + unsigned int end = bvec->bv_offset + bvec->bv_len - 1; + struct buffer_head *head, *bh; + unsigned int off = 0; + + ASSERT(bvec->bv_offset < PAGE_SIZE); + ASSERT((bvec->bv_offset & blockmask) == 0); + ASSERT(end < PAGE_SIZE); + ASSERT((bvec->bv_len & blockmask) == 0); + + bh = head = page_buffers(bvec->bv_page); + + do { + if (off < bvec->bv_offset) + goto next_bh; + if (off > end) + break; + bh->b_end_io(bh, !error); +next_bh: + off += bh->b_size; + } while ((bh = bh->b_this_page) != head); +} + +/* + * We're now finished for good with this ioend structure. Update the page + * state, release holds on bios, and finally free up memory. Do not use the + * ioend after this. */ STATIC void xfs_destroy_ioend( - xfs_ioend_t *ioend) + struct xfs_ioend *ioend) { - struct buffer_head *bh, *next; + struct inode *inode = ioend->io_inode; + int error = ioend->io_error; + struct bio *bio, *next; + + for (bio = ioend->io_bio_done; bio; bio = next) { + struct bio_vec *bvec; + int i; + + next = bio->bi_private; + bio->bi_private = NULL; - for (bh = ioend->io_buffer_head; bh; bh = next) { - next = bh->b_private; - bh->b_end_io(bh, !ioend->io_error); + /* walk each page on bio, ending page IO on them */ + bio_for_each_segment_all(bvec, bio, i) + xfs_finish_page_writeback(inode, bvec, error); + + bio_put(bio); } mempool_free(ioend, xfs_ioend_pool); @@ -286,6 +330,7 @@ xfs_alloc_ioend( ioend->io_type = type; ioend->io_inode = inode; INIT_WORK(&ioend->io_work, xfs_end_io); + spin_lock_init(&ioend->io_lock); return ioend; } @@ -365,15 +410,21 @@ STATIC void xfs_end_bio( struct bio *bio) { - xfs_ioend_t *ioend = bio->bi_private; - - if (!ioend->io_error) - ioend->io_error = bio->bi_error; + struct xfs_ioend *ioend = bio->bi_private; + unsigned long flags; - /* Toss bio and pass work off to an xfsdatad thread */ bio->bi_private = NULL; bio->bi_end_io = NULL; - bio_put(bio); + + spin_lock_irqsave(&ioend->io_lock, flags); + if (!ioend->io_error) + ioend->io_error = bio->bi_error; + if (!ioend->io_bio_done) + ioend->io_bio_done = bio; + else + ioend->io_bio_done_tail->bi_private = bio; + ioend->io_bio_done_tail = bio; + spin_unlock_irqrestore(&ioend->io_lock, flags); xfs_finish_ioend(ioend); } @@ -511,21 +562,11 @@ xfs_add_to_ioend( if (!wpc->ioend || wpc->io_type != wpc->ioend->io_type || bh->b_blocknr != wpc->last_block + 1 || offset != wpc->ioend->io_offset + wpc->ioend->io_size) { - struct xfs_ioend *new; - if (wpc->ioend) list_add(&wpc->ioend->io_list, iolist); - - new = xfs_alloc_ioend(inode, wpc->io_type); - new->io_offset = offset; - new->io_buffer_head = bh; - new->io_buffer_tail = bh; - wpc->ioend = new; - } else { - wpc->ioend->io_buffer_tail->b_private = bh; - wpc->ioend->io_buffer_tail = bh; + wpc->ioend = xfs_alloc_ioend(inode, wpc->io_type); + wpc->ioend->io_offset = offset; } - bh->b_private = NULL; retry: if (!wpc->ioend->io_bio) diff --git a/fs/xfs/xfs_aops.h b/fs/xfs/xfs_aops.h index c89c3bd..1c7b041 100644 --- a/fs/xfs/xfs_aops.h +++ b/fs/xfs/xfs_aops.h @@ -46,13 +46,14 @@ typedef struct xfs_ioend { int io_error; /* I/O error code */ atomic_t io_remaining; /* hold count */ struct inode *io_inode; /* file being written to */ - struct buffer_head *io_buffer_head;/* buffer linked list head */ - struct buffer_head *io_buffer_tail;/* buffer linked list tail */ size_t io_size; /* size of the extent */ xfs_off_t io_offset; /* offset in the file */ struct work_struct io_work; /* xfsdatad work queue */ struct xfs_trans *io_append_trans;/* xact. for size update */ struct bio *io_bio; /* bio being built */ + struct bio *io_bio_done; /* bios completed */ + struct bio *io_bio_done_tail; /* bios completed */ + spinlock_t io_lock; /* for bio completion list */ } xfs_ioend_t; extern const struct address_space_operations xfs_address_space_operations; -- 2.1.4 From eguan@redhat.com Wed Mar 16 06:54:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4BF4B7CF3 for ; Wed, 16 Mar 2016 06:54:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B3EBFAC004 for ; Wed, 16 Mar 2016 04:54:04 -0700 (PDT) X-ASG-Debug-ID: 1458129242-04cb6c7f2b211260001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id c5Lpor2fCfyhpP8B (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 04:54:03 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 7F367C00071A; Wed, 16 Mar 2016 11:54:02 +0000 (UTC) Received: from localhost (dhcp-13-211.nay.redhat.com [10.66.13.211]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GBs1JT023656; Wed, 16 Mar 2016 07:54:01 -0400 From: Eryu Guan To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com, Eryu Guan Subject: [PATCH] xfs/073: filter out finobt warning from mkfs.xfs Date: Wed, 16 Mar 2016 19:53:24 +0800 X-ASG-Orig-Subj: [PATCH] xfs/073: filter out finobt warning from mkfs.xfs Message-Id: <1458129204-31882-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458129243 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 When testing xfs/073 with MKFS_OPTIONS="-m crc=1,finobt=1" set, it fails due to extra warning about disabling finobt feature: +warning: finobt not supported without CRC support, disabled. Because xfs/073 disables crc unconditionally and finobt can not be enabled either. Signed-off-by: Eryu Guan --- tests/xfs/073 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tests/xfs/073 b/tests/xfs/073 index e1335df..909231b 100755 --- a/tests/xfs/073 +++ b/tests/xfs/073 @@ -61,6 +61,11 @@ _filter_path() sed -e "s,$1,,g" | LC_COLLATE=POSIX sort } +filter_finobt_warn() +{ + sed -e "s/warning: finobt .*without CRC.*disabled.//" +} + _populate_scratch() { POSIXLY_CORRECT=yes \ @@ -138,7 +143,8 @@ _require_loop rm -f $seqres.full -_scratch_mkfs_xfs -m crc=0 -dsize=41m,agcount=2 | _filter_mkfs 2>/dev/null +_scratch_mkfs_xfs -m crc=0 -dsize=41m,agcount=2 2>&1 | filter_finobt_warn | \ + _filter_mkfs 2>/dev/null _scratch_mount 2>/dev/null || _fail "initial scratch mount failed" echo -- 2.5.0 From BATV+5569ef098222fddc2386+4588+infradead.org+hch@bombadil.srs.infradead.org Wed Mar 16 07:04:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 77EE67CF5 for ; Wed, 16 Mar 2016 07:04:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id CDCE8AC002 for ; Wed, 16 Mar 2016 05:04:34 -0700 (PDT) X-ASG-Debug-ID: 1458129869-04cb6c7f2a2116f0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id wXdwPjrTkozeqC8G (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 16 Mar 2016 05:04:29 -0700 (PDT) X-Barracuda-Envelope-From: BATV+5569ef098222fddc2386+4588+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 1agABU-0005kh-CV; Wed, 16 Mar 2016 12:04:16 +0000 Date: Wed, 16 Mar 2016 05:04:16 -0700 From: Christoph Hellwig To: Eryu Guan Cc: fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs/073: filter out finobt warning from mkfs.xfs Message-ID: <20160316120416.GA18030@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs/073: filter out finobt warning from mkfs.xfs References: <1458129204-31882-1-git-send-email-eguan@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1458129204-31882-1-git-send-email-eguan@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458129869 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27895 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Mar 16, 2016 at 07:53:24PM +0800, Eryu Guan wrote: > When testing xfs/073 with MKFS_OPTIONS="-m crc=1,finobt=1" set, it fails > due to extra warning about disabling finobt feature: > > +warning: finobt not supported without CRC support, disabled. > > Because xfs/073 disables crc unconditionally and finobt can not be > enabled either. How about explicitly disabling finobt as well? From BATV+5569ef098222fddc2386+4588+infradead.org+hch@bombadil.srs.infradead.org Wed Mar 16 07:05:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A28137CF5 for ; Wed, 16 Mar 2016 07:05:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4FBE48F8033 for ; Wed, 16 Mar 2016 05:05:23 -0700 (PDT) X-ASG-Debug-ID: 1458129921-04bdf002ed51c230001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 81aZMo0MWEIt1wix (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 16 Mar 2016 05:05:21 -0700 (PDT) X-Barracuda-Envelope-From: BATV+5569ef098222fddc2386+4588+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 1agACK-0006WV-P1; Wed, 16 Mar 2016 12:05:08 +0000 Date: Wed, 16 Mar 2016 05:05:08 -0700 From: Christoph Hellwig To: Eryu Guan Cc: fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] fstests: make xfs/006 generic Message-ID: <20160316120508.GA22668@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] fstests: make xfs/006 generic References: <1458120654-27284-1-git-send-email-eguan@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1458120654-27284-1-git-send-email-eguan@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458129921 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com 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, MARKETING_SUBJECT, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27895 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From bfoster@redhat.com Wed Mar 16 07:31:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 955587CFB for ; Wed, 16 Mar 2016 07:31:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6601A8F8035 for ; Wed, 16 Mar 2016 05:31:18 -0700 (PDT) X-ASG-Debug-ID: 1458131476-04cb6c7f292123e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ZDZDXCCOCC9nrzYs (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 05:31: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-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 8DD5D2563 for ; Wed, 16 Mar 2016 12:31:16 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-24.bos.redhat.com [10.18.41.24]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GCVFsa017106; Wed, 16 Mar 2016 08:31:16 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 135D7125517; Wed, 16 Mar 2016 08:31:15 -0400 (EDT) Date: Wed, 16 Mar 2016 08:31:14 -0400 From: Brian Foster To: Zorro Lang Cc: xfs@oss.sgi.com Subject: Re: [PATCH] io/mmap: new -s option for mmap command to reserve some free space Message-ID: <20160316123113.GB8096@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] io/mmap: new -s option for mmap command to reserve some free space References: <1458119884-17942-1-git-send-email-zlang@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1458119884-17942-1-git-send-email-zlang@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458131477 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Mar 16, 2016 at 05:18:04PM +0800, Zorro Lang wrote: > This patch come from a test likes below: > xfs_io -t -f > -c "truncate 10000" > -c "mmap -rw 0 1024" > -c "mremap 8192" > file > > mremap always hit ENOMEM error, when it try to remap more space > without MREMAP_MAYMOVE flag. This's a normal condition, due to > no free space after mapped 1024 bytes region. > > But if we try to mremap from the original mapped starting point in > a C program, at first we always do: > > addr = mmap(NULL, res_size, prot, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); > munmap(addr, res_size); > > Then do: > > addr = mmap(addr, real_len, ...); > > The "res_size" is bigger than "real_len". This will help us get a > region between real_len and res_size, which maybe free space. The > truth is we can't guarantee that this free memory will stay free. > But this method is still very helpful for reserve some free space > in short time. > > After merge this patch, we can resolve above mremap problem by run: > xfs_io -t -f > ... > -c "mmap -rw -s 8192 0 1024" > -c "mremap 8192" > ... > > Although we can't sure it's useful 100%, it really have pretty high > success rate. > > Signed-off-by: Zorro Lang > --- I'm a little curious why one would use this as opposed to 'mremap -m' in the context of xfs_io (it certainly might make sense for an application). It sounds like any xfstests tests, for example, that is susceptible to this problem might want to use -m even if -s is employed as well. Can you provide any additional context on this or do you have a use case in mind? That said, I'm not against adding this to the xfs_io toolbox and the code looks Ok to me: Reviewed-by: Brian Foster > io/mmap.c | 29 +++++++++++++++++++++++------ > man/man8/xfs_io.8 | 17 ++++++++++++++++- > 2 files changed, 39 insertions(+), 7 deletions(-) > > diff --git a/io/mmap.c b/io/mmap.c > index 5970069..6cd37a9 100644 > --- a/io/mmap.c > +++ b/io/mmap.c > @@ -146,6 +146,7 @@ mmap_help(void) > " -r -- map with PROT_READ protection\n" > " -w -- map with PROT_WRITE protection\n" > " -x -- map with PROT_EXEC protection\n" > +" -s -- first do mmap(size)/munmap(size), try to reserve some free space\n" > " If no protection mode is specified, all are used by default.\n" > "\n")); > } > @@ -156,8 +157,8 @@ mmap_f( > char **argv) > { > off64_t offset; > - ssize_t length; > - void *address; > + ssize_t length = 0, length2 = 0; > + void *address = NULL; > char *filename; > size_t blocksize, sectsize; > int c, prot = 0; > @@ -181,7 +182,9 @@ mmap_f( > return 0; > } > > - while ((c = getopt(argc, argv, "rwx")) != EOF) { > + init_cvtnum(&blocksize, §size); > + > + while ((c = getopt(argc, argv, "rwxs:")) != EOF) { > switch (c) { > case 'r': > prot |= PROT_READ; > @@ -192,6 +195,9 @@ mmap_f( > case 'x': > prot |= PROT_EXEC; > break; > + case 's': > + length2 = cvtnum(blocksize, sectsize, optarg); > + break; > default: > return command_usage(&mmap_cmd); > } > @@ -202,7 +208,6 @@ mmap_f( > if (optind != argc - 2) > return command_usage(&mmap_cmd); > > - init_cvtnum(&blocksize, §size); > offset = cvtnum(blocksize, sectsize, argv[optind]); > if (offset < 0) { > printf(_("non-numeric offset argument -- %s\n"), argv[optind]); > @@ -221,7 +226,19 @@ mmap_f( > return 0; > } > > - address = mmap(NULL, length, prot, MAP_SHARED, file->fd, offset); > + /* > + * mmap and munmap memory area of length2 region is helpful to > + * make a region of extendible free memory. It's generally used > + * for later mremap operation(no MREMAP_MAYMOVE flag). But there > + * isn't guarantee that the memory after length (up to length2) > + * will stay free. > + */ > + if (length2 > length) { > + address = mmap(NULL, length2, prot, > + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); > + munmap(address, length2); > + } > + address = mmap(address, length, prot, MAP_SHARED, file->fd, offset); > if (address == MAP_FAILED) { > perror("mmap"); > free(filename); > @@ -647,7 +664,7 @@ mmap_init(void) > mmap_cmd.argmin = 0; > mmap_cmd.argmax = -1; > mmap_cmd.flags = CMD_NOMAP_OK | CMD_NOFILE_OK | CMD_FOREIGN_OK; > - mmap_cmd.args = _("[N] | [-rwx] [off len]"); > + mmap_cmd.args = _("[N] | [-rwx] [-s size] [off len]"); > mmap_cmd.oneline = > _("mmap a range in the current file, show mappings"); > mmap_cmd.help = mmap_help; > diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 > index 33fbe6a..93a8a00 100644 > --- a/man/man8/xfs_io.8 > +++ b/man/man8/xfs_io.8 > @@ -559,7 +559,7 @@ Do not print timing statistics at all. > > .SH MEMORY MAPPED I/O COMMANDS > .TP > -.BI "mmap [ " N " | [[ \-rwx ] " "offset length " ]] > +.BI "mmap [ " N " | [[ \-rwx ] [\-s " size " ] " "offset length " ]] > With no arguments, > .B mmap > shows the current mappings. Specifying a single numeric argument > @@ -575,6 +575,21 @@ PROT_WRITE > .RB ( \-w ), > and PROT_EXEC > .RB ( \-x ). > +.BI \-s " size" > +is used to do a mmap(size) && munmap(size) operation at first, try to reserve some > +extendible free memory space, if > +.I size > +is bigger than > +.I length > +parameter. But there's not guarantee that the memory after > +.I length > +( up to > +.I size > +) will stay free. > +.B e.g. > +"mmap -rw -s 8192 1024" will mmap 0 ~ 1024 bytes memory, but try to reserve 1024 ~ 8192 > +free space(no guarantee). This free space will helpful for "mremap 8192" without > +MREMAP_MAYMOVE flag. > .TP > .B mm > See the > -- > 2.5.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Wed Mar 16 07:31:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7A73D7CFB for ; Wed, 16 Mar 2016 07:31:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id EADB4AC002 for ; Wed, 16 Mar 2016 05:31:29 -0700 (PDT) X-ASG-Debug-ID: 1458131488-04bdf002ed51cec0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id xZfsr8ljxDtlRyZB (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 05:31:28 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 6C3FE4AD7D for ; Wed, 16 Mar 2016 12:31:28 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-24.bos.redhat.com [10.18.41.24]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GCVRrM005049; Wed, 16 Mar 2016 08:31:27 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id DB2D2125517; Wed, 16 Mar 2016 08:31:26 -0400 (EDT) Date: Wed, 16 Mar 2016 08:31:26 -0400 From: Brian Foster To: Zorro Lang Cc: xfs@oss.sgi.com Subject: Re: [PATCH] io/mremap: modify argument errors of mremap command Message-ID: <20160316123126.GC8096@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] io/mremap: modify argument errors of mremap command References: <1458120707-25219-1-git-send-email-zlang@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1458120707-25219-1-git-send-email-zlang@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458131488 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Mar 16, 2016 at 05:31:47PM +0800, Zorro Lang wrote: > There're 2 argument errors in mremap command: > 1. If run "mremap 1024 8192", it won't return error and try to > do "mremap 1024" silently. > > 2. The "-f" option can't be used, due to it need a new address > argument as the fifth argument of mremap() syscall(man mremap). > > This patch try to fix above two problems. > > Signed-off-by: Zorro Lang > --- A couple nits... > > Hi, > > I'm not sure pass a address argument to mremap command is right or > wrong. And maybe I should use strtoul() to instead of cvtnum() for > address argument. > > At least I did some simple test with this patch on my machine, results are: > "mremap -f 139946004389888 2048" PASS > "mremap -f 4096k 2048" PASS > "mremap -f 1g 2048" PASS > "mremap -f 4096 2048" FAIL as 'Permission denied' > > What do you think of this patch? > > Thanks, > Zorro > > > io/mmap.c | 22 +++++++++++++++------- > man/man8/xfs_io.8 | 5 ++++- > 2 files changed, 19 insertions(+), 8 deletions(-) > > diff --git a/io/mmap.c b/io/mmap.c > index 5970069..672ee61 100644 > --- a/io/mmap.c > +++ b/io/mmap.c > @@ -589,7 +589,7 @@ mremap_help(void) > "\n" > " Resizes the mappping, growing or shrinking from the current size.\n" > " The default stored value is 'X', repeated to fill the range specified.\n" > -" -f -- use the MREMAP_FIXED flag\n" > +" -f -- use the MREMAP_FIXED flag to mremap on the new address\n" Exceeds 80 chars. > " -m -- use the MREMAP_MAYMOVE flag\n" > "\n")); > } > @@ -600,15 +600,18 @@ mremap_f( > char **argv) > { > ssize_t new_length; > - void *new_addr; > + void *new_addr = NULL; > int flags = 0; > int c; > size_t blocksize, sectsize; > > - while ((c = getopt(argc, argv, "fm")) != EOF) { > + init_cvtnum(&blocksize, §size); > + > + while ((c = getopt(argc, argv, "f:m")) != EOF) { > switch (c) { > case 'f': > flags = MREMAP_FIXED|MREMAP_MAYMOVE; > + new_addr = (void *)cvtnum(blocksize, sectsize, optarg); > break; > case 'm': > flags = MREMAP_MAYMOVE; > @@ -618,7 +621,9 @@ mremap_f( > } > } > > - init_cvtnum(&blocksize, §size); > + if (optind != argc - 1) > + return command_usage(&mremap_cmd); > + > new_length = cvtnum(blocksize, sectsize, argv[optind]); > if (new_length < 0) { > printf(_("non-numeric offset argument -- %s\n"), > @@ -626,7 +631,10 @@ mremap_f( > return 0; > } > > - new_addr = mremap(mapping->addr, mapping->length, new_length, flags); > + if (!new_addr) > + new_addr = mremap(mapping->addr, mapping->length, new_length, flags); > + else > + new_addr = mremap(mapping->addr, mapping->length, new_length, flags, new_addr); Both mremap() calls above exceed 80 chars. Otherwise, this looks Ok to me: Reviewed-by: Brian Foster > if (new_addr == MAP_FAILED) > perror("mremap"); > else { > @@ -697,9 +705,9 @@ mmap_init(void) > mremap_cmd.altname = "mrm"; > mremap_cmd.cfunc = mremap_f; > mremap_cmd.argmin = 1; > - mremap_cmd.argmax = 2; > + mremap_cmd.argmax = 3; > mremap_cmd.flags = CMD_NOFILE_OK | CMD_FOREIGN_OK; > - mremap_cmd.args = _("[-m|-f] newsize"); > + mremap_cmd.args = _("[-m|-f ] newsize"); > mremap_cmd.oneline = > _("alters the size of the current memory mapping"); > mremap_cmd.help = mremap_help; > diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 > index 33fbe6a..984b551 100644 > --- a/man/man8/xfs_io.8 > +++ b/man/man8/xfs_io.8 > @@ -581,7 +581,7 @@ See the > .B mmap > command. > .TP > -.BI "mremap [ \-f ] [ \-m ] " new_length > +.BI "mremap [ \-f ] [ \-m ] " new_length > Changes the current mapping size to > .IR new_length . > Whether the mapping may be moved is controlled by the flags passed; > @@ -589,6 +589,9 @@ MREMAP_FIXED > .RB ( \-f ), > or MREMAP_MAYMOVE > .RB ( \-m ). > +.IR new_length > +specifies a page-aligned address to which the mapping must be moved. It > +can be setted to 139946004389888, 4096k or 1g etc. > .TP > .B mrm > See the > -- > 2.5.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From weber@zbfmail.de Wed Mar 16 08:03:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 C87337CF5 for ; Wed, 16 Mar 2016 08:03:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 80789304039 for ; Wed, 16 Mar 2016 06:03:33 -0700 (PDT) X-ASG-Debug-ID: 1458133408-04bdf002ec51dfb0001-NocioJ Received: from mail.zbfmail.de (mail.zbfmail.de [176.9.84.12]) by cuda.sgi.com with ESMTP id 0W7kmtyeFoRkZ1Zv (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 06:03:30 -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 685EE10C0BB; Wed, 16 Mar 2016 14:03:28 +0100 (CET) DKIM-Filter: OpenDKIM Filter v2.10.3 mail.zbfmail.de 685EE10C0BB DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zbfmail.de; s=dkim; t=1458133408; bh=3HBSjX3NIaqTQOrCBv4t9+mF+OUnGyKGz2lFFd+RxI0=; h=Date:From:To:Cc:Subject:Reply-To:In-Reply-To:References; b=HgfnGpS7+hpTZKd4EUQZIjErezWzY4Sa82VGU0G8ayeolTjQtxQRObIoIB+a4TYOH AcmWgm1DC69oeBOO0m5kmbkdcdDhcwB10zybY18CxtWcvaIQBzE+ofO5NFJ3eM/dfo U2eCbkesOCfzHRnaJPSTp1S7jIHN44VbR/HQMdEI= MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit Date: Wed, 16 Mar 2016 14:03:28 +0100 From: Marko Weber | 8000 To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: an mount option question and dunno if right here... Organization: zbf mail X-ASG-Orig-Subj: Re: an mount option question and dunno if right here... Reply-To: weber@zbfmail.de Mail-Reply-To: weber@zbfmail.de In-Reply-To: <56E1A8B1.2080800@sandeen.net> References: <08297acdf77244b468e15458f3d78327@zbfmail.de> <56E1A8B1.2080800@sandeen.net> Message-ID: X-Sender: weber@zbfmail.de User-Agent: Roundcube zbfmail Webmail X-DCC-INFN-TO-Metrics: mailserver 1233; Body=2 Fuz1=2 Fuz2=2 X-Barracuda-Connect: mail.zbfmail.de[176.9.84.12] X-Barracuda-Start-Time: 1458133409 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27896 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Am 2016-03-10 18:02, schrieb Eric Sandeen: > On 3/9/16 4:35 AM, Marko Weber | 8000 wrote: >> >> >> hello list, >> >> my drives are all xfs formatted. >> in fstab i set: >> >> lazytime,logbsize=256k,logbufs=8 >> >> >> when i call "mount" on console i get: >> >> >> rw,relatime,lazytime,attr2,inode64,logbufs=8,logbsize=256k,sunit=1024,swidth=3072,noquota >> >> >> Why is relatime listed? Or is lazytime override this setting? >> Even when i set "norelatime" in /etc/fstab i get "relatime" listed on >> 'mount' >> >> Or am i wrong here with this question? is this not xfs related? >> anyway, for any hints or suggestions i am thankful > > lazytime is not a valid xfs mount option: > > [root ~]# mount -o lazytime /dev/sdb1 /mnt/test > mount: wrong fs type, bad option, bad superblock on /dev/sdb1, > missing codepage or helper program, or other error > In some cases useful info is found in syslog - try > dmesg | tail or so > > [root ~]# dmesg | tail -n 1 > [645779.811802] XFS (sdb1): unknown mount option [lazytime]. > > I'm guessing this is your root fs? xfs today will silently ignore > unknown mount options on remount (patches to fix that are upstream), > and the root fs may get remounted w/ fstab options. So presumably > that's how you got lazytime into the mount output, especially if > it's looking at /etc/mtab. Look in /proc/mounts; I doubt you'll > see "lazytime" for this filesystem: > > [root ~]# mount /dev/sdb1 /mnt/test > [root ~]# mount -o remount,lazytime /mnt/test > > [root ~]# grep sdb1 /etc/mtab /proc/mounts > /etc/mtab:/dev/sdb1 /mnt/test xfs rw,lazytime 0 0 > /proc/mounts:/dev/sdb1 /mnt/test xfs > rw,seclabel,relatime,attr2,inode64,noquota 0 0 Hi Eric, my /etc/fstab entry: /dev/VolGroup01/wiso /raid5/wiso xfs norelatime,lazytime # mount: /dev/mapper/VolGroup01-wiso on /raid5/wiso type xfs (rw,relatime,lazytime,attr2,inode64,logbufs=8,logbsize=256k,sunit=1024,swidth=3072,noquota) cat /proc/mounts: /dev/mapper/VolGroup01-wiso /raid5/wiso xfs rw,lazytime,relatime,attr2,inode64,logbufs=8,logbsize=256k,sunit=1024,swidth=3072,noquota 0 0 > > -Eric > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From spatel@omnifone.com Wed Mar 16 08:16:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BD7A47D01 for ; Wed, 16 Mar 2016 08:16:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 877C5304043 for ; Wed, 16 Mar 2016 06:16:15 -0700 (PDT) X-ASG-Debug-ID: 1458134171-04cb6c7f2a213730001-NocioJ Received: from mail1.bemta3.messagelabs.com (mail1.bemta3.messagelabs.com [195.245.230.176]) by cuda.sgi.com with ESMTP id q3h3pwd9Flp1rPxN (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 06:16:12 -0700 (PDT) X-Barracuda-Envelope-From: spatel@omnifone.com X-Barracuda-Apparent-Source-IP: 195.245.230.176 Received: from [195.245.230.131] by server-16.bemta-3.messagelabs.com id 29/45-02994-A9C59E65; Wed, 16 Mar 2016 13:16:10 +0000 X-Env-Sender: spatel@omnifone.com X-Msg-Ref: server-15.tower-78.messagelabs.com!1458134170!13805918!1 X-Originating-IP: [195.54.58.132] X-StarScan-Received: X-StarScan-Version: 8.11; banners=omnifone.com,-,- X-VirusChecked: Checked Received: (qmail 14956 invoked from network); 16 Mar 2016 13:16:10 -0000 Received: from brookgreen.ribob01.net (HELO EXFE2IS02.omnifone.com) (195.54.58.132) by server-15.tower-78.messagelabs.com with AES128-SHA encrypted SMTP; 16 Mar 2016 13:16:10 -0000 Received: from EXBE1IS02.omnifone.com ([::1]) by EXFE2IS02.omnifone.com ([::1]) with mapi id 14.01.0438.000; Wed, 16 Mar 2016 13:16:10 +0000 From: Sandeep Patel To: Emmanuel Florac CC: "xfs@oss.sgi.com" Subject: RE: XFS corruptions Thread-Topic: XFS corruptions X-ASG-Orig-Subj: RE: XFS corruptions Thread-Index: AdErjxENXmHY5tPxRXq2ndhekRd0vAABy5kAAAAX3HAAAi4uAAAkewtgAAN7poAAAFYU0AHGx3oQAAGTUQAFtVpUkACS5xgADMCm+aA= Date: Wed, 16 Mar 2016 13:15:59 +0000 Deferred-Delivery: Wed, 16 Mar 2016 13:15:00 +0000 Message-ID: <558408F298C8CE4C89D93BD56AB474E8018621BE9E@EXBE1IS02.omnifone.com> References: <558408F298C8CE4C89D93BD56AB474E8018617B2B3@EXBE1IS02.omnifone.com> <20151130184048.3fa123e0@harpe.intellique.com> <558408F298C8CE4C89D93BD56AB474E8018617B3A6@EXBE1IS02.omnifone.com> <20151130194554.6140bf30@harpe.intellique.com> <558408F298C8CE4C89D93BD56AB474E8018617C636@EXBE1IS02.omnifone.com> <20151201145011.6df02063@harpe.intellique.com> <558408F298C8CE4C89D93BD56AB474E8018618503B@EXBE1IS02.omnifone.com> <20151210164640.78a13865@harpe.intellique.com> <558408F298C8CE4C89D93BD56AB474E801861CBD2B@EXBE1IS02.omnifone.com> <20160111161602.0c8413ca@harpe.intellique.com> In-Reply-To: <20160111161602.0c8413ca@harpe.intellique.com> Accept-Language: en-GB, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.60.0.80] Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-Barracuda-Connect: mail1.bemta3.messagelabs.com[195.245.230.176] X-Barracuda-Start-Time: 1458134172 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/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=BSF_SC0_MISMATCH_TO, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27896 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header SGkgRW1tYW51ZWwsCgpJdCBzZWVtcyB5b3Ugd2VyZSBjb3JyZWN0LiBPdXIgY2x1c3RlciBzZWVt cyB0byBiZSBtdWNoIG1vcmUgc3RhYmxlIHNpbmNlIHRoZSBrZXJuZWwgdXBncmFkZS4KClRoYW5r IHlvdSB2ZXJ5IG11Y2ggZm9yIHlvdXIgaGVscC4gUmVhbGx5IGFwcHJlY2lhdGUgaXQuCgpLaW5k IFJlZ2FyZHMKU2FuZGVlcAoKLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0KRnJvbTogRW1tYW51 ZWwgRmxvcmFjIFttYWlsdG86ZWZsb3JhY0BpbnRlbGxpcXVlLmNvbV0gClNlbnQ6IDExIEphbnVh cnkgMjAxNiAxNToxNgpUbzogU2FuZGVlcCBQYXRlbApDYzogeGZzQG9zcy5zZ2kuY29tClN1Ympl Y3Q6IFJlOiBYRlMgY29ycnVwdGlvbnMKCkxlIE1vbiwgMTEgSmFuIDIwMTYgMTQ6MjA6MTIgKzAw MDAKU2FuZGVlcCBQYXRlbCA8c3BhdGVsQG9tbmlmb25lLmNvbT4gw6ljcml2YWl0OgoKPiBIaSBF bW1hbnVlbCwKPiAKPiBJIGhhdmUgbWFuYWdlZCB0byB1cGdyYWRlIG91ciBrZXJuZWwgdG8gMy44 LjEzLTExOC4yLjIuZWw2dWVrLng4Nl82NCAKPiB3aGljaCB3YXMgdGhlIGxhdGVzdCBhdmFpbGFi bGUgb24gb3VyIHJlcG8uIEkgd2lsbCBsZXQgeW91IGtub3cgaG93IEkgCj4gZ2V0IG9uLgo+IAoK T0suIEknbSBwcmV0dHkgY29uZmlkZW50IGl0IHNob3VsZCBlbmhhbmNlIHRoZSBzaXR1YXRpb24g OikKCi0tCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpFbW1hbnVlbCBGbG9yYWMgICAgIHwgICBEaXJlY3Rpb24g dGVjaG5pcXVlCiAgICAgICAgICAgICAgICAgICAgfCAgIEludGVsbGlxdWUKICAgICAgICAgICAg ICAgICAgICB8CTxlZmxvcmFjQGludGVsbGlxdWUuY29tPgogICAgICAgICAgICAgICAgICAgIHwg ICArMzMgMSA3OCA5NCA4NCAwMgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCl9fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KVGhpcyBl bWFpbCBoYXMgYmVlbiBzY2FubmVkIGJ5IHRoZSBTeW1hbnRlYyBFbWFpbCBTZWN1cml0eS5jbG91 ZCBzZXJ2aWNlLgpGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2UgdmlzaXQgaHR0cDovL3d3dy5z eW1hbnRlY2Nsb3VkLmNvbSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgpfX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClRoaXMgZW1haWwg aGFzIGJlZW4gc2Nhbm5lZCBieSB0aGUgU3ltYW50ZWMgRW1haWwgU2VjdXJpdHkuY2xvdWQgc2Vy dmljZS4KRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHZpc2l0IGh0dHA6Ly93d3cuc3ltYW50 ZWNjbG91ZC5jb20KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXwo= From sandeen@sandeen.net Wed Mar 16 08:48:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3D7A27CA0 for ; Wed, 16 Mar 2016 08:48:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 00E858F8040 for ; Wed, 16 Mar 2016 06:48:18 -0700 (PDT) X-ASG-Debug-ID: 1458136094-04cb6c7f292148a0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 616QNEoHNMIe1fCD for ; Wed, 16 Mar 2016 06:48:14 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id C3DFE55A; Wed, 16 Mar 2016 08:48:11 -0500 (CDT) Subject: Re: an mount option question and dunno if right here... To: weber@zbfmail.de X-ASG-Orig-Subj: Re: an mount option question and dunno if right here... References: <08297acdf77244b468e15458f3d78327@zbfmail.de> <56E1A8B1.2080800@sandeen.net> Cc: xfs@oss.sgi.com From: Eric Sandeen Message-ID: <56E9641D.7010203@sandeen.net> Date: Wed, 16 Mar 2016 08:48:13 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1458136094 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27897 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 3/16/16 8:03 AM, Marko Weber | 8000 wrote: > > Hi Eric, > > > my /etc/fstab entry: > > /dev/VolGroup01/wiso /raid5/wiso xfs norelatime,lazytime > > > > # mount: > > > /dev/mapper/VolGroup01-wiso on /raid5/wiso type xfs (rw,relatime,lazytime,attr2,inode64,logbufs=8,logbsize=256k,sunit=1024,swidth=3072,noquota) > > > cat /proc/mounts: > > /dev/mapper/VolGroup01-wiso /raid5/wiso xfs rw,lazytime,relatime,attr2,inode64,logbufs=8,logbsize=256k,sunit=1024,swidth=3072,noquota 0 0 > Ok, I stand corrected, sorry; I forgot about this: commit 0ae45f63d4ef8d8eeec49c7d8b44a1775fff13e8 Author: Theodore Ts'o Date: Mon Feb 2 00:37:00 2015 -0500 vfs: add support for a lazytime mount option -Eric From zlang@redhat.com Wed Mar 16 08:53:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 44B897CA0 for ; Wed, 16 Mar 2016 08:53:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A2416AC001 for ; Wed, 16 Mar 2016 06:53:47 -0700 (PDT) X-ASG-Debug-ID: 1458136425-04cb6c7f28214c30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id MXXkGRtOJiBuPHUx (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 06:53:46 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 5F92D12B35 for ; Wed, 16 Mar 2016 13:53:45 +0000 (UTC) Received: from localhost (vpn1-6-215.pek2.redhat.com [10.72.6.215]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GDrikH001361; Wed, 16 Mar 2016 09:53:44 -0400 Date: Wed, 16 Mar 2016 21:53:43 +0800 From: Zorro Lang To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH] io/mmap: new -s option for mmap command to reserve some free space Message-ID: <20160316135343.GA2772@dhcp12-237.nay.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] io/mmap: new -s option for mmap command to reserve some free space References: <1458119884-17942-1-git-send-email-zlang@redhat.com> <20160316123113.GB8096@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160316123113.GB8096@bfoster.bfoster> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458136425 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Mar 16, 2016 at 08:31:14AM -0400, Brian Foster wrote: > On Wed, Mar 16, 2016 at 05:18:04PM +0800, Zorro Lang wrote: > > This patch come from a test likes below: > > xfs_io -t -f > > -c "truncate 10000" > > -c "mmap -rw 0 1024" > > -c "mremap 8192" > > file > > > > mremap always hit ENOMEM error, when it try to remap more space > > without MREMAP_MAYMOVE flag. This's a normal condition, due to > > no free space after mapped 1024 bytes region. > > > > But if we try to mremap from the original mapped starting point in > > a C program, at first we always do: > > > > addr = mmap(NULL, res_size, prot, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); > > munmap(addr, res_size); > > > > Then do: > > > > addr = mmap(addr, real_len, ...); > > > > The "res_size" is bigger than "real_len". This will help us get a > > region between real_len and res_size, which maybe free space. The > > truth is we can't guarantee that this free memory will stay free. > > But this method is still very helpful for reserve some free space > > in short time. > > > > After merge this patch, we can resolve above mremap problem by run: > > xfs_io -t -f > > ... > > -c "mmap -rw -s 8192 0 1024" > > -c "mremap 8192" > > ... > > > > Although we can't sure it's useful 100%, it really have pretty high > > success rate. > > > > Signed-off-by: Zorro Lang > > --- > > I'm a little curious why one would use this as opposed to 'mremap -m' in > the context of xfs_io (it certainly might make sense for an > application). It sounds like any xfstests tests, for example, that is > susceptible to this problem might want to use -m even if -s is employed > as well. Can you provide any additional context on this or do you have a > use case in mind? > > That said, I'm not against adding this to the xfs_io toolbox and the > code looks Ok to me: Hi Brian, I hit this problem when I try to use xfs_io to rewrite LTP's mmap16 testcase for xfstests(I know I can backport that mmap16.c into xfstests/src directly, but I just try to use xfs_io). That case from linux commit: 90a8020 vfs: fix data corruption when blocksize < pagesize for mmaped data For reproduce that bug, I think I shouldn't move page when mremap. So I need mremap to extend mapped space from orignal starting address. If no this option, xfs_io -c "mmap 0 1024" -c "mremap 8192" will hit ENOMEM error nearly 100%, but if use this option, it nearly always remap successfully(on my test machine). So I think it maybe helpful in the future, if someone try to mremap without "-m" :) Thanks, Zorro > > Reviewed-by: Brian Foster > > > io/mmap.c | 29 +++++++++++++++++++++++------ > > man/man8/xfs_io.8 | 17 ++++++++++++++++- > > 2 files changed, 39 insertions(+), 7 deletions(-) > > > > diff --git a/io/mmap.c b/io/mmap.c > > index 5970069..6cd37a9 100644 > > --- a/io/mmap.c > > +++ b/io/mmap.c > > @@ -146,6 +146,7 @@ mmap_help(void) > > " -r -- map with PROT_READ protection\n" > > " -w -- map with PROT_WRITE protection\n" > > " -x -- map with PROT_EXEC protection\n" > > +" -s -- first do mmap(size)/munmap(size), try to reserve some free space\n" > > " If no protection mode is specified, all are used by default.\n" > > "\n")); > > } > > @@ -156,8 +157,8 @@ mmap_f( > > char **argv) > > { > > off64_t offset; > > - ssize_t length; > > - void *address; > > + ssize_t length = 0, length2 = 0; > > + void *address = NULL; > > char *filename; > > size_t blocksize, sectsize; > > int c, prot = 0; > > @@ -181,7 +182,9 @@ mmap_f( > > return 0; > > } > > > > - while ((c = getopt(argc, argv, "rwx")) != EOF) { > > + init_cvtnum(&blocksize, §size); > > + > > + while ((c = getopt(argc, argv, "rwxs:")) != EOF) { > > switch (c) { > > case 'r': > > prot |= PROT_READ; > > @@ -192,6 +195,9 @@ mmap_f( > > case 'x': > > prot |= PROT_EXEC; > > break; > > + case 's': > > + length2 = cvtnum(blocksize, sectsize, optarg); > > + break; > > default: > > return command_usage(&mmap_cmd); > > } > > @@ -202,7 +208,6 @@ mmap_f( > > if (optind != argc - 2) > > return command_usage(&mmap_cmd); > > > > - init_cvtnum(&blocksize, §size); > > offset = cvtnum(blocksize, sectsize, argv[optind]); > > if (offset < 0) { > > printf(_("non-numeric offset argument -- %s\n"), argv[optind]); > > @@ -221,7 +226,19 @@ mmap_f( > > return 0; > > } > > > > - address = mmap(NULL, length, prot, MAP_SHARED, file->fd, offset); > > + /* > > + * mmap and munmap memory area of length2 region is helpful to > > + * make a region of extendible free memory. It's generally used > > + * for later mremap operation(no MREMAP_MAYMOVE flag). But there > > + * isn't guarantee that the memory after length (up to length2) > > + * will stay free. > > + */ > > + if (length2 > length) { > > + address = mmap(NULL, length2, prot, > > + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); > > + munmap(address, length2); > > + } > > + address = mmap(address, length, prot, MAP_SHARED, file->fd, offset); > > if (address == MAP_FAILED) { > > perror("mmap"); > > free(filename); > > @@ -647,7 +664,7 @@ mmap_init(void) > > mmap_cmd.argmin = 0; > > mmap_cmd.argmax = -1; > > mmap_cmd.flags = CMD_NOMAP_OK | CMD_NOFILE_OK | CMD_FOREIGN_OK; > > - mmap_cmd.args = _("[N] | [-rwx] [off len]"); > > + mmap_cmd.args = _("[N] | [-rwx] [-s size] [off len]"); > > mmap_cmd.oneline = > > _("mmap a range in the current file, show mappings"); > > mmap_cmd.help = mmap_help; > > diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 > > index 33fbe6a..93a8a00 100644 > > --- a/man/man8/xfs_io.8 > > +++ b/man/man8/xfs_io.8 > > @@ -559,7 +559,7 @@ Do not print timing statistics at all. > > > > .SH MEMORY MAPPED I/O COMMANDS > > .TP > > -.BI "mmap [ " N " | [[ \-rwx ] " "offset length " ]] > > +.BI "mmap [ " N " | [[ \-rwx ] [\-s " size " ] " "offset length " ]] > > With no arguments, > > .B mmap > > shows the current mappings. Specifying a single numeric argument > > @@ -575,6 +575,21 @@ PROT_WRITE > > .RB ( \-w ), > > and PROT_EXEC > > .RB ( \-x ). > > +.BI \-s " size" > > +is used to do a mmap(size) && munmap(size) operation at first, try to reserve some > > +extendible free memory space, if > > +.I size > > +is bigger than > > +.I length > > +parameter. But there's not guarantee that the memory after > > +.I length > > +( up to > > +.I size > > +) will stay free. > > +.B e.g. > > +"mmap -rw -s 8192 1024" will mmap 0 ~ 1024 bytes memory, but try to reserve 1024 ~ 8192 > > +free space(no guarantee). This free space will helpful for "mremap 8192" without > > +MREMAP_MAYMOVE flag. > > .TP > > .B mm > > See the > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From zlang@redhat.com Wed Mar 16 09:00:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7655F7CA0 for ; Wed, 16 Mar 2016 09:00:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C825EAC005 for ; Wed, 16 Mar 2016 07:00:04 -0700 (PDT) X-ASG-Debug-ID: 1458136802-04cb6c7f2b214fa0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id g5eX1k2Uvb8tPOmz (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 07:00:03 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id A416A8E662 for ; Wed, 16 Mar 2016 14:00:02 +0000 (UTC) Received: from localhost (vpn1-6-215.pek2.redhat.com [10.72.6.215]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GE01ge028915; Wed, 16 Mar 2016 10:00:01 -0400 Date: Wed, 16 Mar 2016 22:00:00 +0800 From: Zorro Lang To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH] io/mremap: modify argument errors of mremap command Message-ID: <20160316140000.GB2772@dhcp12-237.nay.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] io/mremap: modify argument errors of mremap command References: <1458120707-25219-1-git-send-email-zlang@redhat.com> <20160316123126.GC8096@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160316123126.GC8096@bfoster.bfoster> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458136803 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Mar 16, 2016 at 08:31:26AM -0400, Brian Foster wrote: > On Wed, Mar 16, 2016 at 05:31:47PM +0800, Zorro Lang wrote: > > There're 2 argument errors in mremap command: > > 1. If run "mremap 1024 8192", it won't return error and try to > > do "mremap 1024" silently. > > > > 2. The "-f" option can't be used, due to it need a new address > > argument as the fifth argument of mremap() syscall(man mremap). > > > > This patch try to fix above two problems. > > > > Signed-off-by: Zorro Lang > > --- > > A couple nits... > > > > > Hi, > > > > I'm not sure pass a address argument to mremap command is right or > > wrong. And maybe I should use strtoul() to instead of cvtnum() for > > address argument. > > > > At least I did some simple test with this patch on my machine, results are: > > "mremap -f 139946004389888 2048" PASS > > "mremap -f 4096k 2048" PASS > > "mremap -f 1g 2048" PASS > > "mremap -f 4096 2048" FAIL as 'Permission denied' > > > > What do you think of this patch? > > > > Thanks, > > Zorro > > > > > > io/mmap.c | 22 +++++++++++++++------- > > man/man8/xfs_io.8 | 5 ++++- > > 2 files changed, 19 insertions(+), 8 deletions(-) > > > > diff --git a/io/mmap.c b/io/mmap.c > > index 5970069..672ee61 100644 > > --- a/io/mmap.c > > +++ b/io/mmap.c > > @@ -589,7 +589,7 @@ mremap_help(void) > > "\n" > > " Resizes the mappping, growing or shrinking from the current size.\n" > > " The default stored value is 'X', repeated to fill the range specified.\n" > > -" -f -- use the MREMAP_FIXED flag\n" > > +" -f -- use the MREMAP_FIXED flag to mremap on the new address\n" > > Exceeds 80 chars. > > > " -m -- use the MREMAP_MAYMOVE flag\n" > > "\n")); > > } > > @@ -600,15 +600,18 @@ mremap_f( > > char **argv) > > { > > ssize_t new_length; > > - void *new_addr; > > + void *new_addr = NULL; > > int flags = 0; > > int c; > > size_t blocksize, sectsize; > > > > - while ((c = getopt(argc, argv, "fm")) != EOF) { > > + init_cvtnum(&blocksize, §size); > > + > > + while ((c = getopt(argc, argv, "f:m")) != EOF) { > > switch (c) { > > case 'f': > > flags = MREMAP_FIXED|MREMAP_MAYMOVE; > > + new_addr = (void *)cvtnum(blocksize, sectsize, optarg); > > break; > > case 'm': > > flags = MREMAP_MAYMOVE; > > @@ -618,7 +621,9 @@ mremap_f( > > } > > } > > > > - init_cvtnum(&blocksize, §size); > > + if (optind != argc - 1) > > + return command_usage(&mremap_cmd); > > + > > new_length = cvtnum(blocksize, sectsize, argv[optind]); > > if (new_length < 0) { > > printf(_("non-numeric offset argument -- %s\n"), > > @@ -626,7 +631,10 @@ mremap_f( > > return 0; > > } > > > > - new_addr = mremap(mapping->addr, mapping->length, new_length, flags); > > + if (!new_addr) > > + new_addr = mremap(mapping->addr, mapping->length, new_length, flags); > > + else > > + new_addr = mremap(mapping->addr, mapping->length, new_length, flags, new_addr); > > Both mremap() calls above exceed 80 chars. Otherwise, this looks Ok to > me: > > Reviewed-by: Brian Foster Hi Brian, Thanks for your review. I will send a V2 patch to fix these "exceed 80 chars" errors. Thanks, Zorro > > > if (new_addr == MAP_FAILED) > > perror("mremap"); > > else { > > @@ -697,9 +705,9 @@ mmap_init(void) > > mremap_cmd.altname = "mrm"; > > mremap_cmd.cfunc = mremap_f; > > mremap_cmd.argmin = 1; > > - mremap_cmd.argmax = 2; > > + mremap_cmd.argmax = 3; > > mremap_cmd.flags = CMD_NOFILE_OK | CMD_FOREIGN_OK; > > - mremap_cmd.args = _("[-m|-f] newsize"); > > + mremap_cmd.args = _("[-m|-f ] newsize"); > > mremap_cmd.oneline = > > _("alters the size of the current memory mapping"); > > mremap_cmd.help = mremap_help; > > diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 > > index 33fbe6a..984b551 100644 > > --- a/man/man8/xfs_io.8 > > +++ b/man/man8/xfs_io.8 > > @@ -581,7 +581,7 @@ See the > > .B mmap > > command. > > .TP > > -.BI "mremap [ \-f ] [ \-m ] " new_length > > +.BI "mremap [ \-f ] [ \-m ] " new_length > > Changes the current mapping size to > > .IR new_length . > > Whether the mapping may be moved is controlled by the flags passed; > > @@ -589,6 +589,9 @@ MREMAP_FIXED > > .RB ( \-f ), > > or MREMAP_MAYMOVE > > .RB ( \-m ). > > +.IR new_length > > +specifies a page-aligned address to which the mapping must be moved. It > > +can be setted to 139946004389888, 4096k or 1g etc. > > .TP > > .B mrm > > See the > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From eflorac@intellique.com Wed Mar 16 09:08:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8197E7CA0 for ; Wed, 16 Mar 2016 09:08:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4F6EB304039 for ; Wed, 16 Mar 2016 07:07:54 -0700 (PDT) X-ASG-Debug-ID: 1458137271-04cbb00b6f4f40a0001-NocioJ Received: from mail1.g1.pair.com (mail1.g1.pair.com [66.39.3.162]) by cuda.sgi.com with ESMTP id pYK5AdhE87RiFdCh (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 07:07:51 -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 4401B2D2DD; Wed, 16 Mar 2016 10:07:51 -0400 (EDT) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail1.g1.pair.com (Postfix) with ESMTPSA id 84F952D1D9; Wed, 16 Mar 2016 10:07:50 -0400 (EDT) Date: Wed, 16 Mar 2016 15:07:54 +0100 From: Emmanuel Florac To: Sandeep Patel Cc: "xfs@oss.sgi.com" Subject: Re: XFS corruptions Message-ID: <20160316150754.0bc64844@harpe.intellique.com> X-ASG-Orig-Subj: Re: XFS corruptions In-Reply-To: <558408F298C8CE4C89D93BD56AB474E8018621BE9E@EXBE1IS02.omnifone.com> References: <558408F298C8CE4C89D93BD56AB474E8018617B2B3@EXBE1IS02.omnifone.com> <20151130184048.3fa123e0@harpe.intellique.com> <558408F298C8CE4C89D93BD56AB474E8018617B3A6@EXBE1IS02.omnifone.com> <20151130194554.6140bf30@harpe.intellique.com> <558408F298C8CE4C89D93BD56AB474E8018617C636@EXBE1IS02.omnifone.com> <20151201145011.6df02063@harpe.intellique.com> <558408F298C8CE4C89D93BD56AB474E8018618503B@EXBE1IS02.omnifone.com> <20151210164640.78a13865@harpe.intellique.com> <558408F298C8CE4C89D93BD56AB474E801861CBD2B@EXBE1IS02.omnifone.com> <20160111161602.0c8413ca@harpe.intellique.com> <558408F298C8CE4C89D93BD56AB474E8018621BE9E@EXBE1IS02.omnifone.com> Organization: Intellique X-Mailer: Claws Mail 3.13.1 (GTK+ 2.24.20; i486-slackware-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail1.g1.pair.com[66.39.3.162] X-Barracuda-Start-Time: 1458137271 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27897 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Le Wed, 16 Mar 2016 13:15:59 +0000 Sandeep Patel =C3=A9crivait: > It seems you were correct. Our cluster seems to be much more stable > since the kernel upgrade. >=20 > Thank you very much for your help. Really appreciate it. Good news :) Have a nice day. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From zlang@redhat.com Wed Mar 16 09:22:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EAEE57CA0 for ; Wed, 16 Mar 2016 09:22:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 66C04AC001 for ; Wed, 16 Mar 2016 07:22:05 -0700 (PDT) X-ASG-Debug-ID: 1458138124-04bdf002ee520ac0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id dzn1Fn8dpOzLR1Fi (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 07:22:04 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 264BD80508 for ; Wed, 16 Mar 2016 14:22:04 +0000 (UTC) Received: from localhost (vpn1-6-215.pek2.redhat.com [10.72.6.215]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GEM2fU028367; Wed, 16 Mar 2016 10:22:03 -0400 From: Zorro Lang To: xfs@oss.sgi.com Cc: bfoster@redhat.com, Zorro Lang Subject: [PATCH v2] io/mremap: modify argument errors of mremap command Date: Wed, 16 Mar 2016 22:21:58 +0800 X-ASG-Orig-Subj: [PATCH v2] io/mremap: modify argument errors of mremap command Message-Id: <1458138118-5272-1-git-send-email-zlang@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: 1458138124 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 There're 2 argument errors in mremap command: 1. If run "mremap 1024 8192", it won't return error and try to do "mremap 1024" silently. 2. The "-f" option can't be used, due to it need a new address argument as the fifth argument of mremap() syscall(man mremap). This patch try to fix above two problems. Signed-off-by: Zorro Lang Reviewed-by: Brian Foster --- io/mmap.c | 25 ++++++++++++++++++------- man/man8/xfs_io.8 | 5 ++++- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/io/mmap.c b/io/mmap.c index 5970069..568102e 100644 --- a/io/mmap.c +++ b/io/mmap.c @@ -589,7 +589,7 @@ mremap_help(void) "\n" " Resizes the mappping, growing or shrinking from the current size.\n" " The default stored value is 'X', repeated to fill the range specified.\n" -" -f -- use the MREMAP_FIXED flag\n" +" -f -- use MREMAP_FIXED flag to mremap on new_address\n" " -m -- use the MREMAP_MAYMOVE flag\n" "\n")); } @@ -600,15 +600,19 @@ mremap_f( char **argv) { ssize_t new_length; - void *new_addr; + void *new_addr = NULL; int flags = 0; int c; size_t blocksize, sectsize; - while ((c = getopt(argc, argv, "fm")) != EOF) { + init_cvtnum(&blocksize, §size); + + while ((c = getopt(argc, argv, "f:m")) != EOF) { switch (c) { case 'f': flags = MREMAP_FIXED|MREMAP_MAYMOVE; + new_addr = (void *)cvtnum(blocksize, sectsize, + optarg); break; case 'm': flags = MREMAP_MAYMOVE; @@ -618,7 +622,9 @@ mremap_f( } } - init_cvtnum(&blocksize, §size); + if (optind != argc - 1) + return command_usage(&mremap_cmd); + new_length = cvtnum(blocksize, sectsize, argv[optind]); if (new_length < 0) { printf(_("non-numeric offset argument -- %s\n"), @@ -626,7 +632,12 @@ mremap_f( return 0; } - new_addr = mremap(mapping->addr, mapping->length, new_length, flags); + if (!new_addr) + new_addr = mremap(mapping->addr, mapping->length, + new_length, flags); + else + new_addr = mremap(mapping->addr, mapping->length, + new_length, flags, new_addr); if (new_addr == MAP_FAILED) perror("mremap"); else { @@ -697,9 +708,9 @@ mmap_init(void) mremap_cmd.altname = "mrm"; mremap_cmd.cfunc = mremap_f; mremap_cmd.argmin = 1; - mremap_cmd.argmax = 2; + mremap_cmd.argmax = 3; mremap_cmd.flags = CMD_NOFILE_OK | CMD_FOREIGN_OK; - mremap_cmd.args = _("[-m|-f] newsize"); + mremap_cmd.args = _("[-m|-f ] newsize"); mremap_cmd.oneline = _("alters the size of the current memory mapping"); mremap_cmd.help = mremap_help; diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 index 33fbe6a..984b551 100644 --- a/man/man8/xfs_io.8 +++ b/man/man8/xfs_io.8 @@ -581,7 +581,7 @@ See the .B mmap command. .TP -.BI "mremap [ \-f ] [ \-m ] " new_length +.BI "mremap [ \-f ] [ \-m ] " new_length Changes the current mapping size to .IR new_length . Whether the mapping may be moved is controlled by the flags passed; @@ -589,6 +589,9 @@ MREMAP_FIXED .RB ( \-f ), or MREMAP_MAYMOVE .RB ( \-m ). +.IR new_length +specifies a page-aligned address to which the mapping must be moved. It +can be setted to 139946004389888, 4096k or 1g etc. .TP .B mrm See the -- 2.5.0 From bfoster@redhat.com Wed Mar 16 09:23:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2C74F7CA0 for ; Wed, 16 Mar 2016 09:23:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id F3AE18F8035 for ; Wed, 16 Mar 2016 07:23:01 -0700 (PDT) X-ASG-Debug-ID: 1458138175-04cb6c7f28215bb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cuVQWU6ORqT56eHx (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 07:22: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 (Postfix) with ESMTPS id 278FD7F09A for ; Wed, 16 Mar 2016 14:22:55 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-24.bos.redhat.com [10.18.41.24]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GEMsTf021834; Wed, 16 Mar 2016 10:22:54 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 9EAD4125517; Wed, 16 Mar 2016 10:22:53 -0400 (EDT) Date: Wed, 16 Mar 2016 10:22:53 -0400 From: Brian Foster To: Zorro Lang Cc: xfs@oss.sgi.com Subject: Re: [PATCH] io/mmap: new -s option for mmap command to reserve some free space Message-ID: <20160316142253.GD8096@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] io/mmap: new -s option for mmap command to reserve some free space References: <1458119884-17942-1-git-send-email-zlang@redhat.com> <20160316123113.GB8096@bfoster.bfoster> <20160316135343.GA2772@dhcp12-237.nay.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160316135343.GA2772@dhcp12-237.nay.redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458138175 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Mar 16, 2016 at 09:53:43PM +0800, Zorro Lang wrote: > On Wed, Mar 16, 2016 at 08:31:14AM -0400, Brian Foster wrote: > > On Wed, Mar 16, 2016 at 05:18:04PM +0800, Zorro Lang wrote: > > > This patch come from a test likes below: > > > xfs_io -t -f > > > -c "truncate 10000" > > > -c "mmap -rw 0 1024" > > > -c "mremap 8192" > > > file > > > > > > mremap always hit ENOMEM error, when it try to remap more space > > > without MREMAP_MAYMOVE flag. This's a normal condition, due to > > > no free space after mapped 1024 bytes region. > > > > > > But if we try to mremap from the original mapped starting point in > > > a C program, at first we always do: > > > > > > addr = mmap(NULL, res_size, prot, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); > > > munmap(addr, res_size); > > > > > > Then do: > > > > > > addr = mmap(addr, real_len, ...); > > > > > > The "res_size" is bigger than "real_len". This will help us get a > > > region between real_len and res_size, which maybe free space. The > > > truth is we can't guarantee that this free memory will stay free. > > > But this method is still very helpful for reserve some free space > > > in short time. > > > > > > After merge this patch, we can resolve above mremap problem by run: > > > xfs_io -t -f > > > ... > > > -c "mmap -rw -s 8192 0 1024" > > > -c "mremap 8192" > > > ... > > > > > > Although we can't sure it's useful 100%, it really have pretty high > > > success rate. > > > > > > Signed-off-by: Zorro Lang > > > --- > > > > I'm a little curious why one would use this as opposed to 'mremap -m' in > > the context of xfs_io (it certainly might make sense for an > > application). It sounds like any xfstests tests, for example, that is > > susceptible to this problem might want to use -m even if -s is employed > > as well. Can you provide any additional context on this or do you have a > > use case in mind? > > > > That said, I'm not against adding this to the xfs_io toolbox and the > > code looks Ok to me: > > Hi Brian, > > I hit this problem when I try to use xfs_io to rewrite LTP's mmap16 > testcase for xfstests(I know I can backport that mmap16.c into > xfstests/src directly, but I just try to use xfs_io). That case > from linux commit: > > 90a8020 vfs: fix data corruption when blocksize < pagesize for > mmaped data > > For reproduce that bug, I think I shouldn't move page when mremap. So > I need mremap to extend mapped space from orignal starting address. > > If no this option, xfs_io -c "mmap 0 1024" -c "mremap 8192" will > hit ENOMEM error nearly 100%, but if use this option, it nearly always > remap successfully(on my test machine). So I think it maybe helpful > in the future, if someone try to mremap without "-m" :) > Sounds good, thanks for the explanation! I might suggest to include this use case in the commit log description for future reference (perhaps condense it a bit first). Brian > Thanks, > Zorro > > > > > Reviewed-by: Brian Foster > > > > > io/mmap.c | 29 +++++++++++++++++++++++------ > > > man/man8/xfs_io.8 | 17 ++++++++++++++++- > > > 2 files changed, 39 insertions(+), 7 deletions(-) > > > > > > diff --git a/io/mmap.c b/io/mmap.c > > > index 5970069..6cd37a9 100644 > > > --- a/io/mmap.c > > > +++ b/io/mmap.c > > > @@ -146,6 +146,7 @@ mmap_help(void) > > > " -r -- map with PROT_READ protection\n" > > > " -w -- map with PROT_WRITE protection\n" > > > " -x -- map with PROT_EXEC protection\n" > > > +" -s -- first do mmap(size)/munmap(size), try to reserve some free space\n" > > > " If no protection mode is specified, all are used by default.\n" > > > "\n")); > > > } > > > @@ -156,8 +157,8 @@ mmap_f( > > > char **argv) > > > { > > > off64_t offset; > > > - ssize_t length; > > > - void *address; > > > + ssize_t length = 0, length2 = 0; > > > + void *address = NULL; > > > char *filename; > > > size_t blocksize, sectsize; > > > int c, prot = 0; > > > @@ -181,7 +182,9 @@ mmap_f( > > > return 0; > > > } > > > > > > - while ((c = getopt(argc, argv, "rwx")) != EOF) { > > > + init_cvtnum(&blocksize, §size); > > > + > > > + while ((c = getopt(argc, argv, "rwxs:")) != EOF) { > > > switch (c) { > > > case 'r': > > > prot |= PROT_READ; > > > @@ -192,6 +195,9 @@ mmap_f( > > > case 'x': > > > prot |= PROT_EXEC; > > > break; > > > + case 's': > > > + length2 = cvtnum(blocksize, sectsize, optarg); > > > + break; > > > default: > > > return command_usage(&mmap_cmd); > > > } > > > @@ -202,7 +208,6 @@ mmap_f( > > > if (optind != argc - 2) > > > return command_usage(&mmap_cmd); > > > > > > - init_cvtnum(&blocksize, §size); > > > offset = cvtnum(blocksize, sectsize, argv[optind]); > > > if (offset < 0) { > > > printf(_("non-numeric offset argument -- %s\n"), argv[optind]); > > > @@ -221,7 +226,19 @@ mmap_f( > > > return 0; > > > } > > > > > > - address = mmap(NULL, length, prot, MAP_SHARED, file->fd, offset); > > > + /* > > > + * mmap and munmap memory area of length2 region is helpful to > > > + * make a region of extendible free memory. It's generally used > > > + * for later mremap operation(no MREMAP_MAYMOVE flag). But there > > > + * isn't guarantee that the memory after length (up to length2) > > > + * will stay free. > > > + */ > > > + if (length2 > length) { > > > + address = mmap(NULL, length2, prot, > > > + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); > > > + munmap(address, length2); > > > + } > > > + address = mmap(address, length, prot, MAP_SHARED, file->fd, offset); > > > if (address == MAP_FAILED) { > > > perror("mmap"); > > > free(filename); > > > @@ -647,7 +664,7 @@ mmap_init(void) > > > mmap_cmd.argmin = 0; > > > mmap_cmd.argmax = -1; > > > mmap_cmd.flags = CMD_NOMAP_OK | CMD_NOFILE_OK | CMD_FOREIGN_OK; > > > - mmap_cmd.args = _("[N] | [-rwx] [off len]"); > > > + mmap_cmd.args = _("[N] | [-rwx] [-s size] [off len]"); > > > mmap_cmd.oneline = > > > _("mmap a range in the current file, show mappings"); > > > mmap_cmd.help = mmap_help; > > > diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 > > > index 33fbe6a..93a8a00 100644 > > > --- a/man/man8/xfs_io.8 > > > +++ b/man/man8/xfs_io.8 > > > @@ -559,7 +559,7 @@ Do not print timing statistics at all. > > > > > > .SH MEMORY MAPPED I/O COMMANDS > > > .TP > > > -.BI "mmap [ " N " | [[ \-rwx ] " "offset length " ]] > > > +.BI "mmap [ " N " | [[ \-rwx ] [\-s " size " ] " "offset length " ]] > > > With no arguments, > > > .B mmap > > > shows the current mappings. Specifying a single numeric argument > > > @@ -575,6 +575,21 @@ PROT_WRITE > > > .RB ( \-w ), > > > and PROT_EXEC > > > .RB ( \-x ). > > > +.BI \-s " size" > > > +is used to do a mmap(size) && munmap(size) operation at first, try to reserve some > > > +extendible free memory space, if > > > +.I size > > > +is bigger than > > > +.I length > > > +parameter. But there's not guarantee that the memory after > > > +.I length > > > +( up to > > > +.I size > > > +) will stay free. > > > +.B e.g. > > > +"mmap -rw -s 8192 1024" will mmap 0 ~ 1024 bytes memory, but try to reserve 1024 ~ 8192 > > > +free space(no guarantee). This free space will helpful for "mremap 8192" without > > > +MREMAP_MAYMOVE flag. > > > .TP > > > .B mm > > > See the > > > > _______________________________________________ > > 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 eguan@redhat.com Wed Mar 16 09:54:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4624A7CA0 for ; Wed, 16 Mar 2016 09:54:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 03AFA304051 for ; Wed, 16 Mar 2016 07:54:21 -0700 (PDT) X-ASG-Debug-ID: 1458140060-04cbb00b704f6410001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id xyln8YJTycv8mLi4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 07:54:21 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 50A8D219A; Wed, 16 Mar 2016 14:54:20 +0000 (UTC) Received: from localhost (dhcp-13-211.nay.redhat.com [10.66.13.211]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GEsJrV006719; Wed, 16 Mar 2016 10:54:19 -0400 Date: Wed, 16 Mar 2016 22:54:18 +0800 From: Eryu Guan To: Christoph Hellwig Cc: fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs/073: filter out finobt warning from mkfs.xfs Message-ID: <20160316145418.GT11419@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs/073: filter out finobt warning from mkfs.xfs References: <1458129204-31882-1-git-send-email-eguan@redhat.com> <20160316120416.GA18030@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160316120416.GA18030@infradead.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458140061 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Mar 16, 2016 at 05:04:16AM -0700, Christoph Hellwig wrote: > On Wed, Mar 16, 2016 at 07:53:24PM +0800, Eryu Guan wrote: > > When testing xfs/073 with MKFS_OPTIONS="-m crc=1,finobt=1" set, it fails > > due to extra warning about disabling finobt feature: > > > > +warning: finobt not supported without CRC support, disabled. > > > > Because xfs/073 disables crc unconditionally and finobt can not be > > enabled either. > > How about explicitly disabling finobt as well? I think that's a cleaner way to fix it. Just that some extra work is needed to let the test pass with old mkfs.xfs without metadata suport. Will send v2 shortly. Thanks for the review! Eryu From eguan@redhat.com Wed Mar 16 10:05:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 912B27CA0 for ; Wed, 16 Mar 2016 10:05:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 63A93304051 for ; Wed, 16 Mar 2016 08:05:27 -0700 (PDT) X-ASG-Debug-ID: 1458140722-04cb6c7f292176b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id v37k0ZOXP3HWG0kb (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 08:05:23 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id C2A9163175; Wed, 16 Mar 2016 15:05:22 +0000 (UTC) Received: from localhost (dhcp-13-211.nay.redhat.com [10.66.13.211]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GF5LQ5025936; Wed, 16 Mar 2016 11:05:22 -0400 From: Eryu Guan To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com, Eryu Guan Subject: [PATCH v2] xfs/073: avoid finobt warning from mkfs Date: Wed, 16 Mar 2016 23:04:44 +0800 X-ASG-Orig-Subj: [PATCH v2] xfs/073: avoid finobt warning from mkfs Message-Id: <1458140684-4723-1-git-send-email-eguan@redhat.com> In-Reply-To: <1458129204-31882-1-git-send-email-eguan@redhat.com> References: <1458129204-31882-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Wed, 16 Mar 2016 15:05:22 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458140723 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 When testing xfs/073 with MKFS_OPTIONS="-m crc=1,finobt=1" set, it fails due to extra warning about disabling finobt feature: +warning: finobt not supported without CRC support, disabled. Because xfs/073 disables crc unconditionally and finobt can not be enabled either. Fix it by explicitly disabling finobt as well. Also remove all meta related mkfs options in _scratch_mkfs_xfs_opts() if mkfs.xfs has no metadata support, not only the crc option. So that test still passes on distros with such old binaries. Suggested-by: Christoph Hellwig Signed-off-by: Eryu Guan --- v2: - disable finobt explicitly, instead of filtering the warning common/rc | 4 ++-- tests/xfs/073 | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/common/rc b/common/rc index a34c387..73d2ea6 100644 --- a/common/rc +++ b/common/rc @@ -444,9 +444,9 @@ _scratch_mkfs_xfs_opts() { mkfs_opts=$* - # remove crc related mkfs options if mkfs.xfs doesn't support v5 xfs + # remove metadata related mkfs options if mkfs.xfs doesn't them if [ -n "$XFS_MKFS_HAS_NO_META_SUPPORT" ]; then - mkfs_opts=`echo $mkfs_opts | sed "s/-m\s\+crc=.//"` + mkfs_opts=`echo $mkfs_opts | sed "s/-m\s\+\S\+//g"` fi _scratch_options mkfs diff --git a/tests/xfs/073 b/tests/xfs/073 index e1335df..e2c1af3 100755 --- a/tests/xfs/073 +++ b/tests/xfs/073 @@ -138,7 +138,7 @@ _require_loop rm -f $seqres.full -_scratch_mkfs_xfs -m crc=0 -dsize=41m,agcount=2 | _filter_mkfs 2>/dev/null +_scratch_mkfs_xfs -m crc=0,finobt=0 -dsize=41m,agcount=2 | _filter_mkfs 2>/dev/null _scratch_mount 2>/dev/null || _fail "initial scratch mount failed" echo -- 2.5.0 From zlang@redhat.com Wed Mar 16 10:12:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4B3E67CA0 for ; Wed, 16 Mar 2016 10:12:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id BC61EAC006 for ; Wed, 16 Mar 2016 08:12:27 -0700 (PDT) X-ASG-Debug-ID: 1458141146-04bdf002ee522a50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QdkZNu9dG0GJGYfK (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 08:12:26 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 0561380500 for ; Wed, 16 Mar 2016 15:12:26 +0000 (UTC) Received: from localhost (vpn1-6-215.pek2.redhat.com [10.72.6.215]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GFCOLG022329; Wed, 16 Mar 2016 11:12:25 -0400 Date: Wed, 16 Mar 2016 23:12:23 +0800 From: Zorro Lang To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH] io/mmap: new -s option for mmap command to reserve some free space Message-ID: <20160316151223.GA6364@dhcp12-237.nay.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] io/mmap: new -s option for mmap command to reserve some free space References: <1458119884-17942-1-git-send-email-zlang@redhat.com> <20160316123113.GB8096@bfoster.bfoster> <20160316135343.GA2772@dhcp12-237.nay.redhat.com> <20160316142253.GD8096@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160316142253.GD8096@bfoster.bfoster> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458141146 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Mar 16, 2016 at 10:22:53AM -0400, Brian Foster wrote: > On Wed, Mar 16, 2016 at 09:53:43PM +0800, Zorro Lang wrote: > > On Wed, Mar 16, 2016 at 08:31:14AM -0400, Brian Foster wrote: > > > On Wed, Mar 16, 2016 at 05:18:04PM +0800, Zorro Lang wrote: > > > > This patch come from a test likes below: > > > > xfs_io -t -f > > > > -c "truncate 10000" > > > > -c "mmap -rw 0 1024" > > > > -c "mremap 8192" > > > > file > > > > > > > > mremap always hit ENOMEM error, when it try to remap more space > > > > without MREMAP_MAYMOVE flag. This's a normal condition, due to > > > > no free space after mapped 1024 bytes region. > > > > > > > > But if we try to mremap from the original mapped starting point in > > > > a C program, at first we always do: > > > > > > > > addr = mmap(NULL, res_size, prot, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); > > > > munmap(addr, res_size); > > > > > > > > Then do: > > > > > > > > addr = mmap(addr, real_len, ...); > > > > > > > > The "res_size" is bigger than "real_len". This will help us get a > > > > region between real_len and res_size, which maybe free space. The > > > > truth is we can't guarantee that this free memory will stay free. > > > > But this method is still very helpful for reserve some free space > > > > in short time. > > > > > > > > After merge this patch, we can resolve above mremap problem by run: > > > > xfs_io -t -f > > > > ... > > > > -c "mmap -rw -s 8192 0 1024" > > > > -c "mremap 8192" > > > > ... > > > > > > > > Although we can't sure it's useful 100%, it really have pretty high > > > > success rate. > > > > > > > > Signed-off-by: Zorro Lang > > > > --- > > > > > > I'm a little curious why one would use this as opposed to 'mremap -m' in > > > the context of xfs_io (it certainly might make sense for an > > > application). It sounds like any xfstests tests, for example, that is > > > susceptible to this problem might want to use -m even if -s is employed > > > as well. Can you provide any additional context on this or do you have a > > > use case in mind? > > > > > > That said, I'm not against adding this to the xfs_io toolbox and the > > > code looks Ok to me: > > > > Hi Brian, > > > > I hit this problem when I try to use xfs_io to rewrite LTP's mmap16 > > testcase for xfstests(I know I can backport that mmap16.c into > > xfstests/src directly, but I just try to use xfs_io). That case > > from linux commit: > > > > 90a8020 vfs: fix data corruption when blocksize < pagesize for > > mmaped data > > > > For reproduce that bug, I think I shouldn't move page when mremap. So > > I need mremap to extend mapped space from orignal starting address. > > > > If no this option, xfs_io -c "mmap 0 1024" -c "mremap 8192" will > > hit ENOMEM error nearly 100%, but if use this option, it nearly always > > remap successfully(on my test machine). So I think it maybe helpful > > in the future, if someone try to mremap without "-m" :) > > > > Sounds good, thanks for the explanation! I might suggest to include this > use case in the commit log description for future reference (perhaps > condense it a bit first). Hi Brain, How about below commit message? If you feel it's OK, I will send a V2 patch with this commit: io/mmap: new -s option for mmap command to reserve some free space When I try to use xfs_io to rewrite LTP's mmap16 testcase for xfstests, I always hit mremap ENOMEM error. But according to linux commit: 90a8020 vfs: fix data corruption when blocksize < pagesize for mmaped data The reproducer shouldn't use MREMAP_MAYMOVE flag for mremap(). So we need a stable method to make mremap can extend space from the original mapped starting address(That means no -m option for xfs_io mremap). Generally if we try to mremap from the original mapped starting point in a C program, at first we always do: addr = mmap(NULL, res_size, prot, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); munmap(addr, res_size); Then do: addr = mmap(addr, real_len, ...); The "res_size" is bigger than "real_len". This will help us get a region between real_len and res_size, which maybe free space. The truth is we can't guarantee that this free memory will stay free. But this method is still very helpful for reserve some free space in short time. This patch bring in the "res_size" by use a new -s option. If don't use this option, xfs_io -c "mmap 0 1024" -c "mremap 8192" will hit ENOMEM error nearly 100%, but if use this option, it nearly always remap successfully. So I think it's helpful, if someone try to run mremap without "-m". Thanks, Zorro > > Brian > > > Thanks, > > Zorro > > > > > > > > Reviewed-by: Brian Foster > > > > > > > io/mmap.c | 29 +++++++++++++++++++++++------ > > > > man/man8/xfs_io.8 | 17 ++++++++++++++++- > > > > 2 files changed, 39 insertions(+), 7 deletions(-) > > > > > > > > diff --git a/io/mmap.c b/io/mmap.c > > > > index 5970069..6cd37a9 100644 > > > > --- a/io/mmap.c > > > > +++ b/io/mmap.c > > > > @@ -146,6 +146,7 @@ mmap_help(void) > > > > " -r -- map with PROT_READ protection\n" > > > > " -w -- map with PROT_WRITE protection\n" > > > > " -x -- map with PROT_EXEC protection\n" > > > > +" -s -- first do mmap(size)/munmap(size), try to reserve some free space\n" > > > > " If no protection mode is specified, all are used by default.\n" > > > > "\n")); > > > > } > > > > @@ -156,8 +157,8 @@ mmap_f( > > > > char **argv) > > > > { > > > > off64_t offset; > > > > - ssize_t length; > > > > - void *address; > > > > + ssize_t length = 0, length2 = 0; > > > > + void *address = NULL; > > > > char *filename; > > > > size_t blocksize, sectsize; > > > > int c, prot = 0; > > > > @@ -181,7 +182,9 @@ mmap_f( > > > > return 0; > > > > } > > > > > > > > - while ((c = getopt(argc, argv, "rwx")) != EOF) { > > > > + init_cvtnum(&blocksize, §size); > > > > + > > > > + while ((c = getopt(argc, argv, "rwxs:")) != EOF) { > > > > switch (c) { > > > > case 'r': > > > > prot |= PROT_READ; > > > > @@ -192,6 +195,9 @@ mmap_f( > > > > case 'x': > > > > prot |= PROT_EXEC; > > > > break; > > > > + case 's': > > > > + length2 = cvtnum(blocksize, sectsize, optarg); > > > > + break; > > > > default: > > > > return command_usage(&mmap_cmd); > > > > } > > > > @@ -202,7 +208,6 @@ mmap_f( > > > > if (optind != argc - 2) > > > > return command_usage(&mmap_cmd); > > > > > > > > - init_cvtnum(&blocksize, §size); > > > > offset = cvtnum(blocksize, sectsize, argv[optind]); > > > > if (offset < 0) { > > > > printf(_("non-numeric offset argument -- %s\n"), argv[optind]); > > > > @@ -221,7 +226,19 @@ mmap_f( > > > > return 0; > > > > } > > > > > > > > - address = mmap(NULL, length, prot, MAP_SHARED, file->fd, offset); > > > > + /* > > > > + * mmap and munmap memory area of length2 region is helpful to > > > > + * make a region of extendible free memory. It's generally used > > > > + * for later mremap operation(no MREMAP_MAYMOVE flag). But there > > > > + * isn't guarantee that the memory after length (up to length2) > > > > + * will stay free. > > > > + */ > > > > + if (length2 > length) { > > > > + address = mmap(NULL, length2, prot, > > > > + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); > > > > + munmap(address, length2); > > > > + } > > > > + address = mmap(address, length, prot, MAP_SHARED, file->fd, offset); > > > > if (address == MAP_FAILED) { > > > > perror("mmap"); > > > > free(filename); > > > > @@ -647,7 +664,7 @@ mmap_init(void) > > > > mmap_cmd.argmin = 0; > > > > mmap_cmd.argmax = -1; > > > > mmap_cmd.flags = CMD_NOMAP_OK | CMD_NOFILE_OK | CMD_FOREIGN_OK; > > > > - mmap_cmd.args = _("[N] | [-rwx] [off len]"); > > > > + mmap_cmd.args = _("[N] | [-rwx] [-s size] [off len]"); > > > > mmap_cmd.oneline = > > > > _("mmap a range in the current file, show mappings"); > > > > mmap_cmd.help = mmap_help; > > > > diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 > > > > index 33fbe6a..93a8a00 100644 > > > > --- a/man/man8/xfs_io.8 > > > > +++ b/man/man8/xfs_io.8 > > > > @@ -559,7 +559,7 @@ Do not print timing statistics at all. > > > > > > > > .SH MEMORY MAPPED I/O COMMANDS > > > > .TP > > > > -.BI "mmap [ " N " | [[ \-rwx ] " "offset length " ]] > > > > +.BI "mmap [ " N " | [[ \-rwx ] [\-s " size " ] " "offset length " ]] > > > > With no arguments, > > > > .B mmap > > > > shows the current mappings. Specifying a single numeric argument > > > > @@ -575,6 +575,21 @@ PROT_WRITE > > > > .RB ( \-w ), > > > > and PROT_EXEC > > > > .RB ( \-x ). > > > > +.BI \-s " size" > > > > +is used to do a mmap(size) && munmap(size) operation at first, try to reserve some > > > > +extendible free memory space, if > > > > +.I size > > > > +is bigger than > > > > +.I length > > > > +parameter. But there's not guarantee that the memory after > > > > +.I length > > > > +( up to > > > > +.I size > > > > +) will stay free. > > > > +.B e.g. > > > > +"mmap -rw -s 8192 1024" will mmap 0 ~ 1024 bytes memory, but try to reserve 1024 ~ 8192 > > > > +free space(no guarantee). This free space will helpful for "mremap 8192" without > > > > +MREMAP_MAYMOVE flag. > > > > .TP > > > > .B mm > > > > See the > > > > > > _______________________________________________ > > > xfs mailing list > > > xfs@oss.sgi.com > > > http://oss.sgi.com/mailman/listinfo/xfs > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Wed Mar 16 10:34:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7B01E7CA0 for ; Wed, 16 Mar 2016 10:34:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3A8F9304048 for ; Wed, 16 Mar 2016 08:34:03 -0700 (PDT) X-ASG-Debug-ID: 1458142441-04cbb00b724f9800001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id rns7S9AgSYHLWYrY (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 08:34:02 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id A0D03C03BD55 for ; Wed, 16 Mar 2016 15:34:01 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-24.bos.redhat.com [10.18.41.24]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GFY1N3020240; Wed, 16 Mar 2016 11:34:01 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id EF087125517; Wed, 16 Mar 2016 11:33:59 -0400 (EDT) Date: Wed, 16 Mar 2016 11:33:59 -0400 From: Brian Foster To: Zorro Lang Cc: xfs@oss.sgi.com Subject: Re: [PATCH] io/mmap: new -s option for mmap command to reserve some free space Message-ID: <20160316153359.GE8096@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] io/mmap: new -s option for mmap command to reserve some free space References: <1458119884-17942-1-git-send-email-zlang@redhat.com> <20160316123113.GB8096@bfoster.bfoster> <20160316135343.GA2772@dhcp12-237.nay.redhat.com> <20160316142253.GD8096@bfoster.bfoster> <20160316151223.GA6364@dhcp12-237.nay.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160316151223.GA6364@dhcp12-237.nay.redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458142442 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Mar 16, 2016 at 11:12:23PM +0800, Zorro Lang wrote: > On Wed, Mar 16, 2016 at 10:22:53AM -0400, Brian Foster wrote: > > On Wed, Mar 16, 2016 at 09:53:43PM +0800, Zorro Lang wrote: > > > On Wed, Mar 16, 2016 at 08:31:14AM -0400, Brian Foster wrote: > > > > On Wed, Mar 16, 2016 at 05:18:04PM +0800, Zorro Lang wrote: > > > > > This patch come from a test likes below: > > > > > xfs_io -t -f > > > > > -c "truncate 10000" > > > > > -c "mmap -rw 0 1024" > > > > > -c "mremap 8192" > > > > > file > > > > > > > > > > mremap always hit ENOMEM error, when it try to remap more space > > > > > without MREMAP_MAYMOVE flag. This's a normal condition, due to > > > > > no free space after mapped 1024 bytes region. > > > > > > > > > > But if we try to mremap from the original mapped starting point in > > > > > a C program, at first we always do: > > > > > > > > > > addr = mmap(NULL, res_size, prot, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); > > > > > munmap(addr, res_size); > > > > > > > > > > Then do: > > > > > > > > > > addr = mmap(addr, real_len, ...); > > > > > > > > > > The "res_size" is bigger than "real_len". This will help us get a > > > > > region between real_len and res_size, which maybe free space. The > > > > > truth is we can't guarantee that this free memory will stay free. > > > > > But this method is still very helpful for reserve some free space > > > > > in short time. > > > > > > > > > > After merge this patch, we can resolve above mremap problem by run: > > > > > xfs_io -t -f > > > > > ... > > > > > -c "mmap -rw -s 8192 0 1024" > > > > > -c "mremap 8192" > > > > > ... > > > > > > > > > > Although we can't sure it's useful 100%, it really have pretty high > > > > > success rate. > > > > > > > > > > Signed-off-by: Zorro Lang > > > > > --- > > > > > > > > I'm a little curious why one would use this as opposed to 'mremap -m' in > > > > the context of xfs_io (it certainly might make sense for an > > > > application). It sounds like any xfstests tests, for example, that is > > > > susceptible to this problem might want to use -m even if -s is employed > > > > as well. Can you provide any additional context on this or do you have a > > > > use case in mind? > > > > > > > > That said, I'm not against adding this to the xfs_io toolbox and the > > > > code looks Ok to me: > > > > > > Hi Brian, > > > > > > I hit this problem when I try to use xfs_io to rewrite LTP's mmap16 > > > testcase for xfstests(I know I can backport that mmap16.c into > > > xfstests/src directly, but I just try to use xfs_io). That case > > > from linux commit: > > > > > > 90a8020 vfs: fix data corruption when blocksize < pagesize for > > > mmaped data > > > > > > For reproduce that bug, I think I shouldn't move page when mremap. So > > > I need mremap to extend mapped space from orignal starting address. > > > > > > If no this option, xfs_io -c "mmap 0 1024" -c "mremap 8192" will > > > hit ENOMEM error nearly 100%, but if use this option, it nearly always > > > remap successfully(on my test machine). So I think it maybe helpful > > > in the future, if someone try to mremap without "-m" :) > > > > > > > Sounds good, thanks for the explanation! I might suggest to include this > > use case in the commit log description for future reference (perhaps > > condense it a bit first). > > Hi Brain, > > How about below commit message? If you feel it's OK, I will send a V2 > patch with this commit: > Looks fine to me, thanks! Brian > io/mmap: new -s option for mmap command to reserve some free space > > When I try to use xfs_io to rewrite LTP's mmap16 testcase for > xfstests, > I always hit mremap ENOMEM error. But according to linux commit: > > 90a8020 vfs: fix data corruption when blocksize < pagesize for > mmaped data > > The reproducer shouldn't use MREMAP_MAYMOVE flag for mremap(). So we > need a stable method to make mremap can extend space from the original > mapped starting address(That means no -m option for xfs_io mremap). > > Generally if we try to mremap from the original mapped starting point > in a C program, at first we always do: > > addr = mmap(NULL, res_size, prot, MAP_PRIVATE | MAP_ANONYMOUS, -1, > 0); > munmap(addr, res_size); > > Then do: > > addr = mmap(addr, real_len, ...); > > The "res_size" is bigger than "real_len". This will help us get a > region between real_len and res_size, which maybe free space. The > truth is we can't guarantee that this free memory will stay free. > But this method is still very helpful for reserve some free space > in short time. > > This patch bring in the "res_size" by use a new -s option. If don't > use > this option, xfs_io -c "mmap 0 1024" -c "mremap 8192" will hit ENOMEM > error nearly 100%, but if use this option, it nearly always remap > successfully. So I think it's helpful, if someone try to run mremap > without "-m". > > Thanks, > Zorro > > > > > Brian > > > > > Thanks, > > > Zorro > > > > > > > > > > > Reviewed-by: Brian Foster > > > > > > > > > io/mmap.c | 29 +++++++++++++++++++++++------ > > > > > man/man8/xfs_io.8 | 17 ++++++++++++++++- > > > > > 2 files changed, 39 insertions(+), 7 deletions(-) > > > > > > > > > > diff --git a/io/mmap.c b/io/mmap.c > > > > > index 5970069..6cd37a9 100644 > > > > > --- a/io/mmap.c > > > > > +++ b/io/mmap.c > > > > > @@ -146,6 +146,7 @@ mmap_help(void) > > > > > " -r -- map with PROT_READ protection\n" > > > > > " -w -- map with PROT_WRITE protection\n" > > > > > " -x -- map with PROT_EXEC protection\n" > > > > > +" -s -- first do mmap(size)/munmap(size), try to reserve some free space\n" > > > > > " If no protection mode is specified, all are used by default.\n" > > > > > "\n")); > > > > > } > > > > > @@ -156,8 +157,8 @@ mmap_f( > > > > > char **argv) > > > > > { > > > > > off64_t offset; > > > > > - ssize_t length; > > > > > - void *address; > > > > > + ssize_t length = 0, length2 = 0; > > > > > + void *address = NULL; > > > > > char *filename; > > > > > size_t blocksize, sectsize; > > > > > int c, prot = 0; > > > > > @@ -181,7 +182,9 @@ mmap_f( > > > > > return 0; > > > > > } > > > > > > > > > > - while ((c = getopt(argc, argv, "rwx")) != EOF) { > > > > > + init_cvtnum(&blocksize, §size); > > > > > + > > > > > + while ((c = getopt(argc, argv, "rwxs:")) != EOF) { > > > > > switch (c) { > > > > > case 'r': > > > > > prot |= PROT_READ; > > > > > @@ -192,6 +195,9 @@ mmap_f( > > > > > case 'x': > > > > > prot |= PROT_EXEC; > > > > > break; > > > > > + case 's': > > > > > + length2 = cvtnum(blocksize, sectsize, optarg); > > > > > + break; > > > > > default: > > > > > return command_usage(&mmap_cmd); > > > > > } > > > > > @@ -202,7 +208,6 @@ mmap_f( > > > > > if (optind != argc - 2) > > > > > return command_usage(&mmap_cmd); > > > > > > > > > > - init_cvtnum(&blocksize, §size); > > > > > offset = cvtnum(blocksize, sectsize, argv[optind]); > > > > > if (offset < 0) { > > > > > printf(_("non-numeric offset argument -- %s\n"), argv[optind]); > > > > > @@ -221,7 +226,19 @@ mmap_f( > > > > > return 0; > > > > > } > > > > > > > > > > - address = mmap(NULL, length, prot, MAP_SHARED, file->fd, offset); > > > > > + /* > > > > > + * mmap and munmap memory area of length2 region is helpful to > > > > > + * make a region of extendible free memory. It's generally used > > > > > + * for later mremap operation(no MREMAP_MAYMOVE flag). But there > > > > > + * isn't guarantee that the memory after length (up to length2) > > > > > + * will stay free. > > > > > + */ > > > > > + if (length2 > length) { > > > > > + address = mmap(NULL, length2, prot, > > > > > + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); > > > > > + munmap(address, length2); > > > > > + } > > > > > + address = mmap(address, length, prot, MAP_SHARED, file->fd, offset); > > > > > if (address == MAP_FAILED) { > > > > > perror("mmap"); > > > > > free(filename); > > > > > @@ -647,7 +664,7 @@ mmap_init(void) > > > > > mmap_cmd.argmin = 0; > > > > > mmap_cmd.argmax = -1; > > > > > mmap_cmd.flags = CMD_NOMAP_OK | CMD_NOFILE_OK | CMD_FOREIGN_OK; > > > > > - mmap_cmd.args = _("[N] | [-rwx] [off len]"); > > > > > + mmap_cmd.args = _("[N] | [-rwx] [-s size] [off len]"); > > > > > mmap_cmd.oneline = > > > > > _("mmap a range in the current file, show mappings"); > > > > > mmap_cmd.help = mmap_help; > > > > > diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 > > > > > index 33fbe6a..93a8a00 100644 > > > > > --- a/man/man8/xfs_io.8 > > > > > +++ b/man/man8/xfs_io.8 > > > > > @@ -559,7 +559,7 @@ Do not print timing statistics at all. > > > > > > > > > > .SH MEMORY MAPPED I/O COMMANDS > > > > > .TP > > > > > -.BI "mmap [ " N " | [[ \-rwx ] " "offset length " ]] > > > > > +.BI "mmap [ " N " | [[ \-rwx ] [\-s " size " ] " "offset length " ]] > > > > > With no arguments, > > > > > .B mmap > > > > > shows the current mappings. Specifying a single numeric argument > > > > > @@ -575,6 +575,21 @@ PROT_WRITE > > > > > .RB ( \-w ), > > > > > and PROT_EXEC > > > > > .RB ( \-x ). > > > > > +.BI \-s " size" > > > > > +is used to do a mmap(size) && munmap(size) operation at first, try to reserve some > > > > > +extendible free memory space, if > > > > > +.I size > > > > > +is bigger than > > > > > +.I length > > > > > +parameter. But there's not guarantee that the memory after > > > > > +.I length > > > > > +( up to > > > > > +.I size > > > > > +) will stay free. > > > > > +.B e.g. > > > > > +"mmap -rw -s 8192 1024" will mmap 0 ~ 1024 bytes memory, but try to reserve 1024 ~ 8192 > > > > > +free space(no guarantee). This free space will helpful for "mremap 8192" without > > > > > +MREMAP_MAYMOVE flag. > > > > > .TP > > > > > .B mm > > > > > See the > > > > > > > > _______________________________________________ > > > > xfs mailing list > > > > xfs@oss.sgi.com > > > > http://oss.sgi.com/mailman/listinfo/xfs > > > > > > _______________________________________________ > > > xfs mailing list > > > xfs@oss.sgi.com > > > http://oss.sgi.com/mailman/listinfo/xfs > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs From zlang@redhat.com Wed Mar 16 10:44:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AF82C7CA0 for ; Wed, 16 Mar 2016 10:44:25 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 27765AC002 for ; Wed, 16 Mar 2016 08:44:24 -0700 (PDT) X-ASG-Debug-ID: 1458143063-04bdf002ee524090001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Ofn2F3cMp0csBoIZ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 08:44:24 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 79E808F2FD for ; Wed, 16 Mar 2016 15:44:23 +0000 (UTC) Received: from localhost (vpn1-6-215.pek2.redhat.com [10.72.6.215]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GFiMqw007871; Wed, 16 Mar 2016 11:44:22 -0400 From: Zorro Lang To: xfs@oss.sgi.com Cc: bfoster@redhat.com, Zorro Lang Subject: [PATCH v2] io/mmap: new -s option for mmap command to reserve some free space Date: Wed, 16 Mar 2016 23:44:19 +0800 X-ASG-Orig-Subj: [PATCH v2] io/mmap: new -s option for mmap command to reserve some free space Message-Id: <1458143059-26153-1-git-send-email-zlang@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: 1458143063 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 When I try to use xfs_io to rewrite LTP's mmap16 testcase for xfstests, I always hit mremap ENOMEM error. But according to linux commit: 90a8020 vfs: fix data corruption when blocksize < pagesize for mmaped data The reproducer shouldn't use MREMAP_MAYMOVE flag for mremap(). So we need a stable method to make mremap can extend space from the original mapped starting address(That means no -m option for xfs_io mremap). Generally if we try to mremap from the original mapped starting point in a C program, at first we always do: addr = mmap(NULL, res_size, prot, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); munmap(addr, res_size); Then do: addr = mmap(addr, real_len, ...); The "res_size" is bigger than "real_len". This will help us get a region between real_len and res_size, which maybe free space. The truth is we can't guarantee that this free memory will stay free. But this method is still very helpful for reserve some free space in short time. This patch bring in the "res_size" by use a new -s option. If don't use this option, xfs_io -c "mmap 0 1024" -c "mremap 8192" will hit ENOMEM error nearly 100%, but if use this option, it nearly always remap successfully. So I think it's helpful, if someone try to run mremap without "-m". Signed-off-by: Zorro Lang Reviewed-by: Brian Foster --- io/mmap.c | 29 +++++++++++++++++++++++------ man/man8/xfs_io.8 | 17 ++++++++++++++++- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/io/mmap.c b/io/mmap.c index 5970069..6cd37a9 100644 --- a/io/mmap.c +++ b/io/mmap.c @@ -146,6 +146,7 @@ mmap_help(void) " -r -- map with PROT_READ protection\n" " -w -- map with PROT_WRITE protection\n" " -x -- map with PROT_EXEC protection\n" +" -s -- first do mmap(size)/munmap(size), try to reserve some free space\n" " If no protection mode is specified, all are used by default.\n" "\n")); } @@ -156,8 +157,8 @@ mmap_f( char **argv) { off64_t offset; - ssize_t length; - void *address; + ssize_t length = 0, length2 = 0; + void *address = NULL; char *filename; size_t blocksize, sectsize; int c, prot = 0; @@ -181,7 +182,9 @@ mmap_f( return 0; } - while ((c = getopt(argc, argv, "rwx")) != EOF) { + init_cvtnum(&blocksize, §size); + + while ((c = getopt(argc, argv, "rwxs:")) != EOF) { switch (c) { case 'r': prot |= PROT_READ; @@ -192,6 +195,9 @@ mmap_f( case 'x': prot |= PROT_EXEC; break; + case 's': + length2 = cvtnum(blocksize, sectsize, optarg); + break; default: return command_usage(&mmap_cmd); } @@ -202,7 +208,6 @@ mmap_f( if (optind != argc - 2) return command_usage(&mmap_cmd); - init_cvtnum(&blocksize, §size); offset = cvtnum(blocksize, sectsize, argv[optind]); if (offset < 0) { printf(_("non-numeric offset argument -- %s\n"), argv[optind]); @@ -221,7 +226,19 @@ mmap_f( return 0; } - address = mmap(NULL, length, prot, MAP_SHARED, file->fd, offset); + /* + * mmap and munmap memory area of length2 region is helpful to + * make a region of extendible free memory. It's generally used + * for later mremap operation(no MREMAP_MAYMOVE flag). But there + * isn't guarantee that the memory after length (up to length2) + * will stay free. + */ + if (length2 > length) { + address = mmap(NULL, length2, prot, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + munmap(address, length2); + } + address = mmap(address, length, prot, MAP_SHARED, file->fd, offset); if (address == MAP_FAILED) { perror("mmap"); free(filename); @@ -647,7 +664,7 @@ mmap_init(void) mmap_cmd.argmin = 0; mmap_cmd.argmax = -1; mmap_cmd.flags = CMD_NOMAP_OK | CMD_NOFILE_OK | CMD_FOREIGN_OK; - mmap_cmd.args = _("[N] | [-rwx] [off len]"); + mmap_cmd.args = _("[N] | [-rwx] [-s size] [off len]"); mmap_cmd.oneline = _("mmap a range in the current file, show mappings"); mmap_cmd.help = mmap_help; diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 index 33fbe6a..93a8a00 100644 --- a/man/man8/xfs_io.8 +++ b/man/man8/xfs_io.8 @@ -559,7 +559,7 @@ Do not print timing statistics at all. .SH MEMORY MAPPED I/O COMMANDS .TP -.BI "mmap [ " N " | [[ \-rwx ] " "offset length " ]] +.BI "mmap [ " N " | [[ \-rwx ] [\-s " size " ] " "offset length " ]] With no arguments, .B mmap shows the current mappings. Specifying a single numeric argument @@ -575,6 +575,21 @@ PROT_WRITE .RB ( \-w ), and PROT_EXEC .RB ( \-x ). +.BI \-s " size" +is used to do a mmap(size) && munmap(size) operation at first, try to reserve some +extendible free memory space, if +.I size +is bigger than +.I length +parameter. But there's not guarantee that the memory after +.I length +( up to +.I size +) will stay free. +.B e.g. +"mmap -rw -s 8192 1024" will mmap 0 ~ 1024 bytes memory, but try to reserve 1024 ~ 8192 +free space(no guarantee). This free space will helpful for "mremap 8192" without +MREMAP_MAYMOVE flag. .TP .B mm See the -- 2.5.0 From david@fromorbit.com Wed Mar 16 14:34:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2A14D7CA0 for ; Wed, 16 Mar 2016 14:34:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E1F928F8040 for ; Wed, 16 Mar 2016 12:34:41 -0700 (PDT) X-ASG-Debug-ID: 1458156878-04cb6c7f2a223a10001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id GTNzTISRRRbekEP8 for ; Wed, 16 Mar 2016 12:34:38 -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: A2BlCgBKtOlWPFEqLHleKAECgxuBQYZmnzYGjAKJYoYHAgIBAQKBQU0BAQEBAQEHAQEBAUFAhEIBAQQ6HCMQCAMUBAklDwUlAwcaE4gmwEgBAQEBBgEBAQEcGYU9hQyHZ4EPAQSXUY13jw+Of4RbKC6KYwEBAQ Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl2.internode.on.net with ESMTP; 17 Mar 2016 06:04:37 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1agHDI-0008Gc-4i; Thu, 17 Mar 2016 06:34:36 +1100 Date: Thu, 17 Mar 2016 06:34:36 +1100 From: Dave Chinner To: Eric Sandeen Cc: weber@zbfmail.de, xfs@oss.sgi.com Subject: Re: an mount option question and dunno if right here... Message-ID: <20160316193436.GF11812@dastard> X-ASG-Orig-Subj: Re: an mount option question and dunno if right here... References: <08297acdf77244b468e15458f3d78327@zbfmail.de> <56E1A8B1.2080800@sandeen.net> <56E9641D.7010203@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56E9641D.7010203@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1458156878 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27907 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Mar 16, 2016 at 08:48:13AM -0500, Eric Sandeen wrote: > On 3/16/16 8:03 AM, Marko Weber | 8000 wrote: > > > > > Hi Eric, > > > > > > my /etc/fstab entry: > > > > /dev/VolGroup01/wiso /raid5/wiso xfs norelatime,lazytime > > > > > > > > # mount: > > > > > > /dev/mapper/VolGroup01-wiso on /raid5/wiso type xfs (rw,relatime,lazytime,attr2,inode64,logbufs=8,logbsize=256k,sunit=1024,swidth=3072,noquota) > > > > > > cat /proc/mounts: > > > > /dev/mapper/VolGroup01-wiso /raid5/wiso xfs rw,lazytime,relatime,attr2,inode64,logbufs=8,logbsize=256k,sunit=1024,swidth=3072,noquota 0 0 > > > > Ok, I stand corrected, sorry; I forgot about this: > > commit 0ae45f63d4ef8d8eeec49c7d8b44a1775fff13e8 > Author: Theodore Ts'o > Date: Mon Feb 2 00:37:00 2015 -0500 > > vfs: add support for a lazytime mount option Don't for that lazytime isn't actually implemented by XFS, and we can't intercept that flag at mount time because it's been added as a VFS flag. So on everything but ext4 it does nothing, it conflicts with other atime settings we do support, and we can't really do anything about it... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Mar 16 15:00:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 85B6E7CA0 for ; Wed, 16 Mar 2016 15:00:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4AE7F304051 for ; Wed, 16 Mar 2016 13:00:51 -0700 (PDT) X-ASG-Debug-ID: 1458158447-04cbb00b715053f0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id UT4ccxZoYNhh2Ril for ; Wed, 16 Mar 2016 13:00:48 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2ABCgAhuulWPFEqLHleKAECgxuBQYZmnzYGjAKFVoQMhgcEAgKBQU0BAQEBAQEHAQEBAUFAhEIBAQQ6HCMQCAMOCgklDwUlAwcaE4gmwEUBAQgCAR0ZhT2FDIh2BZdRjXePD45/hFsoLopjAQEB Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl2.internode.on.net with ESMTP; 17 Mar 2016 06:30:44 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1agHcZ-0008Jw-8D; Thu, 17 Mar 2016 07:00:43 +1100 Date: Thu, 17 Mar 2016 07:00:43 +1100 From: Dave Chinner To: Eryu Guan Cc: Christoph Hellwig , fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs/073: filter out finobt warning from mkfs.xfs Message-ID: <20160316200043.GG11812@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs/073: filter out finobt warning from mkfs.xfs References: <1458129204-31882-1-git-send-email-eguan@redhat.com> <20160316120416.GA18030@infradead.org> <20160316145418.GT11419@eguan.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160316145418.GT11419@eguan.usersys.redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1458158448 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27909 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Mar 16, 2016 at 10:54:18PM +0800, Eryu Guan wrote: > On Wed, Mar 16, 2016 at 05:04:16AM -0700, Christoph Hellwig wrote: > > On Wed, Mar 16, 2016 at 07:53:24PM +0800, Eryu Guan wrote: > > > When testing xfs/073 with MKFS_OPTIONS="-m crc=1,finobt=1" set, it fails > > > due to extra warning about disabling finobt feature: > > > > > > +warning: finobt not supported without CRC support, disabled. > > > > > > Because xfs/073 disables crc unconditionally and finobt can not be > > > enabled either. > > > > How about explicitly disabling finobt as well? > > I think that's a cleaner way to fix it. Just that some extra work is > needed to let the test pass with old mkfs.xfs without metadata suport. This is a downhill slope. e.g. if I add "-i sparse=1" to the mkfs line, it will warning differently and a new filter is needed. I would suggest just ignoring the mkfs output altogether (maybe just dumping it all to $seqres.full) as it's not necessary to determine whether the test ran correctly or not. Cheers, Dave. -- Dave Chinner david@fromorbit.com From agruenba@redhat.com Wed Mar 16 17:19:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EC2437CA0 for ; Wed, 16 Mar 2016 17:19:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B1B7130405F for ; Wed, 16 Mar 2016 15:19:16 -0700 (PDT) X-ASG-Debug-ID: 1458166754-04cbb00b7150a090001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id y1mLi2UeaghYlx4v (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 15:19:14 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 0D7D3C3268; Wed, 16 Mar 2016 22:19:14 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-8.ams2.redhat.com [10.36.5.8]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GMJ4Hw007786; Wed, 16 Mar 2016 18:19:10 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v20 01/23] vfs: Add IS_ACL() and IS_RICHACL() tests Date: Wed, 16 Mar 2016 23:18:41 +0100 X-ASG-Orig-Subj: [PATCH v20 01/23] vfs: Add IS_ACL() and IS_RICHACL() tests Message-Id: <1458166743-18488-2-git-send-email-agruenba@redhat.com> In-Reply-To: <1458166743-18488-1-git-send-email-agruenba@redhat.com> References: <1458166743-18488-1-git-send-email-agruenba@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: 1458166754 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The vfs does not apply the umask for file systems that support acls. The test used for this used to be called IS_POSIXACL(). Switch to a new IS_ACL() test to check for either posix acls or richacls instead. Add a new MS_RICHACL flag and IS_RICHACL() test for richacls alone. The IS_POSIXACL() test is still needed by nfsd. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields Reviewed-by: Andreas Dilger --- fs/Kconfig | 3 +++ fs/namei.c | 8 ++++---- include/linux/fs.h | 12 ++++++++++++ include/uapi/linux/fs.h | 3 ++- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/fs/Kconfig b/fs/Kconfig index 9adee0d..f7b26f3 100644 --- a/fs/Kconfig +++ b/fs/Kconfig @@ -63,6 +63,9 @@ endif # BLOCK config FS_POSIX_ACL def_bool n +config FS_RICHACL + def_bool n + config EXPORTFS tristate diff --git a/fs/namei.c b/fs/namei.c index 9c590e0..68e1056 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -2861,7 +2861,7 @@ static int atomic_open(struct nameidata *nd, struct dentry *dentry, } mode = op->mode; - if ((open_flag & O_CREAT) && !IS_POSIXACL(dir)) + if ((open_flag & O_CREAT) && !IS_ACL(dir)) mode &= ~current_umask(); excl = (open_flag & (O_EXCL | O_CREAT)) == (O_EXCL | O_CREAT); @@ -3045,7 +3045,7 @@ static int lookup_open(struct nameidata *nd, struct path *path, /* Negative dentry, just create the file */ if (!dentry->d_inode && (op->open_flag & O_CREAT)) { umode_t mode = op->mode; - if (!IS_POSIXACL(dir->d_inode)) + if (!IS_ACL(dir->d_inode)) mode &= ~current_umask(); /* * This write is needed to ensure that a @@ -3620,7 +3620,7 @@ retry: if (IS_ERR(dentry)) return PTR_ERR(dentry); - if (!IS_POSIXACL(path.dentry->d_inode)) + if (!IS_ACL(path.dentry->d_inode)) mode &= ~current_umask(); error = security_path_mknod(&path, dentry, mode, dev); if (error) @@ -3689,7 +3689,7 @@ retry: if (IS_ERR(dentry)) return PTR_ERR(dentry); - if (!IS_POSIXACL(path.dentry->d_inode)) + if (!IS_ACL(path.dentry->d_inode)) mode &= ~current_umask(); error = security_path_mkdir(&path, dentry, mode); if (!error) diff --git a/include/linux/fs.h b/include/linux/fs.h index ae68100..f9d2b59 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1804,6 +1804,12 @@ struct super_operations { #define IS_IMMUTABLE(inode) ((inode)->i_flags & S_IMMUTABLE) #define IS_POSIXACL(inode) __IS_FLG(inode, MS_POSIXACL) +#ifdef CONFIG_FS_RICHACL +#define IS_RICHACL(inode) __IS_FLG(inode, MS_RICHACL) +#else +#define IS_RICHACL(inode) 0 +#endif + #define IS_DEADDIR(inode) ((inode)->i_flags & S_DEAD) #define IS_NOCMTIME(inode) ((inode)->i_flags & S_NOCMTIME) #define IS_SWAPFILE(inode) ((inode)->i_flags & S_SWAPFILE) @@ -1817,6 +1823,12 @@ struct super_operations { (inode)->i_rdev == WHITEOUT_DEV) /* + * IS_ACL() tells the VFS to not apply the umask + * and use check_acl for acl permission checks when defined. + */ +#define IS_ACL(inode) __IS_FLG(inode, MS_POSIXACL | MS_RICHACL) + +/* * Inode state bits. Protected by inode->i_lock * * Three bits determine the dirty state of the inode, I_DIRTY_SYNC, diff --git a/include/uapi/linux/fs.h b/include/uapi/linux/fs.h index 149bec8..540dbef 100644 --- a/include/uapi/linux/fs.h +++ b/include/uapi/linux/fs.h @@ -120,7 +120,7 @@ struct inodes_stat_t { #define MS_VERBOSE 32768 /* War is peace. Verbosity is silence. MS_VERBOSE is deprecated. */ #define MS_SILENT 32768 -#define MS_POSIXACL (1<<16) /* VFS does not apply the umask */ +#define MS_POSIXACL (1<<16) /* Supports POSIX ACLs */ #define MS_UNBINDABLE (1<<17) /* change to unbindable */ #define MS_PRIVATE (1<<18) /* change to private */ #define MS_SLAVE (1<<19) /* change to slave */ @@ -130,6 +130,7 @@ struct inodes_stat_t { #define MS_I_VERSION (1<<23) /* Update inode I_version field */ #define MS_STRICTATIME (1<<24) /* Always perform atime updates */ #define MS_LAZYTIME (1<<25) /* Update the on-disk [acm]times lazily */ +#define MS_RICHACL (1<<26) /* Supports richacls */ /* These sb flags are internal to the kernel */ #define MS_NOSEC (1<<28) -- 2.5.0 From agruenba@redhat.com Wed Mar 16 17:19:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 594107CA4 for ; Wed, 16 Mar 2016 17: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 C3417AC001 for ; Wed, 16 Mar 2016 15:19:15 -0700 (PDT) X-ASG-Debug-ID: 1458166750-04cbb00b7050a080001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Dtp8nTNLDlZnoiPq (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 15:19:11 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id B929EC00DE0F; Wed, 16 Mar 2016 22:19:09 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-8.ams2.redhat.com [10.36.5.8]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GMJ4Hv007786; Wed, 16 Mar 2016 18:19:04 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v20 00/23] Richacls (Core and Ext4) Date: Wed, 16 Mar 2016 23:18:40 +0100 X-ASG-Orig-Subj: [PATCH v20 00/23] Richacls (Core and Ext4) Message-Id: <1458166743-18488-1-git-send-email-agruenba@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: 1458166751 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Al, here is a minor update to the richacl patches with some feedback from Christoph incorporated. Changes since the last posting (https://lkml.org/lkml/2016/3/14/503): * Merge richacl_base.c and richacl_inode.c into richacl.c. * Add linux/acl.h header including function acl_chmod. Use it in richacl enabled filesystems. The complete patch queue is available here: git://git.kernel.org/pub/scm/linux/kernel/git/agruen/linux-richacl.git \ richacl-2016-03-16 The richacl user-space utilitites, man pages, and test suite are available here: https://github.com/andreas-gruenbacher/richacl Changes to other user-space packages for richacl: https://github.com/andreas-gruenbacher/coreutils https://github.com/andreas-gruenbacher/e2fsprogs https://github.com/andreas-gruenbacher/samba https://github.com/andreas-gruenbacher/xfsprogs-dev https://github.com/andreas-gruenbacher/nfs-utils Please see the richacl homepage for more information: http://www.bestbits.at/richacl/ Thanks, Andreas Andreas Gruenbacher (21): vfs: Add IS_ACL() and IS_RICHACL() tests vfs: Add MAY_CREATE_FILE and MAY_CREATE_DIR permission flags vfs: Add MAY_DELETE_SELF and MAY_DELETE_CHILD permission flags vfs: Make the inode passed to inode_change_ok non-const vfs: Add permission flags for setting file attributes richacl: In-memory representation and helper functions richacl: Permission mapping functions richacl: Compute maximum file masks from an acl richacl: Permission check algorithm posix_acl: Unexport acl_by_type and make it static posix_acl: Improve xattr fixup code vfs: Cache base_acl objects in inodes vfs: Add get_richacl and set_richacl inode operations vfs: Cache richacl in struct inode richacl: Update the file masks in chmod() richacl: Check if an acl is equivalent to a file mode richacl: Create-time inheritance richacl: Automatic Inheritance richacl: xattr mapping functions richacl: Add richacl xattr handler vfs: Add richacl permission checking Aneesh Kumar K.V (2): ext4: Add richacl support ext4: Add richacl feature flag drivers/staging/lustre/lustre/llite/llite_lib.c | 2 +- fs/Kconfig | 3 + fs/Makefile | 1 + fs/attr.c | 81 ++- fs/ext4/Kconfig | 11 + fs/ext4/Makefile | 1 + fs/ext4/ext4.h | 6 +- fs/ext4/file.c | 3 + fs/ext4/ialloc.c | 11 +- fs/ext4/inode.c | 5 +- fs/ext4/namei.c | 5 + fs/ext4/richacl.c | 137 ++++ fs/ext4/richacl.h | 40 ++ fs/ext4/super.c | 49 +- fs/ext4/xattr.c | 7 + fs/f2fs/acl.c | 4 +- fs/inode.c | 15 +- fs/jffs2/acl.c | 10 +- fs/namei.c | 118 +++- fs/posix_acl.c | 50 +- fs/richacl.c | 889 ++++++++++++++++++++++++ fs/richacl_xattr.c | 235 +++++++ fs/xattr.c | 29 +- include/linux/acl.h | 15 + include/linux/fs.h | 60 +- include/linux/posix_acl.h | 13 +- include/linux/richacl.h | 205 ++++++ include/linux/richacl_xattr.h | 31 + include/uapi/linux/Kbuild | 2 + include/uapi/linux/fs.h | 3 +- include/uapi/linux/richacl.h | 152 ++++ include/uapi/linux/richacl_xattr.h | 44 ++ include/uapi/linux/xattr.h | 2 + 33 files changed, 2131 insertions(+), 108 deletions(-) create mode 100644 fs/ext4/richacl.c create mode 100644 fs/ext4/richacl.h create mode 100644 fs/richacl.c create mode 100644 fs/richacl_xattr.c create mode 100644 include/linux/acl.h create mode 100644 include/linux/richacl.h create mode 100644 include/linux/richacl_xattr.h create mode 100644 include/uapi/linux/richacl.h create mode 100644 include/uapi/linux/richacl_xattr.h -- 2.5.0 From agruenba@redhat.com Wed Mar 16 17:19:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 790187CA4 for ; Wed, 16 Mar 2016 17:19:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id F2EB7AC002 for ; Wed, 16 Mar 2016 15:19:19 -0700 (PDT) X-ASG-Debug-ID: 1458166758-04bdf002ed535700001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id wmHJim390uK61BA3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 15:19:18 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 4B98C4AD7D; Wed, 16 Mar 2016 22:19:18 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-8.ams2.redhat.com [10.36.5.8]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GMJ4Hx007786; Wed, 16 Mar 2016 18:19:14 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v20 02/23] vfs: Add MAY_CREATE_FILE and MAY_CREATE_DIR permission flags Date: Wed, 16 Mar 2016 23:18:42 +0100 X-ASG-Orig-Subj: [PATCH v20 02/23] vfs: Add MAY_CREATE_FILE and MAY_CREATE_DIR permission flags Message-Id: <1458166743-18488-3-git-send-email-agruenba@redhat.com> In-Reply-To: <1458166743-18488-1-git-send-email-agruenba@redhat.com> References: <1458166743-18488-1-git-send-email-agruenba@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: 1458166758 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Richacls distinguish between creating non-directories and directories. To support that, add an isdir parameter to may_create(). When checking inode_permission() for create permission, pass in an additional MAY_CREATE_FILE or MAY_CREATE_DIR mask flag. Add may_replace() to allow checking for delete and create access when replacing an existing file in vfs_rename(). Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields Reviewed-by: Andreas Dilger --- fs/namei.c | 49 +++++++++++++++++++++++++++++++++---------------- include/linux/fs.h | 2 ++ 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/fs/namei.c b/fs/namei.c index 68e1056..2092742 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -453,7 +453,9 @@ static int sb_permission(struct super_block *sb, struct inode *inode, int mask) * this, letting us set arbitrary permissions for filesystem access without * changing the "normal" UIDs which are used for other things. * - * When checking for MAY_APPEND, MAY_WRITE must also be set in @mask. + * MAY_WRITE must be set in @mask whenever MAY_APPEND, MAY_CREATE_FILE, or + * MAY_CREATE_DIR are set. That way, file systems that don't support these + * permissions will check for MAY_WRITE instead. */ int inode_permission(struct inode *inode, int mask) { @@ -2616,7 +2618,8 @@ EXPORT_SYMBOL(__check_sticky); * 10. We don't allow removal of NFS sillyrenamed files; it's handled by * nfs_async_unlink(). */ -static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) +static int may_delete_or_replace(struct inode *dir, struct dentry *victim, + bool isdir, int mask) { struct inode *inode = d_backing_inode(victim); int error; @@ -2628,7 +2631,7 @@ static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) BUG_ON(victim->d_parent->d_inode != dir); audit_inode_child(dir, victim, AUDIT_TYPE_CHILD_DELETE); - error = inode_permission(dir, MAY_WRITE | MAY_EXEC); + error = inode_permission(dir, mask); if (error) return error; if (IS_APPEND(dir)) @@ -2651,6 +2654,18 @@ static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) return 0; } +static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) +{ + return may_delete_or_replace(dir, victim, isdir, MAY_WRITE | MAY_EXEC); +} + +static int may_replace(struct inode *dir, struct dentry *victim, bool isdir) +{ + int mask = isdir ? MAY_CREATE_DIR : MAY_CREATE_FILE; + + return may_delete_or_replace(dir, victim, isdir, mask | MAY_WRITE | MAY_EXEC); +} + /* Check whether we can create an object with dentry child in directory * dir. * 1. We can't do it if child already exists (open has special treatment for @@ -2659,14 +2674,16 @@ static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) * 3. We should have write and exec permissions on dir * 4. We can't do it if dir is immutable (done in permission()) */ -static inline int may_create(struct inode *dir, struct dentry *child) +static inline int may_create(struct inode *dir, struct dentry *child, bool isdir) { + int mask = isdir ? MAY_CREATE_DIR : MAY_CREATE_FILE; + audit_inode_child(dir, child, AUDIT_TYPE_CHILD_CREATE); if (child->d_inode) return -EEXIST; if (IS_DEADDIR(dir)) return -ENOENT; - return inode_permission(dir, MAY_WRITE | MAY_EXEC); + return inode_permission(dir, MAY_WRITE | MAY_EXEC | mask); } /* @@ -2716,7 +2733,7 @@ EXPORT_SYMBOL(unlock_rename); int vfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, bool want_excl) { - int error = may_create(dir, dentry); + int error = may_create(dir, dentry, false); if (error) return error; @@ -3561,7 +3578,7 @@ EXPORT_SYMBOL(user_path_create); int vfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev) { - int error = may_create(dir, dentry); + int error = may_create(dir, dentry, false); if (error) return error; @@ -3653,7 +3670,7 @@ SYSCALL_DEFINE3(mknod, const char __user *, filename, umode_t, mode, unsigned, d int vfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) { - int error = may_create(dir, dentry); + int error = may_create(dir, dentry, true); unsigned max_links = dir->i_sb->s_max_links; if (error) @@ -3734,7 +3751,7 @@ EXPORT_SYMBOL(dentry_unhash); int vfs_rmdir(struct inode *dir, struct dentry *dentry) { - int error = may_delete(dir, dentry, 1); + int error = may_delete(dir, dentry, true); if (error) return error; @@ -3856,7 +3873,7 @@ SYSCALL_DEFINE1(rmdir, const char __user *, pathname) int vfs_unlink(struct inode *dir, struct dentry *dentry, struct inode **delegated_inode) { struct inode *target = dentry->d_inode; - int error = may_delete(dir, dentry, 0); + int error = may_delete(dir, dentry, false); if (error) return error; @@ -3990,7 +4007,7 @@ SYSCALL_DEFINE1(unlink, const char __user *, pathname) int vfs_symlink(struct inode *dir, struct dentry *dentry, const char *oldname) { - int error = may_create(dir, dentry); + int error = may_create(dir, dentry, false); if (error) return error; @@ -4073,7 +4090,7 @@ int vfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_de if (!inode) return -ENOENT; - error = may_create(dir, new_dentry); + error = may_create(dir, new_dentry, false); if (error) return error; @@ -4266,14 +4283,14 @@ int vfs_rename(struct inode *old_dir, struct dentry *old_dentry, return error; if (!target) { - error = may_create(new_dir, new_dentry); + error = may_create(new_dir, new_dentry, is_dir); } else { new_is_dir = d_is_dir(new_dentry); if (!(flags & RENAME_EXCHANGE)) - error = may_delete(new_dir, new_dentry, is_dir); + error = may_replace(new_dir, new_dentry, is_dir); else - error = may_delete(new_dir, new_dentry, new_is_dir); + error = may_replace(new_dir, new_dentry, new_is_dir); } if (error) return error; @@ -4536,7 +4553,7 @@ SYSCALL_DEFINE2(rename, const char __user *, oldname, const char __user *, newna int vfs_whiteout(struct inode *dir, struct dentry *dentry) { - int error = may_create(dir, dentry); + int error = may_create(dir, dentry, false); if (error) return error; diff --git a/include/linux/fs.h b/include/linux/fs.h index f9d2b59..02e99d7 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -83,6 +83,8 @@ typedef void (dax_iodone_t)(struct buffer_head *bh_map, int uptodate); #define MAY_CHDIR 0x00000040 /* called from RCU mode, don't block */ #define MAY_NOT_BLOCK 0x00000080 +#define MAY_CREATE_FILE 0x00000100 +#define MAY_CREATE_DIR 0x00000200 /* * flags in file.f_mode. Note that FMODE_READ and FMODE_WRITE must correspond -- 2.5.0 From agruenba@redhat.com Wed Mar 16 17:19:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 298D07CA0 for ; Wed, 16 Mar 2016 17:19:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 84888AC001 for ; Wed, 16 Mar 2016 15:19:24 -0700 (PDT) X-ASG-Debug-ID: 1458166762-04cb6c7f2b229420001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id js6zfHTcTe2tzmnY (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 15:19:23 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 9F11AC9429; Wed, 16 Mar 2016 22:19:22 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-8.ams2.redhat.com [10.36.5.8]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GMJ4I0007786; Wed, 16 Mar 2016 18:19:18 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v20 03/23] vfs: Add MAY_DELETE_SELF and MAY_DELETE_CHILD permission flags Date: Wed, 16 Mar 2016 23:18:43 +0100 X-ASG-Orig-Subj: [PATCH v20 03/23] vfs: Add MAY_DELETE_SELF and MAY_DELETE_CHILD permission flags Message-Id: <1458166743-18488-4-git-send-email-agruenba@redhat.com> In-Reply-To: <1458166743-18488-1-git-send-email-agruenba@redhat.com> References: <1458166743-18488-1-git-send-email-agruenba@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: 1458166763 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Normally, deleting a file requires MAY_WRITE access to the parent directory. With richacls, a file may be deleted with MAY_DELETE_CHILD access to the parent directory or with MAY_DELETE_SELF access to the file. To support that, pass the MAY_DELETE_CHILD mask flag to inode_permission() when checking for delete access inside a directory, and MAY_DELETE_SELF when checking for delete access to a file itelf. The MAY_DELETE_SELF permission overrides the sticky directory check. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields --- fs/namei.c | 20 ++++++++++++-------- include/linux/fs.h | 2 ++ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/fs/namei.c b/fs/namei.c index 2092742..28707ae 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -453,9 +453,9 @@ static int sb_permission(struct super_block *sb, struct inode *inode, int mask) * this, letting us set arbitrary permissions for filesystem access without * changing the "normal" UIDs which are used for other things. * - * MAY_WRITE must be set in @mask whenever MAY_APPEND, MAY_CREATE_FILE, or - * MAY_CREATE_DIR are set. That way, file systems that don't support these - * permissions will check for MAY_WRITE instead. + * MAY_WRITE must be set in @mask whenever MAY_APPEND, MAY_CREATE_FILE, + * MAY_CREATE_DIR, or MAY_DELETE_CHILD are set. That way, file systems that + * don't support these permissions will check for MAY_WRITE instead. */ int inode_permission(struct inode *inode, int mask) { @@ -2631,14 +2631,18 @@ static int may_delete_or_replace(struct inode *dir, struct dentry *victim, BUG_ON(victim->d_parent->d_inode != dir); audit_inode_child(dir, victim, AUDIT_TYPE_CHILD_DELETE); - error = inode_permission(dir, mask); + error = inode_permission(dir, mask | MAY_WRITE | MAY_DELETE_CHILD); + if (!error && check_sticky(dir, inode)) + error = -EPERM; + if (error && IS_RICHACL(inode) && + inode_permission(inode, MAY_DELETE_SELF) == 0 && + inode_permission(dir, mask) == 0) + error = 0; if (error) return error; if (IS_APPEND(dir)) return -EPERM; - - if (check_sticky(dir, inode) || IS_APPEND(inode) || - IS_IMMUTABLE(inode) || IS_SWAPFILE(inode)) + if (IS_APPEND(inode) || IS_IMMUTABLE(inode) || IS_SWAPFILE(inode)) return -EPERM; if (isdir) { if (!d_is_dir(victim)) @@ -2656,7 +2660,7 @@ static int may_delete_or_replace(struct inode *dir, struct dentry *victim, static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) { - return may_delete_or_replace(dir, victim, isdir, MAY_WRITE | MAY_EXEC); + return may_delete_or_replace(dir, victim, isdir, MAY_EXEC); } static int may_replace(struct inode *dir, struct dentry *victim, bool isdir) diff --git a/include/linux/fs.h b/include/linux/fs.h index 02e99d7..97e34ba 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -85,6 +85,8 @@ typedef void (dax_iodone_t)(struct buffer_head *bh_map, int uptodate); #define MAY_NOT_BLOCK 0x00000080 #define MAY_CREATE_FILE 0x00000100 #define MAY_CREATE_DIR 0x00000200 +#define MAY_DELETE_CHILD 0x00000400 +#define MAY_DELETE_SELF 0x00000800 /* * flags in file.f_mode. Note that FMODE_READ and FMODE_WRITE must correspond -- 2.5.0 From agruenba@redhat.com Wed Mar 16 17:19:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DA2747CAF for ; Wed, 16 Mar 2016 17:19:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A09888F8049 for ; Wed, 16 Mar 2016 15:19:28 -0700 (PDT) X-ASG-Debug-ID: 1458166767-04bdf002ec535710001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id tdqlH8lSVoELmIUt (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 15:19:27 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id EE23246269; Wed, 16 Mar 2016 22:19:26 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-8.ams2.redhat.com [10.36.5.8]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GMJ4I1007786; Wed, 16 Mar 2016 18:19:22 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v20 04/23] vfs: Make the inode passed to inode_change_ok non-const Date: Wed, 16 Mar 2016 23:18:44 +0100 X-ASG-Orig-Subj: [PATCH v20 04/23] vfs: Make the inode passed to inode_change_ok non-const Message-Id: <1458166743-18488-5-git-send-email-agruenba@redhat.com> In-Reply-To: <1458166743-18488-1-git-send-email-agruenba@redhat.com> References: <1458166743-18488-1-git-send-email-agruenba@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: 1458166767 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 We will need to call iop->permission and iop->get_acl from inode_change_ok() for additional permission checks, and both take a non-const inode. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields Reviewed-by: Andreas Dilger --- fs/attr.c | 2 +- include/linux/fs.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/attr.c b/fs/attr.c index 25b24d0..7ca7fa0 100644 --- a/fs/attr.c +++ b/fs/attr.c @@ -28,7 +28,7 @@ * Should be called as the first thing in ->setattr implementations, * possibly after taking additional locks. */ -int inode_change_ok(const struct inode *inode, struct iattr *attr) +int inode_change_ok(struct inode *inode, struct iattr *attr) { unsigned int ia_valid = attr->ia_valid; diff --git a/include/linux/fs.h b/include/linux/fs.h index 97e34ba..efff04f 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2908,7 +2908,7 @@ extern int buffer_migrate_page(struct address_space *, #define buffer_migrate_page NULL #endif -extern int inode_change_ok(const struct inode *, struct iattr *); +extern int inode_change_ok(struct inode *, struct iattr *); extern int inode_newsize_ok(const struct inode *, loff_t offset); extern void setattr_copy(struct inode *inode, const struct iattr *attr); -- 2.5.0 From agruenba@redhat.com Wed Mar 16 17:19:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A612D7CB5 for ; Wed, 16 Mar 2016 17:19:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 78B90304066 for ; Wed, 16 Mar 2016 15:19:33 -0700 (PDT) X-ASG-Debug-ID: 1458166771-04cb6c7f2b229430001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 5QDYXXWrmuh9uD91 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 15:19:32 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 43F67C00F204; Wed, 16 Mar 2016 22:19:31 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-8.ams2.redhat.com [10.36.5.8]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GMJ4I2007786; Wed, 16 Mar 2016 18:19:27 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v20 05/23] vfs: Add permission flags for setting file attributes Date: Wed, 16 Mar 2016 23:18:45 +0100 X-ASG-Orig-Subj: [PATCH v20 05/23] vfs: Add permission flags for setting file attributes Message-Id: <1458166743-18488-6-git-send-email-agruenba@redhat.com> In-Reply-To: <1458166743-18488-1-git-send-email-agruenba@redhat.com> References: <1458166743-18488-1-git-send-email-agruenba@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: 1458166772 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Richacls support permissions that allow to take ownership of a file, change the file permissions, and set the file timestamps. Support that by introducing new permission mask flags and by checking for those mask flags in inode_change_ok(). Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields --- fs/attr.c | 79 +++++++++++++++++++++++++++++++++++++++++++++--------- include/linux/fs.h | 3 +++ 2 files changed, 70 insertions(+), 12 deletions(-) diff --git a/fs/attr.c b/fs/attr.c index 7ca7fa0..2a8c49c 100644 --- a/fs/attr.c +++ b/fs/attr.c @@ -17,6 +17,65 @@ #include /** + * inode_extended_permission - permissions beyond read/write/execute + * + * Check for permissions that only richacls can currently grant. + */ +static int inode_extended_permission(struct inode *inode, int mask) +{ + if (!IS_RICHACL(inode)) + return -EPERM; + return inode_permission(inode, mask); +} + +static bool inode_uid_change_ok(struct inode *inode, kuid_t ia_uid) +{ + if (uid_eq(current_fsuid(), inode->i_uid) && + uid_eq(ia_uid, inode->i_uid)) + return true; + if (uid_eq(current_fsuid(), ia_uid) && + inode_extended_permission(inode, MAY_TAKE_OWNERSHIP) == 0) + return true; + if (capable_wrt_inode_uidgid(inode, CAP_CHOWN)) + return true; + return false; +} + +static bool inode_gid_change_ok(struct inode *inode, kgid_t ia_gid) +{ + int in_group = in_group_p(ia_gid); + if (uid_eq(current_fsuid(), inode->i_uid) && + (in_group || gid_eq(ia_gid, inode->i_gid))) + return true; + if (in_group && inode_extended_permission(inode, MAY_TAKE_OWNERSHIP) == 0) + return true; + if (capable_wrt_inode_uidgid(inode, CAP_CHOWN)) + return true; + return false; +} + +/** + * inode_owner_permitted_or_capable + * + * Check for permissions implicitly granted to the owner, like MAY_CHMOD or + * MAY_SET_TIMES. Equivalent to inode_owner_or_capable for file systems + * without support for those permissions. + */ +static bool inode_owner_permitted_or_capable(struct inode *inode, int mask) +{ + struct user_namespace *ns; + + if (uid_eq(current_fsuid(), inode->i_uid)) + return true; + if (inode_extended_permission(inode, mask) == 0) + return true; + ns = current_user_ns(); + if (ns_capable(ns, CAP_FOWNER) && kuid_has_mapping(ns, inode->i_uid)) + return true; + return false; +} + +/** * inode_change_ok - check if attribute changes to an inode are allowed * @inode: inode to check * @attr: attributes to change @@ -47,22 +106,18 @@ int inode_change_ok(struct inode *inode, struct iattr *attr) return 0; /* Make sure a caller can chown. */ - if ((ia_valid & ATTR_UID) && - (!uid_eq(current_fsuid(), inode->i_uid) || - !uid_eq(attr->ia_uid, inode->i_uid)) && - !capable_wrt_inode_uidgid(inode, CAP_CHOWN)) - return -EPERM; + if (ia_valid & ATTR_UID) + if (!inode_uid_change_ok(inode, attr->ia_uid)) + return -EPERM; /* Make sure caller can chgrp. */ - if ((ia_valid & ATTR_GID) && - (!uid_eq(current_fsuid(), inode->i_uid) || - (!in_group_p(attr->ia_gid) && !gid_eq(attr->ia_gid, inode->i_gid))) && - !capable_wrt_inode_uidgid(inode, CAP_CHOWN)) - return -EPERM; + if (ia_valid & ATTR_GID) + if (!inode_gid_change_ok(inode, attr->ia_gid)) + return -EPERM; /* Make sure a caller can chmod. */ if (ia_valid & ATTR_MODE) { - if (!inode_owner_or_capable(inode)) + if (!inode_owner_permitted_or_capable(inode, MAY_CHMOD)) return -EPERM; /* Also check the setgid bit! */ if (!in_group_p((ia_valid & ATTR_GID) ? attr->ia_gid : @@ -73,7 +128,7 @@ int inode_change_ok(struct inode *inode, struct iattr *attr) /* Check for setting the inode time. */ if (ia_valid & (ATTR_MTIME_SET | ATTR_ATIME_SET | ATTR_TIMES_SET)) { - if (!inode_owner_or_capable(inode)) + if (!inode_owner_permitted_or_capable(inode, MAY_SET_TIMES)) return -EPERM; } diff --git a/include/linux/fs.h b/include/linux/fs.h index efff04f..0f560b7 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -87,6 +87,9 @@ typedef void (dax_iodone_t)(struct buffer_head *bh_map, int uptodate); #define MAY_CREATE_DIR 0x00000200 #define MAY_DELETE_CHILD 0x00000400 #define MAY_DELETE_SELF 0x00000800 +#define MAY_TAKE_OWNERSHIP 0x00001000 +#define MAY_CHMOD 0x00002000 +#define MAY_SET_TIMES 0x00004000 /* * flags in file.f_mode. Note that FMODE_READ and FMODE_WRITE must correspond -- 2.5.0 From agruenba@redhat.com Wed Mar 16 17:19:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 552227CA0 for ; Wed, 16 Mar 2016 17:19:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 27A708F8035 for ; Wed, 16 Mar 2016 15:19:38 -0700 (PDT) X-ASG-Debug-ID: 1458166775-04cbb00b7150a0c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 2T2NJXnHe5iwle8A (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 15:19:36 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 8777264D08; Wed, 16 Mar 2016 22:19:35 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-8.ams2.redhat.com [10.36.5.8]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GMJ4I3007786; Wed, 16 Mar 2016 18:19:31 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v20 06/23] richacl: In-memory representation and helper functions Date: Wed, 16 Mar 2016 23:18:46 +0100 X-ASG-Orig-Subj: [PATCH v20 06/23] richacl: In-memory representation and helper functions Message-Id: <1458166743-18488-7-git-send-email-agruenba@redhat.com> In-Reply-To: <1458166743-18488-1-git-send-email-agruenba@redhat.com> References: <1458166743-18488-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Wed, 16 Mar 2016 22:19:35 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458166776 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 A richacl consists of an NFSv4 acl and an owner, group, and other mask. These three masks correspond to the owner, group, and other file permission bits, but they contain NFSv4 permissions instead of POSIX permissions. Each entry in the NFSv4 acl applies to the file owner (OWNER@), the owning group (GROUP@), everyone (EVERYONE@), or to a specific uid or gid. As in the standard POSIX file permission model, each process is the owner, group, or other file class. A richacl grants a requested access only if the NFSv4 acl in the richacl grants the access (according to the NFSv4 permission check algorithm), and the file mask that applies to the process includes the requested permissions. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields --- fs/Makefile | 1 + fs/richacl.c | 65 ++++++++++++++++ include/linux/richacl.h | 179 +++++++++++++++++++++++++++++++++++++++++++ include/uapi/linux/Kbuild | 1 + include/uapi/linux/richacl.h | 99 ++++++++++++++++++++++++ 5 files changed, 345 insertions(+) create mode 100644 fs/richacl.c create mode 100644 include/linux/richacl.h create mode 100644 include/uapi/linux/richacl.h diff --git a/fs/Makefile b/fs/Makefile index 79f5225..884d7a4 100644 --- a/fs/Makefile +++ b/fs/Makefile @@ -48,6 +48,7 @@ obj-$(CONFIG_COREDUMP) += coredump.o obj-$(CONFIG_SYSCTL) += drop_caches.o obj-$(CONFIG_FHANDLE) += fhandle.o +obj-$(CONFIG_FS_RICHACL) += richacl.o obj-y += quota/ diff --git a/fs/richacl.c b/fs/richacl.c new file mode 100644 index 0000000..bcc6591 --- /dev/null +++ b/fs/richacl.c @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2006, 2010 Novell, Inc. + * Copyright (C) 2015 Red Hat, Inc. + * Written by Andreas Gruenbacher + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#include +#include +#include +#include +#include + +/** + * richacl_alloc - allocate a richacl + * @count: number of entries + */ +struct richacl * +richacl_alloc(int count, gfp_t gfp) +{ + size_t size = sizeof(struct richacl) + count * sizeof(struct richace); + struct richacl *acl = kzalloc(size, gfp); + + if (acl) { + atomic_set(&acl->a_refcount, 1); + acl->a_count = count; + } + return acl; +} +EXPORT_SYMBOL_GPL(richacl_alloc); + +/** + * richacl_clone - create a copy of a richacl + */ +struct richacl * +richacl_clone(const struct richacl *acl, gfp_t gfp) +{ + int count = acl->a_count; + size_t size = sizeof(struct richacl) + count * sizeof(struct richace); + struct richacl *dup = kmalloc(size, gfp); + + if (dup) { + memcpy(dup, acl, size); + atomic_set(&dup->a_refcount, 1); + } + return dup; +} + +/** + * richace_copy - copy an acl entry + */ +void +richace_copy(struct richace *to, const struct richace *from) +{ + memcpy(to, from, sizeof(struct richace)); +} diff --git a/include/linux/richacl.h b/include/linux/richacl.h new file mode 100644 index 0000000..edb8480 --- /dev/null +++ b/include/linux/richacl.h @@ -0,0 +1,179 @@ +/* + * Copyright (C) 2006, 2010 Novell, Inc. + * Copyright (C) 2015 Red Hat, Inc. + * Written by Andreas Gruenbacher + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#ifndef __RICHACL_H +#define __RICHACL_H + +#include + +struct richace { + unsigned short e_type; + unsigned short e_flags; + unsigned int e_mask; + union { + kuid_t uid; + kgid_t gid; + unsigned int special; + } e_id; +}; + +struct richacl { + atomic_t a_refcount; + unsigned int a_owner_mask; + unsigned int a_group_mask; + unsigned int a_other_mask; + unsigned short a_count; + unsigned short a_flags; + struct richace a_entries[0]; +}; + +#define richacl_for_each_entry(_ace, _acl) \ + for (_ace = (_acl)->a_entries; \ + _ace != (_acl)->a_entries + (_acl)->a_count; \ + _ace++) + +#define richacl_for_each_entry_reverse(_ace, _acl) \ + for (_ace = (_acl)->a_entries + (_acl)->a_count - 1; \ + _ace != (_acl)->a_entries - 1; \ + _ace--) + +/** + * richacl_get - grab another reference to a richacl handle + */ +static inline struct richacl * +richacl_get(struct richacl *acl) +{ + if (acl) + atomic_inc(&acl->a_refcount); + return acl; +} + +/** + * richacl_put - free a richacl handle + */ +static inline void +richacl_put(struct richacl *acl) +{ + if (acl && atomic_dec_and_test(&acl->a_refcount)) + kfree(acl); +} + +/** + * richace_is_owner - check if @ace is an OWNER@ entry + */ +static inline bool +richace_is_owner(const struct richace *ace) +{ + return (ace->e_flags & RICHACE_SPECIAL_WHO) && + ace->e_id.special == RICHACE_OWNER_SPECIAL_ID; +} + +/** + * richace_is_group - check if @ace is a GROUP@ entry + */ +static inline bool +richace_is_group(const struct richace *ace) +{ + return (ace->e_flags & RICHACE_SPECIAL_WHO) && + ace->e_id.special == RICHACE_GROUP_SPECIAL_ID; +} + +/** + * richace_is_everyone - check if @ace is an EVERYONE@ entry + */ +static inline bool +richace_is_everyone(const struct richace *ace) +{ + return (ace->e_flags & RICHACE_SPECIAL_WHO) && + ace->e_id.special == RICHACE_EVERYONE_SPECIAL_ID; +} + +/** + * richace_is_unix_user - check if @ace applies to a specific user + */ +static inline bool +richace_is_unix_user(const struct richace *ace) +{ + return !(ace->e_flags & RICHACE_SPECIAL_WHO) && + !(ace->e_flags & RICHACE_IDENTIFIER_GROUP); +} + +/** + * richace_is_unix_group - check if @ace applies to a specific group + */ +static inline bool +richace_is_unix_group(const struct richace *ace) +{ + return !(ace->e_flags & RICHACE_SPECIAL_WHO) && + (ace->e_flags & RICHACE_IDENTIFIER_GROUP); +} + +/** + * richace_is_inherit_only - check if @ace is for inheritance only + * + * ACEs with the %RICHACE_INHERIT_ONLY_ACE flag set have no effect during + * permission checking. + */ +static inline bool +richace_is_inherit_only(const struct richace *ace) +{ + return ace->e_flags & RICHACE_INHERIT_ONLY_ACE; +} + +/** + * richace_is_inheritable - check if @ace is inheritable + */ +static inline bool +richace_is_inheritable(const struct richace *ace) +{ + return ace->e_flags & (RICHACE_FILE_INHERIT_ACE | + RICHACE_DIRECTORY_INHERIT_ACE); +} + +/** + * richace_is_allow - check if @ace is an %ALLOW type entry + */ +static inline bool +richace_is_allow(const struct richace *ace) +{ + return ace->e_type == RICHACE_ACCESS_ALLOWED_ACE_TYPE; +} + +/** + * richace_is_deny - check if @ace is a %DENY type entry + */ +static inline bool +richace_is_deny(const struct richace *ace) +{ + return ace->e_type == RICHACE_ACCESS_DENIED_ACE_TYPE; +} + +/** + * richace_is_same_identifier - are both identifiers the same? + */ +static inline bool +richace_is_same_identifier(const struct richace *a, const struct richace *b) +{ + return !((a->e_flags ^ b->e_flags) & + (RICHACE_SPECIAL_WHO | RICHACE_IDENTIFIER_GROUP)) && + !memcmp(&a->e_id, &b->e_id, sizeof(a->e_id)); +} + +extern struct richacl *richacl_alloc(int, gfp_t); +extern struct richacl *richacl_clone(const struct richacl *, gfp_t); +extern void richace_copy(struct richace *, const struct richace *); + +#endif /* __RICHACL_H */ diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild index ebd10e6..6e05dc8 100644 --- a/include/uapi/linux/Kbuild +++ b/include/uapi/linux/Kbuild @@ -351,6 +351,7 @@ header-y += reboot.h header-y += reiserfs_fs.h header-y += reiserfs_xattr.h header-y += resource.h +header-y += richacl.h header-y += rfkill.h header-y += romfs_fs.h header-y += rose.h diff --git a/include/uapi/linux/richacl.h b/include/uapi/linux/richacl.h new file mode 100644 index 0000000..08856f8 --- /dev/null +++ b/include/uapi/linux/richacl.h @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2006, 2010 Novell, Inc. + * Copyright (C) 2015 Red Hat, Inc. + * Written by Andreas Gruenbacher + * + * This file is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + */ + +#ifndef __UAPI_RICHACL_H +#define __UAPI_RICHACL_H + +/* a_flags values */ +#define RICHACL_WRITE_THROUGH 0x40 +#define RICHACL_MASKED 0x80 + +/* e_type values */ +#define RICHACE_ACCESS_ALLOWED_ACE_TYPE 0x0000 +#define RICHACE_ACCESS_DENIED_ACE_TYPE 0x0001 + +/* e_flags bitflags */ +#define RICHACE_FILE_INHERIT_ACE 0x0001 +#define RICHACE_DIRECTORY_INHERIT_ACE 0x0002 +#define RICHACE_NO_PROPAGATE_INHERIT_ACE 0x0004 +#define RICHACE_INHERIT_ONLY_ACE 0x0008 +#define RICHACE_IDENTIFIER_GROUP 0x0040 +#define RICHACE_SPECIAL_WHO 0x4000 + +/* e_mask bitflags */ +#define RICHACE_READ_DATA 0x00000001 +#define RICHACE_LIST_DIRECTORY 0x00000001 +#define RICHACE_WRITE_DATA 0x00000002 +#define RICHACE_ADD_FILE 0x00000002 +#define RICHACE_APPEND_DATA 0x00000004 +#define RICHACE_ADD_SUBDIRECTORY 0x00000004 +#define RICHACE_READ_NAMED_ATTRS 0x00000008 +#define RICHACE_WRITE_NAMED_ATTRS 0x00000010 +#define RICHACE_EXECUTE 0x00000020 +#define RICHACE_DELETE_CHILD 0x00000040 +#define RICHACE_READ_ATTRIBUTES 0x00000080 +#define RICHACE_WRITE_ATTRIBUTES 0x00000100 +#define RICHACE_WRITE_RETENTION 0x00000200 +#define RICHACE_WRITE_RETENTION_HOLD 0x00000400 +#define RICHACE_DELETE 0x00010000 +#define RICHACE_READ_ACL 0x00020000 +#define RICHACE_WRITE_ACL 0x00040000 +#define RICHACE_WRITE_OWNER 0x00080000 +#define RICHACE_SYNCHRONIZE 0x00100000 + +/* e_id values */ +#define RICHACE_OWNER_SPECIAL_ID 0 +#define RICHACE_GROUP_SPECIAL_ID 1 +#define RICHACE_EVERYONE_SPECIAL_ID 2 + +#define RICHACL_VALID_FLAGS ( \ + RICHACL_WRITE_THROUGH | \ + RICHACL_MASKED ) + +#define RICHACE_VALID_FLAGS ( \ + RICHACE_FILE_INHERIT_ACE | \ + RICHACE_DIRECTORY_INHERIT_ACE | \ + RICHACE_NO_PROPAGATE_INHERIT_ACE | \ + RICHACE_INHERIT_ONLY_ACE | \ + RICHACE_IDENTIFIER_GROUP | \ + RICHACE_SPECIAL_WHO ) + +#define RICHACE_INHERITANCE_FLAGS ( \ + RICHACE_FILE_INHERIT_ACE | \ + RICHACE_DIRECTORY_INHERIT_ACE | \ + RICHACE_NO_PROPAGATE_INHERIT_ACE | \ + RICHACE_INHERIT_ONLY_ACE ) + +/* Valid RICHACE_* flags for directories and non-directories */ +#define RICHACE_VALID_MASK ( \ + RICHACE_READ_DATA | RICHACE_LIST_DIRECTORY | \ + RICHACE_WRITE_DATA | RICHACE_ADD_FILE | \ + RICHACE_APPEND_DATA | RICHACE_ADD_SUBDIRECTORY | \ + RICHACE_READ_NAMED_ATTRS | \ + RICHACE_WRITE_NAMED_ATTRS | \ + RICHACE_EXECUTE | \ + RICHACE_DELETE_CHILD | \ + RICHACE_READ_ATTRIBUTES | \ + RICHACE_WRITE_ATTRIBUTES | \ + RICHACE_WRITE_RETENTION | \ + RICHACE_WRITE_RETENTION_HOLD | \ + RICHACE_DELETE | \ + RICHACE_READ_ACL | \ + RICHACE_WRITE_ACL | \ + RICHACE_WRITE_OWNER | \ + RICHACE_SYNCHRONIZE ) + +#endif /* __UAPI_RICHACL_H */ -- 2.5.0 From agruenba@redhat.com Wed Mar 16 17:19:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AC9AD7CAF for ; Wed, 16 Mar 2016 17:19:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 22E92AC003 for ; Wed, 16 Mar 2016 15:19:42 -0700 (PDT) X-ASG-Debug-ID: 1458166780-04cbb00b7250a0d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id tbfLrizJzvjmZ8nB (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 15:19:40 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id D5B90C0467EE; Wed, 16 Mar 2016 22:19:39 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-8.ams2.redhat.com [10.36.5.8]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GMJ4I4007786; Wed, 16 Mar 2016 18:19:35 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v20 07/23] richacl: Permission mapping functions Date: Wed, 16 Mar 2016 23:18:47 +0100 X-ASG-Orig-Subj: [PATCH v20 07/23] richacl: Permission mapping functions Message-Id: <1458166743-18488-8-git-send-email-agruenba@redhat.com> In-Reply-To: <1458166743-18488-1-git-send-email-agruenba@redhat.com> References: <1458166743-18488-1-git-send-email-agruenba@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: 1458166780 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 We need to map from POSIX permissions to NFSv4 permissions when a chmod() is done, from NFSv4 permissions to POSIX permissions when an acl is set (which implicitly sets the file permission bits), and from the MAY_READ/MAY_WRITE/MAY_EXEC/MAY_APPEND flags to NFSv4 permissions when doing an access check in a richacl. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields --- fs/richacl.c | 118 +++++++++++++++++++++++++++++++++++++++++++ include/linux/richacl.h | 3 ++ include/uapi/linux/richacl.h | 44 ++++++++++++++++ 3 files changed, 165 insertions(+) diff --git a/fs/richacl.c b/fs/richacl.c index bcc6591..d0a4135 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -63,3 +63,121 @@ richace_copy(struct richace *to, const struct richace *from) { memcpy(to, from, sizeof(struct richace)); } + +/* + * richacl_mask_to_mode - compute the file permission bits from mask + * @mask: %RICHACE_* permission mask + * + * Compute the file permission bits corresponding to a particular set of + * richacl permissions. + * + * See richacl_masks_to_mode(). + */ +static int +richacl_mask_to_mode(unsigned int mask) +{ + int mode = 0; + + if (mask & RICHACE_POSIX_MODE_READ) + mode |= S_IROTH; + if (mask & RICHACE_POSIX_MODE_WRITE) + mode |= S_IWOTH; + if (mask & RICHACE_POSIX_MODE_EXEC) + mode |= S_IXOTH; + + return mode; +} + +/** + * richacl_masks_to_mode - compute file permission bits from file masks + * + * When setting a richacl, we set the file permission bits to indicate maximum + * permissions: for example, we set the Write permission when a mask contains + * RICHACE_APPEND_DATA even if it does not also contain RICHACE_WRITE_DATA. + * + * Permissions which are not in RICHACE_POSIX_MODE_READ, + * RICHACE_POSIX_MODE_WRITE, or RICHACE_POSIX_MODE_EXEC cannot be represented + * in the file permission bits. Such permissions can still be effective, but + * not for new files or after a chmod(); they must be explicitly enabled in the + * richacl. + */ +int +richacl_masks_to_mode(const struct richacl *acl) +{ + return richacl_mask_to_mode(acl->a_owner_mask) << 6 | + richacl_mask_to_mode(acl->a_group_mask) << 3 | + richacl_mask_to_mode(acl->a_other_mask); +} +EXPORT_SYMBOL_GPL(richacl_masks_to_mode); + +/** + * richacl_mode_to_mask - compute a file mask from the lowest three mode bits + * @mode: mode to convert to richacl permissions + * + * When the file permission bits of a file are set with chmod(), this specifies + * the maximum permissions that processes will get. All permissions beyond + * that will be removed from the file masks, and become ineffective. + */ +unsigned int +richacl_mode_to_mask(umode_t mode) +{ + unsigned int mask = 0; + + if (mode & S_IROTH) + mask |= RICHACE_POSIX_MODE_READ; + if (mode & S_IWOTH) + mask |= RICHACE_POSIX_MODE_WRITE; + if (mode & S_IXOTH) + mask |= RICHACE_POSIX_MODE_EXEC; + + return mask; +} + +/** + * richacl_want_to_mask - convert the iop->permission want argument to a mask + * @want: @want argument of the permission inode operation + * + * When checking for append, @want is (MAY_WRITE | MAY_APPEND). + * + * Richacls use the iop->may_create and iop->may_delete hooks which are used + * for checking if creating and deleting files is allowed. These hooks do not + * use richacl_want_to_mask(), so we do not have to deal with mapping MAY_WRITE + * to RICHACE_ADD_FILE, RICHACE_ADD_SUBDIRECTORY, and RICHACE_DELETE_CHILD + * here. + */ +unsigned int +richacl_want_to_mask(unsigned int want) +{ + unsigned int mask = 0; + + if (want & MAY_READ) + mask |= RICHACE_READ_DATA; + if (want & MAY_DELETE_SELF) + mask |= RICHACE_DELETE; + if (want & MAY_TAKE_OWNERSHIP) + mask |= RICHACE_WRITE_OWNER; + if (want & MAY_CHMOD) + mask |= RICHACE_WRITE_ACL; + if (want & MAY_SET_TIMES) + mask |= RICHACE_WRITE_ATTRIBUTES; + if (want & MAY_EXEC) + mask |= RICHACE_EXECUTE; + /* + * differentiate MAY_WRITE from these request + */ + if (want & (MAY_APPEND | + MAY_CREATE_FILE | MAY_CREATE_DIR | + MAY_DELETE_CHILD)) { + if (want & MAY_APPEND) + mask |= RICHACE_APPEND_DATA; + if (want & MAY_CREATE_FILE) + mask |= RICHACE_ADD_FILE; + if (want & MAY_CREATE_DIR) + mask |= RICHACE_ADD_SUBDIRECTORY; + if (want & MAY_DELETE_CHILD) + mask |= RICHACE_DELETE_CHILD; + } else if (want & MAY_WRITE) + mask |= RICHACE_WRITE_DATA; + return mask; +} +EXPORT_SYMBOL_GPL(richacl_want_to_mask); diff --git a/include/linux/richacl.h b/include/linux/richacl.h index edb8480..9102ef0 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -175,5 +175,8 @@ richace_is_same_identifier(const struct richace *a, const struct richace *b) extern struct richacl *richacl_alloc(int, gfp_t); extern struct richacl *richacl_clone(const struct richacl *, gfp_t); extern void richace_copy(struct richace *, const struct richace *); +extern int richacl_masks_to_mode(const struct richacl *); +extern unsigned int richacl_mode_to_mask(umode_t); +extern unsigned int richacl_want_to_mask(unsigned int); #endif /* __RICHACL_H */ diff --git a/include/uapi/linux/richacl.h b/include/uapi/linux/richacl.h index 08856f8..1ed48ac 100644 --- a/include/uapi/linux/richacl.h +++ b/include/uapi/linux/richacl.h @@ -96,4 +96,48 @@ RICHACE_WRITE_OWNER | \ RICHACE_SYNCHRONIZE ) +/* + * The POSIX permissions are supersets of the following richacl permissions: + * + * - MAY_READ maps to READ_DATA or LIST_DIRECTORY, depending on the type + * of the file system object. + * + * - MAY_WRITE maps to WRITE_DATA or RICHACE_APPEND_DATA for files, and to + * ADD_FILE, RICHACE_ADD_SUBDIRECTORY, or RICHACE_DELETE_CHILD for directories. + * + * - MAY_EXECUTE maps to RICHACE_EXECUTE. + * + * (Some of these richacl permissions have the same bit values.) + */ +#define RICHACE_POSIX_MODE_READ ( \ + RICHACE_READ_DATA | \ + RICHACE_LIST_DIRECTORY) +#define RICHACE_POSIX_MODE_WRITE ( \ + RICHACE_WRITE_DATA | \ + RICHACE_ADD_FILE | \ + RICHACE_APPEND_DATA | \ + RICHACE_ADD_SUBDIRECTORY | \ + RICHACE_DELETE_CHILD) +#define RICHACE_POSIX_MODE_EXEC RICHACE_EXECUTE +#define RICHACE_POSIX_MODE_ALL ( \ + RICHACE_POSIX_MODE_READ | \ + RICHACE_POSIX_MODE_WRITE | \ + RICHACE_POSIX_MODE_EXEC) + +/* + * These permissions are always allowed no matter what the acl says. + */ +#define RICHACE_POSIX_ALWAYS_ALLOWED ( \ + RICHACE_SYNCHRONIZE | \ + RICHACE_READ_ATTRIBUTES | \ + RICHACE_READ_ACL) + +/* + * The owner is implicitly granted these permissions under POSIX. + */ +#define RICHACE_POSIX_OWNER_ALLOWED ( \ + RICHACE_WRITE_ATTRIBUTES | \ + RICHACE_WRITE_OWNER | \ + RICHACE_WRITE_ACL) + #endif /* __UAPI_RICHACL_H */ -- 2.5.0 From agruenba@redhat.com Wed Mar 16 17:19:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 22F477CA0 for ; Wed, 16 Mar 2016 17:19:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id BEA75304062 for ; Wed, 16 Mar 2016 15:19:45 -0700 (PDT) X-ASG-Debug-ID: 1458166784-04bdf002ee535730001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id nuLLj0AWH4Y8YljN (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 15:19:44 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 1741C804E7; Wed, 16 Mar 2016 22:19:44 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-8.ams2.redhat.com [10.36.5.8]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GMJ4I5007786; Wed, 16 Mar 2016 18:19:40 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v20 08/23] richacl: Compute maximum file masks from an acl Date: Wed, 16 Mar 2016 23:18:48 +0100 X-ASG-Orig-Subj: [PATCH v20 08/23] richacl: Compute maximum file masks from an acl Message-Id: <1458166743-18488-9-git-send-email-agruenba@redhat.com> In-Reply-To: <1458166743-18488-1-git-send-email-agruenba@redhat.com> References: <1458166743-18488-1-git-send-email-agruenba@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: 1458166784 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Compute upper bound owner, group, and other file masks with as few permissions as possible without denying any permissions that the NFSv4 acl in a richacl grants. This algorithm is used when a file inherits an acl at create time and when an acl is set via a mechanism that does not provide file masks (such as setting an acl via nfsd). When user-space sets an acl via setxattr, the extended attribute already includes the file masks. Setting an acl also sets the file mode permission bits: they are determined by the file masks; see richacl_masks_to_mode(). Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields --- fs/richacl.c | 157 ++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/richacl.h | 1 + 2 files changed, 158 insertions(+) diff --git a/fs/richacl.c b/fs/richacl.c index d0a4135..056228f 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -181,3 +181,160 @@ richacl_want_to_mask(unsigned int want) return mask; } EXPORT_SYMBOL_GPL(richacl_want_to_mask); + +/* + * Note: functions like richacl_allowed_to_who(), richacl_group_class_allowed(), + * and richacl_compute_max_masks() iterate through the entire acl in reverse + * order as an optimization. + * + * In the standard algorithm, aces are considered in forward order. When a + * process matches an ace, the permissions in the ace are either allowed or + * denied depending on the ace type. Once a permission has been allowed or + * denied, it is no longer considered in further aces. + * + * By iterating through the acl in reverse order, we can compute the same + * result without having to keep track of which permissions have been allowed + * and denied already. + */ + +/** + * richacl_allowed_to_who - permissions allowed to a specific who value + * + * Compute the maximum mask values allowed to a specific who value, taking + * everyone@ aces into account. + */ +static unsigned int richacl_allowed_to_who(struct richacl *acl, + struct richace *who) +{ + struct richace *ace; + unsigned int allowed = 0; + + richacl_for_each_entry_reverse(ace, acl) { + if (richace_is_inherit_only(ace)) + continue; + if (richace_is_same_identifier(ace, who) || + richace_is_everyone(ace)) { + if (richace_is_allow(ace)) + allowed |= ace->e_mask; + else if (richace_is_deny(ace)) + allowed &= ~ace->e_mask; + } + } + return allowed; +} + +/** + * richacl_group_class_allowed - maximum permissions of the group class + * + * Compute the maximum mask values allowed to a process in the group class + * (i.e., a process which is not the owner but is in the owning group or + * matches a user or group acl entry). This includes permissions granted or + * denied by everyone@ aces. + * + * See richacl_compute_max_masks(). + */ +static unsigned int richacl_group_class_allowed(struct richacl *acl) +{ + struct richace *ace; + unsigned int everyone_allowed = 0, group_class_allowed = 0; + int had_group_ace = 0; + + richacl_for_each_entry_reverse(ace, acl) { + if (richace_is_inherit_only(ace) || + richace_is_owner(ace)) + continue; + + if (richace_is_everyone(ace)) { + if (richace_is_allow(ace)) + everyone_allowed |= ace->e_mask; + else if (richace_is_deny(ace)) + everyone_allowed &= ~ace->e_mask; + } else { + group_class_allowed |= + richacl_allowed_to_who(acl, ace); + + if (richace_is_group(ace)) + had_group_ace = 1; + } + } + /* + * If the acl doesn't contain any group@ aces, richacl_allowed_to_who() + * wasn't called for the owning group. We could make that call now, but + * we already know the result (everyone_allowed). + */ + if (!had_group_ace) + group_class_allowed |= everyone_allowed; + return group_class_allowed; +} + +/** + * richacl_compute_max_masks - compute upper bound masks + * + * Computes upper bound owner, group, and other masks so that none of the + * permissions allowed by the acl are disabled. + * + * We don't make assumptions about who the owner is so that the owner can + * change with no effect on the file masks or file mode permission bits; this + * means that we must assume that all entries can match the owner. + */ +void richacl_compute_max_masks(struct richacl *acl) +{ + unsigned int gmask = ~0; + struct richace *ace; + + /* + * @gmask contains all permissions which the group class is ever + * allowed. We use it to avoid adding permissions to the group mask + * from everyone@ allow aces which the group class is always denied + * through other aces. For example, the following acl would otherwise + * result in a group mask of rw: + * + * group@:w::deny + * everyone@:rw::allow + * + * Avoid computing @gmask for acls which do not include any group class + * deny aces: in such acls, the group class is never denied any + * permissions from everyone@ allow aces, and the group class cannot + * have fewer permissions than the other class. + */ + +restart: + acl->a_owner_mask = 0; + acl->a_group_mask = 0; + acl->a_other_mask = 0; + + richacl_for_each_entry_reverse(ace, acl) { + if (richace_is_inherit_only(ace)) + continue; + + if (richace_is_owner(ace)) { + if (richace_is_allow(ace)) + acl->a_owner_mask |= ace->e_mask; + else if (richace_is_deny(ace)) + acl->a_owner_mask &= ~ace->e_mask; + } else if (richace_is_everyone(ace)) { + if (richace_is_allow(ace)) { + acl->a_owner_mask |= ace->e_mask; + acl->a_group_mask |= ace->e_mask & gmask; + acl->a_other_mask |= ace->e_mask; + } else if (richace_is_deny(ace)) { + acl->a_owner_mask &= ~ace->e_mask; + acl->a_group_mask &= ~ace->e_mask; + acl->a_other_mask &= ~ace->e_mask; + } + } else { + if (richace_is_allow(ace)) { + acl->a_owner_mask |= ace->e_mask & gmask; + acl->a_group_mask |= ace->e_mask & gmask; + } else if (richace_is_deny(ace) && gmask == ~0) { + gmask = richacl_group_class_allowed(acl); + if (likely(gmask != ~0)) + /* should always be true */ + goto restart; + } + } + } + + acl->a_flags &= ~(RICHACL_WRITE_THROUGH | RICHACL_MASKED); +} +EXPORT_SYMBOL_GPL(richacl_compute_max_masks); diff --git a/include/linux/richacl.h b/include/linux/richacl.h index 9102ef0..3559b2c 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -178,5 +178,6 @@ extern void richace_copy(struct richace *, const struct richace *); extern int richacl_masks_to_mode(const struct richacl *); extern unsigned int richacl_mode_to_mask(umode_t); extern unsigned int richacl_want_to_mask(unsigned int); +extern void richacl_compute_max_masks(struct richacl *); #endif /* __RICHACL_H */ -- 2.5.0 From agruenba@redhat.com Wed Mar 16 17:19:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BC91F7CD1 for ; Wed, 16 Mar 2016 17:19:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8113030405F for ; Wed, 16 Mar 2016 15:19:50 -0700 (PDT) X-ASG-Debug-ID: 1458166788-04cbb00b7250a0f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id PxVmreJs4rcfrkZg (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 15:19:49 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 8DB3BB8BBE; Wed, 16 Mar 2016 22:19:48 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-8.ams2.redhat.com [10.36.5.8]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GMJ4I6007786; Wed, 16 Mar 2016 18:19:44 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v20 09/23] richacl: Permission check algorithm Date: Wed, 16 Mar 2016 23:18:49 +0100 X-ASG-Orig-Subj: [PATCH v20 09/23] richacl: Permission check algorithm Message-Id: <1458166743-18488-10-git-send-email-agruenba@redhat.com> In-Reply-To: <1458166743-18488-1-git-send-email-agruenba@redhat.com> References: <1458166743-18488-1-git-send-email-agruenba@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: 1458166789 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 A richacl roughly grants a requested access if the NFSv4 acl in the richacl grants the requested permissions according to the NFSv4 permission check algorithm and the file mask that applies to the process includes the requested permissions. Signed-off-by: Andreas Gruenbacher Reviewed-by: "J. Bruce Fields" --- fs/richacl.c | 128 ++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/richacl.h | 1 + 2 files changed, 129 insertions(+) diff --git a/fs/richacl.c b/fs/richacl.c index 056228f..cb0ef3f 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -338,3 +338,131 @@ restart: acl->a_flags &= ~(RICHACL_WRITE_THROUGH | RICHACL_MASKED); } EXPORT_SYMBOL_GPL(richacl_compute_max_masks); + +/** + * richacl_permission - richacl permission check algorithm + * @inode: inode to check + * @acl: rich acl of the inode + * @want: requested access (MAY_* flags) + * + * Checks if the current process is granted @mask flags in @acl. + */ +int +richacl_permission(struct inode *inode, const struct richacl *acl, + int want) +{ + const struct richace *ace; + unsigned int mask = richacl_want_to_mask(want); + unsigned int requested = mask, denied = 0; + int in_owning_group = in_group_p(inode->i_gid); + int in_owner_or_group_class = in_owning_group; + + /* + * A process is + * - in the owner file class if it owns the file, + * - in the group file class if it is in the file's owning group or + * it matches any of the user or group entries, and + * - in the other file class otherwise. + * The file class is only relevant for determining which file mask to + * apply, which only happens for masked acls. + */ + if (acl->a_flags & RICHACL_MASKED) { + if ((acl->a_flags & RICHACL_WRITE_THROUGH) && + uid_eq(current_fsuid(), inode->i_uid)) { + denied = requested & ~acl->a_owner_mask; + goto out; + } + } else { + /* + * When the acl is not masked, there is no need to determine if + * the process is in the group class and we can break out + * earlier of the loop below. + */ + in_owner_or_group_class = 1; + } + + /* + * Check if the acl grants the requested access and determine which + * file class the process is in. + */ + richacl_for_each_entry(ace, acl) { + unsigned int ace_mask = ace->e_mask; + + if (richace_is_inherit_only(ace)) + continue; + if (richace_is_owner(ace)) { + if (!uid_eq(current_fsuid(), inode->i_uid)) + continue; + goto entry_matches_owner; + } else if (richace_is_group(ace)) { + if (!in_owning_group) + continue; + } else if (richace_is_unix_user(ace)) { + if (!uid_eq(current_fsuid(), ace->e_id.uid)) + continue; + if (uid_eq(current_fsuid(), inode->i_uid)) + goto entry_matches_owner; + } else if (richace_is_unix_group(ace)) { + if (!in_group_p(ace->e_id.gid)) + continue; + } else + goto entry_matches_everyone; + + /* + * Apply the group file mask to entries other than owner@ and + * everyone@ or user entries matching the owner. This ensures + * that we grant the same permissions as the acl computed by + * richacl_apply_masks(). + * + * Without this restriction, the following richacl would grant + * rw access to processes which are both the owner and in the + * owning group, but not to other users in the owning group, + * which could not be represented without masks: + * + * owner:rw::mask + * group@:rw::allow + */ + if ((acl->a_flags & RICHACL_MASKED) && richace_is_allow(ace)) + ace_mask &= acl->a_group_mask; + +entry_matches_owner: + /* The process is in the owner or group file class. */ + in_owner_or_group_class = 1; + +entry_matches_everyone: + /* Check which mask flags the ACE allows or denies. */ + if (richace_is_deny(ace)) + denied |= ace_mask & mask; + mask &= ~ace_mask; + + /* + * Keep going until we know which file class + * the process is in. + */ + if (!mask && in_owner_or_group_class) + break; + } + denied |= mask; + + if (acl->a_flags & RICHACL_MASKED) { + /* + * The file class a process is in determines which file mask + * applies. Check if that file mask also grants the requested + * access. + */ + if (uid_eq(current_fsuid(), inode->i_uid)) + denied |= requested & ~acl->a_owner_mask; + else if (in_owner_or_group_class) + denied |= requested & ~acl->a_group_mask; + else { + if (acl->a_flags & RICHACL_WRITE_THROUGH) + denied = requested & ~acl->a_other_mask; + else + denied |= requested & ~acl->a_other_mask; + } + } + +out: + return denied ? -EACCES : 0; +} +EXPORT_SYMBOL_GPL(richacl_permission); diff --git a/include/linux/richacl.h b/include/linux/richacl.h index 3559b2c..be9fb65 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -179,5 +179,6 @@ extern int richacl_masks_to_mode(const struct richacl *); extern unsigned int richacl_mode_to_mask(umode_t); extern unsigned int richacl_want_to_mask(unsigned int); extern void richacl_compute_max_masks(struct richacl *); +extern int richacl_permission(struct inode *, const struct richacl *, int); #endif /* __RICHACL_H */ -- 2.5.0 From agruenba@redhat.com Wed Mar 16 17:19:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7680C7CA0 for ; Wed, 16 Mar 2016 17:19:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4A6AB8F804B for ; Wed, 16 Mar 2016 15:19:54 -0700 (PDT) X-ASG-Debug-ID: 1458166793-04cb6c7f2a229460001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id VX8zuOWKORC8N5In (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 15:19:53 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id CDD83711E8; Wed, 16 Mar 2016 22:19:52 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-8.ams2.redhat.com [10.36.5.8]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GMJ4I7007786; Wed, 16 Mar 2016 18:19:48 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v20 10/23] posix_acl: Unexport acl_by_type and make it static Date: Wed, 16 Mar 2016 23:18:50 +0100 X-ASG-Orig-Subj: [PATCH v20 10/23] posix_acl: Unexport acl_by_type and make it static Message-Id: <1458166743-18488-11-git-send-email-agruenba@redhat.com> In-Reply-To: <1458166743-18488-1-git-send-email-agruenba@redhat.com> References: <1458166743-18488-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Wed, 16 Mar 2016 22:19:52 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458166793 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 acl_by_type(inode, type) returns a pointer to either inode->i_acl or inode->i_default_acl depending on type. This is useful in fs/posix_acl.c, but should never have been visible outside that file. Signed-off-by: Andreas Gruenbacher Reviewed-by: Christoph Hellwig --- fs/posix_acl.c | 3 +-- include/linux/posix_acl.h | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/fs/posix_acl.c b/fs/posix_acl.c index 711dd51..55f2445 100644 --- a/fs/posix_acl.c +++ b/fs/posix_acl.c @@ -21,7 +21,7 @@ #include #include -struct posix_acl **acl_by_type(struct inode *inode, int type) +static struct posix_acl **acl_by_type(struct inode *inode, int type) { switch (type) { case ACL_TYPE_ACCESS: @@ -32,7 +32,6 @@ struct posix_acl **acl_by_type(struct inode *inode, int type) BUG(); } } -EXPORT_SYMBOL(acl_by_type); struct posix_acl *get_cached_acl(struct inode *inode, int type) { diff --git a/include/linux/posix_acl.h b/include/linux/posix_acl.h index 3e96a6a..5b5a80c 100644 --- a/include/linux/posix_acl.h +++ b/include/linux/posix_acl.h @@ -99,7 +99,6 @@ extern int posix_acl_create(struct inode *, umode_t *, struct posix_acl **, extern int simple_set_acl(struct inode *, struct posix_acl *, int); extern int simple_acl_create(struct inode *, struct inode *); -struct posix_acl **acl_by_type(struct inode *inode, int type); struct posix_acl *get_cached_acl(struct inode *inode, int type); struct posix_acl *get_cached_acl_rcu(struct inode *inode, int type); void set_cached_acl(struct inode *inode, int type, struct posix_acl *acl); -- 2.5.0 From agruenba@redhat.com Wed Mar 16 17:20:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F024C7CA1 for ; Wed, 16 Mar 2016 17:20:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C3BE230405F for ; Wed, 16 Mar 2016 15:20:10 -0700 (PDT) X-ASG-Debug-ID: 1458166806-04cb6c7f28229470001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id kD0jr5qZG7USy3Vw (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 15:20:06 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id BFCFB64D08; Wed, 16 Mar 2016 22:20:05 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-8.ams2.redhat.com [10.36.5.8]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GMJ4IA007786; Wed, 16 Mar 2016 18:20:01 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v20 13/23] vfs: Add get_richacl and set_richacl inode operations Date: Wed, 16 Mar 2016 23:18:53 +0100 X-ASG-Orig-Subj: [PATCH v20 13/23] vfs: Add get_richacl and set_richacl inode operations Message-Id: <1458166743-18488-14-git-send-email-agruenba@redhat.com> In-Reply-To: <1458166743-18488-1-git-send-email-agruenba@redhat.com> References: <1458166743-18488-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Wed, 16 Mar 2016 22:20:05 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458166806 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 These operations are similar to the get_acl and set_acl operations for POSIX ACLs. The distinction between access and default ACLs doesn't exist for richacls. Signed-off-by: Andreas Gruenbacher --- include/linux/fs.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/linux/fs.h b/include/linux/fs.h index 3db7729..e04dbb4 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1682,6 +1682,7 @@ struct inode_operations { const char * (*get_link) (struct dentry *, struct inode *, struct delayed_call *); int (*permission) (struct inode *, int); struct posix_acl * (*get_acl)(struct inode *, int); + struct richacl * (*get_richacl)(struct inode *); int (*readlink) (struct dentry *, char __user *,int); @@ -1710,6 +1711,7 @@ struct inode_operations { umode_t create_mode, int *opened); int (*tmpfile) (struct inode *, struct dentry *, umode_t); int (*set_acl)(struct inode *, struct posix_acl *, int); + int (*set_richacl)(struct inode *, struct richacl *); } ____cacheline_aligned; ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector, -- 2.5.0 From agruenba@redhat.com Wed Mar 16 17:20:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4E64C7CA1 for ; Wed, 16 Mar 2016 17:20:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 02B628F8049 for ; Wed, 16 Mar 2016 15:20:10 -0700 (PDT) X-ASG-Debug-ID: 1458166801-04bdf002ee535750001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 0xOAzMD9GImV5qIQ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 15:20:01 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 6E21BB8BC3; Wed, 16 Mar 2016 22:20:01 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-8.ams2.redhat.com [10.36.5.8]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GMJ4I9007786; Wed, 16 Mar 2016 18:19:57 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v20 12/23] vfs: Cache base_acl objects in inodes Date: Wed, 16 Mar 2016 23:18:52 +0100 X-ASG-Orig-Subj: [PATCH v20 12/23] vfs: Cache base_acl objects in inodes Message-Id: <1458166743-18488-13-git-send-email-agruenba@redhat.com> In-Reply-To: <1458166743-18488-1-git-send-email-agruenba@redhat.com> References: <1458166743-18488-1-git-send-email-agruenba@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: 1458166801 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 POSIX ACLs and richacls are both objects allocated by kmalloc() with a reference count which are freed by kfree_rcu(). An inode can either cache an access and a default POSIX ACL, or a richacl (richacls do not have default acls). To allow an inode to cache either of the two kinds of acls, introduce a new base_acl type and convert i_acl and i_default_acl to that type. In most cases, the vfs then doesn't care which kind of acl an inode caches (if any). Signed-off-by: Andreas Gruenbacher Reviewed-by: Andreas Dilger --- drivers/staging/lustre/lustre/llite/llite_lib.c | 2 +- fs/f2fs/acl.c | 4 +-- fs/inode.c | 4 +-- fs/jffs2/acl.c | 10 ++++-- fs/posix_acl.c | 41 +++++++++++++------------ fs/richacl.c | 4 +-- include/linux/fs.h | 34 ++++++++++++++++++-- include/linux/posix_acl.h | 12 +++----- include/linux/richacl.h | 9 +++--- 9 files changed, 75 insertions(+), 45 deletions(-) diff --git a/drivers/staging/lustre/lustre/llite/llite_lib.c b/drivers/staging/lustre/lustre/llite/llite_lib.c index b2fc5b3..b587944 100644 --- a/drivers/staging/lustre/lustre/llite/llite_lib.c +++ b/drivers/staging/lustre/lustre/llite/llite_lib.c @@ -1073,7 +1073,7 @@ void ll_clear_inode(struct inode *inode) } #ifdef CONFIG_FS_POSIX_ACL else if (lli->lli_posix_acl) { - LASSERT(atomic_read(&lli->lli_posix_acl->a_refcount) == 1); + LASSERT(base_acl_refcount(&lli->lli_posix_acl->a_base) == 1); LASSERT(lli->lli_remote_perms == NULL); posix_acl_release(lli->lli_posix_acl); lli->lli_posix_acl = NULL; diff --git a/fs/f2fs/acl.c b/fs/f2fs/acl.c index c8f25f7..9646197 100644 --- a/fs/f2fs/acl.c +++ b/fs/f2fs/acl.c @@ -270,7 +270,7 @@ static struct posix_acl *f2fs_acl_clone(const struct posix_acl *acl, sizeof(struct posix_acl_entry); clone = kmemdup(acl, size, flags); if (clone) - atomic_set(&clone->a_refcount, 1); + base_acl_init(&clone->a_base); } return clone; } @@ -282,7 +282,7 @@ static int f2fs_acl_create_masq(struct posix_acl *acl, umode_t *mode_p) umode_t mode = *mode_p; int not_equiv = 0; - /* assert(atomic_read(acl->a_refcount) == 1); */ + /* assert(base_acl_refcount(&acl->a_base) == 1); */ FOREACH_ACL_ENTRY(pa, acl, pe) { switch(pa->e_tag) { diff --git a/fs/inode.c b/fs/inode.c index 69b8b52..101d806 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -239,9 +239,9 @@ void __destroy_inode(struct inode *inode) #ifdef CONFIG_FS_POSIX_ACL if (inode->i_acl && inode->i_acl != ACL_NOT_CACHED) - posix_acl_release(inode->i_acl); + base_acl_put(inode->i_acl); if (inode->i_default_acl && inode->i_default_acl != ACL_NOT_CACHED) - posix_acl_release(inode->i_default_acl); + base_acl_put(inode->i_default_acl); #endif this_cpu_dec(nr_inodes); } diff --git a/fs/jffs2/acl.c b/fs/jffs2/acl.c index 2f7a3c0..569cb1b 100644 --- a/fs/jffs2/acl.c +++ b/fs/jffs2/acl.c @@ -294,13 +294,19 @@ int jffs2_init_acl_post(struct inode *inode) int rc; if (inode->i_default_acl) { - rc = __jffs2_set_acl(inode, JFFS2_XPREFIX_ACL_DEFAULT, inode->i_default_acl); + struct posix_acl *default_acl = container_of( + inode->i_default_acl, struct posix_acl, a_base); + + rc = __jffs2_set_acl(inode, JFFS2_XPREFIX_ACL_DEFAULT, default_acl); if (rc) return rc; } if (inode->i_acl) { - rc = __jffs2_set_acl(inode, JFFS2_XPREFIX_ACL_ACCESS, inode->i_acl); + struct posix_acl *acl = container_of( + inode->i_acl, struct posix_acl, a_base); + + rc = __jffs2_set_acl(inode, JFFS2_XPREFIX_ACL_ACCESS, acl); if (rc) return rc; } diff --git a/fs/posix_acl.c b/fs/posix_acl.c index 55f2445..743b6dc 100644 --- a/fs/posix_acl.c +++ b/fs/posix_acl.c @@ -21,7 +21,7 @@ #include #include -static struct posix_acl **acl_by_type(struct inode *inode, int type) +static struct base_acl **acl_by_type(struct inode *inode, int type) { switch (type) { case ACL_TYPE_ACCESS: @@ -35,63 +35,64 @@ static struct posix_acl **acl_by_type(struct inode *inode, int type) struct posix_acl *get_cached_acl(struct inode *inode, int type) { - struct posix_acl **p = acl_by_type(inode, type); - struct posix_acl *acl = ACCESS_ONCE(*p); + struct base_acl **p = acl_by_type(inode, type); + struct base_acl *acl = ACCESS_ONCE(*p); if (acl) { spin_lock(&inode->i_lock); acl = *p; if (acl != ACL_NOT_CACHED) - acl = posix_acl_dup(acl); + base_acl_get(acl); spin_unlock(&inode->i_lock); } - return acl; + return container_of(acl, struct posix_acl, a_base); } EXPORT_SYMBOL(get_cached_acl); struct posix_acl *get_cached_acl_rcu(struct inode *inode, int type) { - return rcu_dereference(*acl_by_type(inode, type)); + struct base_acl *acl = rcu_dereference(*acl_by_type(inode, type)); + return container_of(acl, struct posix_acl, a_base); } EXPORT_SYMBOL(get_cached_acl_rcu); void set_cached_acl(struct inode *inode, int type, struct posix_acl *acl) { - struct posix_acl **p = acl_by_type(inode, type); - struct posix_acl *old; + struct base_acl **p = acl_by_type(inode, type); + struct base_acl *old; spin_lock(&inode->i_lock); old = *p; - rcu_assign_pointer(*p, posix_acl_dup(acl)); + rcu_assign_pointer(*p, &posix_acl_dup(acl)->a_base); spin_unlock(&inode->i_lock); if (old != ACL_NOT_CACHED) - posix_acl_release(old); + base_acl_put(old); } EXPORT_SYMBOL(set_cached_acl); void forget_cached_acl(struct inode *inode, int type) { - struct posix_acl **p = acl_by_type(inode, type); - struct posix_acl *old; + struct base_acl **p = acl_by_type(inode, type); + struct base_acl *old; spin_lock(&inode->i_lock); old = *p; *p = ACL_NOT_CACHED; spin_unlock(&inode->i_lock); if (old != ACL_NOT_CACHED) - posix_acl_release(old); + base_acl_put(old); } EXPORT_SYMBOL(forget_cached_acl); void forget_all_cached_acls(struct inode *inode) { - struct posix_acl *old_access, *old_default; + struct base_acl *old_access, *old_default; spin_lock(&inode->i_lock); old_access = inode->i_acl; old_default = inode->i_default_acl; inode->i_acl = inode->i_default_acl = ACL_NOT_CACHED; spin_unlock(&inode->i_lock); if (old_access != ACL_NOT_CACHED) - posix_acl_release(old_access); + base_acl_put(old_access); if (old_default != ACL_NOT_CACHED) - posix_acl_release(old_default); + base_acl_put(old_default); } EXPORT_SYMBOL(forget_all_cached_acls); @@ -128,7 +129,7 @@ EXPORT_SYMBOL(get_acl); void posix_acl_init(struct posix_acl *acl, int count) { - atomic_set(&acl->a_refcount, 1); + base_acl_init(&acl->a_base); acl->a_count = count; } EXPORT_SYMBOL(posix_acl_init); @@ -161,7 +162,7 @@ posix_acl_clone(const struct posix_acl *acl, gfp_t flags) sizeof(struct posix_acl_entry); clone = kmemdup(acl, size, flags); if (clone) - atomic_set(&clone->a_refcount, 1); + base_acl_init(&clone->a_base); } return clone; } @@ -383,7 +384,7 @@ static int posix_acl_create_masq(struct posix_acl *acl, umode_t *mode_p) umode_t mode = *mode_p; int not_equiv = 0; - /* assert(atomic_read(acl->a_refcount) == 1); */ + /* assert(base_acl_refcount(&acl->a_base) == 1); */ FOREACH_ACL_ENTRY(pa, acl, pe) { switch(pa->e_tag) { @@ -438,7 +439,7 @@ static int __posix_acl_chmod_masq(struct posix_acl *acl, umode_t mode) struct posix_acl_entry *group_obj = NULL, *mask_obj = NULL; struct posix_acl_entry *pa, *pe; - /* assert(atomic_read(acl->a_refcount) == 1); */ + /* assert(base_acl_refcount(&acl->a_base) == 1); */ FOREACH_ACL_ENTRY(pa, acl, pe) { switch(pa->e_tag) { diff --git a/fs/richacl.c b/fs/richacl.c index cb0ef3f..8971ead 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -31,7 +31,7 @@ richacl_alloc(int count, gfp_t gfp) struct richacl *acl = kzalloc(size, gfp); if (acl) { - atomic_set(&acl->a_refcount, 1); + base_acl_init(&acl->a_base); acl->a_count = count; } return acl; @@ -50,7 +50,7 @@ richacl_clone(const struct richacl *acl, gfp_t gfp) if (dup) { memcpy(dup, acl, size); - atomic_set(&dup->a_refcount, 1); + base_acl_init(&dup->a_base); } return dup; } diff --git a/include/linux/fs.h b/include/linux/fs.h index 0f560b7..3db7729 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -578,6 +578,12 @@ static inline void mapping_allow_writable(struct address_space *mapping) #define i_size_ordered_init(inode) do { } while (0) #endif +struct base_acl { + union { + atomic_t ba_refcount; + struct rcu_head ba_rcu; + }; +}; struct posix_acl; #define ACL_NOT_CACHED ((void *)(-1)) @@ -597,9 +603,9 @@ struct inode { kgid_t i_gid; unsigned int i_flags; -#ifdef CONFIG_FS_POSIX_ACL - struct posix_acl *i_acl; - struct posix_acl *i_default_acl; +#if defined(CONFIG_FS_POSIX_ACL) + struct base_acl *i_acl; + struct base_acl *i_default_acl; #endif const struct inode_operations *i_op; @@ -3097,4 +3103,26 @@ static inline bool dir_relax(struct inode *inode) extern bool path_noexec(const struct path *path); extern void inode_nohighmem(struct inode *inode); +static inline void base_acl_get(struct base_acl *acl) +{ + if (acl) + atomic_inc(&acl->ba_refcount); +} + +static inline void base_acl_put(struct base_acl *acl) +{ + if (acl && atomic_dec_and_test(&acl->ba_refcount)) + kfree_rcu(acl, ba_rcu); +} + +static inline void base_acl_init(struct base_acl *acl) +{ + atomic_set(&acl->ba_refcount, 1); +} + +static inline int base_acl_refcount(struct base_acl *acl) +{ + return atomic_read(&acl->ba_refcount); +} + #endif /* _LINUX_FS_H */ diff --git a/include/linux/posix_acl.h b/include/linux/posix_acl.h index 5b5a80c..cef5428 100644 --- a/include/linux/posix_acl.h +++ b/include/linux/posix_acl.h @@ -43,10 +43,7 @@ struct posix_acl_entry { }; struct posix_acl { - union { - atomic_t a_refcount; - struct rcu_head a_rcu; - }; + struct base_acl a_base; /* must be first, see posix_acl_release() */ unsigned int a_count; struct posix_acl_entry a_entries[0]; }; @@ -61,8 +58,7 @@ struct posix_acl { static inline struct posix_acl * posix_acl_dup(struct posix_acl *acl) { - if (acl) - atomic_inc(&acl->a_refcount); + base_acl_get(&acl->a_base); return acl; } @@ -72,8 +68,8 @@ posix_acl_dup(struct posix_acl *acl) static inline void posix_acl_release(struct posix_acl *acl) { - if (acl && atomic_dec_and_test(&acl->a_refcount)) - kfree_rcu(acl, a_rcu); + BUILD_BUG_ON(offsetof(struct posix_acl, a_base) != 0); + base_acl_put(&acl->a_base); } diff --git a/include/linux/richacl.h b/include/linux/richacl.h index be9fb65..35a5bcb 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -31,7 +31,7 @@ struct richace { }; struct richacl { - atomic_t a_refcount; + struct base_acl a_base; /* must be first, see richacl_put() */ unsigned int a_owner_mask; unsigned int a_group_mask; unsigned int a_other_mask; @@ -56,8 +56,7 @@ struct richacl { static inline struct richacl * richacl_get(struct richacl *acl) { - if (acl) - atomic_inc(&acl->a_refcount); + base_acl_get(&acl->a_base); return acl; } @@ -67,8 +66,8 @@ richacl_get(struct richacl *acl) static inline void richacl_put(struct richacl *acl) { - if (acl && atomic_dec_and_test(&acl->a_refcount)) - kfree(acl); + BUILD_BUG_ON(offsetof(struct richacl, a_base) != 0); + base_acl_put(&acl->a_base); } /** -- 2.5.0 From agruenba@redhat.com Wed Mar 16 17:20:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2DA897CA1 for ; Wed, 16 Mar 2016 17:20:12 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CB7798F804B for ; Wed, 16 Mar 2016 15:20:11 -0700 (PDT) X-ASG-Debug-ID: 1458166810-04bdf002ed535770001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 6FiXA43Rb3XEkP8Y (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 15:20:10 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 0E410C049E19; Wed, 16 Mar 2016 22:20:10 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-8.ams2.redhat.com [10.36.5.8]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GMJ4IB007786; Wed, 16 Mar 2016 18:20:06 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v20 14/23] vfs: Cache richacl in struct inode Date: Wed, 16 Mar 2016 23:18:54 +0100 X-ASG-Orig-Subj: [PATCH v20 14/23] vfs: Cache richacl in struct inode Message-Id: <1458166743-18488-15-git-send-email-agruenba@redhat.com> In-Reply-To: <1458166743-18488-1-git-send-email-agruenba@redhat.com> References: <1458166743-18488-1-git-send-email-agruenba@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: 1458166810 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Cache richacls in struct inode so that this doesn't have to be done individually in each filesystem. This is similar to POSIX ACLs. Signed-off-by: Andreas Gruenbacher --- fs/inode.c | 11 +++++-- fs/posix_acl.c | 2 +- fs/richacl.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/fs.h | 5 +++- include/linux/richacl.h | 6 ++++ 5 files changed, 96 insertions(+), 5 deletions(-) diff --git a/fs/inode.c b/fs/inode.c index 101d806..de80116 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -180,8 +180,11 @@ int inode_init_always(struct super_block *sb, struct inode *inode) inode->i_private = NULL; inode->i_mapping = mapping; INIT_HLIST_HEAD(&inode->i_dentry); /* buggered by rcu freeing */ -#ifdef CONFIG_FS_POSIX_ACL - inode->i_acl = inode->i_default_acl = ACL_NOT_CACHED; +#if defined(CONFIG_FS_POSIX_ACL) || defined(CONFIG_FS_RICHACL) + inode->i_acl = ACL_NOT_CACHED; +# if defined(CONFIG_FS_POSIX_ACL) + inode->i_default_acl = ACL_NOT_CACHED; +# endif #endif #ifdef CONFIG_FSNOTIFY @@ -237,11 +240,13 @@ void __destroy_inode(struct inode *inode) atomic_long_dec(&inode->i_sb->s_remove_count); } -#ifdef CONFIG_FS_POSIX_ACL +#if defined(CONFIG_FS_POSIX_ACL) || defined(CONFIG_FS_RICHACL) if (inode->i_acl && inode->i_acl != ACL_NOT_CACHED) base_acl_put(inode->i_acl); +# if defined(CONFIG_FS_POSIX_ACL) if (inode->i_default_acl && inode->i_default_acl != ACL_NOT_CACHED) base_acl_put(inode->i_default_acl); +# endif #endif this_cpu_dec(nr_inodes); } diff --git a/fs/posix_acl.c b/fs/posix_acl.c index 743b6dc..f24646e 100644 --- a/fs/posix_acl.c +++ b/fs/posix_acl.c @@ -37,7 +37,7 @@ struct posix_acl *get_cached_acl(struct inode *inode, int type) { struct base_acl **p = acl_by_type(inode, type); struct base_acl *acl = ACCESS_ONCE(*p); - if (acl) { + if (acl && IS_POSIXACL(inode)) { spin_lock(&inode->i_lock); acl = *p; if (acl != ACL_NOT_CACHED) diff --git a/fs/richacl.c b/fs/richacl.c index 8971ead..59ef600 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -20,6 +20,83 @@ #include #include +struct richacl *get_cached_richacl(struct inode *inode) +{ + struct base_acl *acl; + + acl = ACCESS_ONCE(inode->i_acl); + if (acl && IS_RICHACL(inode)) { + spin_lock(&inode->i_lock); + acl = inode->i_acl; + if (acl != ACL_NOT_CACHED) + base_acl_get(acl); + spin_unlock(&inode->i_lock); + } + return container_of(acl, struct richacl, a_base); +} +EXPORT_SYMBOL_GPL(get_cached_richacl); + +struct richacl *get_cached_richacl_rcu(struct inode *inode) +{ + struct base_acl *acl = rcu_dereference(inode->i_acl); + + return container_of(acl, struct richacl, a_base); +} +EXPORT_SYMBOL_GPL(get_cached_richacl_rcu); + +void set_cached_richacl(struct inode *inode, struct richacl *acl) +{ + struct base_acl *old = NULL; + + spin_lock(&inode->i_lock); + old = inode->i_acl; + rcu_assign_pointer(inode->i_acl, &richacl_get(acl)->a_base); + spin_unlock(&inode->i_lock); + if (old != ACL_NOT_CACHED) + base_acl_put(old); +} +EXPORT_SYMBOL_GPL(set_cached_richacl); + +void forget_cached_richacl(struct inode *inode) +{ + struct base_acl *old = NULL; + + spin_lock(&inode->i_lock); + old = inode->i_acl; + inode->i_acl = ACL_NOT_CACHED; + spin_unlock(&inode->i_lock); + if (old != ACL_NOT_CACHED) + base_acl_put(old); +} +EXPORT_SYMBOL_GPL(forget_cached_richacl); + +struct richacl *get_richacl(struct inode *inode) +{ + struct richacl *acl; + + acl = get_cached_richacl(inode); + if (acl != ACL_NOT_CACHED) + return acl; + + if (!IS_RICHACL(inode)) + return NULL; + + /* + * A filesystem can force a ACL callback by just never filling the + * ACL cache. But normally you'd fill the cache either at inode + * instantiation time, or on the first ->get_richacl call. + * + * If the filesystem doesn't have a get_richacl() function at all, + * we'll just create the negative cache entry. + */ + if (!inode->i_op->get_richacl) { + set_cached_richacl(inode, NULL); + return NULL; + } + return inode->i_op->get_richacl(inode); +} +EXPORT_SYMBOL_GPL(get_richacl); + /** * richacl_alloc - allocate a richacl * @count: number of entries diff --git a/include/linux/fs.h b/include/linux/fs.h index e04dbb4..560f4e0 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -585,6 +585,7 @@ struct base_acl { }; }; struct posix_acl; +struct richacl; #define ACL_NOT_CACHED ((void *)(-1)) #define IOP_FASTPERM 0x0001 @@ -603,9 +604,11 @@ struct inode { kgid_t i_gid; unsigned int i_flags; -#if defined(CONFIG_FS_POSIX_ACL) +#if defined(CONFIG_FS_POSIX_ACL) || defined(CONFIG_FS_RICHACL) struct base_acl *i_acl; +# if defined(CONFIG_FS_POSIX_ACL) struct base_acl *i_default_acl; +# endif #endif const struct inode_operations *i_op; diff --git a/include/linux/richacl.h b/include/linux/richacl.h index 35a5bcb..d19b61b 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -70,6 +70,12 @@ richacl_put(struct richacl *acl) base_acl_put(&acl->a_base); } +extern struct richacl *get_cached_richacl(struct inode *); +extern struct richacl *get_cached_richacl_rcu(struct inode *); +extern void set_cached_richacl(struct inode *, struct richacl *); +extern void forget_cached_richacl(struct inode *); +extern struct richacl *get_richacl(struct inode *); + /** * richace_is_owner - check if @ace is an OWNER@ entry */ -- 2.5.0 From agruenba@redhat.com Wed Mar 16 17:20:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2DC027CB7 for ; Wed, 16 Mar 2016 17:20:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C70DC304048 for ; Wed, 16 Mar 2016 15:20:18 -0700 (PDT) X-ASG-Debug-ID: 1458166797-04bdf002ed535740001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id yibXmMJnZvC6Ib51 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 15:19:57 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 2C9E67822F; Wed, 16 Mar 2016 22:19:57 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-8.ams2.redhat.com [10.36.5.8]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GMJ4I8007786; Wed, 16 Mar 2016 18:19:53 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v20 11/23] posix_acl: Improve xattr fixup code Date: Wed, 16 Mar 2016 23:18:51 +0100 X-ASG-Orig-Subj: [PATCH v20 11/23] posix_acl: Improve xattr fixup code Message-Id: <1458166743-18488-12-git-send-email-agruenba@redhat.com> In-Reply-To: <1458166743-18488-1-git-send-email-agruenba@redhat.com> References: <1458166743-18488-1-git-send-email-agruenba@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: 1458166797 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Both XATTR_NAME_POSIX_ACL_ACCESS and XATTR_NAME_POSIX_ACL_DEFAULT have the same XATTR_SYSTEM_PREFIX prefix; don't check for the same prefix repeatedly. Signed-off-by: Andreas Gruenbacher --- fs/xattr.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/fs/xattr.c b/fs/xattr.c index 4861322..c364696 100644 --- a/fs/xattr.c +++ b/fs/xattr.c @@ -295,6 +295,16 @@ out: } EXPORT_SYMBOL_GPL(vfs_removexattr); +static void +fix_xattr_from_user(const char *kname, void *kvalue, size_t size) +{ + if (strncmp(kname, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) + return; + kname += XATTR_SYSTEM_PREFIX_LEN; + if (!strcmp(kname, XATTR_POSIX_ACL_ACCESS) || + !strcmp(kname, XATTR_POSIX_ACL_DEFAULT)) + posix_acl_fix_xattr_from_user(kvalue, size); +} /* * Extended attribute SET operations @@ -329,9 +339,7 @@ setxattr(struct dentry *d, const char __user *name, const void __user *value, error = -EFAULT; goto out; } - if ((strcmp(kname, XATTR_NAME_POSIX_ACL_ACCESS) == 0) || - (strcmp(kname, XATTR_NAME_POSIX_ACL_DEFAULT) == 0)) - posix_acl_fix_xattr_from_user(kvalue, size); + fix_xattr_from_user(kname, kvalue, size); } error = vfs_setxattr(d, kname, kvalue, size, flags); @@ -396,6 +404,17 @@ SYSCALL_DEFINE5(fsetxattr, int, fd, const char __user *, name, return error; } +static void +fix_xattr_to_user(const char *kname, void *kvalue, size_t size) +{ + if (strncmp(kname, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) + return; + kname += XATTR_SYSTEM_PREFIX_LEN; + if (!strcmp(kname, XATTR_POSIX_ACL_ACCESS) || + !strcmp(kname, XATTR_POSIX_ACL_DEFAULT)) + posix_acl_fix_xattr_to_user(kvalue, size); +} + /* * Extended attribute GET operations */ @@ -426,9 +445,7 @@ getxattr(struct dentry *d, const char __user *name, void __user *value, error = vfs_getxattr(d, kname, kvalue, size); if (error > 0) { - if ((strcmp(kname, XATTR_NAME_POSIX_ACL_ACCESS) == 0) || - (strcmp(kname, XATTR_NAME_POSIX_ACL_DEFAULT) == 0)) - posix_acl_fix_xattr_to_user(kvalue, size); + fix_xattr_to_user(kname, kvalue, size); if (size && copy_to_user(value, kvalue, error)) error = -EFAULT; } else if (error == -ERANGE && size >= XATTR_SIZE_MAX) { -- 2.5.0 From agruenba@redhat.com Wed Mar 16 17:20:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 856B97CDA for ; Wed, 16 Mar 2016 17:20:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 94D32AC002 for ; Wed, 16 Mar 2016 15:20:20 -0700 (PDT) X-ASG-Debug-ID: 1458166818-04cbb00b7250a120001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id c8DWsxEOmAFQIvI3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 15:20:19 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 860FEC049D68; Wed, 16 Mar 2016 22:20:18 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-8.ams2.redhat.com [10.36.5.8]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GMJ4ID007786; Wed, 16 Mar 2016 18:20:14 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v20 16/23] richacl: Check if an acl is equivalent to a file mode Date: Wed, 16 Mar 2016 23:18:56 +0100 X-ASG-Orig-Subj: [PATCH v20 16/23] richacl: Check if an acl is equivalent to a file mode Message-Id: <1458166743-18488-17-git-send-email-agruenba@redhat.com> In-Reply-To: <1458166743-18488-1-git-send-email-agruenba@redhat.com> References: <1458166743-18488-1-git-send-email-agruenba@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: 1458166819 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 ACLs are considered equivalent to file modes if they only consist of owner@, group@, and everyone@ entries, the owner@ permissions do not depend on whether the owner is a member in the owning group, and no inheritance flags are set. This test is used to avoid storing richacls if the acl can be computed from the file permission bits. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields --- fs/richacl.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/richacl.h | 1 + 2 files changed, 105 insertions(+) diff --git a/fs/richacl.c b/fs/richacl.c index 23c1aa9..0df359c 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -614,3 +614,107 @@ richacl_chmod(struct inode *inode, umode_t mode) return retval; } EXPORT_SYMBOL(richacl_chmod); + +/** + * richacl_equiv_mode - compute the mode equivalent of @acl + * + * An acl is considered equivalent to a file mode if it only consists of + * owner@, group@, and everyone@ entries and the owner@ permissions do not + * depend on whether the owner is a member in the owning group. + */ +int +richacl_equiv_mode(const struct richacl *acl, umode_t *mode_p) +{ + umode_t mode = *mode_p; + + /* + * The RICHACE_DELETE_CHILD flag is meaningless for non-directories, so + * we ignore it. + */ + unsigned int x = S_ISDIR(mode) ? 0 : RICHACE_DELETE_CHILD; + struct { + unsigned int allowed; + unsigned int defined; /* allowed or denied */ + } owner = { + .defined = RICHACE_POSIX_ALWAYS_ALLOWED | + RICHACE_POSIX_OWNER_ALLOWED | x, + }, group = { + .defined = RICHACE_POSIX_ALWAYS_ALLOWED | x, + }, everyone = { + .defined = RICHACE_POSIX_ALWAYS_ALLOWED | x, + }; + const struct richace *ace; + + if (acl->a_flags & ~(RICHACL_WRITE_THROUGH | RICHACL_MASKED)) + return -1; + + richacl_for_each_entry(ace, acl) { + if (ace->e_flags & ~RICHACE_SPECIAL_WHO) + return -1; + + if (richace_is_owner(ace) || richace_is_everyone(ace)) { + x = ace->e_mask & ~owner.defined; + if (richace_is_allow(ace)) { + unsigned int group_denied = + group.defined & ~group.allowed; + + if (x & group_denied) + return -1; + owner.allowed |= x; + } else /* if (richace_is_deny(ace)) */ { + if (x & group.allowed) + return -1; + } + owner.defined |= x; + + if (richace_is_everyone(ace)) { + x = ace->e_mask; + if (richace_is_allow(ace)) { + group.allowed |= + x & ~group.defined; + everyone.allowed |= + x & ~everyone.defined; + } + group.defined |= x; + everyone.defined |= x; + } + } else if (richace_is_group(ace)) { + x = ace->e_mask & ~group.defined; + if (richace_is_allow(ace)) + group.allowed |= x; + group.defined |= x; + } else + return -1; + } + + if (group.allowed & ~owner.defined) + return -1; + + if (acl->a_flags & RICHACL_MASKED) { + if (acl->a_flags & RICHACL_WRITE_THROUGH) { + owner.allowed = acl->a_owner_mask; + everyone.allowed = acl->a_other_mask; + } else { + owner.allowed &= acl->a_owner_mask; + everyone.allowed &= acl->a_other_mask; + } + group.allowed &= acl->a_group_mask; + } + + mode = (mode & ~S_IRWXUGO) | + (richacl_mask_to_mode(owner.allowed) << 6) | + (richacl_mask_to_mode(group.allowed) << 3) | + richacl_mask_to_mode(everyone.allowed); + + /* Mask flags we can ignore */ + x = S_ISDIR(mode) ? 0 : RICHACE_DELETE_CHILD; + + if (((richacl_mode_to_mask(mode >> 6) ^ owner.allowed) & ~x) || + ((richacl_mode_to_mask(mode >> 3) ^ group.allowed) & ~x) || + ((richacl_mode_to_mask(mode) ^ everyone.allowed) & ~x)) + return -1; + + *mode_p = mode; + return 0; +} +EXPORT_SYMBOL_GPL(richacl_equiv_mode); diff --git a/include/linux/richacl.h b/include/linux/richacl.h index 554f050..f61475b 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -186,5 +186,6 @@ extern unsigned int richacl_want_to_mask(unsigned int); extern void richacl_compute_max_masks(struct richacl *); extern int richacl_permission(struct inode *, const struct richacl *, int); extern int richacl_chmod(struct inode *, umode_t); +extern int richacl_equiv_mode(const struct richacl *, umode_t *); #endif /* __RICHACL_H */ -- 2.5.0 From agruenba@redhat.com Wed Mar 16 17:20:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BC22D7CDA for ; Wed, 16 Mar 2016 17:20:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8D17F8F804C for ; Wed, 16 Mar 2016 15:20:22 -0700 (PDT) X-ASG-Debug-ID: 1458166814-04cb6c7f2b229490001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 2HCSXKSIYxWL8EUA (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 15:20:15 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 5FB77461D6; Wed, 16 Mar 2016 22:20:14 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-8.ams2.redhat.com [10.36.5.8]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GMJ4IC007786; Wed, 16 Mar 2016 18:20:10 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v20 15/23] richacl: Update the file masks in chmod() Date: Wed, 16 Mar 2016 23:18:55 +0100 X-ASG-Orig-Subj: [PATCH v20 15/23] richacl: Update the file masks in chmod() Message-Id: <1458166743-18488-16-git-send-email-agruenba@redhat.com> In-Reply-To: <1458166743-18488-1-git-send-email-agruenba@redhat.com> References: <1458166743-18488-1-git-send-email-agruenba@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: 1458166814 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Doing a chmod() sets the file mode, which includes the file permission bits. When a file has a richacl, the permissions that the richacl grants need to be limited to what the new file permission bits allow. This is done by setting the file masks in the richacl to what the file permission bits map to. The richacl access check algorithm takes the file masks into account, which ensures that the richacl cannot grant too many permissions. It is possible to explicitly add permissions to the file masks which go beyond what the file permission bits can grant (like the RICHACE_WRITE_ACL permission). The POSIX.1 standard calls this an alternate file access control mechanism. A subsequent chmod() would ensure that those permissions are disabled again. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields --- fs/richacl.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/richacl.h | 1 + 2 files changed, 72 insertions(+) diff --git a/fs/richacl.c b/fs/richacl.c index 59ef600..23c1aa9 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -543,3 +543,74 @@ out: return denied ? -EACCES : 0; } EXPORT_SYMBOL_GPL(richacl_permission); + +/** + * __richacl_chmod - update the file masks to reflect the new mode + * @acl: access control list + * @mode: new file permission bits including the file type + * + * Return a copy of @acl where the file masks have been replaced by the file + * masks corresponding to the file permission bits in @mode, or returns @acl + * itself if the file masks are already up to date. Takes over a reference + * to @acl. + */ +static struct richacl * +__richacl_chmod(struct richacl *acl, umode_t mode) +{ + unsigned int x = S_ISDIR(mode) ? 0 : RICHACE_DELETE_CHILD; + unsigned int owner_mask, group_mask, other_mask; + struct richacl *clone; + + owner_mask = richacl_mode_to_mask(mode >> 6) & ~x; + group_mask = richacl_mode_to_mask(mode >> 3) & ~x; + other_mask = richacl_mode_to_mask(mode) & ~x; + + if (acl->a_owner_mask == owner_mask && + acl->a_group_mask == group_mask && + acl->a_other_mask == other_mask && + (acl->a_flags & RICHACL_MASKED) && + (acl->a_flags & RICHACL_WRITE_THROUGH)) + return acl; + + clone = richacl_clone(acl, GFP_KERNEL); + richacl_put(acl); + if (!clone) + return ERR_PTR(-ENOMEM); + + clone->a_flags |= (RICHACL_WRITE_THROUGH | RICHACL_MASKED); + clone->a_owner_mask = owner_mask; + clone->a_group_mask = group_mask; + clone->a_other_mask = other_mask; + + return clone; +} + +/** + * richacl_chmod - filesystem chmod helper + * @inode: inode whose file permission bits to change + * @mode: new file permission bits including the file type + * + * Helper for filesystems to use to perform a chmod on the richacl of an inode. + */ +int +richacl_chmod(struct inode *inode, umode_t mode) +{ + struct richacl *acl; + int retval; + + if (S_ISLNK(mode)) + return -EOPNOTSUPP; + if (!inode->i_op->set_richacl) + return -EOPNOTSUPP; + acl = get_richacl(inode); + if (IS_ERR_OR_NULL(acl)) + return PTR_ERR(acl); + acl = __richacl_chmod(acl, mode); + if (IS_ERR(acl)) + return PTR_ERR(acl); + retval = inode->i_op->set_richacl(inode, acl); + richacl_put(acl); + + return retval; +} +EXPORT_SYMBOL(richacl_chmod); diff --git a/include/linux/richacl.h b/include/linux/richacl.h index d19b61b..554f050 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -185,5 +185,6 @@ extern unsigned int richacl_mode_to_mask(umode_t); extern unsigned int richacl_want_to_mask(unsigned int); extern void richacl_compute_max_masks(struct richacl *); extern int richacl_permission(struct inode *, const struct richacl *, int); +extern int richacl_chmod(struct inode *, umode_t); #endif /* __RICHACL_H */ -- 2.5.0 From agruenba@redhat.com Wed Mar 16 17:20:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6D12E7CEF for ; Wed, 16 Mar 2016 17:20:25 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 14A098F8050 for ; Wed, 16 Mar 2016 15:20:25 -0700 (PDT) X-ASG-Debug-ID: 1458166822-04bdf002ed535790001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ClEOh8VSGICeruol (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 15:20:23 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id D3ED2B8BC4; Wed, 16 Mar 2016 22:20:22 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-8.ams2.redhat.com [10.36.5.8]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GMJ4IE007786; Wed, 16 Mar 2016 18:20:18 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v20 17/23] richacl: Create-time inheritance Date: Wed, 16 Mar 2016 23:18:57 +0100 X-ASG-Orig-Subj: [PATCH v20 17/23] richacl: Create-time inheritance Message-Id: <1458166743-18488-18-git-send-email-agruenba@redhat.com> In-Reply-To: <1458166743-18488-1-git-send-email-agruenba@redhat.com> References: <1458166743-18488-1-git-send-email-agruenba@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: 1458166823 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 When a new file is created, it can inherit an acl from its parent directory; this is similar to how default acls work in POSIX ACLs. As with POSIX ACLs, if a file inherits an acl from its parent directory, the intersection between the create mode and the permissions granted by the inherited acl determines the file masks and file permission bits, and the umask is ignored. Signed-off-by: Andreas Gruenbacher --- fs/richacl.c | 151 ++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/richacl.h | 2 + 2 files changed, 153 insertions(+) diff --git a/fs/richacl.c b/fs/richacl.c index 0df359c..7c82bc2 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -718,3 +718,154 @@ richacl_equiv_mode(const struct richacl *acl, umode_t *mode_p) return 0; } EXPORT_SYMBOL_GPL(richacl_equiv_mode); + +static inline bool +ace_inherits_to_directory(const struct richace *ace) +{ + if (ace->e_flags & RICHACE_DIRECTORY_INHERIT_ACE) + return true; + if ((ace->e_flags & RICHACE_FILE_INHERIT_ACE) && + !(ace->e_flags & RICHACE_NO_PROPAGATE_INHERIT_ACE)) + return true; + return false; +} + +/** + * richacl_inherit - compute the inherited acl of a new file + * @dir_acl: acl of the containing directory + * @isdir: inherit by a directory or non-directory? + * + * A directory can have acl entries which files and/or directories created + * inside the directory will inherit. This function computes the acl for such + * a new file. If there is no inheritable acl, it will return %NULL. + */ +struct richacl * +richacl_inherit(const struct richacl *dir_acl, int isdir) +{ + const struct richace *dir_ace; + struct richacl *acl = NULL; + struct richace *ace; + int count = 0; + + if (isdir) { + richacl_for_each_entry(dir_ace, dir_acl) { + if (!ace_inherits_to_directory(dir_ace)) + continue; + count++; + } + if (!count) + return NULL; + acl = richacl_alloc(count, GFP_KERNEL); + if (!acl) + return ERR_PTR(-ENOMEM); + ace = acl->a_entries; + richacl_for_each_entry(dir_ace, dir_acl) { + if (!ace_inherits_to_directory(dir_ace)) + continue; + richace_copy(ace, dir_ace); + if (dir_ace->e_flags & RICHACE_NO_PROPAGATE_INHERIT_ACE) + ace->e_flags &= ~RICHACE_INHERITANCE_FLAGS; + else if (dir_ace->e_flags & RICHACE_DIRECTORY_INHERIT_ACE) + ace->e_flags &= ~RICHACE_INHERIT_ONLY_ACE; + else + ace->e_flags |= RICHACE_INHERIT_ONLY_ACE; + ace++; + } + } else { + richacl_for_each_entry(dir_ace, dir_acl) { + if (!(dir_ace->e_flags & RICHACE_FILE_INHERIT_ACE)) + continue; + count++; + } + if (!count) + return NULL; + acl = richacl_alloc(count, GFP_KERNEL); + if (!acl) + return ERR_PTR(-ENOMEM); + ace = acl->a_entries; + richacl_for_each_entry(dir_ace, dir_acl) { + if (!(dir_ace->e_flags & RICHACE_FILE_INHERIT_ACE)) + continue; + richace_copy(ace, dir_ace); + ace->e_flags &= ~RICHACE_INHERITANCE_FLAGS; + /* + * RICHACE_DELETE_CHILD is meaningless for + * non-directories, so clear it. + */ + ace->e_mask &= ~RICHACE_DELETE_CHILD; + ace++; + } + } + + return acl; +} + +/* + * richacl_inherit_inode - compute inherited acl and file mode + * @dir_acl: acl of the containing directory + * @mode_p: mode of the new inode + * + * The file permission bits in @mode_p must be set to the create mode by the + * caller. + * + * If there is an inheritable acl, the maximum permissions that the acl grants + * are computed and the file masks of the new acl are set accordingly. + */ +static struct richacl * +richacl_inherit_inode(const struct richacl *dir_acl, umode_t *mode_p) +{ + struct richacl *acl; + umode_t mode = *mode_p; + + acl = richacl_inherit(dir_acl, S_ISDIR(mode)); + if (acl) { + if (richacl_equiv_mode(acl, &mode) == 0) { + *mode_p &= mode; + richacl_put(acl); + acl = NULL; + } else { + richacl_compute_max_masks(acl); + /* + * Ensure that the acl will not grant any permissions + * beyond the create mode. + */ + acl->a_flags |= RICHACL_MASKED; + acl->a_owner_mask &= + richacl_mode_to_mask(mode >> 6); + acl->a_group_mask &= + richacl_mode_to_mask(mode >> 3); + acl->a_other_mask &= + richacl_mode_to_mask(mode); + } + } else + *mode_p &= ~current_umask(); + + return acl; +} + +/** + * richacl_create - filesystem create helper + * @mode_p: mode of the new inode + * @dir: containing directory + * + * Compute the inherited acl for a new inode. If there is no acl to inherit, + * apply the umask. Use when creating a new inode on a richacl enabled file + * system. + */ +struct richacl *richacl_create(umode_t *mode_p, struct inode *dir) +{ + struct richacl *dir_acl, *acl = NULL; + + if (S_ISLNK(*mode_p)) + return NULL; + dir_acl = get_richacl(dir); + if (dir_acl) { + if (IS_ERR(dir_acl)) + return dir_acl; + acl = richacl_inherit_inode(dir_acl, mode_p); + richacl_put(dir_acl); + } else + *mode_p &= ~current_umask(); + return acl; +} +EXPORT_SYMBOL_GPL(richacl_create); diff --git a/include/linux/richacl.h b/include/linux/richacl.h index f61475b..199800a 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -187,5 +187,7 @@ extern void richacl_compute_max_masks(struct richacl *); extern int richacl_permission(struct inode *, const struct richacl *, int); extern int richacl_chmod(struct inode *, umode_t); extern int richacl_equiv_mode(const struct richacl *, umode_t *); +extern struct richacl *richacl_inherit(const struct richacl *, int); +extern struct richacl *richacl_create(umode_t *, struct inode *); #endif /* __RICHACL_H */ -- 2.5.0 From agruenba@redhat.com Wed Mar 16 17:20:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7A6E17CA2 for ; Wed, 16 Mar 2016 17:20:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3B540304051 for ; Wed, 16 Mar 2016 15:20:29 -0700 (PDT) X-ASG-Debug-ID: 1458166827-04cbb00b7150a120001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id KSTlNygEREdJf3fm (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 15:20:27 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 26EBC64456; Wed, 16 Mar 2016 22:20:27 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-8.ams2.redhat.com [10.36.5.8]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GMJ4IF007786; Wed, 16 Mar 2016 18:20:23 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v20 18/23] richacl: Automatic Inheritance Date: Wed, 16 Mar 2016 23:18:58 +0100 X-ASG-Orig-Subj: [PATCH v20 18/23] richacl: Automatic Inheritance Message-Id: <1458166743-18488-19-git-send-email-agruenba@redhat.com> In-Reply-To: <1458166743-18488-1-git-send-email-agruenba@redhat.com> References: <1458166743-18488-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Wed, 16 Mar 2016 22:20:27 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458166827 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Automatic Inheritance (AI) allows changes to the acl of a directory to propagate down to children. This is mostly implemented in user space: when a process changes the permissions of a directory and Automatic Inheritance is enabled for that directory, the process must propagate those changes to all children, recursively. The kernel enables this by keeping track of which permissions have been inherited at create time. In addition, it makes sure that permission propagation is turned off when the permissions are set explicitly (for example, upon create or chmod). Automatic Inheritance works as follows: - When the RICHACL_AUTO_INHERIT flag in the acl of a file or directory is not set, the file or directory is not affected by AI. - When the RICHACL_AUTO_INHERIT flag in the acl of a directory is set and a file or subdirectory is created in that directory, the inherited acl will have the RICHACL_AUTO_INHERIT flag set, and all inherited aces will have the RICHACE_INHERITED_ACE flag set. This allows user space to distinguish between aces which have been inherited and aces which have been explicitly added. - When the RICHACL_PROTECTED acl flag in the acl of a file or directory is set, AI will not modify the acl. This does not affect propagation of permissions from the file to its children (if the file is a directory). Linux does not have a way of creating files or directories without setting the file permission bits, so all files created inside a directory with RICHACL_AUTO_INHERIT set will have the RICHACL_PROTECTED flag set. This effectively disables Automatic Inheritance. Protocols which support creating files without specifying permissions can explicitly clear the RICHACL_PROTECTED flag after creating a file and reset the file masks to "undo" applying the create mode; see richacl_compute_max_masks(). They should set the RICHACL_DEFAULTED flag. (A mechanism that would allow to indicate to the kernel to ignore the create mode in the first place when there are inherited permissions would be nice to have.) Signed-off-by: Andreas Gruenbacher --- fs/richacl.c | 20 +++++++++++++++++++- include/linux/richacl.h | 12 ++++++++++++ include/uapi/linux/richacl.h | 11 ++++++++++- 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/fs/richacl.c b/fs/richacl.c index 7c82bc2..1bada18 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -569,7 +569,8 @@ __richacl_chmod(struct richacl *acl, umode_t mode) acl->a_group_mask == group_mask && acl->a_other_mask == other_mask && (acl->a_flags & RICHACL_MASKED) && - (acl->a_flags & RICHACL_WRITE_THROUGH)) + (acl->a_flags & RICHACL_WRITE_THROUGH) && + (!richacl_is_auto_inherit(acl) || richacl_is_protected(acl))) return acl; clone = richacl_clone(acl, GFP_KERNEL); @@ -581,6 +582,8 @@ __richacl_chmod(struct richacl *acl, umode_t mode) clone->a_owner_mask = owner_mask; clone->a_group_mask = group_mask; clone->a_other_mask = other_mask; + if (richacl_is_auto_inherit(clone)) + clone->a_flags |= RICHACL_PROTECTED; return clone; } @@ -796,6 +799,14 @@ richacl_inherit(const struct richacl *dir_acl, int isdir) ace++; } } + if (richacl_is_auto_inherit(dir_acl)) { + acl->a_flags = RICHACL_AUTO_INHERIT; + richacl_for_each_entry(ace, acl) + ace->e_flags |= RICHACE_INHERITED_ACE; + } else { + richacl_for_each_entry(ace, acl) + ace->e_flags &= ~RICHACE_INHERITED_ACE; + } return acl; } @@ -824,6 +835,13 @@ richacl_inherit_inode(const struct richacl *dir_acl, umode_t *mode_p) richacl_put(acl); acl = NULL; } else { + /* + * We need to set RICHACL_PROTECTED because we are + * doing an implicit chmod + */ + if (richacl_is_auto_inherit(acl)) + acl->a_flags |= RICHACL_PROTECTED; + richacl_compute_max_masks(acl); /* * Ensure that the acl will not grant any permissions diff --git a/include/linux/richacl.h b/include/linux/richacl.h index 199800a..e1c6c79 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -76,6 +76,18 @@ extern void set_cached_richacl(struct inode *, struct richacl *); extern void forget_cached_richacl(struct inode *); extern struct richacl *get_richacl(struct inode *); +static inline int +richacl_is_auto_inherit(const struct richacl *acl) +{ + return acl->a_flags & RICHACL_AUTO_INHERIT; +} + +static inline int +richacl_is_protected(const struct richacl *acl) +{ + return acl->a_flags & RICHACL_PROTECTED; +} + /** * richace_is_owner - check if @ace is an OWNER@ entry */ diff --git a/include/uapi/linux/richacl.h b/include/uapi/linux/richacl.h index 1ed48ac..8849a53 100644 --- a/include/uapi/linux/richacl.h +++ b/include/uapi/linux/richacl.h @@ -18,6 +18,9 @@ #define __UAPI_RICHACL_H /* a_flags values */ +#define RICHACL_AUTO_INHERIT 0x01 +#define RICHACL_PROTECTED 0x02 +#define RICHACL_DEFAULTED 0x04 #define RICHACL_WRITE_THROUGH 0x40 #define RICHACL_MASKED 0x80 @@ -31,6 +34,7 @@ #define RICHACE_NO_PROPAGATE_INHERIT_ACE 0x0004 #define RICHACE_INHERIT_ONLY_ACE 0x0008 #define RICHACE_IDENTIFIER_GROUP 0x0040 +#define RICHACE_INHERITED_ACE 0x0080 #define RICHACE_SPECIAL_WHO 0x4000 /* e_mask bitflags */ @@ -60,6 +64,9 @@ #define RICHACE_EVERYONE_SPECIAL_ID 2 #define RICHACL_VALID_FLAGS ( \ + RICHACL_AUTO_INHERIT | \ + RICHACL_PROTECTED | \ + RICHACL_DEFAULTED | \ RICHACL_WRITE_THROUGH | \ RICHACL_MASKED ) @@ -69,13 +76,15 @@ RICHACE_NO_PROPAGATE_INHERIT_ACE | \ RICHACE_INHERIT_ONLY_ACE | \ RICHACE_IDENTIFIER_GROUP | \ + RICHACE_INHERITED_ACE | \ RICHACE_SPECIAL_WHO ) #define RICHACE_INHERITANCE_FLAGS ( \ RICHACE_FILE_INHERIT_ACE | \ RICHACE_DIRECTORY_INHERIT_ACE | \ RICHACE_NO_PROPAGATE_INHERIT_ACE | \ - RICHACE_INHERIT_ONLY_ACE ) + RICHACE_INHERIT_ONLY_ACE | \ + RICHACE_INHERITED_ACE ) /* Valid RICHACE_* flags for directories and non-directories */ #define RICHACE_VALID_MASK ( \ -- 2.5.0 From agruenba@redhat.com Wed Mar 16 17:20:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A68C37CE6 for ; Wed, 16 Mar 2016 17:20:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 79E4E304048 for ; Wed, 16 Mar 2016 15:20:37 -0700 (PDT) X-ASG-Debug-ID: 1458166835-04cbb00b7150a130001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id xcJdXD7nyr71wZS7 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 15:20:36 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id B68412F146D; Wed, 16 Mar 2016 22:20:35 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-8.ams2.redhat.com [10.36.5.8]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GMJ4IH007786; Wed, 16 Mar 2016 18:20:31 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v20 20/23] richacl: Add richacl xattr handler Date: Wed, 16 Mar 2016 23:19:00 +0100 X-ASG-Orig-Subj: [PATCH v20 20/23] richacl: Add richacl xattr handler Message-Id: <1458166743-18488-21-git-send-email-agruenba@redhat.com> In-Reply-To: <1458166743-18488-1-git-send-email-agruenba@redhat.com> References: <1458166743-18488-1-git-send-email-agruenba@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: 1458166836 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add richacl xattr handler implementing the xattr operations based on the get_richacl and set_richacl inode operations. Signed-off-by: Andreas Gruenbacher --- fs/richacl_xattr.c | 74 +++++++++++++++++++++++++++++++++++++++++++ include/linux/richacl_xattr.h | 2 ++ 2 files changed, 76 insertions(+) diff --git a/fs/richacl_xattr.c b/fs/richacl_xattr.c index dc1ad36..5cb5e11 100644 --- a/fs/richacl_xattr.c +++ b/fs/richacl_xattr.c @@ -18,7 +18,9 @@ #include #include #include +#include #include +#include /** * richacl_from_xattr - convert a richacl xattr into the in-memory representation @@ -159,3 +161,75 @@ richacl_to_xattr(struct user_namespace *user_ns, return real_size; } EXPORT_SYMBOL_GPL(richacl_to_xattr); + +static bool +richacl_xattr_list(struct dentry *dentry) +{ + return IS_RICHACL(d_backing_inode(dentry)); +} + +static int +richacl_xattr_get(const struct xattr_handler *handler, + struct dentry *dentry, const char *name, void *buffer, + size_t buffer_size) +{ + struct inode *inode = d_backing_inode(dentry); + struct richacl *acl; + int error; + + if (*name) + return -EINVAL; + if (!IS_RICHACL(inode)) + return -EOPNOTSUPP; + if (S_ISLNK(inode->i_mode)) + return -EOPNOTSUPP; + acl = get_richacl(inode); + if (IS_ERR(acl)) + return PTR_ERR(acl); + if (acl == NULL) + return -ENODATA; + error = richacl_to_xattr(current_user_ns(), acl, buffer, buffer_size); + richacl_put(acl); + return error; +} + +static int +richacl_xattr_set(const struct xattr_handler *handler, + struct dentry *dentry, const char *name, + const void *value, size_t size, int flags) +{ + struct inode *inode = d_backing_inode(dentry); + struct richacl *acl = NULL; + int ret; + + if (*name) + return -EINVAL; + if (!IS_RICHACL(inode)) + return -EOPNOTSUPP; + if (!inode->i_op->set_richacl) + return -EOPNOTSUPP; + + if (!uid_eq(current_fsuid(), inode->i_uid) && + inode_permission(inode, MAY_CHMOD) && + !capable(CAP_FOWNER)) + return -EPERM; + + if (value) { + acl = richacl_from_xattr(current_user_ns(), value, size, + -EINVAL); + if (IS_ERR(acl)) + return PTR_ERR(acl); + } + + ret = inode->i_op->set_richacl(inode, acl); + richacl_put(acl); + return ret; +} + +struct xattr_handler richacl_xattr_handler = { + .name = XATTR_NAME_RICHACL, + .list = richacl_xattr_list, + .get = richacl_xattr_get, + .set = richacl_xattr_set, +}; +EXPORT_SYMBOL(richacl_xattr_handler); diff --git a/include/linux/richacl_xattr.h b/include/linux/richacl_xattr.h index 0efa14b..6c6adb1 100644 --- a/include/linux/richacl_xattr.h +++ b/include/linux/richacl_xattr.h @@ -26,4 +26,6 @@ extern size_t richacl_xattr_size(const struct richacl *); extern int richacl_to_xattr(struct user_namespace *, const struct richacl *, void *, size_t); +extern struct xattr_handler richacl_xattr_handler; + #endif /* __RICHACL_XATTR_H */ -- 2.5.0 From agruenba@redhat.com Wed Mar 16 17:20:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 66EF17CB4 for ; Wed, 16 Mar 2016 17:20:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1D27D304048 for ; Wed, 16 Mar 2016 15:20:37 -0700 (PDT) X-ASG-Debug-ID: 1458166831-04bdf002ee5357a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id NVxnB0rwP43HELlN (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 15:20:31 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 72E377FD44; Wed, 16 Mar 2016 22:20:31 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-8.ams2.redhat.com [10.36.5.8]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GMJ4IG007786; Wed, 16 Mar 2016 18:20:27 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v20 19/23] richacl: xattr mapping functions Date: Wed, 16 Mar 2016 23:18:59 +0100 X-ASG-Orig-Subj: [PATCH v20 19/23] richacl: xattr mapping functions Message-Id: <1458166743-18488-20-git-send-email-agruenba@redhat.com> In-Reply-To: <1458166743-18488-1-git-send-email-agruenba@redhat.com> References: <1458166743-18488-1-git-send-email-agruenba@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: 1458166831 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Map between "system.richacl" xattrs and the in-kernel representation. Signed-off-by: Andreas Gruenbacher --- fs/Makefile | 2 +- fs/richacl_xattr.c | 161 +++++++++++++++++++++++++++++++++++++ include/linux/richacl_xattr.h | 29 +++++++ include/uapi/linux/Kbuild | 1 + include/uapi/linux/richacl_xattr.h | 44 ++++++++++ include/uapi/linux/xattr.h | 2 + 6 files changed, 238 insertions(+), 1 deletion(-) create mode 100644 fs/richacl_xattr.c create mode 100644 include/linux/richacl_xattr.h create mode 100644 include/uapi/linux/richacl_xattr.h diff --git a/fs/Makefile b/fs/Makefile index 884d7a4..a6f15f1 100644 --- a/fs/Makefile +++ b/fs/Makefile @@ -48,7 +48,7 @@ obj-$(CONFIG_COREDUMP) += coredump.o obj-$(CONFIG_SYSCTL) += drop_caches.o obj-$(CONFIG_FHANDLE) += fhandle.o -obj-$(CONFIG_FS_RICHACL) += richacl.o +obj-$(CONFIG_FS_RICHACL) += richacl.o richacl_xattr.o obj-y += quota/ diff --git a/fs/richacl_xattr.c b/fs/richacl_xattr.c new file mode 100644 index 0000000..dc1ad36 --- /dev/null +++ b/fs/richacl_xattr.c @@ -0,0 +1,161 @@ +/* + * Copyright (C) 2006, 2010 Novell, Inc. + * Copyright (C) 2015 Red Hat, Inc. + * Written by Andreas Gruenbacher + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#include +#include +#include +#include +#include + +/** + * richacl_from_xattr - convert a richacl xattr into the in-memory representation + */ +struct richacl * +richacl_from_xattr(struct user_namespace *user_ns, + const void *value, size_t size, int invalid_error) +{ + const struct richacl_xattr *xattr_acl = value; + const struct richace_xattr *xattr_ace = (void *)(xattr_acl + 1); + struct richacl *acl; + struct richace *ace; + int count; + + if (size < sizeof(*xattr_acl) || + xattr_acl->a_version != RICHACL_XATTR_VERSION || + (xattr_acl->a_flags & ~RICHACL_VALID_FLAGS)) + goto invalid; + size -= sizeof(*xattr_acl); + count = le16_to_cpu(xattr_acl->a_count); + if (count > RICHACL_XATTR_MAX_COUNT) + goto invalid; + if (size != count * sizeof(*xattr_ace)) + goto invalid; + + acl = richacl_alloc(count, GFP_NOFS); + if (!acl) + return ERR_PTR(-ENOMEM); + + acl->a_flags = xattr_acl->a_flags; + acl->a_owner_mask = le32_to_cpu(xattr_acl->a_owner_mask); + if (acl->a_owner_mask & ~RICHACE_VALID_MASK) + goto put_invalid; + acl->a_group_mask = le32_to_cpu(xattr_acl->a_group_mask); + if (acl->a_group_mask & ~RICHACE_VALID_MASK) + goto put_invalid; + acl->a_other_mask = le32_to_cpu(xattr_acl->a_other_mask); + if (acl->a_other_mask & ~RICHACE_VALID_MASK) + goto put_invalid; + + richacl_for_each_entry(ace, acl) { + ace->e_type = le16_to_cpu(xattr_ace->e_type); + ace->e_flags = le16_to_cpu(xattr_ace->e_flags); + ace->e_mask = le32_to_cpu(xattr_ace->e_mask); + + if (ace->e_flags & ~RICHACE_VALID_FLAGS) + goto put_invalid; + if (ace->e_flags & RICHACE_SPECIAL_WHO) { + ace->e_id.special = le32_to_cpu(xattr_ace->e_id); + if (ace->e_id.special > RICHACE_EVERYONE_SPECIAL_ID) + goto put_invalid; + } else if (ace->e_flags & RICHACE_IDENTIFIER_GROUP) { + u32 id = le32_to_cpu(xattr_ace->e_id); + + ace->e_id.gid = make_kgid(user_ns, id); + if (!gid_valid(ace->e_id.gid)) + goto put_invalid; + } else { + u32 id = le32_to_cpu(xattr_ace->e_id); + + ace->e_id.uid = make_kuid(user_ns, id); + if (!uid_valid(ace->e_id.uid)) + goto put_invalid; + } + if (ace->e_type > RICHACE_ACCESS_DENIED_ACE_TYPE || + (ace->e_mask & ~RICHACE_VALID_MASK)) + goto put_invalid; + + xattr_ace++; + } + + return acl; + +put_invalid: + richacl_put(acl); +invalid: + return ERR_PTR(invalid_error); +} +EXPORT_SYMBOL_GPL(richacl_from_xattr); + +/** + * richacl_xattr_size - compute the size of the xattr representation of @acl + */ +size_t +richacl_xattr_size(const struct richacl *acl) +{ + size_t size = sizeof(struct richacl_xattr); + + size += sizeof(struct richace_xattr) * acl->a_count; + return size; +} +EXPORT_SYMBOL_GPL(richacl_xattr_size); + +/** + * richacl_to_xattr - convert @acl into its xattr representation + * @acl: the richacl to convert + * @buffer: buffer for the result + * @size: size of @buffer + */ +int +richacl_to_xattr(struct user_namespace *user_ns, + const struct richacl *acl, void *buffer, size_t size) +{ + struct richacl_xattr *xattr_acl = buffer; + struct richace_xattr *xattr_ace; + const struct richace *ace; + size_t real_size; + + real_size = richacl_xattr_size(acl); + if (!buffer) + return real_size; + if (real_size > size) + return -ERANGE; + + xattr_acl->a_version = RICHACL_XATTR_VERSION; + xattr_acl->a_flags = acl->a_flags; + xattr_acl->a_count = cpu_to_le16(acl->a_count); + + xattr_acl->a_owner_mask = cpu_to_le32(acl->a_owner_mask); + xattr_acl->a_group_mask = cpu_to_le32(acl->a_group_mask); + xattr_acl->a_other_mask = cpu_to_le32(acl->a_other_mask); + + xattr_ace = (void *)(xattr_acl + 1); + richacl_for_each_entry(ace, acl) { + xattr_ace->e_type = cpu_to_le16(ace->e_type); + xattr_ace->e_flags = cpu_to_le16(ace->e_flags); + xattr_ace->e_mask = cpu_to_le32(ace->e_mask); + if (ace->e_flags & RICHACE_SPECIAL_WHO) + xattr_ace->e_id = cpu_to_le32(ace->e_id.special); + else if (ace->e_flags & RICHACE_IDENTIFIER_GROUP) + xattr_ace->e_id = + cpu_to_le32(from_kgid(user_ns, ace->e_id.gid)); + else + xattr_ace->e_id = + cpu_to_le32(from_kuid(user_ns, ace->e_id.uid)); + xattr_ace++; + } + return real_size; +} +EXPORT_SYMBOL_GPL(richacl_to_xattr); diff --git a/include/linux/richacl_xattr.h b/include/linux/richacl_xattr.h new file mode 100644 index 0000000..0efa14b --- /dev/null +++ b/include/linux/richacl_xattr.h @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2006, 2010 Novell, Inc. + * Copyright (C) 2015 Red Hat, Inc. + * Written by Andreas Gruenbacher + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#ifndef __RICHACL_XATTR_H +#define __RICHACL_XATTR_H + +#include +#include + +extern struct richacl *richacl_from_xattr(struct user_namespace *, const void *, + size_t, int); +extern size_t richacl_xattr_size(const struct richacl *); +extern int richacl_to_xattr(struct user_namespace *, const struct richacl *, + void *, size_t); + +#endif /* __RICHACL_XATTR_H */ diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild index 6e05dc8..14b8a06 100644 --- a/include/uapi/linux/Kbuild +++ b/include/uapi/linux/Kbuild @@ -352,6 +352,7 @@ header-y += reiserfs_fs.h header-y += reiserfs_xattr.h header-y += resource.h header-y += richacl.h +header-y += richacl_xattr.h header-y += rfkill.h header-y += romfs_fs.h header-y += rose.h diff --git a/include/uapi/linux/richacl_xattr.h b/include/uapi/linux/richacl_xattr.h new file mode 100644 index 0000000..20da204 --- /dev/null +++ b/include/uapi/linux/richacl_xattr.h @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2006, 2010 Novell, Inc. + * Copyright (C) 2015 Red Hat, Inc. + * Written by Andreas Gruenbacher + * + * This file is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + */ + +#ifndef __UAPI_RICHACL_XATTR_H +#define __UAPI_RICHACL_XATTR_H + +#include +#include + +struct richace_xattr { + __le16 e_type; + __le16 e_flags; + __le32 e_mask; + __le32 e_id; +}; + +struct richacl_xattr { + __u8 a_version; + __u8 a_flags; + __le16 a_count; + __le32 a_owner_mask; + __le32 a_group_mask; + __le32 a_other_mask; +}; + +#define RICHACL_XATTR_VERSION 0 +#define RICHACL_XATTR_MAX_COUNT \ + ((XATTR_SIZE_MAX - sizeof(struct richacl_xattr)) / \ + sizeof(struct richace_xattr)) + +#endif /* __UAPI_RICHACL_XATTR_H */ diff --git a/include/uapi/linux/xattr.h b/include/uapi/linux/xattr.h index 1590c49..1996903 100644 --- a/include/uapi/linux/xattr.h +++ b/include/uapi/linux/xattr.h @@ -73,5 +73,7 @@ #define XATTR_POSIX_ACL_DEFAULT "posix_acl_default" #define XATTR_NAME_POSIX_ACL_DEFAULT XATTR_SYSTEM_PREFIX XATTR_POSIX_ACL_DEFAULT +#define XATTR_RICHACL "richacl" +#define XATTR_NAME_RICHACL XATTR_SYSTEM_PREFIX XATTR_RICHACL #endif /* _UAPI_LINUX_XATTR_H */ -- 2.5.0 From agruenba@redhat.com Wed Mar 16 17:20:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 569F37CA7 for ; Wed, 16 Mar 2016 17:20:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id EDDC88F8035 for ; Wed, 16 Mar 2016 15:20:41 -0700 (PDT) X-ASG-Debug-ID: 1458166840-04bdf002ec5357a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cAEdVTp1EEETlsLl (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 15:20:40 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 131EF8050D; Wed, 16 Mar 2016 22:20:40 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-8.ams2.redhat.com [10.36.5.8]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GMJ4II007786; Wed, 16 Mar 2016 18:20:36 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v20 21/23] vfs: Add richacl permission checking Date: Wed, 16 Mar 2016 23:19:01 +0100 X-ASG-Orig-Subj: [PATCH v20 21/23] vfs: Add richacl permission checking Message-Id: <1458166743-18488-22-git-send-email-agruenba@redhat.com> In-Reply-To: <1458166743-18488-1-git-send-email-agruenba@redhat.com> References: <1458166743-18488-1-git-send-email-agruenba@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: 1458166840 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hook the richacl permission checking function into the vfs. Signed-off-by: Andreas Gruenbacher --- fs/namei.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++-- fs/posix_acl.c | 6 +++--- 2 files changed, 52 insertions(+), 5 deletions(-) diff --git a/fs/namei.c b/fs/namei.c index 28707ae..b55cee6 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -35,6 +35,7 @@ #include #include #include +#include #include #include "internal.h" @@ -255,7 +256,40 @@ void putname(struct filename *name) __putname(name); } -static int check_acl(struct inode *inode, int mask) +static int check_richacl(struct inode *inode, int mask) +{ +#ifdef CONFIG_FS_RICHACL + struct richacl *acl; + + if (mask & MAY_NOT_BLOCK) { + acl = get_cached_richacl_rcu(inode); + if (!acl) + goto no_acl; + /* no ->get_richacl() calls in RCU mode... */ + if (acl == ACL_NOT_CACHED) + return -ECHILD; + return richacl_permission(inode, acl, mask & ~MAY_NOT_BLOCK); + } + + acl = get_richacl(inode); + if (IS_ERR(acl)) + return PTR_ERR(acl); + if (acl) { + int error = richacl_permission(inode, acl, mask); + richacl_put(acl); + return error; + } +no_acl: +#endif + if (mask & (MAY_DELETE_SELF | MAY_TAKE_OWNERSHIP | + MAY_CHMOD | MAY_SET_TIMES)) { + /* File permission bits cannot grant this. */ + return -EACCES; + } + return -EAGAIN; +} + +static int check_posix_acl(struct inode *inode, int mask) { #ifdef CONFIG_FS_POSIX_ACL struct posix_acl *acl; @@ -290,11 +324,24 @@ static int acl_permission_check(struct inode *inode, int mask) { unsigned int mode = inode->i_mode; + /* + * With POSIX ACLs, the (mode & S_IRWXU) bits exactly match the owner + * permissions, and we can skip checking posix acls for the owner. + * With richacls, the owner may be granted fewer permissions than the + * mode bits seem to suggest (for example, append but not write), and + * we always need to check the richacl. + */ + + if (IS_RICHACL(inode)) { + int error = check_richacl(inode, mask); + if (error != -EAGAIN) + return error; + } if (likely(uid_eq(current_fsuid(), inode->i_uid))) mode >>= 6; else { if (IS_POSIXACL(inode) && (mode & S_IRWXG)) { - int error = check_acl(inode, mask); + int error = check_posix_acl(inode, mask); if (error != -EAGAIN) return error; } diff --git a/fs/posix_acl.c b/fs/posix_acl.c index f24646e..7810c6f 100644 --- a/fs/posix_acl.c +++ b/fs/posix_acl.c @@ -100,13 +100,13 @@ struct posix_acl *get_acl(struct inode *inode, int type) { struct posix_acl *acl; + if (!IS_POSIXACL(inode)) + return NULL; + acl = get_cached_acl(inode, type); if (acl != ACL_NOT_CACHED) return acl; - if (!IS_POSIXACL(inode)) - return NULL; - /* * A filesystem can force a ACL callback by just never filling the * ACL cache. But normally you'd fill the cache either at inode -- 2.5.0 From agruenba@redhat.com Wed Mar 16 17:20:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2F68C7CB1 for ; Wed, 16 Mar 2016 17:20:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7EDC6AC005 for ; Wed, 16 Mar 2016 15:20:48 -0700 (PDT) X-ASG-Debug-ID: 1458166844-04cb6c7f2b2294d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GDrkHlkFy5wuMSGM (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 15:20:45 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 8B8FB46213; Wed, 16 Mar 2016 22:20:44 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-8.ams2.redhat.com [10.36.5.8]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GMJ4IJ007786; Wed, 16 Mar 2016 18:20:40 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: "Aneesh Kumar K.V" , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org, Andreas Gruenbacher Subject: [PATCH v20 22/23] ext4: Add richacl support Date: Wed, 16 Mar 2016 23:19:02 +0100 X-ASG-Orig-Subj: [PATCH v20 22/23] ext4: Add richacl support Message-Id: <1458166743-18488-23-git-send-email-agruenba@redhat.com> In-Reply-To: <1458166743-18488-1-git-send-email-agruenba@redhat.com> References: <1458166743-18488-1-git-send-email-agruenba@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: 1458166845 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: "Aneesh Kumar K.V" Support the richacl permission model in ext4. The richacls are stored in "system.richacl" xattrs. Richacls need to be enabled by tune2fs or at file system create time. Signed-off-by: Aneesh Kumar K.V Signed-off-by: Andreas Gruenbacher Reviewed-by: Andreas Dilger --- fs/ext4/Kconfig | 11 +++++ fs/ext4/Makefile | 1 + fs/ext4/file.c | 3 ++ fs/ext4/ialloc.c | 11 ++++- fs/ext4/inode.c | 5 +- fs/ext4/namei.c | 5 ++ fs/ext4/richacl.c | 137 ++++++++++++++++++++++++++++++++++++++++++++++++++++ fs/ext4/richacl.h | 40 +++++++++++++++ fs/ext4/xattr.c | 7 +++ include/linux/acl.h | 15 ++++++ 10 files changed, 231 insertions(+), 4 deletions(-) create mode 100644 fs/ext4/richacl.c create mode 100644 fs/ext4/richacl.h create mode 100644 include/linux/acl.h diff --git a/fs/ext4/Kconfig b/fs/ext4/Kconfig index b46e9fc..4e21c18 100644 --- a/fs/ext4/Kconfig +++ b/fs/ext4/Kconfig @@ -22,6 +22,17 @@ config EXT3_FS_POSIX_ACL This config option is here only for backward compatibility. ext3 filesystem is now handled by the ext4 driver. +config EXT4_FS_RICHACL + bool "Ext4 Rich Access Control Lists" + depends on EXT4_FS + select FS_RICHACL + help + Richacls are an implementation of NFSv4 ACLs, extended by file masks + to cleanly integrate into the POSIX file permission model. To learn + more about them, see http://www.bestbits.at/richacl/. + + If you don't know what Richacls are, say N. + config EXT3_FS_SECURITY bool "Ext3 Security Labels" depends on EXT3_FS diff --git a/fs/ext4/Makefile b/fs/ext4/Makefile index f52cf54..1fb7f11 100644 --- a/fs/ext4/Makefile +++ b/fs/ext4/Makefile @@ -14,3 +14,4 @@ ext4-$(CONFIG_EXT4_FS_POSIX_ACL) += acl.o ext4-$(CONFIG_EXT4_FS_SECURITY) += xattr_security.o ext4-$(CONFIG_EXT4_FS_ENCRYPTION) += crypto_policy.o crypto.o \ crypto_key.o crypto_fname.o +ext4-$(CONFIG_EXT4_FS_RICHACL) += richacl.o diff --git a/fs/ext4/file.c b/fs/ext4/file.c index 4cd318f..92e35bc 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c @@ -30,6 +30,7 @@ #include "ext4_jbd2.h" #include "xattr.h" #include "acl.h" +#include "richacl.h" /* * Called when an inode is released. Note that this is different @@ -749,6 +750,8 @@ const struct inode_operations ext4_file_inode_operations = { .removexattr = generic_removexattr, .get_acl = ext4_get_acl, .set_acl = ext4_set_acl, + .get_richacl = ext4_get_richacl, + .set_richacl = ext4_set_richacl, .fiemap = ext4_fiemap, }; diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index acc0ad5..f2d31c2 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c @@ -27,6 +27,7 @@ #include "ext4_jbd2.h" #include "xattr.h" #include "acl.h" +#include "richacl.h" #include @@ -729,6 +730,14 @@ out: return ret; } +static inline int +ext4_new_acl(handle_t *handle, struct inode *inode, struct inode *dir) +{ + if (IS_RICHACL(dir)) + return ext4_init_richacl(handle, inode, dir); + return ext4_init_acl(handle, inode, dir); +} + /* * There are two policies for allocating an inode. If the new inode is * a directory, then a forward search is made for a block group with both @@ -1093,7 +1102,7 @@ got: if (err) goto fail_drop; - err = ext4_init_acl(handle, inode, dir); + err = ext4_new_acl(handle, inode, dir); if (err) goto fail_free_drop; diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index aee960b..1dbd4c2 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -37,10 +37,10 @@ #include #include #include +#include #include "ext4_jbd2.h" #include "xattr.h" -#include "acl.h" #include "truncate.h" #include @@ -5025,8 +5025,7 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) ext4_orphan_del(NULL, inode); if (!rc && (ia_valid & ATTR_MODE)) - rc = posix_acl_chmod(inode, inode->i_mode); - + rc = acl_chmod(inode); err_out: ext4_std_error(inode->i_sb, error); if (!error) diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index 48e4b89..d86c5f2 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c @@ -38,6 +38,7 @@ #include "xattr.h" #include "acl.h" +#include "richacl.h" #include /* @@ -3888,6 +3889,8 @@ const struct inode_operations ext4_dir_inode_operations = { .removexattr = generic_removexattr, .get_acl = ext4_get_acl, .set_acl = ext4_set_acl, + .get_richacl = ext4_get_richacl, + .set_richacl = ext4_set_richacl, .fiemap = ext4_fiemap, }; @@ -3899,4 +3902,6 @@ const struct inode_operations ext4_special_inode_operations = { .removexattr = generic_removexattr, .get_acl = ext4_get_acl, .set_acl = ext4_set_acl, + .get_richacl = ext4_get_richacl, + .set_richacl = ext4_set_richacl, }; diff --git a/fs/ext4/richacl.c b/fs/ext4/richacl.c new file mode 100644 index 0000000..13a88e2 --- /dev/null +++ b/fs/ext4/richacl.c @@ -0,0 +1,137 @@ +/* + * Copyright IBM Corporation, 2010 + * Copyright (C) 2015 Red Hat, Inc. + * Author: Aneesh Kumar K.V , + * Andreas Gruenbacher + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2.1 of the GNU Lesser 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. + * + */ + +#include +#include +#include + +#include "ext4.h" +#include "ext4_jbd2.h" +#include "xattr.h" +#include "acl.h" +#include "richacl.h" + +struct richacl * +ext4_get_richacl(struct inode *inode) +{ + const int name_index = EXT4_XATTR_INDEX_RICHACL; + void *value = NULL; + struct richacl *acl = NULL; + int retval; + + retval = ext4_xattr_get(inode, name_index, "", NULL, 0); + if (retval > 0) { + value = kmalloc(retval, GFP_NOFS); + if (!value) + return ERR_PTR(-ENOMEM); + retval = ext4_xattr_get(inode, name_index, "", value, retval); + } + if (retval > 0) + acl = richacl_from_xattr(&init_user_ns, value, retval, -EIO); + else if (retval != -ENODATA && retval != -ENOSYS) + acl = ERR_PTR(retval); + kfree(value); + + if (!IS_ERR(acl)) + set_cached_richacl(inode, acl); + + return acl; +} + +static int +__ext4_remove_richacl(handle_t *handle, struct inode *inode) +{ + const int name_index = EXT4_XATTR_INDEX_RICHACL; + int retval; + + retval = ext4_xattr_set_handle(handle, inode, name_index, "", + NULL, 0, 0); + if (!retval) + set_cached_richacl(inode, NULL); + return retval; +} + +static int +__ext4_set_richacl(handle_t *handle, struct inode *inode, struct richacl *acl) +{ + const int name_index = EXT4_XATTR_INDEX_RICHACL; + umode_t mode = inode->i_mode; + int retval, size; + void *value; + + if (richacl_equiv_mode(acl, &mode) == 0) { + inode->i_ctime = ext4_current_time(inode); + inode->i_mode = mode; + ext4_mark_inode_dirty(handle, inode); + return __ext4_remove_richacl(handle, inode); + } + + mode &= ~S_IRWXUGO; + mode |= richacl_masks_to_mode(acl); + + size = richacl_xattr_size(acl); + value = kmalloc(size, GFP_NOFS); + if (!value) + return -ENOMEM; + richacl_to_xattr(&init_user_ns, acl, value, size); + inode->i_mode = mode; + retval = ext4_xattr_set_handle(handle, inode, name_index, "", + value, size, 0); + kfree(value); + if (retval) + return retval; + + set_cached_richacl(inode, acl); + + return 0; +} + +int +ext4_set_richacl(struct inode *inode, struct richacl *acl) +{ + handle_t *handle; + int retval, retries = 0; + +retry: + handle = ext4_journal_start(inode, EXT4_HT_XATTR, + ext4_jbd2_credits_xattr(inode)); + if (IS_ERR(handle)) + return PTR_ERR(handle); + + if (acl) + retval = __ext4_set_richacl(handle, inode, acl); + else + retval = __ext4_remove_richacl(handle, inode); + + ext4_journal_stop(handle); + if (retval == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) + goto retry; + return retval; +} + +int +ext4_init_richacl(handle_t *handle, struct inode *inode, struct inode *dir) +{ + struct richacl *acl = richacl_create(&inode->i_mode, dir); + int error; + + error = PTR_ERR(acl); + if (!IS_ERR_OR_NULL(acl)) { + error = __ext4_set_richacl(handle, inode, acl); + richacl_put(acl); + } + return error; +} diff --git a/fs/ext4/richacl.h b/fs/ext4/richacl.h new file mode 100644 index 0000000..6fe9a92 --- /dev/null +++ b/fs/ext4/richacl.h @@ -0,0 +1,40 @@ +/* + * Copyright IBM Corporation, 2010 + * Copyright (C) 2015 Red Hat, Inc. + * Author Aneesh Kumar K.V + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2.1 of the GNU Lesser 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. + * + */ + +#ifndef __FS_EXT4_RICHACL_H +#define __FS_EXT4_RICHACL_H + +#include + +#ifdef CONFIG_EXT4_FS_RICHACL + +extern struct richacl *ext4_get_richacl(struct inode *); +extern int ext4_set_richacl(struct inode *, struct richacl *); + +extern int ext4_init_richacl(handle_t *, struct inode *, struct inode *); + +#else /* CONFIG_EXT4_FS_RICHACL */ + +#define ext4_get_richacl NULL +#define ext4_set_richacl NULL + +static inline int +ext4_init_richacl(handle_t *handle, struct inode *inode, struct inode *dir) +{ + return 0; +} + +#endif /* CONFIG_EXT4_FS_RICHACL */ +#endif /* __FS_EXT4_RICHACL_H */ diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c index a95151e..ef76630 100644 --- a/fs/ext4/xattr.c +++ b/fs/ext4/xattr.c @@ -55,6 +55,7 @@ #include #include #include +#include #include "ext4_jbd2.h" #include "ext4.h" #include "xattr.h" @@ -97,6 +98,9 @@ static const struct xattr_handler *ext4_xattr_handler_map[] = { #ifdef CONFIG_EXT4_FS_SECURITY [EXT4_XATTR_INDEX_SECURITY] = &ext4_xattr_security_handler, #endif +#ifdef CONFIG_EXT4_FS_RICHACL + [EXT4_XATTR_INDEX_RICHACL] = &richacl_xattr_handler, +#endif }; const struct xattr_handler *ext4_xattr_handlers[] = { @@ -109,6 +113,9 @@ const struct xattr_handler *ext4_xattr_handlers[] = { #ifdef CONFIG_EXT4_FS_SECURITY &ext4_xattr_security_handler, #endif +#ifdef CONFIG_EXT4_FS_RICHACL + &richacl_xattr_handler, +#endif NULL }; diff --git a/include/linux/acl.h b/include/linux/acl.h new file mode 100644 index 0000000..3c3b5ce --- /dev/null +++ b/include/linux/acl.h @@ -0,0 +1,15 @@ +#ifndef __LINUX_ACL_H +#define __LINUX_ACL_H + +#include +#include + +static inline int +acl_chmod(struct inode *inode) +{ + if (IS_RICHACL(inode)) + return richacl_chmod(inode, inode->i_mode); + return posix_acl_chmod(inode, inode->i_mode); +} + +#endif -- 2.5.0 From agruenba@redhat.com Wed Mar 16 17:20:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B7E147CA7 for ; Wed, 16 Mar 2016 17:20:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 617AE8F8039 for ; Wed, 16 Mar 2016 15:20:51 -0700 (PDT) X-ASG-Debug-ID: 1458166849-04bdf002ed5357b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id x2VELLcBwCKOlMAE (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 15:20:49 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 13508711EE; Wed, 16 Mar 2016 22:20:49 +0000 (UTC) Received: from nux.redhat.com (vpn1-5-8.ams2.redhat.com [10.36.5.8]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2GMJ4IK007786; Wed, 16 Mar 2016 18:20:44 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: "Aneesh Kumar K.V" , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org, Andreas Gruenbacher Subject: [PATCH v20 23/23] ext4: Add richacl feature flag Date: Wed, 16 Mar 2016 23:19:03 +0100 X-ASG-Orig-Subj: [PATCH v20 23/23] ext4: Add richacl feature flag Message-Id: <1458166743-18488-24-git-send-email-agruenba@redhat.com> In-Reply-To: <1458166743-18488-1-git-send-email-agruenba@redhat.com> References: <1458166743-18488-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Wed, 16 Mar 2016 22:20:49 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458166849 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: "Aneesh Kumar K.V" This feature flag selects richacl instead of POSIX ACL support on the filesystem. When this feature is off, the "acl" and "noacl" mount options control whether POSIX ACLs are enabled. When it is on, richacls are automatically enabled and using the "noacl" mount option leads to an error. Signed-off-by: Aneesh Kumar K.V Signed-off-by: Andreas Gruenbacher Reviewed-by: Andreas Dilger --- fs/ext4/ext4.h | 6 ++++-- fs/ext4/super.c | 49 ++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 157b458..44277f9 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -1092,7 +1092,7 @@ struct ext4_inode_info { #define EXT4_MOUNT_UPDATE_JOURNAL 0x01000 /* Update the journal format */ #define EXT4_MOUNT_NO_UID32 0x02000 /* Disable 32-bit UIDs */ #define EXT4_MOUNT_XATTR_USER 0x04000 /* Extended user attributes */ -#define EXT4_MOUNT_POSIX_ACL 0x08000 /* POSIX Access Control Lists */ +#define EXT4_MOUNT_ACL 0x08000 /* Access Control Lists */ #define EXT4_MOUNT_NO_AUTO_DA_ALLOC 0x10000 /* No auto delalloc mapping */ #define EXT4_MOUNT_BARRIER 0x20000 /* Use block barriers */ #define EXT4_MOUNT_QUOTA 0x80000 /* Some quota option set */ @@ -1690,6 +1690,7 @@ static inline int ext4_encrypted_inode(struct inode *inode) #define EXT4_FEATURE_INCOMPAT_LARGEDIR 0x4000 /* >2GB or 3-lvl htree */ #define EXT4_FEATURE_INCOMPAT_INLINE_DATA 0x8000 /* data in inode */ #define EXT4_FEATURE_INCOMPAT_ENCRYPT 0x10000 +#define EXT4_FEATURE_INCOMPAT_RICHACL 0x20000 #define EXT4_FEATURE_COMPAT_FUNCS(name, flagname) \ static inline bool ext4_has_feature_##name(struct super_block *sb) \ @@ -1804,7 +1805,8 @@ EXT4_FEATURE_INCOMPAT_FUNCS(encrypt, ENCRYPT) EXT4_FEATURE_INCOMPAT_MMP | \ EXT4_FEATURE_INCOMPAT_INLINE_DATA | \ EXT4_FEATURE_INCOMPAT_ENCRYPT | \ - EXT4_FEATURE_INCOMPAT_CSUM_SEED) + EXT4_FEATURE_INCOMPAT_CSUM_SEED | \ + EXT4_FEATURE_INCOMPAT_RICHACL) #define EXT4_FEATURE_RO_COMPAT_SUPP (EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER| \ EXT4_FEATURE_RO_COMPAT_LARGE_FILE| \ EXT4_FEATURE_RO_COMPAT_GDT_CSUM| \ diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 3ed01ec..2ed8485 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -1305,6 +1305,28 @@ static ext4_fsblk_t get_sb_block(void **data) return sb_block; } +static int enable_acl(struct super_block *sb) +{ + sb->s_flags &= ~(MS_POSIXACL | MS_RICHACL); + if (test_opt(sb, ACL)) { + if (EXT4_HAS_INCOMPAT_FEATURE(sb, + EXT4_FEATURE_INCOMPAT_RICHACL)) { +#ifdef CONFIG_EXT4_FS_RICHACL + sb->s_flags |= MS_RICHACL; +#else + return -EOPNOTSUPP; +#endif + } else { +#ifdef CONFIG_EXT4_FS_POSIX_ACL + sb->s_flags |= MS_POSIXACL; +#else + return -EOPNOTSUPP; +#endif + } + } + return 0; +} + #define DEFAULT_JOURNAL_IOPRIO (IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, 3)) static char deprecated_msg[] = "Mount option \"%s\" will be removed by %s\n" "Contact linux-ext4@vger.kernel.org if you think we should keep it.\n"; @@ -1451,9 +1473,9 @@ static const struct mount_opts { MOPT_NO_EXT2 | MOPT_DATAJ}, {Opt_user_xattr, EXT4_MOUNT_XATTR_USER, MOPT_SET}, {Opt_nouser_xattr, EXT4_MOUNT_XATTR_USER, MOPT_CLEAR}, -#ifdef CONFIG_EXT4_FS_POSIX_ACL - {Opt_acl, EXT4_MOUNT_POSIX_ACL, MOPT_SET}, - {Opt_noacl, EXT4_MOUNT_POSIX_ACL, MOPT_CLEAR}, +#if defined(CONFIG_EXT4_FS_POSIX_ACL) || defined(CONFIG_EXT4_FS_RICHACL) + {Opt_acl, EXT4_MOUNT_ACL, MOPT_SET}, + {Opt_noacl, EXT4_MOUNT_ACL, MOPT_CLEAR}, #else {Opt_acl, 0, MOPT_NOSUPPORT}, {Opt_noacl, 0, MOPT_NOSUPPORT}, @@ -1501,6 +1523,13 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token, #endif switch (token) { case Opt_noacl: +#ifdef CONFIG_EXT4_FS_RICHACL + if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RICHACL)) { + ext4_msg(sb, KERN_ERR, "Mount option \"%s\" incompatible " + "with richacl feature", opt); + return -1; + } +#endif case Opt_nouser_xattr: ext4_msg(sb, KERN_WARNING, deprecated_msg, opt, "3.5"); break; @@ -3267,8 +3296,8 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) set_opt(sb, NO_UID32); /* xattr user namespace & acls are now defaulted on */ set_opt(sb, XATTR_USER); -#ifdef CONFIG_EXT4_FS_POSIX_ACL - set_opt(sb, POSIX_ACL); +#if defined(CONFIG_EXT4_FS_POSIX_ACL) || defined(CONFIG_EXT4_FS_RICHACL) + set_opt(sb, ACL); #endif /* don't forget to enable journal_csum when metadata_csum is enabled. */ if (ext4_has_metadata_csum(sb)) @@ -3351,8 +3380,9 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) sb->s_iflags |= SB_I_CGROUPWB; } - sb->s_flags = (sb->s_flags & ~MS_POSIXACL) | - (test_opt(sb, POSIX_ACL) ? MS_POSIXACL : 0); + err = enable_acl(sb); + if (err) + goto failed_mount; if (le32_to_cpu(es->s_rev_level) == EXT4_GOOD_OLD_REV && (ext4_has_compat_features(sb) || @@ -4668,8 +4698,9 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) if (sbi->s_mount_flags & EXT4_MF_FS_ABORTED) ext4_abort(sb, "Abort forced by user"); - sb->s_flags = (sb->s_flags & ~MS_POSIXACL) | - (test_opt(sb, POSIX_ACL) ? MS_POSIXACL : 0); + err = enable_acl(sb); + if (err) + goto restore_opts; es = sbi->s_es; -- 2.5.0 From agruenba@redhat.com Wed Mar 16 17:31:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D05497CCA for ; Wed, 16 Mar 2016 17:31:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 95BD78F8039 for ; Wed, 16 Mar 2016 15:31:41 -0700 (PDT) X-ASG-Debug-ID: 1458167498-04cbb00b7050a630001-NocioJ Received: from mail-vk0-f45.google.com (mail-vk0-f45.google.com [209.85.213.45]) by cuda.sgi.com with ESMTP id jCaAOdsZxHalOVHC (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 16 Mar 2016 15:31:39 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.85.213.45 Received: by mail-vk0-f45.google.com with SMTP id c3so80677497vkb.3 for ; Wed, 16 Mar 2016 15:31:39 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=uuQ44EusZ9oBWVx+ENnz3f2WJt3/DgETnDk9xQr19iU=; b=hHpqweLxtd5CALqHqZLorzuitRgRC7BVbgmLxAhTSXugELPUux5Kx1ul4mwiFusX3Q z9Lb8Y2v96OWABFTI5d6hnMZ0qmTf5vmYd6G9qS2w6FbpWw2KAjT+T7ML3vb83LfT11r eU9VwiE+AXXS8clxavtCunMpo0aguDwEiamovMRXn6JTF6vXVdsv3FB5+bQSa2n873m0 ecjdNLX4OM2uY9HHLJCpTvIVMklKxooY79R+BJfkG4BqjZWGcehzUBV68MfXC13o19Eb oVM7AbHAua4vA4FJKds/bA//68p9XwYMB+lTAWk2fdlmqG9Dp+N6/d3vT+V3+q/Ximsk yHWg== X-Gm-Message-State: AD7BkJJZ81mWOR/jx334QsZ9qUYaqSE+moD48dw9qR0+qBleAuqwdZKils5OC93C8IZbinnP1Bk2K3tMDNVOmLQm MIME-Version: 1.0 X-Received: by 10.31.52.65 with SMTP id b62mr7799583vka.61.1458167498554; Wed, 16 Mar 2016 15:31:38 -0700 (PDT) Received: by 10.159.33.173 with HTTP; Wed, 16 Mar 2016 15:31:38 -0700 (PDT) In-Reply-To: <20160315071256.GD19747@infradead.org> References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <1456733847-17982-12-git-send-email-agruenba@redhat.com> <20160311140746.GC14808@infradead.org> <20160315071256.GD19747@infradead.org> Date: Wed, 16 Mar 2016 23:31:38 +0100 Message-ID: Subject: Re: [PATCH v18 11/22] vfs: Cache base_acl objects in inodes From: Andreas Gruenbacher X-ASG-Orig-Subj: Re: [PATCH v18 11/22] vfs: Cache base_acl objects in inodes To: Christoph Hellwig Cc: Alexander Viro , "J. Bruce Fields" , Linux NFS Mailing List , "Theodore Ts'o" , linux-cifs@vger.kernel.org, Linux API , Trond Myklebust , LKML , XFS Developers , Andreas Dilger , linux-fsdevel , Jeff Layton , linux-ext4 , Anna Schumaker , jaegeuk@kernel.org, chao2.yu@samsung.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-vk0-f45.google.com[209.85.213.45] X-Barracuda-Start-Time: 1458167499 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27913 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Mar 15, 2016 at 8:12 AM, Christoph Hellwig wrote: > On Fri, Mar 11, 2016 at 05:24:45PM +0100, Andreas Gruenbacher wrote: >> POSIX ACLs and RichACLs are different objects, with different members >> and different algorithms operating on them. The only commonality is >> that they are both kmalloc()ed, reference counted objects, and when an >> inode is destroyed, both kinds of ACLs can be put in the same way, >> avoiding an unnecessary if. What kind of common-code container beyond >> that are you still dreaming about? > > We still have a main object that is simply a list of ACEs. But if that > doesn't work out (I suspect it should) I don't think the common base > object is a good idea. It just leads to a lot of crazy container_of > calls. There are two such container_of calls for POSIX ACLs in fs/jffs2/acl.c [which could be replaced by get_acl()], two in fs/posix_acl.c for POSIX ACLs, and two in fs/richacl.c for RichACLs. That's it. > If the common object abstraction doesn't work out we'll need > a procedural one instead that has common acl_* calls that decide what > do to based on the file system acl flag. I've already made such abstractions where it made sense; if you can find more, I don't see why we shouldn't add them. Thanks, Andreas From agruenba@redhat.com Wed Mar 16 17:38:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AECCD7CAE for ; Wed, 16 Mar 2016 17:38:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 71611304048 for ; Wed, 16 Mar 2016 15:38:35 -0700 (PDT) X-ASG-Debug-ID: 1458167912-04cb6c7f2a229ea0001-NocioJ Received: from mail-vk0-f50.google.com (mail-vk0-f50.google.com [209.85.213.50]) by cuda.sgi.com with ESMTP id qiCpmcQMkrluv8gu (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 16 Mar 2016 15:38:32 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.85.213.50 Received: by mail-vk0-f50.google.com with SMTP id e185so80823619vkb.1 for ; Wed, 16 Mar 2016 15:38:32 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=Fl35Gk/WNFgu7W5NycO/jn81OGtaJGLkmOMn+FuPCnU=; b=OgCZCPb6ral2ZUdrX4R3soAjl2FjMQPlGomsWg7apj8ugXYkUlA98ABAjyP7JpruTF rjvEYBUnLjIHCqB7FnN6V/x5/qAb0KAjU2bNWQ5CceO/z7zell2v8g66nIYzr+wAkj8U HG3ivFkgTvqpCRxydyU8llE9pF86wLa9ITHCxhvnjg0IZKYQRLr812bPA0URJnp4auEt RR+GdAkMhrai4bse+1lB3YrrqTuGi5NqVaz32L5C8ZbDv2bDIh2kYQrg3Qdi7/33N00Y k8XpCLBqHiVlybeG5gHbLAw1Xcxzbhlk47o4CSkbZRaY65gCbDsd9nUsFQLX6FxRbh15 1BTA== X-Gm-Message-State: AD7BkJKarNhedgxELEUcp72b/awdLLHg7RVHMnsiFy8mlv+8pCs8uoJz2iKlldXL0i0NS93TMnhOWrra+lWW7m/n MIME-Version: 1.0 X-Received: by 10.31.167.195 with SMTP id q186mr7606482vke.113.1458167912177; Wed, 16 Mar 2016 15:38:32 -0700 (PDT) Received: by 10.159.33.173 with HTTP; Wed, 16 Mar 2016 15:38:32 -0700 (PDT) In-Reply-To: <20160315071707.GF19747@infradead.org> References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <1456733847-17982-22-git-send-email-agruenba@redhat.com> <20160311142719.GG14808@infradead.org> <20160315071707.GF19747@infradead.org> Date: Wed, 16 Mar 2016 23:38:32 +0100 Message-ID: Subject: Re: [PATCH v18 21/22] ext4: Add richacl support From: Andreas Gruenbacher X-ASG-Orig-Subj: Re: [PATCH v18 21/22] ext4: Add richacl support To: Christoph Hellwig Cc: Alexander Viro , "Aneesh Kumar K.V" , "J. Bruce Fields" , Linux NFS Mailing List , "Theodore Ts'o" , linux-cifs@vger.kernel.org, Linux API , Trond Myklebust , LKML , XFS Developers , Andreas Dilger , linux-fsdevel , Jeff Layton , linux-ext4 , Anna Schumaker Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-vk0-f50.google.com[209.85.213.50] X-Barracuda-Start-Time: 1458167912 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27913 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Mar 15, 2016 at 8:17 AM, Christoph Hellwig wrote: > On Mon, Mar 14, 2016 at 12:08:31AM +0100, Andreas Gruenbacher wrote: >> The xattr representation is the same on disk and at the xattr syscall >> layer, and so richacl_from_xattr is used for converting into the >> in-memory representation in both cases. The error codes are not the >> same when a user supplies an invalid value via setxattr or NFS and >> when an invalid xattr is read from disk though. I'll add a parameter >> to richacl_from_xattr to make this more explicit. > > Better add a wrapper instead of a parameter. > >> >> >> +static int >> >> +__ext4_set_richacl(handle_t *handle, struct inode *inode, struct richacl *acl) >> >> +{ >> >> + const int name_index = EXT4_XATTR_INDEX_RICHACL; >> >> + umode_t mode = inode->i_mode; >> >> + int retval, size; >> >> + void *value; >> >> + >> >> + if (richacl_equiv_mode(acl, &mode) == 0) { >> >> + inode->i_ctime = ext4_current_time(inode); >> >> + inode->i_mode = mode; >> >> + ext4_mark_inode_dirty(handle, inode); >> >> + return __ext4_remove_richacl(handle, inode); >> >> + } >> > >> > Should this check for a NULL acl instead of special casing that >> > in ext4_set_richacl? >> >> I'm not sure I understand what you mean. When the > > ext4_set_richacl checks for a NULL acl pointer and then calls into > __ext4_remove_richacl. I'd rather have that special casing in one > place. Those are two different cases: the first is where ext4_set_richacl is called with a NULL acl to remove an existing ACL; the second is where ext4_set_richacl is called with a mode-equivalent ACL to set the mode and remove any existing ACL. The check for mode-equivalent ACLs is in __ext4_set_richacl and not in ext4_set_richacl because an inherited ACL (ext4_init_acl) can also be mode-equivalent. Andreas From chris@colorremedies.com Wed Mar 16 21:39:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 A9A5E7CA0 for ; Wed, 16 Mar 2016 21:39:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 78AA18F8049 for ; Wed, 16 Mar 2016 19:39:25 -0700 (PDT) X-ASG-Debug-ID: 1458182361-04cbb00b6f511270001-NocioJ Received: from mail-io0-f172.google.com (mail-io0-f172.google.com [209.85.223.172]) by cuda.sgi.com with ESMTP id RcwsKqUl3i3FPsA6 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 16 Mar 2016 19:39:22 -0700 (PDT) X-Barracuda-Envelope-From: chris@colorremedies.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.223.172 Received: by mail-io0-f172.google.com with SMTP id n190so83101118iof.0 for ; Wed, 16 Mar 2016 19:39:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=colorremedies-com.20150623.gappssmtp.com; s=20150623; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc; bh=rqvx1nP5ZT3/fz28RMM1F2PZFGh9sidfFLvniw9a+Bw=; b=h8DnG27M2xLAnsMaDmSwGBDpIN6uecXqVROPJ1EqHuFQ5AWFvChk8n8dg2jbhn24Bu pK/7pqpAE8FYoRJ2MgolhylCk7CmAUgygR+GpQ4S7tlMN0bf2/lIesHGL11xg+HZfwML uB7xtSIqlZpHSCjSEPqzUsSW+/8a0WxvOlJecsi3Dwbw0UmUuluzqnJko0Y/SuZQJf8D P3yyu7hUAHSAqsvN9sLmU6lhihPV4FMlZT2P392WLQbjw2pERRqhA+0/07e64v1Y+FO1 IJjjuIxjiCPa56ufpy0to9UwDN6+x5teclPLMRZMPfo+HzYRkXVldrmKdliP5cC0+P/R ZxZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:date :message-id:subject:from:to:cc; bh=rqvx1nP5ZT3/fz28RMM1F2PZFGh9sidfFLvniw9a+Bw=; b=HOzwmAgNKBmjSYIAOhe90TEoul8sLnvEQNfLkgxGOH5l+eK+QKSeayCYm1JEN80WrO Zp4ppLAVje/TZMLJ7LL8qPwMhGRGelt/l/wKB9H3rVzjkev8m5cIIRGmbBOVfvSPuEZ+ VCZKL88AGGpS0O29LQLynqj77g+ytmCiPgK4eNsMUmizqYyZL5od1zyZxOF4dWtkXK78 wuQcSSlFTVYwyvcvBJFCKMORpCeunYWDmUFqK61XadvKgMudBOY+SnH2baBq2UYmgMkQ OOr574AZZ8yqj0/c+7PdJGdVuNeeK8ouzsH+uuZ9azh+J0gbnUlY+TrNiBblqGblIK59 heNg== X-Gm-Message-State: AD7BkJJmCgJg6HKXwf8QI6X+rspucdlMejIaT+WQbli9Aqrct6UQT3G7PNyk4R1yIGDHwDqmMoR45Lb0s1k3LA== MIME-Version: 1.0 X-Received: by 10.107.151.133 with SMTP id z127mr6716839iod.191.1458182361443; Wed, 16 Mar 2016 19:39:21 -0700 (PDT) Sender: chris@colorremedies.com Received: by 10.36.110.3 with HTTP; Wed, 16 Mar 2016 19:39:21 -0700 (PDT) X-Originating-IP: [2601:282:702:b960:90d4:8465:5b43:1e8d] In-Reply-To: References: <56E8AA22.7080301@sandeen.net> Date: Wed, 16 Mar 2016 20:39:21 -0600 X-Google-Sender-Auth: MEYrCn8nIiypDT7ZUyHII4m-iAY Message-ID: Subject: Re: new fs, xfs_admin new label, metadata corruption detected From: Chris Murphy X-ASG-Orig-Subj: Re: new fs, xfs_admin new label, metadata corruption detected To: Chris Murphy Cc: Eric Sandeen , "xfs@oss.sgi.com" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-io0-f172.google.com[209.85.223.172] X-Barracuda-Start-Time: 1458182362 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.00 X-Barracuda-Spam-Status: No, SCORE=1.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_MV0035, BSF_SC0_SA_TO_FROM_ADDR_MATCH, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27920 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address 0.50 BSF_SC0_MV0035 Custom Rule BSF_SC0_MV0035 OK I can consistently reproduce this on the CLI. I end up with totally different # lvcreate -L 40g VG -n testxfs Logical volume "testxfs" created. # lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert testbtrfs VG Vwi-a-tz-- 39.06g thintastic 0.01 testext4 VG Vwi-a-tz-- 39.06g thintastic 3.96 testxfs VG -wi-a----- 40.00g thintastic VG twi-aotz-- 39.06g 3.97 4.86 # mkfs.xfs /dev/VG/testxfs meta-data=/dev/VG/testxfs isize=512 agcount=4, agsize=2621440 blks = sectsz=4096 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=0 data = bsize=4096 blocks=10485760, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=5120, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 # mount /dev/VG/testxfs /mnt/0 # cp file.iso /mnt/0 # lvresize -L 80g VG/testxfs Size of logical volume VG/testxfs changed from 40.00 GiB (10240 extents) to 80.00 GiB (20480 extents). Logical volume testxfs successfully resized. # xfs_growfs -d /mnt/0 meta-data=/dev/mapper/VG-testxfs isize=512 agcount=4, agsize=2621440 blks = sectsz=4096 attr=2, projid32bit=1 = crc=1 finobt=1 spinodes=0 data = bsize=4096 blocks=10485760, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal bsize=4096 blocks=5120, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 data blocks changed from 10485760 to 20971520 # df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs 1.9G 904K 1.9G 1% /run tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/sda1 180G 15G 165G 9% / tmpfs 1.9G 4.0K 1.9G 1% /tmp /dev/sda1 180G 15G 165G 9% /boot /dev/sda6 525M 8.4M 517M 2% /boot/efi /dev/mapper/brick1 562G 355G 205G 64% /brick1 tmpfs 388M 0 388M 0% /run/user/1000 /dev/mapper/VG-testxfs 80G 857M 80G 2% /mnt/0 [root@f23s ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert testbtrfs VG Vwi-a-tz-- 39.06g thintastic 0.01 testext4 VG Vwi-a-tz-- 39.06g thintastic 3.96 testxfs VG -wi-ao---- 80.00g thintastic VG twi-aotz-- 39.06g 3.97 4.86 # xfs_info /dev/VG/testxfs meta-data=/dev/mapper/VG-testxfs isize=512 agcount=8, agsize=2621440 blks = sectsz=4096 attr=2, projid32bit=1 = crc=1 finobt=1 spinodes=0 data = bsize=4096 blocks=20971520, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal bsize=4096 blocks=5120, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 # xfs_repair -n /dev/VG/testxfs Phase 1 - find and verify superblock... Phase 2 - using internal log - zero log... - scan filesystem freespace and inode maps... Metadata corruption detected at xfs_agf block 0x8c00008/0x1000 fllast 1014 in agf 7 too large (max = 1014) Metadata corruption detected at xfs_agf block 0x6400008/0x1000 fllast 1014 in agf 5 too large (max = 1014) Metadata corruption detected at xfs_agf block 0x5000008/0x1000 fllast 1014 in agf 4 too large (max = 1014) Metadata corruption detected at xfs_agf block 0x7800008/0x1000 fllast 1014 in agf 6 too large (max = 1014) - found root inode chunk Phase 3 - for each AG... - scan (but don't clear) agi unlinked lists... - process known inodes and perform inode discovery... - agno = 0 - agno = 1 - agno = 2 - agno = 3 - agno = 4 - agno = 5 - agno = 6 - agno = 7 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno = 0 - agno = 1 - agno = 4 - agno = 2 - agno = 7 - agno = 5 - agno = 6 - agno = 3 No modify flag set, skipping phase 5 Phase 6 - check inode connectivity... - traversing filesystem ... - traversal finished ... - moving disconnected inodes to lost+found ... Phase 7 - verify link counts... No modify flag set, skipping filesystem flush and exiting. # mount /dev/VG/testxfs /mnt/0 No mount errors. [14189.495433] XFS (dm-5): Mounting V5 Filesystem [14189.710141] XFS (dm-5): Ending clean mount [14326.856144] XFS (dm-5): Unmounting Filesystem [14413.691734] XFS (dm-5): Mounting V5 Filesystem [14413.833598] XFS (dm-5): Ending clean mount Chris Murphy From chris@colorremedies.com Wed Mar 16 21:40:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 664927CA0 for ; Wed, 16 Mar 2016 21:40:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id BF7E1AC001 for ; Wed, 16 Mar 2016 19:40:47 -0700 (PDT) X-ASG-Debug-ID: 1458182446-04cb6c7f2a22f9a0001-NocioJ Received: from mail-ig0-f179.google.com (mail-ig0-f179.google.com [209.85.213.179]) by cuda.sgi.com with ESMTP id J1uHeobqN4su1beZ (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 16 Mar 2016 19:40:46 -0700 (PDT) X-Barracuda-Envelope-From: chris@colorremedies.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.213.179 Received: by mail-ig0-f179.google.com with SMTP id ig19so4787223igb.0 for ; Wed, 16 Mar 2016 19:40:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=colorremedies-com.20150623.gappssmtp.com; s=20150623; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to; bh=dzHdOI5DCYeZYMArCxuLBd+vw1TYfXOHKK/dUPt1AQQ=; b=ctHTvh/4wOSxMuxwLoxzKM+9PwVwR19BNfCgEh7eN7OAak2Wuh/FA9RaIMvHuMhtoe uFTabOUXXeRX1L4oGxFv5EK+/lY23yM94ePmZbpR0//SSu5Ub99oTSnihUYgSJEZDgkM ezSqJgke5Hyd0OOkVminVsm5vyeIZ+Y8QFP/3aYd36zM1TcBjFyh2D8zrNnDYcpBGVRw wiXZx12CHD8NPh5BQFHbqng4Jf6/0ImBwf/KkfOxFdhdZUEh37IvLzlu2zicfzyp4k65 w8B5OuYOHGY06Tj1gBfIcPf0Lu/09VUl9b2tgJxilA93Bs1SKUsigJI57iiI/Sa1Fdmv PmdA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:date :message-id:subject:from:to; bh=dzHdOI5DCYeZYMArCxuLBd+vw1TYfXOHKK/dUPt1AQQ=; b=JzAFh6ooqD0Jh4PheJ6bkVUnEkS3whxsrT+NmarxwwSxv/WXEiuX8ZmDJ5jDISClmm cVb7cEhT1DNLtskeiaZ3/FlWHIaTXIPuqoFTZVeocowryqiRUktqpc3u+/n+dx4tLkIi fq4sajhtSJqAeaxDf/w0YVDva7Z1yNzFSxIpyJ/2pR60iM7QlZBGMnyj7iDGoXCmcw/2 LJKRw4xBMs9bdG4vo0/9wmJR80EKw2YxQzC9ut8lsanOoTAad+BkqG3kIHD/7CNg+gKI Yuw52aA5RVmJNqWXnbVnv2q3Erx/mLEsmsjtQPWrD32ZfQA59PbqrLOo0gsGUeX1/Qww ulYg== X-Gm-Message-State: AD7BkJL3kRnD6B9cgmq0uyYBqsjfBR0P/umfCTM8PPlMNIXpC2rk9HrMkpBdaOJX8P0l/bPuAh+vjwZMQhG4EQ== MIME-Version: 1.0 X-Received: by 10.50.25.229 with SMTP id f5mr9002129igg.17.1458182446093; Wed, 16 Mar 2016 19:40:46 -0700 (PDT) Sender: chris@colorremedies.com Received: by 10.36.110.3 with HTTP; Wed, 16 Mar 2016 19:40:46 -0700 (PDT) X-Originating-IP: [2601:282:702:b960:90d4:8465:5b43:1e8d] In-Reply-To: References: <56E8AA22.7080301@sandeen.net> Date: Wed, 16 Mar 2016 20:40:46 -0600 X-Google-Sender-Auth: UkUQEXHdBFtblse956WhikvDOO0 Message-ID: Subject: Re: new fs, xfs_admin new label, metadata corruption detected From: Chris Murphy X-ASG-Orig-Subj: Re: new fs, xfs_admin new label, metadata corruption detected To: "xfs@oss.sgi.com" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ig0-f179.google.com[209.85.213.179] X-Barracuda-Start-Time: 1458182446 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27920 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Wed, Mar 16, 2016 at 8:39 PM, Chris Murphy wrote: > OK I can consistently reproduce this on the CLI. I end up with totally different Ignore the incomplete thought. -- Chris Murphy From chris@colorremedies.com Wed Mar 16 21:55:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 D7B497CA0 for ; Wed, 16 Mar 2016 21:55:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7C1EA8F804C for ; Wed, 16 Mar 2016 19:55:13 -0700 (PDT) X-ASG-Debug-ID: 1458183309-04bdf002ec53c4c0001-NocioJ Received: from mail-io0-f170.google.com (mail-io0-f170.google.com [209.85.223.170]) by cuda.sgi.com with ESMTP id Z0C7RCiWuvdbKHh1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 16 Mar 2016 19:55:10 -0700 (PDT) X-Barracuda-Envelope-From: chris@colorremedies.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.223.170 Received: by mail-io0-f170.google.com with SMTP id g203so83295622iof.2 for ; Wed, 16 Mar 2016 19:55:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=colorremedies-com.20150623.gappssmtp.com; s=20150623; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to; bh=rdmxZHr3t2/jncusiIiDQ7lDVR30Vp84t5MYp2EXQJM=; b=qlY05MEGmzKkGoeEH4hEGZDkbEYmtiusdSyHLPOis6g6B/DoJM1+LzC40aDlfI/0e1 P+jc6wHdkVynQY/dbXh8VELxt5uJ+yRUY/bgYUCbPGvihxu9MbwWbs6LyQ0V5W8RVQ56 XMzpp/35dHpvW0leG+9zwFSKXcGfZUQQF7QfM7zk5AhFimoxhlxhdNB60u8LN1Kax4FO oQQsK+n/VCJ9TDspEK+QjFhCht9HBNzFxL9ao8IcbuzF3fVAakD82wiHD4nLCNyqZprm GO3G3YMJ/WAlzF6cP/4xsOH1iv0PMaZi+yXglo0FddSMeZaq3zUJ29p6QVx0beuvF65j pvlg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:date :message-id:subject:from:to; bh=rdmxZHr3t2/jncusiIiDQ7lDVR30Vp84t5MYp2EXQJM=; b=hfUSj4z4y1X0FWbJMnwmpXONqXQoGiuCarWAz7wBbt/ZaU4/0wSRc1gl8eUycwakDL FAnydcDaKH5tltxhuo+eOZ9hj31EHCYhg7JKLeITSf6cp8mhweL4rn1yjm2+saVLzZlo 5TWLN16YfjT3cdHura/39V94GgxJ3+9SmlglIw7oagBm83BVw6qI5MQpACeOeDNYZSZW oSnoKMCf1P5A37edI/YU3BVSOFz12Kc75katT1eykjvept7rw0Jet3rJhq1LafKhQeyA wOZPyhNK1fJvaviQ/ZIfm2qGmmqb/FNKzX0NoEiepec5WWDQyhvK9/ddvmOmZNrf4BR5 3XAA== X-Gm-Message-State: AD7BkJJt/s6W64V7C/Acs97hy6Q/X8iPd60vmX04hwcpAB9KU8gk9JePEpPPpYGLjHH1BSbBdtbqQKqfbukOJg== MIME-Version: 1.0 X-Received: by 10.107.158.148 with SMTP id h142mr7304467ioe.63.1458183309570; Wed, 16 Mar 2016 19:55:09 -0700 (PDT) Sender: chris@colorremedies.com Received: by 10.36.110.3 with HTTP; Wed, 16 Mar 2016 19:55:09 -0700 (PDT) X-Originating-IP: [2601:282:702:b960:90d4:8465:5b43:1e8d] In-Reply-To: References: <56E8AA22.7080301@sandeen.net> Date: Wed, 16 Mar 2016 20:55:09 -0600 X-Google-Sender-Auth: 3s7VXmKxJf507U0vN-0Nv-kLTjw Message-ID: Subject: Re: new fs, xfs_admin new label, metadata corruption detected From: Chris Murphy X-ASG-Orig-Subj: Re: new fs, xfs_admin new label, metadata corruption detected To: "xfs@oss.sgi.com" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-io0-f170.google.com[209.85.223.170] X-Barracuda-Start-Time: 1458183310 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27920 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Wed, Mar 16, 2016 at 8:39 PM, Chris Murphy wrote: > # xfs_repair -n /dev/VG/testxfs It's amateur hour... yes I did unmount before running xfs_repair or it fails. And I also did the test on conventional LV, not thinp. If I do the same test on a thinp LV, I consistently get more errors (than conventional LV) when I run xfs_repair, probably because there are 4x the AG's on thinp LV's for some reason. # xfs_repair -n /dev/VG/testxfs Phase 1 - find and verify superblock... - reporting progress in intervals of 15 minutes Phase 2 - using internal log - zero log... - scan filesystem freespace and inode maps... Metadata corruption detected at xfs_agf block 0x72ff488/0x1000 Metadata corruption detected at xfs_agf block 0x90ff188/0x1000Metadata corruption detected at xfs_agf block 0x8bff208/0x1000 Metadata corruption detected at xfs_agf block 0x86ff288/0x1000 Metadata corruption detected at xfs_agf block 0x81ff308/0x1000 Metadata corruption detected at xfs_agf block 0x77ff408/0x1000 Metadata corruption detected at xfs_agf block 0x7cff388/0x1000 fllast 1014 in agf 23 too large (max = 1014) Metadata corruption detected at xfs_agf block 0x6dff508/0x1000 Metadata corruption detected at xfs_agf block 0x68ff588/0x1000Metadata corruption detected at xfs_agf block 0x63ff608/0x1000 Metadata corruption detected at xfs_agf block 0x5eff688/0x1000 Metadata corruption detected at xfs_agf block 0x54ff788/0x1000 Metadata corruption detected at xfs_agf block 0x59ff708/0x1000 Metadata corruption detected at xfs_agf block 0x4fff808/0x1000 fllast 1014 in agf 28 too large (max = 1014) fllast 1014 in agf 27 too large (max = 1014) fllast 1014 in agf 26 too large (max = 1014) fllast 1014 in agf 29 too large (max = 1014) fllast 1014 in agf 25 too large (max = 1014) fllast 1014 in agf 24 too large (max = 1014) fllast 1014 in agf 22 too large (max = 1014) fllast 1014 in agf 21 too large (max = 1014) fllast 1014 in agf 19 too large (max = 1014) fllast 1014 in agf 20 too large (max = 1014) fllast 1014 in agf 17 too large (max = 1014) fllast 1014 in agf 18 too large (max = 1014) fllast 1014 in agf 16 too large (max = 1014) Metadata corruption detected at xfs_agf block 0x9fff008/0x1000 Metadata corruption detected at xfs_agf block 0x95ff108/0x1000 fllast 1014 in agf 32 too large (max = 1014) fllast 1014 in agf 30 too large (max = 1014) Metadata corruption detected at xfs_agf block 0x9aff088/0x1000 fllast 1014 in agf 31 too large (max = 1014) - 20:51:37: scanning filesystem freespace - 33 of 33 allocation groups done - found root inode chunk Phase 3 - for each AG... - scan (but don't clear) agi unlinked lists... - 20:51:37: scanning agi unlinked lists - 33 of 33 allocation groups done - process known inodes and perform inode discovery... - agno = 0 - agno = 30 - agno = 15 - agno = 1 - agno = 31 - agno = 16 - agno = 2 - agno = 3 - agno = 17 - agno = 32 - agno = 4 - agno = 18 - agno = 19 - agno = 5 - agno = 20 - agno = 6 - agno = 21 - agno = 7 - agno = 22 - agno = 8 - agno = 23 - agno = 9 - agno = 24 - agno = 10 - agno = 25 - agno = 11 - agno = 26 - agno = 12 - agno = 27 - agno = 13 - agno = 28 - agno = 14 - agno = 29 - 20:51:37: process known inodes and inode discovery - 64 of 64 inodes done - process newly discovered inodes... - 20:51:37: process newly discovered inodes - 33 of 33 allocation groups done Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - 20:51:37: setting up duplicate extent list - 33 of 33 allocation groups done - check for inodes claiming duplicate blocks... - agno = 1 - agno = 2 - agno = 3 - 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 = 4 - agno = 0 - agno = 5 - 20:51:37: check for inodes claiming duplicate blocks - 64 of 64 inodes done No modify flag set, skipping phase 5 Phase 6 - check inode connectivity... - traversing filesystem ... - traversal finished ... - moving disconnected inodes to lost+found ... Phase 7 - verify link counts... No modify flag set, skipping filesystem flush and exiting. -- Chris Murphy From eguan@redhat.com Wed Mar 16 22:28:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BEB557CA0 for ; Wed, 16 Mar 2016 22:28:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 823AA30404E for ; Wed, 16 Mar 2016 20:28:05 -0700 (PDT) X-ASG-Debug-ID: 1458185283-04bdf002ec53d1c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id CYI4rjjwrKtGy5O6 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 20:28:04 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id D0BF1C00DDE6; Thu, 17 Mar 2016 03:28:03 +0000 (UTC) Received: from localhost (dhcp-13-211.nay.redhat.com [10.66.13.211]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2H3S2Yk011803; Wed, 16 Mar 2016 23:28:03 -0400 Date: Thu, 17 Mar 2016 11:28:02 +0800 From: Eryu Guan To: Dave Chinner Cc: Christoph Hellwig , fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs/073: filter out finobt warning from mkfs.xfs Message-ID: <20160317032801.GU11419@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs/073: filter out finobt warning from mkfs.xfs References: <1458129204-31882-1-git-send-email-eguan@redhat.com> <20160316120416.GA18030@infradead.org> <20160316145418.GT11419@eguan.usersys.redhat.com> <20160316200043.GG11812@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160316200043.GG11812@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458185284 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Mar 17, 2016 at 07:00:43AM +1100, Dave Chinner wrote: > On Wed, Mar 16, 2016 at 10:54:18PM +0800, Eryu Guan wrote: > > On Wed, Mar 16, 2016 at 05:04:16AM -0700, Christoph Hellwig wrote: > > > On Wed, Mar 16, 2016 at 07:53:24PM +0800, Eryu Guan wrote: > > > > When testing xfs/073 with MKFS_OPTIONS="-m crc=1,finobt=1" set, it fails > > > > due to extra warning about disabling finobt feature: > > > > > > > > +warning: finobt not supported without CRC support, disabled. > > > > > > > > Because xfs/073 disables crc unconditionally and finobt can not be > > > > enabled either. > > > > > > How about explicitly disabling finobt as well? > > > > I think that's a cleaner way to fix it. Just that some extra work is > > needed to let the test pass with old mkfs.xfs without metadata suport. > > This is a downhill slope. e.g. if I add "-i sparse=1" to the mkfs > line, it will warning differently and a new filter is needed. I > would suggest just ignoring the mkfs output altogether (maybe just > dumping it all to $seqres.full) as it's not necessary to determine > whether the test ran correctly or not. Yes, other tests that call _scratch_mkfs_xfs with explicit "-m crc=0" all redirect output to null or $seqres.full, so I only see the warning in xfs/073. I'd like to do the same for it. I think the update to _scratch_mkfs_xfs_opts() in v2 patch is still worth doing, it belongs to a seperate patch though. Thanks, Eryu From eguan@redhat.com Wed Mar 16 23:27:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 249B47CA0 for ; Wed, 16 Mar 2016 23:27:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9FE72AC002 for ; Wed, 16 Mar 2016 21:27:55 -0700 (PDT) X-ASG-Debug-ID: 1458188873-04cbb00b71517180001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Fjq3cNJeDDmgEbmY (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 21:27:54 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 50D68C00358F; Thu, 17 Mar 2016 04:27:53 +0000 (UTC) Received: from localhost (dhcp-13-211.nay.redhat.com [10.66.13.211]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2H4Rq0j010282; Thu, 17 Mar 2016 00:27:52 -0400 From: Eryu Guan To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com, Eryu Guan Subject: [PATCH v3] xfs/073: ignore mkfs output Date: Thu, 17 Mar 2016 12:27:45 +0800 X-ASG-Orig-Subj: [PATCH v3] xfs/073: ignore mkfs output Message-Id: <1458188865-14819-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458188874 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 When testing xfs/073 with MKFS_OPTIONS="-m crc=1,finobt=1" set, it fails due to extra warning about disabling finobt feature: +warning: finobt not supported without CRC support, disabled. Because xfs/073 disables crc unconditionally and finobt can not be enabled either. Fix it by dumping mkfs output to $seqres.full and updating 073.out accordingly. Signed-off-by: Eryu Guan --- v3: - just ignore mkfs output v2: - disable finobt explicitly, instead of filtering the warning tests/xfs/073 | 2 +- tests/xfs/073.out | 6 ------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/tests/xfs/073 b/tests/xfs/073 index e1335df..9e29223 100755 --- a/tests/xfs/073 +++ b/tests/xfs/073 @@ -138,7 +138,7 @@ _require_loop rm -f $seqres.full -_scratch_mkfs_xfs -m crc=0 -dsize=41m,agcount=2 | _filter_mkfs 2>/dev/null +_scratch_mkfs_xfs -m crc=0 -dsize=41m,agcount=2 >>$seqres.full 2>&1 _scratch_mount 2>/dev/null || _fail "initial scratch mount failed" echo diff --git a/tests/xfs/073.out b/tests/xfs/073.out index 3f27467..5f36ebe 100644 --- a/tests/xfs/073.out +++ b/tests/xfs/073.out @@ -1,10 +1,4 @@ QA output created by 073 -meta-data=DDEV isize=XXX agcount=N, agsize=XXX blks -data = bsize=XXX blocks=XXX, imaxpct=PCT - = sunit=XXX swidth=XXX, unwritten=X -naming =VERN bsize=XXX -log =LDEV bsize=XXX blocks=XXX -realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX === populating scratch device 1000+0 records in -- 2.5.0 From eguan@redhat.com Wed Mar 16 23:28:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4F68E7CA4 for ; Wed, 16 Mar 2016 23:28:39 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1281B8F804B for ; Wed, 16 Mar 2016 21:28:36 -0700 (PDT) X-ASG-Debug-ID: 1458188914-04bdf002ec53f4d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id vJ9IxrMjHLv5Bdny (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 16 Mar 2016 21:28:34 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 6D61BC00EB12; Thu, 17 Mar 2016 04:28:34 +0000 (UTC) Received: from localhost (dhcp-13-211.nay.redhat.com [10.66.13.211]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2H4SXLU017510; Thu, 17 Mar 2016 00:28:33 -0400 From: Eryu Guan To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com, Eryu Guan Subject: [PATCH] common: filter out all metadata related options not only crc Date: Thu, 17 Mar 2016 12:28:12 +0800 X-ASG-Orig-Subj: [PATCH] common: filter out all metadata related options not only crc Message-Id: <1458188892-14905-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458188914 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Remove all metadata related mkfs options in _scratch_mkfs_xfs_opts() if mkfs.xfs has no metadata support, not only the crc option. Signed-off-by: Eryu Guan --- common/rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/rc b/common/rc index a34c387..38d3189 100644 --- a/common/rc +++ b/common/rc @@ -444,9 +444,9 @@ _scratch_mkfs_xfs_opts() { mkfs_opts=$* - # remove crc related mkfs options if mkfs.xfs doesn't support v5 xfs + # remove metadata related mkfs options if mkfs.xfs doesn't support them if [ -n "$XFS_MKFS_HAS_NO_META_SUPPORT" ]; then - mkfs_opts=`echo $mkfs_opts | sed "s/-m\s\+crc=.//"` + mkfs_opts=`echo $mkfs_opts | sed "s/-m\s\+\S\+//g"` fi _scratch_options mkfs -- 2.5.0 From chris@colorremedies.com Thu Mar 17 01:39:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 077D57CA0 for ; Thu, 17 Mar 2016 01:39:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C6045304043 for ; Wed, 16 Mar 2016 23:39:28 -0700 (PDT) X-ASG-Debug-ID: 1458196763-04cb6c7f28235fe0001-NocioJ Received: from mail-ig0-f179.google.com (mail-ig0-f179.google.com [209.85.213.179]) by cuda.sgi.com with ESMTP id yxNDajGYI7MJz0W2 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 16 Mar 2016 23:39:23 -0700 (PDT) X-Barracuda-Envelope-From: chris@colorremedies.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.213.179 Received: by mail-ig0-f179.google.com with SMTP id kc10so4381851igb.0 for ; Wed, 16 Mar 2016 23:39:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=colorremedies-com.20150623.gappssmtp.com; s=20150623; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to; bh=qb9mlCVdQ6bI5sEH0naQAFi1Yzvgg8orFLTYImMLbHs=; b=asj8RfUFSVKo71SLOcQZVU9o96Ci75SziL0sMZETV+/NwQgdnVtRVYpOhFEUftBiXQ mgO/BPCHsDTiA/yeSZ2lbnr+DAthDo7DnD/qWbe2dnCE6TD7MqqtMUb56840F3J8lUDs coaoi3h/WihG8Ng8hnPP2GShXtP0xK4+gBkw9lAVc16vwUaJmHUsMHoYrxtVMweiepaS cyCKNAav6xRWiZsEho+hbbkJx+lGIfMOaVdZlw4U+vZpq9XiQEsB2PM/MmQ2ZtcfRkEK drec7M5T1SlM5Xrwn6jHGNM6N5NnYpU46roXyyrcVk4Qt5mVLmfgNUBkvQ5paoD1XWxn GZEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:date :message-id:subject:from:to; bh=qb9mlCVdQ6bI5sEH0naQAFi1Yzvgg8orFLTYImMLbHs=; b=P+DVnDd/jc6yeRXTxuztNg52LIGusKrX17zJVwlVo5E2/mj00yoCy3jJfEAZc9tX6P N/QTNLhGwul6oyqFiZfzFJvpDKw26Q6rZN+xzLxbQoo9WJlD1E2rI2+0+sIXPHyImRHH D6LHIDG3kQ9mbdD04uZrrcrmcZp53LWdoIreyFZrOA5T7OR1BzTf9r4W/sfNnvmLsTyX 3kXSnySA1pEWertFZkOuCOdi8AMPK3Ez47pLHIe0ueJ/Lj28gbI1CpEwehjxsMrBwjOZ I4r8i5qycZYIyRjXysimgO6Nlfvi0SQU/W8Kt9xwf61kxLetzSMjogJfTQ3Nj1gpvrsy whlQ== X-Gm-Message-State: AD7BkJL3I7hnw/2YjAqPnMpb6IXLO5SOXAm1pYTtnJtlJHNoOB671tPhqs5GJrEOvjh8ZRquNjO+GUmIJ11SCw== MIME-Version: 1.0 X-Received: by 10.50.90.193 with SMTP id by1mr10246991igb.53.1458196763491; Wed, 16 Mar 2016 23:39:23 -0700 (PDT) Sender: chris@colorremedies.com Received: by 10.36.110.3 with HTTP; Wed, 16 Mar 2016 23:39:23 -0700 (PDT) X-Originating-IP: [2601:282:702:b960:dc3f:fbc:4c03:20dd] In-Reply-To: References: <56E8AA22.7080301@sandeen.net> Date: Thu, 17 Mar 2016 00:39:23 -0600 X-Google-Sender-Auth: 1jLpHKhzEHQWzxrKGrTSo2s5Frk Message-ID: Subject: Re: new fs, xfs_admin new label, metadata corruption detected From: Chris Murphy X-ASG-Orig-Subj: Re: new fs, xfs_admin new label, metadata corruption detected To: "xfs@oss.sgi.com" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ig0-f179.google.com[209.85.213.179] X-Barracuda-Start-Time: 1458196763 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27924 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 Using the same procedure but doing it with Btrfs and ext4, there are no errors. 'btrfs check' and 'btrfs scrub' both come up clean, no complaints. And e2fsck has no complaints for a resized ext4 volume. Chris Murphy From zlang@redhat.com Thu Mar 17 02:32:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C6F727CA0 for ; Thu, 17 Mar 2016 02:32:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4C573AC003 for ; Thu, 17 Mar 2016 00:32:38 -0700 (PDT) X-ASG-Debug-ID: 1458199952-04bdf002ee545bb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id n5NLC5sDzlV5HS0J (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 17 Mar 2016 00:32:33 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id BCC7E7F6B6; Thu, 17 Mar 2016 07:32:32 +0000 (UTC) Received: from localhost (dhcp12-206.nay.redhat.com [10.66.12.206] (may be forged)) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2H7WVw4000529; Thu, 17 Mar 2016 03:32:32 -0400 Date: Thu, 17 Mar 2016 15:32:30 +0800 From: Zorro Lang To: Chris Murphy Cc: Eric Sandeen , "xfs@oss.sgi.com" Subject: Re: new fs, xfs_admin new label, metadata corruption detected Message-ID: <20160317073230.GA2708@dhcp12-237.nay.redhat.com> X-ASG-Orig-Subj: Re: new fs, xfs_admin new label, metadata corruption detected References: <56E8AA22.7080301@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458199953 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Mar 16, 2016 at 08:39:21PM -0600, Chris Murphy wrote: > OK I can consistently reproduce this on the CLI. I end up with totally different > > # lvcreate -L 40g VG -n testxfs > Logical volume "testxfs" created. > # lvs > LV VG Attr LSize Pool Origin Data% Meta% > Move Log Cpy%Sync Convert > testbtrfs VG Vwi-a-tz-- 39.06g thintastic 0.01 > testext4 VG Vwi-a-tz-- 39.06g thintastic 3.96 > testxfs VG -wi-a----- 40.00g > thintastic VG twi-aotz-- 39.06g 3.97 4.86 > # mkfs.xfs /dev/VG/testxfs > meta-data=/dev/VG/testxfs isize=512 agcount=4, agsize=2621440 blks > = sectsz=4096 attr=2, projid32bit=1 > = crc=1 finobt=1, sparse=0 > data = bsize=4096 blocks=10485760, imaxpct=25 > = sunit=0 swidth=0 blks > naming =version 2 bsize=4096 ascii-ci=0 ftype=1 > log =internal log bsize=4096 blocks=5120, version=2 > = sectsz=4096 sunit=1 blks, lazy-count=1 > realtime =none extsz=4096 blocks=0, rtextents=0 > # mount /dev/VG/testxfs /mnt/0 > # cp file.iso /mnt/0 > # lvresize -L 80g VG/testxfs > Size of logical volume VG/testxfs changed from 40.00 GiB (10240 > extents) to 80.00 GiB (20480 extents). > Logical volume testxfs successfully resized. > # xfs_growfs -d /mnt/0 > meta-data=/dev/mapper/VG-testxfs isize=512 agcount=4, agsize=2621440 blks > = sectsz=4096 attr=2, projid32bit=1 > = crc=1 finobt=1 spinodes=0 > data = bsize=4096 blocks=10485760, imaxpct=25 > = sunit=0 swidth=0 blks > naming =version 2 bsize=4096 ascii-ci=0 ftype=1 > log =internal bsize=4096 blocks=5120, version=2 > = sectsz=4096 sunit=1 blks, lazy-count=1 > realtime =none extsz=4096 blocks=0, rtextents=0 > data blocks changed from 10485760 to 20971520 > # df -h > Filesystem Size Used Avail Use% Mounted on > devtmpfs 1.9G 0 1.9G 0% /dev > tmpfs 1.9G 0 1.9G 0% /dev/shm > tmpfs 1.9G 904K 1.9G 1% /run > tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup > /dev/sda1 180G 15G 165G 9% / > tmpfs 1.9G 4.0K 1.9G 1% /tmp > /dev/sda1 180G 15G 165G 9% /boot > /dev/sda6 525M 8.4M 517M 2% /boot/efi > /dev/mapper/brick1 562G 355G 205G 64% /brick1 > tmpfs 388M 0 388M 0% /run/user/1000 > /dev/mapper/VG-testxfs 80G 857M 80G 2% /mnt/0 > [root@f23s ~]# lvs > LV VG Attr LSize Pool Origin Data% Meta% > Move Log Cpy%Sync Convert > testbtrfs VG Vwi-a-tz-- 39.06g thintastic 0.01 > testext4 VG Vwi-a-tz-- 39.06g thintastic 3.96 > testxfs VG -wi-ao---- 80.00g > thintastic VG twi-aotz-- 39.06g 3.97 4.86 > # xfs_info /dev/VG/testxfs > meta-data=/dev/mapper/VG-testxfs isize=512 agcount=8, agsize=2621440 blks > = sectsz=4096 attr=2, projid32bit=1 > = crc=1 finobt=1 spinodes=0 > data = bsize=4096 blocks=20971520, imaxpct=25 > = sunit=0 swidth=0 blks > naming =version 2 bsize=4096 ascii-ci=0 ftype=1 > log =internal bsize=4096 blocks=5120, version=2 > = sectsz=4096 sunit=1 blks, lazy-count=1 > realtime =none extsz=4096 blocks=0, rtextents=0 > # xfs_repair -n /dev/VG/testxfs > Phase 1 - find and verify superblock... > Phase 2 - using internal log > - zero log... > - scan filesystem freespace and inode maps... > Metadata corruption detected at xfs_agf block 0x8c00008/0x1000 > fllast 1014 in agf 7 too large (max = 1014) > Metadata corruption detected at xfs_agf block 0x6400008/0x1000 > fllast 1014 in agf 5 too large (max = 1014) > Metadata corruption detected at xfs_agf block 0x5000008/0x1000 > fllast 1014 in agf 4 too large (max = 1014) > Metadata corruption detected at xfs_agf block 0x7800008/0x1000 > fllast 1014 in agf 6 too large (max = 1014) Hi, I can't reproduce this bug by run the same steps with you said on: linux 4.5.0-rc2 xfsprogs v4.5.0-rc1 Could you reproduce you problem on the newest linux/xfsprogs? As above results, agf 4, 5, 6 and 7 are the *new* AGs which created by growfs. So the corruption only on the *new* AGs. Generally the agf_fllast should < XFS_AGFL_SIZE(mp), but your fllast is equal to XFS_AGFL_SIZE(mp). BTW, if you can reproduce this bug on the newest linux/xfsprogs, could you check when "crc=0, finobt=0" or "crc=1, finobt=0", it still can be reproduced? If you can't reproduce on the newest, it maybe a bug of fedora. Thanks, Zorro > - found root inode chunk > Phase 3 - for each AG... > - scan (but don't clear) agi unlinked lists... > - process known inodes and perform inode discovery... > - agno = 0 > - agno = 1 > - agno = 2 > - agno = 3 > - agno = 4 > - agno = 5 > - agno = 6 > - agno = 7 > - process newly discovered inodes... > Phase 4 - check for duplicate blocks... > - setting up duplicate extent list... > - check for inodes claiming duplicate blocks... > - agno = 0 > - agno = 1 > - agno = 4 > - agno = 2 > - agno = 7 > - agno = 5 > - agno = 6 > - agno = 3 > No modify flag set, skipping phase 5 > Phase 6 - check inode connectivity... > - traversing filesystem ... > - traversal finished ... > - moving disconnected inodes to lost+found ... > Phase 7 - verify link counts... > No modify flag set, skipping filesystem flush and exiting. > # mount /dev/VG/testxfs /mnt/0 > > No mount errors. > [14189.495433] XFS (dm-5): Mounting V5 Filesystem > [14189.710141] XFS (dm-5): Ending clean mount > [14326.856144] XFS (dm-5): Unmounting Filesystem > [14413.691734] XFS (dm-5): Mounting V5 Filesystem > [14413.833598] XFS (dm-5): Ending clean mount > > > > Chris Murphy > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From ni.ketut.b@rspp.co.id Thu Mar 17 06:11:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 24ACE7CA0 for ; Thu, 17 Mar 2016 06:11:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4F4DDAC007 for ; Thu, 17 Mar 2016 04:11:36 -0700 (PDT) X-ASG-Debug-ID: 1458213085-04cb6c7f2a23c4d0001-NocioJ Received: from mail.rspp.co.id ([202.151.11.88]) by cuda.sgi.com with ESMTP id w03bGrQ0urjPQQcp (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 17 Mar 2016 04:11:27 -0700 (PDT) X-Barracuda-Envelope-From: ni.ketut.b@rspp.co.id X-Barracuda-Apparent-Source-IP: 202.151.11.88 Received: from localhost (localhost.localdomain [127.0.0.1]) by mail.rspp.co.id (Postfix) with ESMTP id BA62628688F0; Thu, 17 Mar 2016 16:25:08 +0700 (WIB) Received: from mail.rspp.co.id ([127.0.0.1]) by localhost (mail.rspp.co.id [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id fw6WlUiHFmmC; Thu, 17 Mar 2016 16:25:04 +0700 (WIB) Received: from localhost (localhost.localdomain [127.0.0.1]) by mail.rspp.co.id (Postfix) with ESMTP id 6983D28689C9; Thu, 17 Mar 2016 16:21:50 +0700 (WIB) DKIM-Filter: OpenDKIM Filter v2.9.2 mail.rspp.co.id 6983D28689C9 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rspp.co.id; s=8CB6AC22-E666-11E5-B384-A65C98A28952; t=1458206510; bh=dhhK3JYyig50npA7WgoaX3NDWe9vxVfjOTnrb4Yo4iQ=; h=Date:From:Reply-To:Message-ID:Subject:MIME-Version:Content-Type; b=Ve38zAxgvwHvCatNa7kDsJLLcvDkDVHyGXky3CM9pHWbjRuCvuW1OdWWQOWzhf7JW zbOpfqvnTwvVAiU5tCyL0UP4MCIJ6Ravolm6nYxAI5H1bTqWrM8AwxJakOYRWBeogB aMHHulXVpSsDgITHvgmq7fpoBHLA2Q6vNnB5Ab+4= X-Virus-Scanned: amavisd-new at mail.rspp.co.id Received: from mail.rspp.co.id ([127.0.0.1]) by localhost (mail.rspp.co.id [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id x2c06NuiiWIt; Thu, 17 Mar 2016 16:21:49 +0700 (WIB) Received: from mail.rspp.co.id (mail.rspp.co.id [202.151.11.88]) by mail.rspp.co.id (Postfix) with ESMTP id 5C4F72861234; Thu, 17 Mar 2016 16:18:28 +0700 (WIB) Date: Thu, 17 Mar 2016 16:18:28 +0700 (WIB) From: "mr. david ibe" Reply-To: "MR. DAVID IBE" Message-ID: <253777176.19591.1458206308197.JavaMail.zimbra@rspp.co.id> In-Reply-To: <1167916431.19537.1458206275785.JavaMail.zimbra@rspp.co.id> References: <862211298.8751.1458200048700.JavaMail.zimbra@rspp.co.id> <420968864.18944.1458205816824.JavaMail.zimbra@rspp.co.id> <2114241673.18979.1458205842198.JavaMail.zimbra@rspp.co.id> <1062789035.19076.1458205872841.JavaMail.zimbra@rspp.co.id> <69993029.19105.1458205903244.JavaMail.zimbra@rspp.co.id> <918095778.19478.1458206201378.JavaMail.zimbra@rspp.co.id> <1787591237.19510.1458206239294.JavaMail.zimbra@rspp.co.id> <1167916431.19537.1458206275785.JavaMail.zimbra@rspp.co.id> Subject: info, view the attach and get bark to me... MIME-Version: 1.0 X-ASG-Orig-Subj: info, view the attach and get bark to me... Content-Type: multipart/mixed; boundary="----=_Part_19588_613227689.1458206308173" X-Originating-IP: [197.78.165.171] X-Mailer: Zimbra 8.6.0_GA_1153 (ZimbraWebClient - FF44 (Win)/8.6.0_GA_1153) Thread-Topic: info, view the attach and get bark to me... Thread-Index: X1t/A2vscj7Qpk/ut3MQEjVpefRvJ5jxalSd13b4cxjPQcHmkHT6F2UzZv71pahdb5J3H9wxy09ZQH5/ZuO4c/Gn8DhnvxXDI9zswzKH9OyeY3tLmWT9alYpBnGsCTG0Mo9nyOOVGum+h+saD9pBs/CyGtKtocBYpgXoQZePYnkyaphwYsVq/SnTVcKwU+tPM+wIdh40KOM6/62iaQwMNnipqa8JjIIiGs7ZYwxhopXcQPRlBUA6QK53f0t9gDPrObQwgbvPKommcZWWcve8CvrAWIy9SRo2+f3PapfuGDuh+JxqPb6MCl6+GgqBvJP4X4ZaOufQ5RqQ66p05ShODrDboHHK+BIkc4VRM6qlQ5FmKV2GcwAQcbfyi7N81yeCfoF4rBd9GU4jRxjKJST8rPMS2vmFYPupWFffn99xjyxgy7Sg8dw8oJwlQDeXfnvIUhVE6qPBYEb/aAOQpaSkaXndnJiQjymHnAqG0ioklvS3N2xibxeFLa3UjXWAuZwCnrxLo+VvGm5tFMKiZZN16TvNzN3PClKBh8wIR21kU6cdHGcDtEBw1T8Mseeo2uuW17/QinHvVqAsvWoU7UW8qK3uesARs8S6jtqBvrrpKOXcZ4JllBz8lWC2U339YSbFJv+G4zwvG/ws7qDgbANU6QCkZTbt49IwHx5b810uqAe7itfPeeT1iLLrG13omAIfwRkR6FxtEgwpq4BQEjbMV5wvHmmwZrXe+HOnjWEgTXddoBlJXS6eBw+4D5R+S7DknFfwSwraQ4a/O7/dSPQIFpg4qFAsyWvi0Zfo2AG9bMGtpCxKdMqVVBto0hdvoGxIjLuVVJUh8QIHjrKQj24+hKmk60lcSQPil3XNVm9AyofJMxOhNnsjeVkS0M5X++JLbLqnius8gr2gBdmvxo6ya/8y2wiUOIoqIn35aK12i6Aazb11qZEcgrUmr9FQya36ChXpe2zvAIIXApln pTdcYq7F Kd2FucafOicR X-Barracuda-Connect: UNKNOWN[202.151.11.88] X-Barracuda-Start-Time: 1458213086 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.33 X-Barracuda-Spam-Status: No, SCORE=1.33 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, MISSING_HEADERS, RDNS_NONE, THREAD_INDEX, THREAD_TOPIC, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27926 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 1.21 MISSING_HEADERS Missing To: header 0.00 TO_CC_NONE No To: or Cc: header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS To: undisclosed-recipients:; ------=_Part_19588_613227689.1458206308173 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit ------=_Part_19588_613227689.1458206308173 Content-Type: image/png; name=Untitled.png Content-Disposition: attachment; filename=Untitled.png Content-Transfer-Encoding: base64 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 rkJggg== ------=_Part_19588_613227689.1458206308173-- From bfoster@redhat.com Thu Mar 17 08:05:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 45EF97CA0 for ; Thu, 17 Mar 2016 08:05:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B9E00AC004 for ; Thu, 17 Mar 2016 06:05:22 -0700 (PDT) X-ASG-Debug-ID: 1458219920-04bdf002eb54e6b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id fWXWa6Ksmgh7KfwB (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 17 Mar 2016 06:05: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 (Postfix) with ESMTPS id B62BC1F58B; Thu, 17 Mar 2016 13:05:20 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-24.bos.redhat.com [10.18.41.24]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2HD5K4k026503; Thu, 17 Mar 2016 09:05:20 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 2E7FD125517; Thu, 17 Mar 2016 09:05:19 -0400 (EDT) Date: Thu, 17 Mar 2016 09:05:18 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com, Dave Chinner Subject: Re: [PATCH 1/3] xfs: build bios directly in xfs_add_to_ioend Message-ID: <20160317130517.GA8242@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/3] xfs: build bios directly in xfs_add_to_ioend References: <1458128681-10869-1-git-send-email-hch@lst.de> <1458128681-10869-2-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1458128681-10869-2-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458219921 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Mar 16, 2016 at 12:44:39PM +0100, Christoph Hellwig wrote: > Currently adding a buffer to the ioend and then building a bio from > the buffer list are two separate operations. We don't build the bios > and submit them until the ioend is submitted, and this places a > fixed dependency on bufferhead chaining in the ioend. > > The first step to removing the bufferhead chaining in the ioend is > on the IO submission side. We can build the bio directly as we add > the buffers to the ioend chain, thereby removing the need for a > latter "buffer-to-bio" submission loop. This allows us to submit > bios on large ioends as soon as we cannot add more data to the bio. > > These bios then get captured by the active plug, and hence will be > dispatched as soon as either the plug overflows or we schedule away > from the writeback context. This will reduce submission latency for > large IOs, but will also allow more timely request queue based > writeback blocking when the device becomes congested. > > Signed-off-by: Dave Chinner > [hch: various small updates] > Signed-off-by: Christoph Hellwig > --- Reviewed-by: Brian Foster > fs/xfs/xfs_aops.c | 69 +++++++++++++++++++++++++------------------------------ > fs/xfs/xfs_aops.h | 1 + > 2 files changed, 32 insertions(+), 38 deletions(-) > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index 75a39a8..17cc6cc 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -274,6 +274,7 @@ xfs_alloc_ioend( > xfs_ioend_t *ioend; > > ioend = mempool_alloc(xfs_ioend_pool, GFP_NOFS); > + memset(ioend, 0, sizeof(*ioend)); > > /* > * Set the count to 1 initially, which will prevent an I/O > @@ -281,16 +282,9 @@ xfs_alloc_ioend( > * all the I/O from calling the completion routine too early. > */ > atomic_set(&ioend->io_remaining, 1); > - ioend->io_error = 0; > INIT_LIST_HEAD(&ioend->io_list); > ioend->io_type = type; > ioend->io_inode = inode; > - ioend->io_buffer_head = NULL; > - ioend->io_buffer_tail = NULL; > - ioend->io_offset = 0; > - ioend->io_size = 0; > - ioend->io_append_trans = NULL; > - > INIT_WORK(&ioend->io_work, xfs_end_io); > return ioend; > } > @@ -452,13 +446,18 @@ static inline int xfs_bio_add_buffer(struct bio *bio, struct buffer_head *bh) > } > > /* > - * Submit all of the bios for an ioend. We are only passed a single ioend at a > - * time; the caller is responsible for chaining prior to submission. > + * Submit the bio for an ioend. We are passed an ioend with a bio attached to > + * it, and we submit that bio. The ioend may be used for multiple bio > + * submissions, so we only want to allocate an append transaction for the ioend > + * once. In the case of multiple bio submission, each bio will take an IO > + * reference to the ioend to ensure that the ioend completion is only done once > + * all bios have been submitted and the ioend is really done. > * > * If @fail is non-zero, it means that we have a situation where some part of > * the submission process has failed after we have marked paged for writeback > - * and unlocked them. In this situation, we need to fail the ioend chain rather > - * than submit it to IO. This typically only happens on a filesystem shutdown. > + * and unlocked them. In this situation, we need to fail the bio and ioend > + * rather than submit it to IO. This typically only happens on a filesystem > + * shutdown. > */ > STATIC int > xfs_submit_ioend( > @@ -466,14 +465,13 @@ xfs_submit_ioend( > xfs_ioend_t *ioend, > int status) > { > - struct buffer_head *bh; > - struct bio *bio; > - sector_t lastblock = 0; > - > /* Reserve log space if we might write beyond the on-disk inode size. */ > if (!status && > - ioend->io_type != XFS_IO_UNWRITTEN && xfs_ioend_is_append(ioend)) > + ioend->io_bio && ioend->io_type != XFS_IO_UNWRITTEN && > + xfs_ioend_is_append(ioend) && > + !ioend->io_append_trans) > status = xfs_setfilesize_trans_alloc(ioend); > + > /* > * If we are failing the IO now, just mark the ioend with an > * error and finish it. This will run IO completion immediately > @@ -481,31 +479,15 @@ xfs_submit_ioend( > * time. > */ > if (status) { > + if (ioend->io_bio) > + bio_put(ioend->io_bio); > ioend->io_error = status; > xfs_finish_ioend(ioend); > return status; > } > > - bio = NULL; > - for (bh = ioend->io_buffer_head; bh; bh = bh->b_private) { > - > - if (!bio) { > -retry: > - bio = xfs_alloc_ioend_bio(bh); > - } else if (bh->b_blocknr != lastblock + 1) { > - xfs_submit_ioend_bio(wbc, ioend, bio); > - goto retry; > - } > - > - if (xfs_bio_add_buffer(bio, bh) != bh->b_size) { > - xfs_submit_ioend_bio(wbc, ioend, bio); > - goto retry; > - } > - > - lastblock = bh->b_blocknr; > - } > - if (bio) > - xfs_submit_ioend_bio(wbc, ioend, bio); > + xfs_submit_ioend_bio(wbc, ioend, ioend->io_bio); > + ioend->io_bio = NULL; > xfs_finish_ioend(ioend); > return 0; > } > @@ -523,6 +505,7 @@ xfs_add_to_ioend( > struct buffer_head *bh, > xfs_off_t offset, > struct xfs_writepage_ctx *wpc, > + struct writeback_control *wbc, > struct list_head *iolist) > { > if (!wpc->ioend || wpc->io_type != wpc->ioend->io_type || > @@ -542,8 +525,18 @@ xfs_add_to_ioend( > wpc->ioend->io_buffer_tail->b_private = bh; > wpc->ioend->io_buffer_tail = bh; > } > - > bh->b_private = NULL; > + > +retry: > + if (!wpc->ioend->io_bio) > + wpc->ioend->io_bio = xfs_alloc_ioend_bio(bh); > + > + if (xfs_bio_add_buffer(wpc->ioend->io_bio, bh) != bh->b_size) { > + xfs_submit_ioend_bio(wbc, wpc->ioend, wpc->ioend->io_bio); > + wpc->ioend->io_bio = NULL; > + goto retry; > + } > + > wpc->ioend->io_size += bh->b_size; > wpc->last_block = bh->b_blocknr; > xfs_start_buffer_writeback(bh); > @@ -803,7 +796,7 @@ xfs_writepage_map( > lock_buffer(bh); > if (wpc->io_type != XFS_IO_OVERWRITE) > xfs_map_at_offset(inode, bh, &wpc->imap, offset); > - xfs_add_to_ioend(inode, bh, offset, wpc, &submit_list); > + xfs_add_to_ioend(inode, bh, offset, wpc, wbc, &submit_list); > count++; > } > > diff --git a/fs/xfs/xfs_aops.h b/fs/xfs/xfs_aops.h > index 4e01bd5..c89c3bd 100644 > --- a/fs/xfs/xfs_aops.h > +++ b/fs/xfs/xfs_aops.h > @@ -52,6 +52,7 @@ typedef struct xfs_ioend { > xfs_off_t io_offset; /* offset in the file */ > struct work_struct io_work; /* xfsdatad work queue */ > struct xfs_trans *io_append_trans;/* xact. for size update */ > + struct bio *io_bio; /* bio being built */ > } xfs_ioend_t; > > extern const struct address_space_operations xfs_address_space_operations; > -- > 2.1.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu Mar 17 08:05:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6F0C57CA4 for ; Thu, 17 Mar 2016 08:05:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D9410AC006 for ; Thu, 17 Mar 2016 06:05:26 -0700 (PDT) X-ASG-Debug-ID: 1458219924-04cbb00b705282c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Zim5QaztUP1yOIF5 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 17 Mar 2016 06:05: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 (Postfix) with ESMTPS id 76186C0467F6; Thu, 17 Mar 2016 13:05:24 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-24.bos.redhat.com [10.18.41.24]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2HD5Okk019261; Thu, 17 Mar 2016 09:05:24 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 19EFE125517; Thu, 17 Mar 2016 09:05:23 -0400 (EDT) Date: Thu, 17 Mar 2016 09:05:23 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com, Dave Chinner Subject: Re: [PATCH 2/3] xfs: don't release bios on completion immediately Message-ID: <20160317130522.GB8242@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/3] xfs: don't release bios on completion immediately References: <1458128681-10869-1-git-send-email-hch@lst.de> <1458128681-10869-3-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1458128681-10869-3-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458219925 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Mar 16, 2016 at 12:44:40PM +0100, Christoph Hellwig wrote: > Completion of an ioend requires us to walk the bufferhead list to > end writback on all the bufferheads. This, in turn, is needed so > that we can end writeback on all the pages we just did IO on. > > To remove our dependency on bufferheads in writeback, we need to > turn this around the other way - we need to walk the pages we've > just completed IO on, and then walk the buffers attached to the > pages and complete their IO. In doing this, we remove the > requirement for the ioend to track bufferheads directly. > > To enable IO completion to walk all the pages we've submitted IO on, > we need to keep the bios that we used for IO around until the ioend > has been completed. We can do this simply by chaining the bios to > the ioend at completion time, and then walking their pages directly > just before destroying the ioend. > > Signed-off-by: Dave Chinner > [hch: changed the xfs_finish_page_writeback calling convention] > Signed-off-by: Christoph Hellwig > --- Reviewed-by: Brian Foster > fs/xfs/xfs_aops.c | 95 +++++++++++++++++++++++++++++++++++++++---------------- > fs/xfs/xfs_aops.h | 5 +-- > 2 files changed, 71 insertions(+), 29 deletions(-) > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index 17cc6cc..5928770 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -84,20 +84,64 @@ xfs_find_bdev_for_inode( > } > > /* > - * We're now finished for good with this ioend structure. > - * Update the page state via the associated buffer_heads, > - * release holds on the inode and bio, and finally free > - * up memory. Do not use the ioend after this. > + * We're now finished for good with this page. Update the page state via the > + * associated buffer_heads, paying attention to the start and end offsets that > + * we need to process on the page. > + */ > +static void > +xfs_finish_page_writeback( > + struct inode *inode, > + struct bio_vec *bvec, > + int error) > +{ > + unsigned int blockmask = (1 << inode->i_blkbits) - 1; > + unsigned int end = bvec->bv_offset + bvec->bv_len - 1; > + struct buffer_head *head, *bh; > + unsigned int off = 0; > + > + ASSERT(bvec->bv_offset < PAGE_SIZE); > + ASSERT((bvec->bv_offset & blockmask) == 0); > + ASSERT(end < PAGE_SIZE); > + ASSERT((bvec->bv_len & blockmask) == 0); > + > + bh = head = page_buffers(bvec->bv_page); > + > + do { > + if (off < bvec->bv_offset) > + goto next_bh; > + if (off > end) > + break; > + bh->b_end_io(bh, !error); > +next_bh: > + off += bh->b_size; > + } while ((bh = bh->b_this_page) != head); > +} > + > +/* > + * We're now finished for good with this ioend structure. Update the page > + * state, release holds on bios, and finally free up memory. Do not use the > + * ioend after this. > */ > STATIC void > xfs_destroy_ioend( > - xfs_ioend_t *ioend) > + struct xfs_ioend *ioend) > { > - struct buffer_head *bh, *next; > + struct inode *inode = ioend->io_inode; > + int error = ioend->io_error; > + struct bio *bio, *next; > + > + for (bio = ioend->io_bio_done; bio; bio = next) { > + struct bio_vec *bvec; > + int i; > + > + next = bio->bi_private; > + bio->bi_private = NULL; > > - for (bh = ioend->io_buffer_head; bh; bh = next) { > - next = bh->b_private; > - bh->b_end_io(bh, !ioend->io_error); > + /* walk each page on bio, ending page IO on them */ > + bio_for_each_segment_all(bvec, bio, i) > + xfs_finish_page_writeback(inode, bvec, error); > + > + bio_put(bio); > } > > mempool_free(ioend, xfs_ioend_pool); > @@ -286,6 +330,7 @@ xfs_alloc_ioend( > ioend->io_type = type; > ioend->io_inode = inode; > INIT_WORK(&ioend->io_work, xfs_end_io); > + spin_lock_init(&ioend->io_lock); > return ioend; > } > > @@ -365,15 +410,21 @@ STATIC void > xfs_end_bio( > struct bio *bio) > { > - xfs_ioend_t *ioend = bio->bi_private; > - > - if (!ioend->io_error) > - ioend->io_error = bio->bi_error; > + struct xfs_ioend *ioend = bio->bi_private; > + unsigned long flags; > > - /* Toss bio and pass work off to an xfsdatad thread */ > bio->bi_private = NULL; > bio->bi_end_io = NULL; > - bio_put(bio); > + > + spin_lock_irqsave(&ioend->io_lock, flags); > + if (!ioend->io_error) > + ioend->io_error = bio->bi_error; > + if (!ioend->io_bio_done) > + ioend->io_bio_done = bio; > + else > + ioend->io_bio_done_tail->bi_private = bio; > + ioend->io_bio_done_tail = bio; > + spin_unlock_irqrestore(&ioend->io_lock, flags); > > xfs_finish_ioend(ioend); > } > @@ -511,21 +562,11 @@ xfs_add_to_ioend( > if (!wpc->ioend || wpc->io_type != wpc->ioend->io_type || > bh->b_blocknr != wpc->last_block + 1 || > offset != wpc->ioend->io_offset + wpc->ioend->io_size) { > - struct xfs_ioend *new; > - > if (wpc->ioend) > list_add(&wpc->ioend->io_list, iolist); > - > - new = xfs_alloc_ioend(inode, wpc->io_type); > - new->io_offset = offset; > - new->io_buffer_head = bh; > - new->io_buffer_tail = bh; > - wpc->ioend = new; > - } else { > - wpc->ioend->io_buffer_tail->b_private = bh; > - wpc->ioend->io_buffer_tail = bh; > + wpc->ioend = xfs_alloc_ioend(inode, wpc->io_type); > + wpc->ioend->io_offset = offset; > } > - bh->b_private = NULL; > > retry: > if (!wpc->ioend->io_bio) > diff --git a/fs/xfs/xfs_aops.h b/fs/xfs/xfs_aops.h > index c89c3bd..1c7b041 100644 > --- a/fs/xfs/xfs_aops.h > +++ b/fs/xfs/xfs_aops.h > @@ -46,13 +46,14 @@ typedef struct xfs_ioend { > int io_error; /* I/O error code */ > atomic_t io_remaining; /* hold count */ > struct inode *io_inode; /* file being written to */ > - struct buffer_head *io_buffer_head;/* buffer linked list head */ > - struct buffer_head *io_buffer_tail;/* buffer linked list tail */ > size_t io_size; /* size of the extent */ > xfs_off_t io_offset; /* offset in the file */ > struct work_struct io_work; /* xfsdatad work queue */ > struct xfs_trans *io_append_trans;/* xact. for size update */ > struct bio *io_bio; /* bio being built */ > + struct bio *io_bio_done; /* bios completed */ > + struct bio *io_bio_done_tail; /* bios completed */ > + spinlock_t io_lock; /* for bio completion list */ > } xfs_ioend_t; > > extern const struct address_space_operations xfs_address_space_operations; > -- > 2.1.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu Mar 17 08:05:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B32D47CA4 for ; Thu, 17 Mar 2016 08:05:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0DE72AC004 for ; Thu, 17 Mar 2016 06:05:32 -0700 (PDT) X-ASG-Debug-ID: 1458219929-04cb6c7f2923fb50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ZXNttCsOiMctlPeZ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 17 Mar 2016 06:05: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 (Postfix) with ESMTPS id 93EAD65425; Thu, 17 Mar 2016 13:05:29 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-24.bos.redhat.com [10.18.41.24]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2HD5TU1015053; Thu, 17 Mar 2016 09:05:29 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 2671C125517; Thu, 17 Mar 2016 09:05:28 -0400 (EDT) Date: Thu, 17 Mar 2016 09:05:28 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/3] xfs: optimize bio handling in the buffer writeback path Message-ID: <20160317130527.GC8242@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 3/3] xfs: optimize bio handling in the buffer writeback path References: <1458128681-10869-1-git-send-email-hch@lst.de> <1458128681-10869-4-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1458128681-10869-4-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 17 Mar 2016 13:05:29 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458219930 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Mar 16, 2016 at 12:44:41PM +0100, Christoph Hellwig wrote: > This patch implements two closely related changes: First it embedds a > bio the ioend structure so that we don't have to allocate one separately. > Second it uses the block layer bio chaining mechanism to chain additional > bios off this first one if needed instead of manually accouting for > multiple bio completions in the ioend structure. Together this removes a > memory allocation per ioend and greatly simplifies the ioend setup and > I/O completion path. > > Signed-off-by: Christoph Hellwig > --- Thanks for the helper cleanups and the bi_error fix. Looks good to me: Reviewed-by: Brian Foster > fs/xfs/xfs_aops.c | 247 ++++++++++++++++++++++++----------------------------- > fs/xfs/xfs_aops.h | 15 ++-- > fs/xfs/xfs_super.c | 26 ++---- > 3 files changed, 123 insertions(+), 165 deletions(-) > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index 5928770..42e7368 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -124,18 +124,25 @@ next_bh: > */ > STATIC void > xfs_destroy_ioend( > - struct xfs_ioend *ioend) > + struct xfs_ioend *ioend, > + int error) > { > struct inode *inode = ioend->io_inode; > - int error = ioend->io_error; > + struct bio *last = ioend->io_bio; > struct bio *bio, *next; > > - for (bio = ioend->io_bio_done; bio; bio = next) { > + for (bio = &ioend->io_inline_bio; bio; bio = next) { > struct bio_vec *bvec; > int i; > > - next = bio->bi_private; > - bio->bi_private = NULL; > + /* > + * For the last bio, bi_private points to the ioend, so we > + * need to explicitly end the iteration here. > + */ > + if (bio == last) > + next = NULL; > + else > + next = bio->bi_private; > > /* walk each page on bio, ending page IO on them */ > bio_for_each_segment_all(bvec, bio, i) > @@ -143,8 +150,6 @@ xfs_destroy_ioend( > > bio_put(bio); > } > - > - mempool_free(ioend, xfs_ioend_pool); > } > > /* > @@ -218,7 +223,8 @@ xfs_setfilesize( > > STATIC int > xfs_setfilesize_ioend( > - struct xfs_ioend *ioend) > + struct xfs_ioend *ioend, > + int error) > { > struct xfs_inode *ip = XFS_I(ioend->io_inode); > struct xfs_trans *tp = ioend->io_append_trans; > @@ -232,53 +238,32 @@ xfs_setfilesize_ioend( > __sb_writers_acquired(VFS_I(ip)->i_sb, SB_FREEZE_FS); > > /* we abort the update if there was an IO error */ > - if (ioend->io_error) { > + if (error) { > xfs_trans_cancel(tp); > - return ioend->io_error; > + return error; > } > > return xfs_setfilesize(ip, tp, ioend->io_offset, ioend->io_size); > } > > /* > - * Schedule IO completion handling on the final put of an ioend. > - * > - * If there is no work to do we might as well call it a day and free the > - * ioend right now. > - */ > -STATIC void > -xfs_finish_ioend( > - struct xfs_ioend *ioend) > -{ > - if (atomic_dec_and_test(&ioend->io_remaining)) { > - struct xfs_mount *mp = XFS_I(ioend->io_inode)->i_mount; > - > - if (ioend->io_type == XFS_IO_UNWRITTEN) > - queue_work(mp->m_unwritten_workqueue, &ioend->io_work); > - else if (ioend->io_append_trans) > - queue_work(mp->m_data_workqueue, &ioend->io_work); > - else > - xfs_destroy_ioend(ioend); > - } > -} > - > -/* > * IO write completion. > */ > STATIC void > xfs_end_io( > struct work_struct *work) > { > - xfs_ioend_t *ioend = container_of(work, xfs_ioend_t, io_work); > - struct xfs_inode *ip = XFS_I(ioend->io_inode); > - int error = 0; > + struct xfs_ioend *ioend = > + container_of(work, struct xfs_ioend, io_work); > + struct xfs_inode *ip = XFS_I(ioend->io_inode); > + int error = ioend->io_bio->bi_error; > > /* > * Set an error if the mount has shut down and proceed with end I/O > * processing so it can perform whatever cleanups are necessary. > */ > if (XFS_FORCED_SHUTDOWN(ip->i_mount)) > - ioend->io_error = -EIO; > + error = -EIO; > > /* > * For unwritten extents we need to issue transactions to convert a > @@ -288,50 +273,33 @@ xfs_end_io( > * on error. > */ > if (ioend->io_type == XFS_IO_UNWRITTEN) { > - if (ioend->io_error) > + if (error) > goto done; > error = xfs_iomap_write_unwritten(ip, ioend->io_offset, > ioend->io_size); > } else if (ioend->io_append_trans) { > - error = xfs_setfilesize_ioend(ioend); > + error = xfs_setfilesize_ioend(ioend, error); > } else { > ASSERT(!xfs_ioend_is_append(ioend)); > } > > done: > - if (error) > - ioend->io_error = error; > - xfs_destroy_ioend(ioend); > + xfs_destroy_ioend(ioend, error); > } > > -/* > - * Allocate and initialise an IO completion structure. > - * We need to track unwritten extent write completion here initially. > - * We'll need to extend this for updating the ondisk inode size later > - * (vs. incore size). > - */ > -STATIC xfs_ioend_t * > -xfs_alloc_ioend( > - struct inode *inode, > - unsigned int type) > +STATIC void > +xfs_end_bio( > + struct bio *bio) > { > - xfs_ioend_t *ioend; > - > - ioend = mempool_alloc(xfs_ioend_pool, GFP_NOFS); > - memset(ioend, 0, sizeof(*ioend)); > + struct xfs_ioend *ioend = bio->bi_private; > + struct xfs_mount *mp = XFS_I(ioend->io_inode)->i_mount; > > - /* > - * Set the count to 1 initially, which will prevent an I/O > - * completion callback from happening before we have started > - * all the I/O from calling the completion routine too early. > - */ > - atomic_set(&ioend->io_remaining, 1); > - INIT_LIST_HEAD(&ioend->io_list); > - ioend->io_type = type; > - ioend->io_inode = inode; > - INIT_WORK(&ioend->io_work, xfs_end_io); > - spin_lock_init(&ioend->io_lock); > - return ioend; > + if (ioend->io_type == XFS_IO_UNWRITTEN) > + queue_work(mp->m_unwritten_workqueue, &ioend->io_work); > + else if (ioend->io_append_trans) > + queue_work(mp->m_data_workqueue, &ioend->io_work); > + else > + xfs_destroy_ioend(ioend, bio->bi_error); > } > > STATIC int > @@ -403,56 +371,6 @@ xfs_imap_valid( > offset < imap->br_startoff + imap->br_blockcount; > } > > -/* > - * BIO completion handler for buffered IO. > - */ > -STATIC void > -xfs_end_bio( > - struct bio *bio) > -{ > - struct xfs_ioend *ioend = bio->bi_private; > - unsigned long flags; > - > - bio->bi_private = NULL; > - bio->bi_end_io = NULL; > - > - spin_lock_irqsave(&ioend->io_lock, flags); > - if (!ioend->io_error) > - ioend->io_error = bio->bi_error; > - if (!ioend->io_bio_done) > - ioend->io_bio_done = bio; > - else > - ioend->io_bio_done_tail->bi_private = bio; > - ioend->io_bio_done_tail = bio; > - spin_unlock_irqrestore(&ioend->io_lock, flags); > - > - xfs_finish_ioend(ioend); > -} > - > -STATIC void > -xfs_submit_ioend_bio( > - struct writeback_control *wbc, > - xfs_ioend_t *ioend, > - struct bio *bio) > -{ > - atomic_inc(&ioend->io_remaining); > - bio->bi_private = ioend; > - bio->bi_end_io = xfs_end_bio; > - submit_bio(wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE, bio); > -} > - > -STATIC struct bio * > -xfs_alloc_ioend_bio( > - struct buffer_head *bh) > -{ > - struct bio *bio = bio_alloc(GFP_NOIO, BIO_MAX_PAGES); > - > - ASSERT(bio->bi_private == NULL); > - bio->bi_iter.bi_sector = bh->b_blocknr * (bh->b_size >> 9); > - bio->bi_bdev = bh->b_bdev; > - return bio; > -} > - > STATIC void > xfs_start_buffer_writeback( > struct buffer_head *bh) > @@ -513,16 +431,19 @@ static inline int xfs_bio_add_buffer(struct bio *bio, struct buffer_head *bh) > STATIC int > xfs_submit_ioend( > struct writeback_control *wbc, > - xfs_ioend_t *ioend, > + struct xfs_ioend *ioend, > int status) > { > /* Reserve log space if we might write beyond the on-disk inode size. */ > if (!status && > - ioend->io_bio && ioend->io_type != XFS_IO_UNWRITTEN && > + ioend->io_type != XFS_IO_UNWRITTEN && > xfs_ioend_is_append(ioend) && > !ioend->io_append_trans) > status = xfs_setfilesize_trans_alloc(ioend); > > + ioend->io_bio->bi_private = ioend; > + ioend->io_bio->bi_end_io = xfs_end_bio; > + > /* > * If we are failing the IO now, just mark the ioend with an > * error and finish it. This will run IO completion immediately > @@ -530,19 +451,75 @@ xfs_submit_ioend( > * time. > */ > if (status) { > - if (ioend->io_bio) > - bio_put(ioend->io_bio); > - ioend->io_error = status; > - xfs_finish_ioend(ioend); > + ioend->io_bio->bi_error = status; > + bio_endio(ioend->io_bio); > return status; > } > > - xfs_submit_ioend_bio(wbc, ioend, ioend->io_bio); > - ioend->io_bio = NULL; > - xfs_finish_ioend(ioend); > + submit_bio(wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE, > + ioend->io_bio); > return 0; > } > > +static void > +xfs_init_bio_from_bh( > + struct bio *bio, > + struct buffer_head *bh) > +{ > + bio->bi_iter.bi_sector = bh->b_blocknr * (bh->b_size >> 9); > + bio->bi_bdev = bh->b_bdev; > +} > + > +static struct xfs_ioend * > +xfs_alloc_ioend( > + struct inode *inode, > + unsigned int type, > + xfs_off_t offset, > + struct buffer_head *bh) > +{ > + struct xfs_ioend *ioend; > + struct bio *bio; > + > + bio = bio_alloc_bioset(GFP_NOFS, BIO_MAX_PAGES, xfs_ioend_bioset); > + xfs_init_bio_from_bh(bio, bh); > + > + ioend = container_of(bio, struct xfs_ioend, io_inline_bio); > + INIT_LIST_HEAD(&ioend->io_list); > + ioend->io_type = type; > + ioend->io_inode = inode; > + ioend->io_size = 0; > + ioend->io_offset = offset; > + INIT_WORK(&ioend->io_work, xfs_end_io); > + ioend->io_append_trans = NULL; > + ioend->io_bio = bio; > + return ioend; > +} > + > +/* > + * Allocate a new bio, and chain the old bio to the new one. > + * > + * Note that we have to do perform the chaining in this unintuitive order > + * so that the bi_private linkage is set up in the right direction for the > + * traversal in xfs_destroy_ioend(). > + */ > +static void > +xfs_chain_bio( > + struct xfs_ioend *ioend, > + struct writeback_control *wbc, > + struct buffer_head *bh) > +{ > + struct bio *new; > + > + new = bio_alloc(GFP_NOFS, BIO_MAX_PAGES); > + xfs_init_bio_from_bh(new, bh); > + > + bio_chain(ioend->io_bio, new); > + bio_get(ioend->io_bio); /* for xfs_destroy_ioend */ > + submit_bio(wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE, > + ioend->io_bio); > + ioend->io_bio = new; > +} > + > /* > * Test to see if we've been building up a completion structure for > * earlier buffers -- if so, we try to append to this ioend if we > @@ -564,19 +541,15 @@ xfs_add_to_ioend( > offset != wpc->ioend->io_offset + wpc->ioend->io_size) { > if (wpc->ioend) > list_add(&wpc->ioend->io_list, iolist); > - wpc->ioend = xfs_alloc_ioend(inode, wpc->io_type); > - wpc->ioend->io_offset = offset; > + wpc->ioend = xfs_alloc_ioend(inode, wpc->io_type, offset, bh); > } > > -retry: > - if (!wpc->ioend->io_bio) > - wpc->ioend->io_bio = xfs_alloc_ioend_bio(bh); > - > - if (xfs_bio_add_buffer(wpc->ioend->io_bio, bh) != bh->b_size) { > - xfs_submit_ioend_bio(wbc, wpc->ioend, wpc->ioend->io_bio); > - wpc->ioend->io_bio = NULL; > - goto retry; > - } > + /* > + * If the buffer doesn't fit into the bio we need to allocate a new > + * one. This shouldn't happen more than once for a given buffer. > + */ > + while (xfs_bio_add_buffer(wpc->ioend->io_bio, bh) != bh->b_size) > + xfs_chain_bio(wpc->ioend, wbc, bh); > > wpc->ioend->io_size += bh->b_size; > wpc->last_block = bh->b_blocknr; > diff --git a/fs/xfs/xfs_aops.h b/fs/xfs/xfs_aops.h > index 1c7b041..8b5b641 100644 > --- a/fs/xfs/xfs_aops.h > +++ b/fs/xfs/xfs_aops.h > @@ -18,7 +18,7 @@ > #ifndef __XFS_AOPS_H__ > #define __XFS_AOPS_H__ > > -extern mempool_t *xfs_ioend_pool; > +extern struct bio_set *xfs_ioend_bioset; > > /* > * Types of I/O for bmap clustering and I/O completion tracking. > @@ -37,24 +37,19 @@ enum { > { XFS_IO_OVERWRITE, "overwrite" } > > /* > - * xfs_ioend struct manages large extent writes for XFS. > - * It can manage several multi-page bio's at once. > + * Structure for buffered I/O completions. > */ > -typedef struct xfs_ioend { > +struct xfs_ioend { > struct list_head io_list; /* next ioend in chain */ > unsigned int io_type; /* delalloc / unwritten */ > - int io_error; /* I/O error code */ > - atomic_t io_remaining; /* hold count */ > struct inode *io_inode; /* file being written to */ > size_t io_size; /* size of the extent */ > xfs_off_t io_offset; /* offset in the file */ > struct work_struct io_work; /* xfsdatad work queue */ > struct xfs_trans *io_append_trans;/* xact. for size update */ > struct bio *io_bio; /* bio being built */ > - struct bio *io_bio_done; /* bios completed */ > - struct bio *io_bio_done_tail; /* bios completed */ > - spinlock_t io_lock; /* for bio completion list */ > -} xfs_ioend_t; > + struct bio io_inline_bio; /* MUST BE LAST! */ > +}; > > extern const struct address_space_operations xfs_address_space_operations; > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index d760934..e52e9c1 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -58,8 +58,7 @@ > #include > > static const struct super_operations xfs_super_operations; > -static kmem_zone_t *xfs_ioend_zone; > -mempool_t *xfs_ioend_pool; > +struct bio_set *xfs_ioend_bioset; > > static struct kset *xfs_kset; /* top-level xfs sysfs dir */ > #ifdef DEBUG > @@ -1688,20 +1687,15 @@ MODULE_ALIAS_FS("xfs"); > STATIC int __init > xfs_init_zones(void) > { > - > - xfs_ioend_zone = kmem_zone_init(sizeof(xfs_ioend_t), "xfs_ioend"); > - if (!xfs_ioend_zone) > + xfs_ioend_bioset = bioset_create(4 * MAX_BUF_PER_PAGE, > + offsetof(struct xfs_ioend, io_inline_bio)); > + if (!xfs_ioend_bioset) > goto out; > > - xfs_ioend_pool = mempool_create_slab_pool(4 * MAX_BUF_PER_PAGE, > - xfs_ioend_zone); > - if (!xfs_ioend_pool) > - goto out_destroy_ioend_zone; > - > xfs_log_ticket_zone = kmem_zone_init(sizeof(xlog_ticket_t), > "xfs_log_ticket"); > if (!xfs_log_ticket_zone) > - goto out_destroy_ioend_pool; > + goto out_free_ioend_bioset; > > xfs_bmap_free_item_zone = kmem_zone_init(sizeof(xfs_bmap_free_item_t), > "xfs_bmap_free_item"); > @@ -1797,10 +1791,8 @@ xfs_init_zones(void) > kmem_zone_destroy(xfs_bmap_free_item_zone); > out_destroy_log_ticket_zone: > kmem_zone_destroy(xfs_log_ticket_zone); > - out_destroy_ioend_pool: > - mempool_destroy(xfs_ioend_pool); > - out_destroy_ioend_zone: > - kmem_zone_destroy(xfs_ioend_zone); > + out_free_ioend_bioset: > + bioset_free(xfs_ioend_bioset); > out: > return -ENOMEM; > } > @@ -1826,9 +1818,7 @@ xfs_destroy_zones(void) > kmem_zone_destroy(xfs_btree_cur_zone); > kmem_zone_destroy(xfs_bmap_free_item_zone); > kmem_zone_destroy(xfs_log_ticket_zone); > - mempool_destroy(xfs_ioend_pool); > - kmem_zone_destroy(xfs_ioend_zone); > - > + bioset_free(xfs_ioend_bioset); > } > > STATIC int __init > -- > 2.1.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu Mar 17 09:30:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 67E6E7CA0 for ; Thu, 17 Mar 2016 09:30:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2E752304062 for ; Thu, 17 Mar 2016 07:30:41 -0700 (PDT) X-ASG-Debug-ID: 1458225039-04cbb05c46003f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id J4f9IId0t8WGwZDF (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 17 Mar 2016 07:30: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 (Postfix) with ESMTPS id 617B27AE89; Thu, 17 Mar 2016 14:30:39 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-24.bos.redhat.com [10.18.41.24]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2HEUd7v027764; Thu, 17 Mar 2016 10:30:39 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id B18961255F1; Thu, 17 Mar 2016 10:30:37 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Cc: dm-devel@redhat.com, linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [RFC PATCH 5/9] block: add a block_device_operations method to provision space Date: Thu, 17 Mar 2016 10:30:33 -0400 X-ASG-Orig-Subj: [RFC PATCH 5/9] block: add a block_device_operations method to provision space Message-Id: <1458225037-24155-6-git-send-email-bfoster@redhat.com> In-Reply-To: <1458225037-24155-1-git-send-email-bfoster@redhat.com> References: <1458225037-24155-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: 1458225039 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Signed-off-by: Brian Foster --- fs/block_dev.c | 10 ++++++++++ include/linux/blkdev.h | 2 ++ 2 files changed, 12 insertions(+) diff --git a/fs/block_dev.c b/fs/block_dev.c index 375a2e4..73e57b9 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -517,6 +517,16 @@ int blk_get_reserved_space(struct block_device *bdev, sector_t *nr_sects) } EXPORT_SYMBOL_GPL(blk_get_reserved_space); +int blk_provision_space(struct block_device *bdev, sector_t offset, sector_t len) +{ + const struct block_device_operations *ops = bdev->bd_disk->fops; + + if (!ops->provision_space) + return -EOPNOTSUPP; + return ops->provision_space(bdev, offset, len); +} +EXPORT_SYMBOL_GPL(blk_provision_space); + /* * pseudo-fs */ diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index f212fe5..d0fa8a35 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -1666,6 +1666,7 @@ struct block_device_operations { void (*swap_slot_free_notify) (struct block_device *, unsigned long); int (*reserve_space) (struct block_device *, sector_t); int (*get_reserved_space) (struct block_device *, sector_t *); + int (*provision_space) (struct block_device *, sector_t, sector_t); struct module *owner; const struct pr_ops *pr_ops; }; @@ -1679,6 +1680,7 @@ extern long bdev_direct_access(struct block_device *, struct blk_dax_ctl *); extern int blk_reserve_space(struct block_device *, sector_t); extern int blk_get_reserved_space(struct block_device *, sector_t *); +extern int blk_provision_space(struct block_device *, sector_t, sector_t); #else /* CONFIG_BLOCK */ struct block_device; -- 2.4.3 From bfoster@redhat.com Thu Mar 17 09:30:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 732AF7CA1 for ; Thu, 17 Mar 2016 09:30:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3983C30406B for ; Thu, 17 Mar 2016 07:30:41 -0700 (PDT) X-ASG-Debug-ID: 1458225038-04cb6c51bc00800001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 3NOTPqXcPQyK0yEV (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 17 Mar 2016 07:30: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-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id D1650C04FF82; Thu, 17 Mar 2016 14:30:38 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-24.bos.redhat.com [10.18.41.24]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2HEUc8R027745; Thu, 17 Mar 2016 10:30:38 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 45B43122DD7; Thu, 17 Mar 2016 10:30:37 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Cc: dm-devel@redhat.com, linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [RFC PATCH 0/9] dm-thin/xfs: prototype a block reservation allocation model Date: Thu, 17 Mar 2016 10:30:28 -0400 X-ASG-Orig-Subj: [RFC PATCH 0/9] dm-thin/xfs: prototype a block reservation allocation model Message-Id: <1458225037-24155-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: 1458225039 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, This is a proof-of-concept of a block reservation allocation model between XFS and dm-thin. The purpose is to create a mechanism by which the filesystem can determine an underlying thin volume is out of space and opt to return -ENOSPC to userspace rather than waiting until the volume is driven out of space (and deactivated or transitioned read-only). The idea, in principle, is to use a similar reservation model for thin pool blocks as the filesystem does today for delayed allocation blocks and to prevent similar risk of overprovisioning of fs blocks. This idea was concocted a while back during some discussions around how to provide a more user friendly out of space condition to users of filesystems on top of thin devices. At the moment, we (XFS) write to the underlying volume until it runs out of space and transitions to read-only. The administrator is responsible to prevent or recover from this condition via auto provisioning and/or monitoring for low watermark notifications. With a reservation model, the filesytem returns -ENOSPC at write time when the underlying pool is out of space and operation otherwise continues (e.g., space can be freed from the fs) as if the fs itself were out of space. Joe and Mike were kind enough to hack together a dm block reservation mechanism to help us experiment further. I slightly modified and hacked in an additional provision call based on their code, and then hacked up an integration with the existing XFS resource reservation mechanism. I think the results are slightly encouraging, at least in that the basic buffered write mechanism works as expected without too much inefficiency due to the over-reservation. There are still flaws and tradeoffs to this approach, of course. The current implementation uses a worst case reservation model that assumes every unallocated filesystem block requires a new dm-thin block allocation. With dm-thin block sizes on the order of 256k-1MB for larger volumes, this is a significant over-reservation for 4k (or smaller) filesystem blocks. XFS has algorithms in some areas (buffered writes) that deal with this problem already, but at the very least, further optimization might be in order to improve performance. This also doesn't consider other operations (fallocate) or filesystems that might not be immediately suited to handle this limitation. Also, the interface to the block device is clearly crude, incomplete and hacked together (particularly the provision bits added by me). It remains to be seen whether we can define a sane interface to fully support this functionality. As far as the implementation goes, this is a toy/experiment with various other known issues (mostly documented in the code, see the comments in xfs_thin.c) and should not be used for anything outside of experimentation. I haven't done much testing beyond simple buffered write runs to ENOSPC, so problems in other areas can be expected. Apologies for whatever general shoddiness might be discovered, but I wanted to get something posted to generate discussion before putting too much effort into testing and exploring all of the dark corners where more issues certainly lurk. In summary, the primary purpose of this series is to close the loop on some of the early XFS/dm-thin discussion around whether something like this is feasible, worthwhile, and to otherwise gather initial thoughts from fs and dm folks on the general topic. If worth pursuing further, discussion around things like an appropriate interface to the block device is certainly warranted. Thanks again to Joe and Mike for entertaining the idea and hacking something together to play around with. Thoughts, reviews, flames appreciated. (BTW, I'm also planning to be at LSF if anybody is interested in discussing this further). Brian P.S., With these patches applied, use the following to create an over-provisioned thin volume and mount XFS in "reservation mode:" # lvcreate --thinpool test/pool -L1G # lvcreate -T test/pool -n thin -V 10G # mkfs.xfs -f /dev/test/thin # mount /dev/test/thin /mnt -o discard # dmesg | tail ... XFS (dm-8): Mounting V5 Filesystem XFS (dm-8): Ending clean mount XFS (dm-8): Thin pool reservation enabled XFS (dm-8): Thin reserve blocksize: 512 sectors # dd if=/dev/zero of=/mnt/file bs=4k dd: error writing '/mnt/file': No space left on device ... Brian Foster (6): dm thin: update reserve space func to allow reduction block: add a block_device_operations method to provision space dm: add method to provision space dm thin: add method to provision space xfs: thin block device reservation mechanism xfs: adopt a reserved allocation model on dm-thin devices Joe Thornber (1): dm thin: add methods to set and get reserved space Mike Snitzer (2): block: add block_device_operations methods to set and get reserved space dm: add methods to set and get reserved space drivers/md/dm-thin.c | 187 +++++++++++++++++++++++++++-- drivers/md/dm.c | 110 +++++++++++++++++ fs/block_dev.c | 30 +++++ fs/xfs/Makefile | 1 + fs/xfs/libxfs/xfs_alloc.c | 6 + fs/xfs/xfs_mount.c | 81 +++++++++++-- fs/xfs/xfs_mount.h | 7 ++ fs/xfs/xfs_thin.c | 273 ++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_thin.h | 9 ++ fs/xfs/xfs_trace.h | 27 +++++ fs/xfs/xfs_trans.c | 26 +++- include/linux/blkdev.h | 7 ++ include/linux/device-mapper.h | 7 ++ 13 files changed, 749 insertions(+), 22 deletions(-) create mode 100644 fs/xfs/xfs_thin.c create mode 100644 fs/xfs/xfs_thin.h -- 2.4.3 From bfoster@redhat.com Thu Mar 17 09:30:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B21F47CA0 for ; Thu, 17 Mar 2016 09:30:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2232EAC006 for ; Thu, 17 Mar 2016 07:30:41 -0700 (PDT) X-ASG-Debug-ID: 1458225039-04cb6c51be00810001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id dwnmE96ka51A0Dew (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 17 Mar 2016 07:30: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-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id E7D3DC04FF86; Thu, 17 Mar 2016 14:30:38 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-24.bos.redhat.com [10.18.41.24]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2HEUcqF012256; Thu, 17 Mar 2016 10:30:38 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 6D4C3122E5B; Thu, 17 Mar 2016 10:30:37 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Cc: dm-devel@redhat.com, linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [RFC PATCH 1/9] block: add block_device_operations methods to set and get reserved space Date: Thu, 17 Mar 2016 10:30:29 -0400 X-ASG-Orig-Subj: [RFC PATCH 1/9] block: add block_device_operations methods to set and get reserved space Message-Id: <1458225037-24155-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1458225037-24155-1-git-send-email-bfoster@redhat.com> References: <1458225037-24155-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: 1458225039 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Snitzer Signed-off-by: Mike Snitzer --- fs/block_dev.c | 20 ++++++++++++++++++++ include/linux/blkdev.h | 5 +++++ 2 files changed, 25 insertions(+) diff --git a/fs/block_dev.c b/fs/block_dev.c index 826b164..375a2e4 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -497,6 +497,26 @@ long bdev_direct_access(struct block_device *bdev, struct blk_dax_ctl *dax) } EXPORT_SYMBOL_GPL(bdev_direct_access); +int blk_reserve_space(struct block_device *bdev, sector_t nr_sects) +{ + const struct block_device_operations *ops = bdev->bd_disk->fops; + + if (!ops->reserve_space) + return -EOPNOTSUPP; + return ops->reserve_space(bdev, nr_sects); +} +EXPORT_SYMBOL_GPL(blk_reserve_space); + +int blk_get_reserved_space(struct block_device *bdev, sector_t *nr_sects) +{ + const struct block_device_operations *ops = bdev->bd_disk->fops; + + if (!ops->get_reserved_space) + return -EOPNOTSUPP; + return ops->get_reserved_space(bdev, nr_sects); +} +EXPORT_SYMBOL_GPL(blk_get_reserved_space); + /* * pseudo-fs */ diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 413c84f..f212fe5 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -1664,6 +1664,8 @@ struct block_device_operations { int (*getgeo)(struct block_device *, struct hd_geometry *); /* this callback is with swap_lock and sometimes page table lock held */ void (*swap_slot_free_notify) (struct block_device *, unsigned long); + int (*reserve_space) (struct block_device *, sector_t); + int (*get_reserved_space) (struct block_device *, sector_t *); struct module *owner; const struct pr_ops *pr_ops; }; @@ -1674,6 +1676,9 @@ extern int bdev_read_page(struct block_device *, sector_t, struct page *); extern int bdev_write_page(struct block_device *, sector_t, struct page *, struct writeback_control *); extern long bdev_direct_access(struct block_device *, struct blk_dax_ctl *); + +extern int blk_reserve_space(struct block_device *, sector_t); +extern int blk_get_reserved_space(struct block_device *, sector_t *); #else /* CONFIG_BLOCK */ struct block_device; -- 2.4.3 From bfoster@redhat.com Thu Mar 17 09:30:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2E7407CA1 for ; Thu, 17 Mar 2016 09:30:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 021728F8059 for ; Thu, 17 Mar 2016 07:30:41 -0700 (PDT) X-ASG-Debug-ID: 1458225039-04cbb05c45003f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id YLfbfrG4wujx16w7 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 17 Mar 2016 07:30: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 (Postfix) with ESMTPS id 8666D64381; Thu, 17 Mar 2016 14:30:39 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-24.bos.redhat.com [10.18.41.24]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2HEUdgx026364; Thu, 17 Mar 2016 10:30:39 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id DB632125E6F; Thu, 17 Mar 2016 10:30:37 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Cc: dm-devel@redhat.com, linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [RFC PATCH 9/9] xfs: adopt a reserved allocation model on dm-thin devices Date: Thu, 17 Mar 2016 10:30:37 -0400 X-ASG-Orig-Subj: [RFC PATCH 9/9] xfs: adopt a reserved allocation model on dm-thin devices Message-Id: <1458225037-24155-10-git-send-email-bfoster@redhat.com> In-Reply-To: <1458225037-24155-1-git-send-email-bfoster@redhat.com> References: <1458225037-24155-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 17 Mar 2016 14:30:39 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458225040 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Adopt a reservation-based block allocation model when XFS runs on top of a dm-thin device with accompanying support. As of today, the filesystem has no indication of available space in the underlying device. If the thin pool is depleted, the filesystem has no recourse but to handle the read-only state change of the device. This results in unexpected higher level behavior, error returns and can result in data loss if the filesystem is ultimately shutdown before more space is provisioned to the pool. The reservation model enables XFS to manage thin pool space similar to how delayed allocation blocks are managed today. Delalloc blocks are reserved up front (e.g., at write time) to guarantee physical space is available at writeback time and thus prevent data loss due to overprovisioning. Similarly, block device reservation allows XFS to reserve space for various operations in advance and thus guarantee an operation will not fail for lack of space, or otherwise return an error to the user. To accomplish this, tie in the device block reservation calls to the existing filesystem reservation mechanism. Each transaction now reserves physical space in the underlying thin pool along with other such reserved resources (e.g., filesystem blocks, log space). Delayed allocation blocks are similarly reserved in the thin device when the associated filesystem blocks are reserved. If a reservation cannot be satisfied, the associated operation returns -ENOSPC precisely as if the filesystem itself were out of space. Note that this is proof-of-concept and highly experimental. The purpose is to explore the potential effectiveness of such a scheme between the filesystem and a thinly provisioned device. As such, the implementation is hacky, broken and geared towards proof-of-concept over correctness or completeness. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_alloc.c | 6 ++++ fs/xfs/xfs_mount.c | 81 +++++++++++++++++++++++++++++++++++++++++------ fs/xfs/xfs_mount.h | 2 ++ fs/xfs/xfs_trans.c | 26 +++++++++++++-- 4 files changed, 103 insertions(+), 12 deletions(-) diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index a708e38..2497fd3 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -35,6 +35,7 @@ #include "xfs_trans.h" #include "xfs_buf_item.h" #include "xfs_log.h" +#include "xfs_thin.h" struct workqueue_struct *xfs_alloc_wq; @@ -2650,6 +2651,11 @@ xfs_alloc_vextent( goto error0; } + if (mp->m_thin_reserve) { + error = xfs_thin_provision(mp, args->fsbno, args->len); + WARN_ON(error); + error = 0; + } } xfs_perag_put(args->pag); return 0; diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index bb753b3..98c437b 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -41,6 +41,7 @@ #include "xfs_trace.h" #include "xfs_icache.h" #include "xfs_sysfs.h" +#include "xfs_thin.h" static DEFINE_MUTEX(xfs_uuid_table_mutex); @@ -947,6 +948,8 @@ xfs_mountfs( xfs_qm_mount_quotas(mp); } + xfs_thin_init(mp); + /* * Now we are mounted, reserve a small amount of unused space for * privileged transactions. This is needed so that transaction @@ -1165,21 +1168,32 @@ xfs_mod_ifree( */ #define XFS_FDBLOCKS_BATCH 1024 int -xfs_mod_fdblocks( +__xfs_mod_fdblocks( struct xfs_mount *mp, int64_t delta, - bool rsvd) + bool rsvd, + bool unres) { int64_t lcounter; long long res_used; s32 batch; + int error; + int64_t res_delta = 0; if (delta > 0) { /* - * If the reserve pool is depleted, put blocks back into it - * first. Most of the time the pool is full. + * If the reserve pool is full (the typical case), return the + * blocks to the general fs pool. Otherwise, return what we can + * to the reserve pool first. */ if (likely(mp->m_resblks == mp->m_resblks_avail)) { +main_pool: + if (mp->m_thin_reserve && unres) { + error = xfs_thin_unreserve(mp, delta); + if (error) + return error; + } + percpu_counter_add(&mp->m_fdblocks, delta); return 0; } @@ -1187,17 +1201,56 @@ xfs_mod_fdblocks( spin_lock(&mp->m_sb_lock); res_used = (long long)(mp->m_resblks - mp->m_resblks_avail); - if (res_used > delta) { - mp->m_resblks_avail += delta; + /* + * The reserve pool is not full. Blocks in the reserve pool must + * hold a bdev reservation which means we may need to re-reserve + * blocks depending on what the caller is giving us. + * + * If the blocks are already reserved (i.e., via a transaction + * reservation), simply update the reserve pool counter. If not, + * reserve as many blocks as we can, return those to the reserve + * pool, and then jump back above to return whatever is left + * back to the general filesystem pool. + */ + if (!unres) { + while (!unres && delta) { + if (res_delta >= res_used) + break; + + /* XXX: shouldn't call this w/ m_sb_lock */ + error = xfs_thin_reserve(mp, 1); + if (error) + break; + + res_delta++; + delta--; + } } else { - delta -= res_used; - mp->m_resblks_avail = mp->m_resblks; - percpu_counter_add(&mp->m_fdblocks, delta); + res_delta = min(delta, res_used); + delta -= res_delta; } + + if (res_used > res_delta) + mp->m_resblks_avail += res_delta; + else + mp->m_resblks_avail = mp->m_resblks; spin_unlock(&mp->m_sb_lock); + if (delta) + goto main_pool; return 0; } + /* res calls take positive value */ + if (mp->m_thin_reserve) { + error = xfs_thin_reserve(mp, -delta); + if (error == -ENOSPC && rsvd) { + spin_lock(&mp->m_sb_lock); + goto fdblocks_rsvd; + } + if (error) + return error; + } + /* * Taking blocks away, need to be more accurate the closer we * are to zero. @@ -1228,6 +1281,7 @@ xfs_mod_fdblocks( if (!rsvd) goto fdblocks_enospc; +fdblocks_rsvd: lcounter = (long long)mp->m_resblks_avail + delta; if (lcounter >= 0) { mp->m_resblks_avail = lcounter; @@ -1244,6 +1298,15 @@ fdblocks_enospc: } int +xfs_mod_fdblocks( + struct xfs_mount *mp, + int64_t delta, + bool rsvd) +{ + return __xfs_mod_fdblocks(mp, delta, rsvd, true); +} + +int xfs_mod_frextents( struct xfs_mount *mp, int64_t delta) diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 3696700..2d43422 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -328,6 +328,8 @@ extern void xfs_unmountfs(xfs_mount_t *); extern int xfs_mod_icount(struct xfs_mount *mp, int64_t delta); extern int xfs_mod_ifree(struct xfs_mount *mp, int64_t delta); +extern int __xfs_mod_fdblocks(struct xfs_mount *mp, int64_t delta, + bool reserved, bool unres); extern int xfs_mod_fdblocks(struct xfs_mount *mp, int64_t delta, bool reserved); extern int xfs_mod_frextents(struct xfs_mount *mp, int64_t delta); diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 748b16a..729367c 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -548,11 +548,22 @@ xfs_trans_unreserve_and_mod_sb( int64_t rtxdelta = 0; int64_t idelta = 0; int64_t ifreedelta = 0; + int64_t resdelta = 0; int error; /* calculate deltas */ - if (tp->t_blk_res > 0) + if (tp->t_blk_res > 0) { + /* + * Distinguish between what should be unreserved from an + * underlying thin pool and and what is only returned to the + * free blocks counter. + */ blkdelta = tp->t_blk_res; + if (tp->t_blk_res > tp->t_blk_res_used) { + resdelta = tp->t_blk_res - tp->t_blk_res_used; + blkdelta -= resdelta; + } + } if ((tp->t_fdblocks_delta != 0) && (xfs_sb_version_haslazysbcount(&mp->m_sb) || (tp->t_flags & XFS_TRANS_SB_DIRTY))) @@ -571,12 +582,18 @@ xfs_trans_unreserve_and_mod_sb( } /* apply the per-cpu counters */ - if (blkdelta) { - error = xfs_mod_fdblocks(mp, blkdelta, rsvd); + if (resdelta) { + error = __xfs_mod_fdblocks(mp, resdelta, rsvd, true); if (error) goto out; } + if (blkdelta) { + error = __xfs_mod_fdblocks(mp, blkdelta, rsvd, false); + if (error) + goto out_undo_resblocks; + } + if (idelta) { error = xfs_mod_icount(mp, idelta); if (error) @@ -681,6 +698,9 @@ out_undo_icount: out_undo_fdblocks: if (blkdelta) xfs_mod_fdblocks(mp, -blkdelta, rsvd); +out_undo_resblocks: + if (resdelta) + xfs_mod_fdblocks(mp, -resdelta, rsvd); out: ASSERT(error == 0); return; -- 2.4.3 From bfoster@redhat.com Thu Mar 17 09:30:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A45FA7CA2 for ; Thu, 17 Mar 2016 09:30:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4E628304071 for ; Thu, 17 Mar 2016 07:30:41 -0700 (PDT) X-ASG-Debug-ID: 1458225039-04bdf01d3800430001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id YemvwtZytueyW0AF (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 17 Mar 2016 07:30: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-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 104AC7F6C1; Thu, 17 Mar 2016 14:30:39 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-24.bos.redhat.com [10.18.41.24]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2HEUcdS012258; Thu, 17 Mar 2016 10:30:38 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 7E454122E4F; Thu, 17 Mar 2016 10:30:37 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Cc: dm-devel@redhat.com, linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [RFC PATCH 3/9] dm thin: add methods to set and get reserved space Date: Thu, 17 Mar 2016 10:30:31 -0400 X-ASG-Orig-Subj: [RFC PATCH 3/9] dm thin: add methods to set and get reserved space Message-Id: <1458225037-24155-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1458225037-24155-1-git-send-email-bfoster@redhat.com> References: <1458225037-24155-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: 1458225039 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Joe Thornber Experimental reserve interface for XFS guys to play with. I have big reservations (no pun intended) about this patch. Not-Signed-off-by: Joe Thornber Not-Signed-off-by: Mike Snitzer --- drivers/md/dm-thin.c | 142 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 132 insertions(+), 10 deletions(-) diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index 92237b6..31d36da 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c @@ -271,6 +271,8 @@ struct pool { process_mapping_fn process_prepared_discard; struct dm_bio_prison_cell **cell_sort_array; + + dm_block_t reserve_count; }; static enum pool_mode get_pool_mode(struct pool *pool); @@ -318,6 +320,8 @@ struct thin_c { */ atomic_t refcount; struct completion can_destroy; + + dm_block_t reserve_count; }; /*----------------------------------------------------------------*/ @@ -1359,24 +1363,19 @@ static void check_low_water_mark(struct pool *pool, dm_block_t free_blocks) } } -static int alloc_data_block(struct thin_c *tc, dm_block_t *result) +static int get_free_blocks(struct pool *pool, dm_block_t *free_blocks) { int r; - dm_block_t free_blocks; - struct pool *pool = tc->pool; - - if (WARN_ON(get_pool_mode(pool) != PM_WRITE)) - return -EINVAL; - r = dm_pool_get_free_block_count(pool->pmd, &free_blocks); + r = dm_pool_get_free_block_count(pool->pmd, free_blocks); if (r) { metadata_operation_failed(pool, "dm_pool_get_free_block_count", r); return r; } - check_low_water_mark(pool, free_blocks); + check_low_water_mark(pool, *free_blocks); - if (!free_blocks) { + if (!*free_blocks) { /* * Try to commit to see if that will free up some * more space. @@ -1385,7 +1384,7 @@ static int alloc_data_block(struct thin_c *tc, dm_block_t *result) if (r) return r; - r = dm_pool_get_free_block_count(pool->pmd, &free_blocks); + r = dm_pool_get_free_block_count(pool->pmd, free_blocks); if (r) { metadata_operation_failed(pool, "dm_pool_get_free_block_count", r); return r; @@ -1397,6 +1396,78 @@ static int alloc_data_block(struct thin_c *tc, dm_block_t *result) } } + return r; +} + +/* + * Returns true iff either: + * i) decrement succeeded (ie. there was reserve left) + * ii) there is extra space in the pool + */ +static bool dec_reserve_count(struct thin_c *tc, dm_block_t free_blocks) +{ + bool r = false; + unsigned long flags; + + if (!free_blocks) + return false; + + spin_lock_irqsave(&tc->pool->lock, flags); + if (tc->reserve_count > 0) { + tc->reserve_count--; + tc->pool->reserve_count--; + r = true; + } else { + if (free_blocks > tc->pool->reserve_count) + r = true; + } + spin_unlock_irqrestore(&tc->pool->lock, flags); + + return r; +} + +static int set_reserve_count(struct thin_c *tc, dm_block_t count) +{ + int r; + dm_block_t free_blocks, delta; + unsigned long flags; + + r = get_free_blocks(tc->pool, &free_blocks); + if (r) + return r; + + spin_lock_irqsave(&tc->pool->lock, flags); + if (count <= tc->reserve_count) + goto out_unlock; /* nothing to do */ + delta = count - tc->reserve_count; + if (tc->pool->reserve_count + delta > free_blocks) + r = -ENOSPC; + else { + tc->reserve_count = count; + tc->pool->reserve_count += delta; + } +out_unlock: + spin_unlock_irqrestore(&tc->pool->lock, flags); + + return r; +} + +static int alloc_data_block(struct thin_c *tc, dm_block_t *result) +{ + int r; + dm_block_t free_blocks; + struct pool *pool = tc->pool; + + if (WARN_ON(get_pool_mode(pool) != PM_WRITE)) + return -EINVAL; + + r = get_free_blocks(tc->pool, &free_blocks); + if (r) + return r; + + if (!dec_reserve_count(tc, free_blocks)) + return -ENOSPC; + r = dm_pool_alloc_data_block(pool->pmd, result); if (r) { metadata_operation_failed(pool, "dm_pool_alloc_data_block", r); @@ -2880,6 +2951,7 @@ static struct pool *pool_create(struct mapped_device *pool_md, pool->last_commit_jiffies = jiffies; pool->pool_md = pool_md; pool->md_dev = metadata_dev; + pool->reserve_count = 0; __pool_table_insert(pool); return pool; @@ -3895,6 +3967,19 @@ static void pool_io_hints(struct dm_target *ti, struct queue_limits *limits) */ } +static int pool_get_reserved_space(struct dm_target *ti, sector_t *nr_sects) +{ + unsigned long flags; + struct pool_c *pt = ti->private; + struct pool *pool = pt->pool; + + spin_lock_irqsave(&pool->lock, flags); + *nr_sects = pool->reserve_count * pool->sectors_per_block; + spin_unlock_irqrestore(&pool->lock, flags); + + return 0; +} + static struct target_type pool_target = { .name = "thin-pool", .features = DM_TARGET_SINGLETON | DM_TARGET_ALWAYS_WRITEABLE | @@ -3913,6 +3998,7 @@ static struct target_type pool_target = { .status = pool_status, .iterate_devices = pool_iterate_devices, .io_hints = pool_io_hints, + .get_reserved_space = pool_get_reserved_space, }; /*---------------------------------------------------------------- @@ -3936,6 +4022,7 @@ static void thin_dtr(struct dm_target *ti) spin_lock_irqsave(&tc->pool->lock, flags); list_del_rcu(&tc->list); + tc->pool->reserve_count -= tc->reserve_count; spin_unlock_irqrestore(&tc->pool->lock, flags); synchronize_rcu(); @@ -4074,6 +4161,7 @@ static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv) init_completion(&tc->can_destroy); list_add_tail_rcu(&tc->list, &tc->pool->active_thins); spin_unlock_irqrestore(&tc->pool->lock, flags); + tc->reserve_count = 0; /* * This synchronize_rcu() call is needed here otherwise we risk a * wake_worker() call finding no bios to process (because the newly @@ -4271,6 +4359,38 @@ static void thin_io_hints(struct dm_target *ti, struct queue_limits *limits) limits->max_discard_sectors = 2048 * 1024 * 16; /* 16G */ } +static int thin_reserve_space(struct dm_target *ti, sector_t nr_sects) +{ + struct thin_c *tc = ti->private; + struct pool *pool = tc->pool; + sector_t blocks; + + /* + * @nr_sects must always be a factor of the pool's blocksize; + * upper layers can rely on the bdev's minimum_io_size for this. + */ + if (!nr_sects || !is_factor(nr_sects, pool->sectors_per_block)) + return -EINVAL; + + blocks = nr_sects; + (void) sector_div(blocks, pool->sectors_per_block); + + return set_reserve_count(tc, blocks); +} + +static int thin_get_reserved_space(struct dm_target *ti, sector_t *nr_sects) +{ + unsigned long flags; + struct thin_c *tc = ti->private; + struct pool *pool = tc->pool; + + spin_lock_irqsave(&tc->pool->lock, flags); + *nr_sects = tc->reserve_count * pool->sectors_per_block; + spin_unlock_irqrestore(&tc->pool->lock, flags); + + return 0; +} + static struct target_type thin_target = { .name = "thin", .version = {1, 18, 0}, @@ -4285,6 +4405,8 @@ static struct target_type thin_target = { .status = thin_status, .iterate_devices = thin_iterate_devices, .io_hints = thin_io_hints, + .reserve_space = thin_reserve_space, + .get_reserved_space = thin_get_reserved_space, }; /*----------------------------------------------------------------*/ -- 2.4.3 From bfoster@redhat.com Thu Mar 17 09:30:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D75A87CA0 for ; Thu, 17 Mar 2016 09:30:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3BFE7AC007 for ; Thu, 17 Mar 2016 07:30:42 -0700 (PDT) X-ASG-Debug-ID: 1458225039-04cb6c51be00820001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id FCv5MHBJLuUtIYos (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 17 Mar 2016 07:30: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 (Postfix) with ESMTPS id 9E69D64445; Thu, 17 Mar 2016 14:30:39 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-24.bos.redhat.com [10.18.41.24]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2HEUdpQ003135; Thu, 17 Mar 2016 10:30:39 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id BFEFB125078; Thu, 17 Mar 2016 10:30:37 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Cc: dm-devel@redhat.com, linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [RFC PATCH 8/9] xfs: thin block device reservation mechanism Date: Thu, 17 Mar 2016 10:30:36 -0400 X-ASG-Orig-Subj: [RFC PATCH 8/9] xfs: thin block device reservation mechanism Message-Id: <1458225037-24155-9-git-send-email-bfoster@redhat.com> In-Reply-To: <1458225037-24155-1-git-send-email-bfoster@redhat.com> References: <1458225037-24155-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 17 Mar 2016 14:30:39 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458225040 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add block device reservation infrastructure to XFS. This primarily consists of wrappers around the associated block device functions. This mechanism provides the ability to reserve, release and provision a set of blocks in the underlying block device. The mechanism enables the filesystem to adopt a block reservation model with the underlying device. In turn, this allows the filesystem to identify when the underlying device is out of space and propagate an error (-ENOSPC) gracefully before the device itself must handle the condition. The latter typically involves a read-only state transition and thus requires administrator intervention to resolve. Signed-off-by: Brian Foster --- fs/xfs/Makefile | 1 + fs/xfs/xfs_mount.h | 5 + fs/xfs/xfs_thin.c | 273 +++++++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_thin.h | 9 ++ fs/xfs/xfs_trace.h | 27 ++++++ 5 files changed, 315 insertions(+) create mode 100644 fs/xfs/xfs_thin.c create mode 100644 fs/xfs/xfs_thin.h diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index f646391..92ea714 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -88,6 +88,7 @@ xfs-y += xfs_aops.o \ xfs_super.o \ xfs_symlink.o \ xfs_sysfs.o \ + xfs_thin.o \ xfs_trans.o \ xfs_xattr.o \ kmem.o \ diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index b570984..3696700 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -147,6 +147,11 @@ typedef struct xfs_mount { * to various other kinds of pain inflicted on the pNFS server. */ __uint32_t m_generation; + + bool m_thin_reserve; + struct mutex m_thin_res_lock; + uint32_t m_thin_sectpb; + sector_t m_thin_res; } xfs_mount_t; /* diff --git a/fs/xfs/xfs_thin.c b/fs/xfs/xfs_thin.c new file mode 100644 index 0000000..ce6f373 --- /dev/null +++ b/fs/xfs/xfs_thin.c @@ -0,0 +1,273 @@ +/* + * Copyright (c) 2016 Red Hat, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include "xfs.h" +#include "xfs_fs.h" +#include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" +#include "xfs_bit.h" +#include "xfs_sb.h" +#include "xfs_mount.h" +#include "xfs_da_format.h" +#include "xfs_da_btree.h" +#include "xfs_inode.h" +#include "xfs_dir2.h" +#include "xfs_ialloc.h" +#include "xfs_alloc.h" +#include "xfs_rtalloc.h" +#include "xfs_bmap.h" +#include "xfs_trans.h" +#include "xfs_trans_priv.h" +#include "xfs_log.h" +#include "xfs_error.h" +#include "xfs_quota.h" +#include "xfs_fsops.h" +#include "xfs_trace.h" +#include "xfs_icache.h" +#include "xfs_sysfs.h" +/* XXX: above copied from xfs_mount.c */ +#include "xfs_thin.h" + +/* + * Notes/Issues: + * + * - Reservation support depends on the '-o discard' mount option so freed + * extents are returned to the pool. + * - The absolute reservation value API is potentially racy. We can cover our + * own reservations/provisions with a mutex, but a delta reservation API might + * be better. + * - Local reservation accounting is not necessarily correct/accurate. + * Reservation leakage has been reproduced, particularly in ENOSPC conditions. + * The discard mechanism to return blocks to dm-thin has not been totally + * reliable either, which means filling, removing and filling an fs causes + * some space to be lost. This can be worked around with fstrim for the time + * being. + * - The locking in xfs_mod_fdblocks() is not quite correct/safe. Sleeping from + * invalid context BUG()'s are expected. Needs to be reworked. + * - Worst case reservation means each XFS filesystem block is considered a new + * dm block allocation. This translates to a significant amount of space given + * larger dm block sizes. For example, 4k XFS blocks to 64k dm blocks means + * we'll hit ENOSPC sooner and more frequently than typically expected. + * - The above also means large fallocate requests are problematic. Need to find + * a workaround for this. Perhaps a reduced reservation is safe for known + * contiguous extents? E.g., xfs_bmapi_write() w/ nimaps = 1; + * - The xfs_mod_fdblocks() implementation means the XFS reserve pool blocks are + * also reserved from the thin pool. XFS defaults to 8192 reserve pool blocks + * in most cases, which translates to 512MB of reserved space. This can be + * tuned with: 'xfs_io -xc "resblks " '. Note that insufficient + * reserves will result in errors in unexpected areas of code (e.g., page + * discards on writeback, inode unlinked list removal failures, etc.). + * - The existing xfs_reserve_blocks() implementation is flaky and does not + * correctly reserve in the event of xfs_mod_fdblocks() failure. This will + * likely require some fixes independent of this feature. It also may depend + * on some kind of (currently undefined) "query available reservation" or + * "perform partial reservation" API to support partial XFS reserved blocks + * allocation. + */ + +/* + * Convert an fsb count to a sector reservation. + */ +static inline sector_t +XFS_FSB_TO_SECT( + struct xfs_mount *mp, + xfs_fsblock_t fsb) +{ + sector_t bb; + + bb = fsb * mp->m_thin_sectpb; + return bb; +} + +/* + * Reserve blocks from the underlying block device. + */ +int +xfs_thin_reserve( + struct xfs_mount *mp, + xfs_fsblock_t fsb) +{ + int error; + sector_t bb; + + bb = XFS_FSB_TO_SECT(mp, fsb); + + mutex_lock(&mp->m_thin_res_lock); + + error = blk_reserve_space(mp->m_ddev_targp->bt_bdev, + mp->m_thin_res + bb); + if (error) { + if (error == -ENOSPC) + trace_xfs_thin_reserve_enospc(mp, mp->m_thin_res, bb); + goto out; + } + + trace_xfs_thin_reserve(mp, mp->m_thin_res, bb); + mp->m_thin_res += bb; + +out: + mutex_unlock(&mp->m_thin_res_lock); + return error; +} + +static int +__xfs_thin_unreserve( + struct xfs_mount *mp, + sector_t bb) +{ + int error; + + if (bb > mp->m_thin_res) { + WARN(1, "unres (%lu) exceeds current res (%lu)", bb, + mp->m_thin_res); + bb = mp->m_thin_res; + } + + error = blk_reserve_space(mp->m_ddev_targp->bt_bdev, + mp->m_thin_res - bb); + if (error) + return error;; + + trace_xfs_thin_unreserve(mp, mp->m_thin_res, bb); + mp->m_thin_res -= bb; + + return error; +} + +/* + * Release a reservation back to the block device. + */ +int +xfs_thin_unreserve( + struct xfs_mount *mp, + xfs_fsblock_t fsb) +{ + int error; + sector_t bb; + + bb = XFS_FSB_TO_SECT(mp, fsb); + + mutex_lock(&mp->m_thin_res_lock); + error = __xfs_thin_unreserve(mp, bb); + mutex_unlock(&mp->m_thin_res_lock); + + return error; +} + +/* + * Given a recently allocated extent, ask the block device to provision the + * underlying space. + */ +int +xfs_thin_provision( + struct xfs_mount *mp, + xfs_fsblock_t offset, + xfs_fsblock_t len) +{ + sector_t bbres; + sector_t bbstart, bblen; + int count; + int error; + + bbstart = XFS_FSB_TO_DADDR(mp, offset); + bbstart = round_down(bbstart, mp->m_thin_sectpb); + bblen = XFS_FSB_TO_BB(mp, len); + bblen = round_up(bblen, mp->m_thin_sectpb); + + bbres = XFS_FSB_TO_SECT(mp, len); + + mutex_lock(&mp->m_thin_res_lock); + + WARN_ON(bblen > mp->m_thin_res); + + /* + * XXX: alloc count here is kind of a hack. Need to find a local + * mechanism. Pass res to blk_provision_space? + */ + count = blk_provision_space(mp->m_ddev_targp->bt_bdev, bbstart, bblen); + if (count < 0) { + error = count; + goto out; + } + + trace_xfs_thin_provision(mp, count, bbres); + + /* + * Update the local reservation based on the blocks that were actually + * allocated and release the rest of the unused reservation. + */ + mp->m_thin_res -= count; + bbres -= count; + error = __xfs_thin_unreserve(mp, bbres); +out: + mutex_unlock(&mp->m_thin_res_lock); + return error; +} + +int +xfs_thin_init( + struct xfs_mount *mp) +{ + sector_t res1 = 0, res2 = 0; + int error = 0; + unsigned int io_opt; + + mp->m_thin_reserve = false; + + if (!(mp->m_flags & XFS_MOUNT_DISCARD)) + goto out; + + mutex_init(&mp->m_thin_res_lock); + + /* use optimal I/O size as dm-thin block size */ + io_opt = bdev_io_opt(mp->m_super->s_bdev); + if ((io_opt % BBSIZE) || (io_opt < mp->m_sb.sb_blocksize)) + goto out; + mp->m_thin_sectpb = io_opt / BBSIZE; + + /* + * Run some test calls to determine whether the block device has + * support. Note: res is in 512b sector units. + */ + error = xfs_thin_reserve(mp, 1); + if (error) + goto out; + + error = blk_get_reserved_space(mp->m_ddev_targp->bt_bdev, &res1); + if (error) + goto out; + + error = xfs_thin_unreserve(mp, 1); + if (error) + goto out; + + error = blk_get_reserved_space(mp->m_ddev_targp->bt_bdev, &res2); + if (error) + goto out; + + ASSERT(res1 >= 1 && res2 == 0); + mp->m_thin_reserve = true; +out: + xfs_notice(mp, "Thin pool reservation %s", mp->m_thin_reserve ? + "enabled" : "disabled"); + if (mp->m_thin_reserve) + xfs_notice(mp, "Thin reserve blocksize: %u sectors", + mp->m_thin_sectpb); + return 0; +} diff --git a/fs/xfs/xfs_thin.h b/fs/xfs/xfs_thin.h new file mode 100644 index 0000000..ce5a019 --- /dev/null +++ b/fs/xfs/xfs_thin.h @@ -0,0 +1,9 @@ +#ifndef __XFS_THIN_H__ +#define __XFS_THIN_H__ + +int xfs_thin_init(struct xfs_mount *); +int xfs_thin_reserve(struct xfs_mount *, xfs_fsblock_t); +int xfs_thin_unreserve(struct xfs_mount *, xfs_fsblock_t); +int xfs_thin_provision(struct xfs_mount *, xfs_fsblock_t, xfs_fsblock_t); + +#endif /* __XFS_THIN_H__ */ diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 391d797..01b0702 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -2185,6 +2185,33 @@ DEFINE_DISCARD_EVENT(xfs_discard_toosmall); DEFINE_DISCARD_EVENT(xfs_discard_exclude); DEFINE_DISCARD_EVENT(xfs_discard_busy); +DECLARE_EVENT_CLASS(xfs_thin_class, + TP_PROTO(struct xfs_mount *mp, sector_t total, sector_t res), + TP_ARGS(mp, total, res), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(sector_t, total) + __field(sector_t, res) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->total = total; + __entry->res = res; + ), + TP_printk("dev %d:%d total %lu res %lu", + MAJOR(__entry->dev), MINOR(__entry->dev), __entry->total, + __entry->res) +) + +#define DEFINE_THIN_EVENT(name) \ +DEFINE_EVENT(xfs_thin_class, name, \ + TP_PROTO(struct xfs_mount *mp, sector_t total, sector_t res), \ + TP_ARGS(mp, total, res)) +DEFINE_THIN_EVENT(xfs_thin_reserve); +DEFINE_THIN_EVENT(xfs_thin_reserve_enospc); +DEFINE_THIN_EVENT(xfs_thin_unreserve); +DEFINE_THIN_EVENT(xfs_thin_provision); + #endif /* _TRACE_XFS_H */ #undef TRACE_INCLUDE_PATH -- 2.4.3 From bfoster@redhat.com Thu Mar 17 09:30:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 37E197CB1 for ; Thu, 17 Mar 2016 09:30:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E78B18F8059 for ; Thu, 17 Mar 2016 07:30:40 -0700 (PDT) X-ASG-Debug-ID: 1458225039-04cb6c51bd00810001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ktdWUa0r1w4iH6ah (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 17 Mar 2016 07:30: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 (Postfix) with ESMTPS id 6BDFDC00EB35; Thu, 17 Mar 2016 14:30:39 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-24.bos.redhat.com [10.18.41.24]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2HEUdb0003136; Thu, 17 Mar 2016 10:30:39 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id CE5EA125E70; Thu, 17 Mar 2016 10:30:37 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Cc: dm-devel@redhat.com, linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [RFC PATCH 7/9] dm thin: add method to provision space Date: Thu, 17 Mar 2016 10:30:35 -0400 X-ASG-Orig-Subj: [RFC PATCH 7/9] dm thin: add method to provision space Message-Id: <1458225037-24155-8-git-send-email-bfoster@redhat.com> In-Reply-To: <1458225037-24155-1-git-send-email-bfoster@redhat.com> References: <1458225037-24155-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: 1458225039 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This is a hacky interface added to support the filesystem experiment for reserving blocks out of thin pools. The XFS POC uses this method provision space in the pool when blocks are allocated. The number of actual blocks allocated is returned, which is used to update the filesystem accounting. Signed-off-by: Brian Foster --- drivers/md/dm-thin.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index ac770d89..00b7322 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c @@ -4389,6 +4389,52 @@ static int thin_get_reserved_space(struct dm_target *ti, sector_t *nr_sects) return 0; } +static int thin_provision_space(struct dm_target *ti, sector_t offset, sector_t len) +{ + struct thin_c *tc = ti->private; + struct pool *pool = tc->pool; + sector_t end; + dm_block_t pblock; + dm_block_t vblock; + int error; + struct dm_thin_lookup_result lookup; + sector_t count; + + if (!is_factor(offset, pool->sectors_per_block)) + return -EINVAL; + + if (!len || !is_factor(len, pool->sectors_per_block)) + return -EINVAL; + + end = offset + len; + + count = 0; + while (offset < end) { + vblock = offset / pool->sectors_per_block; + + error = dm_thin_find_block(tc->td, vblock, true, &lookup); + if (error == 0) + goto next; + if (error != -ENODATA) + return error; + + error = alloc_data_block(tc, &pblock); + if (error) + return error; + + error = dm_thin_insert_block(tc->td, vblock, pblock); + if (error) + return error; + + count += pool->sectors_per_block; +next: + offset += pool->sectors_per_block; + } + + /* XXX: int -> sector_t ! */ + return count; +} + static struct target_type thin_target = { .name = "thin", .version = {1, 18, 0}, @@ -4405,6 +4451,7 @@ static struct target_type thin_target = { .io_hints = thin_io_hints, .reserve_space = thin_reserve_space, .get_reserved_space = thin_get_reserved_space, + .provision_space = thin_provision_space, }; /*----------------------------------------------------------------*/ -- 2.4.3 From bfoster@redhat.com Thu Mar 17 09:30:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AA89C7CB1 for ; Thu, 17 Mar 2016 09:30:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D0736AC007 for ; Thu, 17 Mar 2016 07:30:40 -0700 (PDT) X-ASG-Debug-ID: 1458225038-04bdf01d3500420001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Te3nhYZ1CF0CLHc0 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 17 Mar 2016 07:30: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-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id CEBEB711C5; Thu, 17 Mar 2016 14:30:38 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-24.bos.redhat.com [10.18.41.24]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2HEUcWM012254; Thu, 17 Mar 2016 10:30:38 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 5A2901201F4; Thu, 17 Mar 2016 10:30:37 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Cc: dm-devel@redhat.com, linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [RFC PATCH 2/9] dm: add methods to set and get reserved space Date: Thu, 17 Mar 2016 10:30:30 -0400 X-ASG-Orig-Subj: [RFC PATCH 2/9] dm: add methods to set and get reserved space Message-Id: <1458225037-24155-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1458225037-24155-1-git-send-email-bfoster@redhat.com> References: <1458225037-24155-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Thu, 17 Mar 2016 14:30:38 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458225039 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Snitzer Signed-off-by: Mike Snitzer --- drivers/md/dm.c | 75 +++++++++++++++++++++++++++++++++++++++++++ include/linux/device-mapper.h | 5 +++ 2 files changed, 80 insertions(+) diff --git a/drivers/md/dm.c b/drivers/md/dm.c index be49057..4da5d3e 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -664,6 +664,79 @@ out: return r; } +/* + * FIXME: factor out common helper that can be used by + * multiple block_device_operations -> target methods + * (including dm_blk_ioctl above) + */ + +static int dm_blk_reserve_space(struct block_device *bdev, sector_t nr_sects) +{ + struct mapped_device *md = bdev->bd_disk->private_data; + int srcu_idx; + struct dm_table *map; + struct dm_target *tgt; + int r = -EINVAL; + + map = dm_get_live_table(md, &srcu_idx); + + if (!map || !dm_table_get_size(map)) + goto out; + + /* We only support devices that have a single target */ + if (dm_table_get_num_targets(map) != 1) + goto out; + + tgt = dm_table_get_target(map, 0); + if (!tgt->type->reserve_space) + goto out; + + if (dm_suspended_md(md)) { + r = -EAGAIN; + goto out; + } + + r = tgt->type->reserve_space(tgt, nr_sects); +out: + dm_put_live_table(md, srcu_idx); + + return r; +} + +static int dm_blk_get_reserved_space(struct block_device *bdev, + sector_t *nr_sects) +{ + struct mapped_device *md = bdev->bd_disk->private_data; + int srcu_idx; + struct dm_table *map; + struct dm_target *tgt; + int r = -EINVAL; + + map = dm_get_live_table(md, &srcu_idx); + + if (!map || !dm_table_get_size(map)) + goto out; + + /* We only support devices that have a single target */ + if (dm_table_get_num_targets(map) != 1) + goto out; + + tgt = dm_table_get_target(map, 0); + if (!tgt->type->get_reserved_space) + goto out; + + if (dm_suspended_md(md)) { + r = -EAGAIN; + goto out; + } + + r = tgt->type->get_reserved_space(tgt, nr_sects); +out: + dm_put_live_table(md, srcu_idx); + + return r; +} + static struct dm_io *alloc_io(struct mapped_device *md) { return mempool_alloc(md->io_pool, GFP_NOIO); @@ -3723,6 +3796,8 @@ static const struct block_device_operations dm_blk_dops = { .ioctl = dm_blk_ioctl, .getgeo = dm_blk_getgeo, .pr_ops = &dm_pr_ops, + .reserve_space = dm_blk_reserve_space, + .get_reserved_space = dm_blk_get_reserved_space, .owner = THIS_MODULE }; diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h index 0830c9e..540c772 100644 --- a/include/linux/device-mapper.h +++ b/include/linux/device-mapper.h @@ -116,6 +116,9 @@ typedef void (*dm_io_hints_fn) (struct dm_target *ti, */ typedef int (*dm_busy_fn) (struct dm_target *ti); +typedef int (*dm_reserve_space_fn) (struct dm_target *ti, sector_t nr_sects); +typedef int (*dm_get_reserved_space_fn) (struct dm_target *ti, sector_t *nr_sects); + void dm_error(const char *message); struct dm_dev { @@ -162,6 +165,8 @@ struct target_type { dm_busy_fn busy; dm_iterate_devices_fn iterate_devices; dm_io_hints_fn io_hints; + dm_reserve_space_fn reserve_space; + dm_get_reserved_space_fn get_reserved_space; /* For internal device-mapper use. */ struct list_head list; -- 2.4.3 From bfoster@redhat.com Thu Mar 17 09:30:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 11D1C7CA3 for ; Thu, 17 Mar 2016 09:30:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 68F0BAC008 for ; Thu, 17 Mar 2016 07:30:41 -0700 (PDT) X-ASG-Debug-ID: 1458225039-04cb6c51bc00810001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 01kHRUHkMimiTJZ1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 17 Mar 2016 07:30: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 (Postfix) with ESMTPS id 6DE58711E1; Thu, 17 Mar 2016 14:30:39 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-24.bos.redhat.com [10.18.41.24]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2HEUdtT026362; Thu, 17 Mar 2016 10:30:39 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id A517912505D; Thu, 17 Mar 2016 10:30:37 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Cc: dm-devel@redhat.com, linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [RFC PATCH 6/9] dm: add method to provision space Date: Thu, 17 Mar 2016 10:30:34 -0400 X-ASG-Orig-Subj: [RFC PATCH 6/9] dm: add method to provision space Message-Id: <1458225037-24155-7-git-send-email-bfoster@redhat.com> In-Reply-To: <1458225037-24155-1-git-send-email-bfoster@redhat.com> References: <1458225037-24155-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Thu, 17 Mar 2016 14:30:39 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458225039 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Signed-off-by: Brian Foster --- drivers/md/dm.c | 35 +++++++++++++++++++++++++++++++++++ include/linux/device-mapper.h | 2 ++ 2 files changed, 37 insertions(+) diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 4da5d3e..e1aec28 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -737,6 +737,40 @@ out: return r; } +static int dm_blk_provision_space(struct block_device *bdev, + sector_t offset, sector_t len) +{ + struct mapped_device *md = bdev->bd_disk->private_data; + int srcu_idx; + struct dm_table *map; + struct dm_target *tgt; + int r = -EINVAL; + + map = dm_get_live_table(md, &srcu_idx); + + if (!map || !dm_table_get_size(map)) + goto out; + + /* We only support devices that have a single target */ + if (dm_table_get_num_targets(map) != 1) + goto out; + + tgt = dm_table_get_target(map, 0); + if (!tgt->type->provision_space) + goto out; + + if (dm_suspended_md(md)) { + r = -EAGAIN; + goto out; + } + + r = tgt->type->provision_space(tgt, offset, len); +out: + dm_put_live_table(md, srcu_idx); + + return r; +} + static struct dm_io *alloc_io(struct mapped_device *md) { return mempool_alloc(md->io_pool, GFP_NOIO); @@ -3798,6 +3832,7 @@ static const struct block_device_operations dm_blk_dops = { .pr_ops = &dm_pr_ops, .reserve_space = dm_blk_reserve_space, .get_reserved_space = dm_blk_get_reserved_space, + .provision_space = dm_blk_provision_space, .owner = THIS_MODULE }; diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h index 540c772..0ebf172 100644 --- a/include/linux/device-mapper.h +++ b/include/linux/device-mapper.h @@ -118,6 +118,7 @@ typedef int (*dm_busy_fn) (struct dm_target *ti); typedef int (*dm_reserve_space_fn) (struct dm_target *ti, sector_t nr_sects); typedef int (*dm_get_reserved_space_fn) (struct dm_target *ti, sector_t *nr_sects); +typedef int (*dm_provision_space_fn) (struct dm_target *ti, sector_t offset, sector_t len); void dm_error(const char *message); @@ -167,6 +168,7 @@ struct target_type { dm_io_hints_fn io_hints; dm_reserve_space_fn reserve_space; dm_get_reserved_space_fn get_reserved_space; + dm_provision_space_fn provision_space; /* For internal device-mapper use. */ struct list_head list; -- 2.4.3 From bfoster@redhat.com Thu Mar 17 09:30:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 03C947CC7 for ; Thu, 17 Mar 2016 09:30:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 840AFAC006 for ; Thu, 17 Mar 2016 07:30:40 -0700 (PDT) X-ASG-Debug-ID: 1458225039-04bdf01d3700430001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 1VRejwcIgS0sn88i (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 17 Mar 2016 07:30: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-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 15639711C9; Thu, 17 Mar 2016 14:30:39 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-24.bos.redhat.com [10.18.41.24]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2HEUcMP003130; Thu, 17 Mar 2016 10:30:38 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 8E69812504F; Thu, 17 Mar 2016 10:30:37 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Cc: dm-devel@redhat.com, linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [RFC PATCH 4/9] dm thin: update reserve space func to allow reduction Date: Thu, 17 Mar 2016 10:30:32 -0400 X-ASG-Orig-Subj: [RFC PATCH 4/9] dm thin: update reserve space func to allow reduction Message-Id: <1458225037-24155-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1458225037-24155-1-git-send-email-bfoster@redhat.com> References: <1458225037-24155-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Thu, 17 Mar 2016 14:30:39 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458225039 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The dm-thin set_reserve_count() function is designed to control the current block reservation for a thin pool. It currently only provides the ability to increase the reservation. Clients such as XFS will rely on over-reservation and thus require the ability to release excess reservation back to the pool. Update set_reserve_count() to return reserved blocks back to the pool. Signed-off-by: Brian Foster --- drivers/md/dm-thin.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index 31d36da..ac770d89 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c @@ -1429,7 +1429,8 @@ static bool dec_reserve_count(struct thin_c *tc, dm_block_t free_blocks) static int set_reserve_count(struct thin_c *tc, dm_block_t count) { int r; - dm_block_t free_blocks, delta; + dm_block_t free_blocks; + int64_t delta; unsigned long flags; r = get_free_blocks(tc->pool, &free_blocks); @@ -1437,8 +1438,6 @@ static int set_reserve_count(struct thin_c *tc, dm_block_t count) return r; spin_lock_irqsave(&tc->pool->lock, flags); - if (count <= tc->reserve_count) - goto out_unlock; /* nothing to do */ delta = count - tc->reserve_count; if (tc->pool->reserve_count + delta > free_blocks) r = -ENOSPC; @@ -1446,7 +1445,6 @@ static int set_reserve_count(struct thin_c *tc, dm_block_t count) tc->reserve_count = count; tc->pool->reserve_count += delta; } -out_unlock: spin_unlock_irqrestore(&tc->pool->lock, flags); return r; @@ -4369,7 +4367,7 @@ static int thin_reserve_space(struct dm_target *ti, sector_t nr_sects) * @nr_sects must always be a factor of the pool's blocksize; * upper layers can rely on the bdev's minimum_io_size for this. */ - if (!nr_sects || !is_factor(nr_sects, pool->sectors_per_block)) + if (!is_factor(nr_sects, pool->sectors_per_block)) return -EINVAL; blocks = nr_sects; -- 2.4.3 From david@fromorbit.com Thu Mar 17 15:57:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C9D037CA0 for ; Thu, 17 Mar 2016 15:57:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9FAA78F8066 for ; Thu, 17 Mar 2016 13:57:37 -0700 (PDT) X-ASG-Debug-ID: 1458248253-04cb6c51bf0d970001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id uNZxS2lHw0uF9bk8 for ; Thu, 17 Mar 2016 13:57:33 -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: A2BeBwDYGetWPFEqLHleKAECgxqBQYJug3mfMwaMAolihgcEAgKBOU0BAQEBAQEHAQEBAUFAhEIBAQQ6HCMQCAMOCgklDwUlAwcaE4gmwUwBAQgCHhmFPYUMiHYFl1SNd4FvjSFEhUmIdoRbKC6JKiWBFAEBAQ Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail05.adl6.internode.on.net with ESMTP; 18 Mar 2016 07:27:29 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1agez3-0002d8-FC; Fri, 18 Mar 2016 07:57:29 +1100 Date: Fri, 18 Mar 2016 07:57:29 +1100 From: Dave Chinner To: Chris Murphy Cc: Eric Sandeen , "xfs@oss.sgi.com" Subject: Re: new fs, xfs_admin new label, metadata corruption detected Message-ID: <20160317205729.GL30721@dastard> X-ASG-Orig-Subj: Re: new fs, xfs_admin new label, metadata corruption detected References: <56E8AA22.7080301@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1458248253 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27933 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Mar 16, 2016 at 08:39:21PM -0600, Chris Murphy wrote: > OK I can consistently reproduce this on the CLI. I end up with totally different > > # lvcreate -L 40g VG -n testxfs > Logical volume "testxfs" created. .... [grow] .... > # xfs_repair -n /dev/VG/testxfs > Phase 1 - find and verify superblock... > Phase 2 - using internal log > - zero log... > - scan filesystem freespace and inode maps... > Metadata corruption detected at xfs_agf block 0x8c00008/0x1000 > fllast 1014 in agf 7 too large (max = 1014) > Metadata corruption detected at xfs_agf block 0x6400008/0x1000 > fllast 1014 in agf 5 too large (max = 1014) > Metadata corruption detected at xfs_agf block 0x5000008/0x1000 > fllast 1014 in agf 4 too large (max = 1014) > Metadata corruption detected at xfs_agf block 0x7800008/0x1000 > fllast 1014 in agf 6 too large (max = 1014) > - found root inode chunk That's caused by commit 96f859d ("libxfs: pack the agfl header structure so XFS_AGFL_SIZE is correct") and growfs setting the last free list entry to something that a userspace without the commit 9fccb9f ("libxfs: pack the agfl header structure so XFS_AGFL_SIZE is correct") fails to validate correctly. i.e. update userspace to 4.5.0, and the repair noise will go away. I think we probably need to fix the growfs code to set it's initial flfirst/fllast values to be 1/0, not 0/EOFL, and the problem will then go away.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Mar 17 16:56:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6E6157CA0 for ; Thu, 17 Mar 2016 16:56:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C5BA9AC004 for ; Thu, 17 Mar 2016 14:56:17 -0700 (PDT) X-ASG-Debug-ID: 1458251771-04cbb05c440f0c0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id uT3ryTHHmzXFSpXJ for ; Thu, 17 Mar 2016 14:56:11 -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: A2CqBwDFJutWPFEqLHleKAECgxqBQYJug3mfMwaMAolihgcCAgEBAoE6TQEBAQEBAQcBAQEBQUCEQQEBAQQnExwjEAgDDgcDCSUPBSUDBxoTiCbBWwEBCAIBHRmFPYUMiHYFl1SNd4FvjSFEhUmIdoRbKC6JKiWBFAEBAQ Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail05.adl6.internode.on.net with ESMTP; 18 Mar 2016 08:26:09 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1agftk-0002jQ-Sf; Fri, 18 Mar 2016 08:56:04 +1100 Date: Fri, 18 Mar 2016 08:56:04 +1100 From: Dave Chinner To: Chris Murphy Cc: Eric Sandeen , "xfs@oss.sgi.com" Subject: Re: new fs, xfs_admin new label, metadata corruption detected Message-ID: <20160317215604.GM30721@dastard> X-ASG-Orig-Subj: Re: new fs, xfs_admin new label, metadata corruption detected References: <56E8AA22.7080301@sandeen.net> <20160317205729.GL30721@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160317205729.GL30721@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: 1458251771 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27933 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Mar 18, 2016 at 07:57:29AM +1100, Dave Chinner wrote: > On Wed, Mar 16, 2016 at 08:39:21PM -0600, Chris Murphy wrote: > > OK I can consistently reproduce this on the CLI. I end up with totally different > > > > # lvcreate -L 40g VG -n testxfs > > Logical volume "testxfs" created. > .... > [grow] > .... > > # xfs_repair -n /dev/VG/testxfs > > Phase 1 - find and verify superblock... > > Phase 2 - using internal log > > - zero log... > > - scan filesystem freespace and inode maps... > > Metadata corruption detected at xfs_agf block 0x8c00008/0x1000 > > fllast 1014 in agf 7 too large (max = 1014) > > Metadata corruption detected at xfs_agf block 0x6400008/0x1000 > > fllast 1014 in agf 5 too large (max = 1014) > > Metadata corruption detected at xfs_agf block 0x5000008/0x1000 > > fllast 1014 in agf 4 too large (max = 1014) > > Metadata corruption detected at xfs_agf block 0x7800008/0x1000 > > fllast 1014 in agf 6 too large (max = 1014) > > - found root inode chunk > > That's caused by commit 96f859d ("libxfs: pack the agfl header > structure so XFS_AGFL_SIZE is correct") and growfs setting the > last free list entry to something that a userspace without the > commit 9fccb9f ("libxfs: pack the agfl header structure so > XFS_AGFL_SIZE is correct") fails to validate correctly. > > i.e. update userspace to 4.5.0, and the repair noise will go away. > > I think we probably need to fix the growfs code to set it's initial > flfirst/fllast values to be 1/0, not 0/EOFL, and the problem will > then go away.... Patch to do this below if you want to test it. -Dave. -- Dave Chinner david@fromorbit.com xfs: Don't wrap growfs AGFL indexes From: Dave Chinner Commit 96f859d ("libxfs: pack the agfl header structure so XFS_AGFL_SIZE is correct") allowed the freelist to use the empty slot at the end of the freelist on 64 bit systems that was not being used due to sizeof() rounding up the structure size. This has caused versions of xfs_repair prior to 4.5.0 (which also has the fix) to report this as a corruption once the filesystem has been grown. Older kernels can also have problems (seen from a whacky container/vm management environment) mounting filesystems grown on a system with a newer kernel than the vm/container it is deployed on. To avoid this problem, change the initial free list indexes not to wrap across the end of the AGFL, hence avoiding the initialisation of agf_fllast to the last index in the AGFL. cc: # 4.4-4.5 Signed-off-by: Dave Chinner --- fs/xfs/xfs_fsops.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index ee3aaa0a..ca0d3eb 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -243,8 +243,8 @@ xfs_growfs_data_private( agf->agf_roots[XFS_BTNUM_CNTi] = cpu_to_be32(XFS_CNT_BLOCK(mp)); agf->agf_levels[XFS_BTNUM_BNOi] = cpu_to_be32(1); agf->agf_levels[XFS_BTNUM_CNTi] = cpu_to_be32(1); - agf->agf_flfirst = 0; - agf->agf_fllast = cpu_to_be32(XFS_AGFL_SIZE(mp) - 1); + agf->agf_flfirst = cpu_to_be32(1); + agf->agf_fllast = 0; agf->agf_flcount = 0; tmpsize = agsize - XFS_PREALLOC_BLOCKS(mp); agf->agf_freeblks = cpu_to_be32(tmpsize); From rjones@redhat.com Thu Mar 17 17:48:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9AF957CA0 for ; Thu, 17 Mar 2016 17:48:12 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5F2AD304032 for ; Thu, 17 Mar 2016 15:48:09 -0700 (PDT) X-ASG-Debug-ID: 1458254884-04bdf01d3511930001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id NCBSl5LhXeKCTAXX (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 17 Mar 2016 15:48:05 -0700 (PDT) X-Barracuda-Envelope-From: rjones@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id D6A06C069B2A for ; Thu, 17 Mar 2016 22:48:04 +0000 (UTC) Received: from localhost (ovpn-204-74.brq.redhat.com [10.40.204.74]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2HMm3Ns025953 for ; Thu, 17 Mar 2016 18:48:04 -0400 Date: Thu, 17 Mar 2016 22:48:03 +0000 From: "Richard W.M. Jones" To: xfs@oss.sgi.com Subject: xfs_growfs causing "Metadata corruption detected at xfs_agf_read_verify" Message-ID: <20160317224803.GA8856@redhat.com> X-ASG-Orig-Subj: xfs_growfs causing "Metadata corruption detected at xfs_agf_read_verify" MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.20 (2009-12-10) 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: 1458254885 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 With recent kernels (or maybe xfsprogs?) we've noticed strange filesystem corruption after using xfs_growfs. Examples: https://bugzilla.redhat.com/show_bug.cgi?id=1315895 (on aarch64) https://www.redhat.com/archives/libguestfs/2016-March/msg00113.html (x86_64) https://rwmj.wordpress.com/2015/11/04/virt-builder-fedora-23-image/#comment-15668 (x86_64) Do these errors look familiar? I don't yet have a simple test case, still working on that. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com virt-builder quickly builds VMs from scratch http://libguestfs.org/virt-builder.1.html From sandeen@sandeen.net Thu Mar 17 17:55:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 20BB27CA0 for ; Thu, 17 Mar 2016 17:55:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8947CAC008 for ; Thu, 17 Mar 2016 15:55:56 -0700 (PDT) X-ASG-Debug-ID: 1458255353-04cbb05c4411670001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id x8aisyuVt42CrkCT for ; Thu, 17 Mar 2016 15:55:53 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id E5A2A19120 for ; Thu, 17 Mar 2016 17:55:48 -0500 (CDT) Subject: Re: xfs_growfs causing "Metadata corruption detected at xfs_agf_read_verify" To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_growfs causing "Metadata corruption detected at xfs_agf_read_verify" References: <20160317224803.GA8856@redhat.com> From: Eric Sandeen Message-ID: <56EB35F8.1030601@sandeen.net> Date: Thu, 17 Mar 2016 17:55:52 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.0 MIME-Version: 1.0 In-Reply-To: <20160317224803.GA8856@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1458255353 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27933 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/17/16 5:48 PM, Richard W.M. Jones wrote: > > With recent kernels (or maybe xfsprogs?) we've noticed strange > filesystem corruption after using xfs_growfs. > > Examples: > > https://bugzilla.redhat.com/show_bug.cgi?id=1315895 (on aarch64) > https://www.redhat.com/archives/libguestfs/2016-March/msg00113.html (x86_64) > https://rwmj.wordpress.com/2015/11/04/virt-builder-fedora-23-image/#comment-15668 (x86_64) > > Do these errors look familiar? I don't yet have a simple test case, > still working on that. try: http://oss.sgi.com/pipermail/xfs/2016-March/047683.html -Eric From chris@colorremedies.com Thu Mar 17 18:22:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 B2B547CA0 for ; Thu, 17 Mar 2016 18:22:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 11B13AC004 for ; Thu, 17 Mar 2016 16:21:57 -0700 (PDT) X-ASG-Debug-ID: 1458256911-04cb6c51bd114b0001-NocioJ Received: from mail-ig0-f171.google.com (mail-ig0-f171.google.com [209.85.213.171]) by cuda.sgi.com with ESMTP id FspjuxIhgrFBbqfJ (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 17 Mar 2016 16:21:52 -0700 (PDT) X-Barracuda-Envelope-From: chris@colorremedies.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.213.171 Received: by mail-ig0-f171.google.com with SMTP id ig19so9156732igb.1 for ; Thu, 17 Mar 2016 16:21:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=colorremedies-com.20150623.gappssmtp.com; s=20150623; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc; bh=JYBlMTlTDzukfGLfjZJdbRrPvRWQQOSAdxSUKHAfAV4=; b=RBcoHtrHOBSrPqNbpiW1+yQRloY3t7k6BgB9H+3daWglFt14rYekc0tDXwhYhVbrsq HnKOHJJ2lo84B4+aW5Xbgw8MJ9A7LnQ/NK4ETxhkHgzgSkxDR8uPFDTYfj4ttozOCvY4 bf91YUWE9bMSTmVTWeTynlr5jRAJDNP/DCKyoeQGbvbderoL+6HWQ4vi8AJKGCQzDaJc r4xqudPUnDZC3pW6KZlLnlTa0MOM/H6EVrBRKrkeHrx5STck7qNwN5RC4EzQhf5WiFKZ 1giRrg5IqNFP18Pr5qh2RxxC9ko3JLf/4EZexC6c38lG4RJGy/4W9fKBqu7oQnz248sW vCFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:date :message-id:subject:from:to:cc; bh=JYBlMTlTDzukfGLfjZJdbRrPvRWQQOSAdxSUKHAfAV4=; b=QTf1MoPWrcS7giV6k2EhKMZIkS7evKbWQVhmCPDFe7Q6qwimzuxNk1WsQ+ER0AXYoU XZs9Ftca8DVOUs0O2gl8hwDQvkM09ivlMPxeyQRS+32+Yv9LHWjXS5pVgWghHwgHm5JK SHbKBNG9NR0+kZvfdLSUYnboaHb1itnj+dmuCRhElTHibPqLyHgmFSNO2mabqqPspO84 KJHoDh7tizZlMv8jfUMMuhQ05qI97Rnu6IBiD47lFvGKXyFZtSHQ88qfrH4vIQUVmdEk bYhlRRULAh/CcHVTegYNJTDDvqdu5c95R9g5j2mITuwEA+qGbfe6klaGY1GSzkCCkxdE fMCw== X-Gm-Message-State: AD7BkJLrWwy9fBo9LVDtVFTKQ/TkB6yWCvgktnawdyDDhcVraFQ5Ubuj8Ri4NPYNCocwycEAw4PYeMNe9FznSg== MIME-Version: 1.0 X-Received: by 10.50.25.229 with SMTP id f5mr14679808igg.17.1458256911510; Thu, 17 Mar 2016 16:21:51 -0700 (PDT) Sender: chris@colorremedies.com Received: by 10.36.110.3 with HTTP; Thu, 17 Mar 2016 16:21:51 -0700 (PDT) X-Originating-IP: [2601:282:702:b960:dc3f:fbc:4c03:20dd] In-Reply-To: <20160317205729.GL30721@dastard> References: <56E8AA22.7080301@sandeen.net> <20160317205729.GL30721@dastard> Date: Thu, 17 Mar 2016 17:21:51 -0600 X-Google-Sender-Auth: pUo6OQ1_4OQ0zZNKj94AI2sRIkE Message-ID: Subject: Re: new fs, xfs_admin new label, metadata corruption detected From: Chris Murphy X-ASG-Orig-Subj: Re: new fs, xfs_admin new label, metadata corruption detected To: Dave Chinner Cc: Chris Murphy , Eric Sandeen , "xfs@oss.sgi.com" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ig0-f171.google.com[209.85.213.171] X-Barracuda-Start-Time: 1458256911 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27933 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Thu, Mar 17, 2016 at 2:57 PM, Dave Chinner wrote: > On Wed, Mar 16, 2016 at 08:39:21PM -0600, Chris Murphy wrote: >> OK I can consistently reproduce this on the CLI. I end up with totally different >> >> # lvcreate -L 40g VG -n testxfs >> Logical volume "testxfs" created. > .... > [grow] > .... >> # xfs_repair -n /dev/VG/testxfs >> Phase 1 - find and verify superblock... >> Phase 2 - using internal log >> - zero log... >> - scan filesystem freespace and inode maps... >> Metadata corruption detected at xfs_agf block 0x8c00008/0x1000 >> fllast 1014 in agf 7 too large (max = 1014) >> Metadata corruption detected at xfs_agf block 0x6400008/0x1000 >> fllast 1014 in agf 5 too large (max = 1014) >> Metadata corruption detected at xfs_agf block 0x5000008/0x1000 >> fllast 1014 in agf 4 too large (max = 1014) >> Metadata corruption detected at xfs_agf block 0x7800008/0x1000 >> fllast 1014 in agf 6 too large (max = 1014) >> - found root inode chunk > > That's caused by commit 96f859d ("libxfs: pack the agfl header > structure so XFS_AGFL_SIZE is correct") and growfs setting the > last free list entry to something that a userspace without the > commit 9fccb9f ("libxfs: pack the agfl header structure so > XFS_AGFL_SIZE is correct") fails to validate correctly. > > i.e. update userspace to 4.5.0, and the repair noise will go away. Yep. The problem is not reproducible with xfsprogs 4.5.0. -- Chris Murphy From cl@linux.com Thu Mar 17 20:58:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 525637CA0 for ; Thu, 17 Mar 2016 20:58:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D1080AC004 for ; Thu, 17 Mar 2016 18:58:50 -0700 (PDT) X-ASG-Debug-ID: 1458266327-04bdf01d3616410001-NocioJ Received: from resqmta-ch2-06v.sys.comcast.net (resqmta-ch2-06v.sys.comcast.net [69.252.207.38]) by cuda.sgi.com with ESMTP id KHZTmH8P7bfbtEEu (version=TLSv1.2 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Thu, 17 Mar 2016 18:58:48 -0700 (PDT) X-Barracuda-Envelope-From: cl@linux.com X-Barracuda-Apparent-Source-IP: 69.252.207.38 Received: from resomta-ch2-05v.sys.comcast.net ([69.252.207.101]) by resqmta-ch2-06v.sys.comcast.net with comcast id XDxf1s0032Bo0NV01Dynam; Fri, 18 Mar 2016 01:58:47 +0000 Received: from gentwo.org ([98.222.162.64]) by resomta-ch2-05v.sys.comcast.net with comcast id XDym1s00H1PgSZ601DymWf; Fri, 18 Mar 2016 01:58:47 +0000 Received: by gentwo.org (Postfix, from userid 1001) id A61FD1896; Thu, 17 Mar 2016 20:58:46 -0500 (CDT) Received: from localhost (localhost [127.0.0.1]) by gentwo.org (Postfix) with ESMTP id A51661696; Thu, 17 Mar 2016 20:58:46 -0500 (CDT) Date: Thu, 17 Mar 2016 20:58:46 -0500 (CDT) From: Christoph Lameter X-X-Sender: cl@east.gentwo.org To: Waiman Long cc: Tejun Heo , Dave Chinner , xfs@oss.sgi.com, linux-kernel@vger.kernel.org, Ingo Molnar , Peter Zijlstra , Scott J Norton , Douglas Hatch Subject: Re: [RFC PATCH 1/2] percpu_counter: Allow falling back to global counter on large system In-Reply-To: <56E9B219.7090500@hpe.com> X-ASG-Orig-Subj: Re: [RFC PATCH 1/2] percpu_counter: Allow falling back to global counter on large system Message-ID: References: <1457146299-1601-1-git-send-email-Waiman.Long@hpe.com> <1457146299-1601-2-git-send-email-Waiman.Long@hpe.com> <56E9B219.7090500@hpe.com> Content-Type: text/plain; charset=US-ASCII DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=comcast.net; s=q20140121; t=1458266327; bh=p1pKcy31/Hbi9yfzhve1Jj1fq6zdHTkIF/ickCi8k5A=; h=Received:Received:Received:Received:Date:From:To:Subject: Message-ID:Content-Type; b=SbgsH2KZLcuTNNHeyHGdLe9HPrLe77C3Fkh9K48JLwPJQiqIApN0s+uG6agY8aSZI f8JqCZHj0+7iWmtEyKvT9V0LV2kCEX8qiGCvoyt5DGeCkEbol82RdWEIzCnqJUApOo n0UGrPmFXHU11bw18YttpCzjYHN4t7viPsS1Z9UxDdAphqwj7xjAQ0i9lz1SaK/jgU t67E4l/sJJ71I34rKsaTbnAS4SLHInp2kyrF4kEpJPCzpvs1t2DjUBHAbcLjWr5BdV 4kV3y1ESTI1xeATZyuQ0zBKsK/KIvL0eJwcNxTd0Aff6gDyv2vkZ2x2Ikb+tCQ0S9c OnnOO61Xs5aBA== X-Barracuda-Connect: resqmta-ch2-06v.sys.comcast.net[69.252.207.38] X-Barracuda-Start-Time: 1458266328 X-Barracuda-Encrypted: DHE-RSA-AES128-SHA X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27935 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Wed, 16 Mar 2016, Waiman Long wrote: > > If the cpumask is empty you can use the global count. Otherwise you just > > need to add up the counters of the cpus set in the cpumask. > > > > I have modified the patch to try that out. However, that doesn't yield that > much of improvement in term of performance and it slows down the percpu fast > path a bit. So I am going to focus on my existing patch first and think about > that later. Hmmm... Maybe look at the cause of the slowdown first? From david@fromorbit.com Thu Mar 17 21:23:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BEEFA7CA0 for ; Thu, 17 Mar 2016 21:23:26 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 27008AC002 for ; Thu, 17 Mar 2016 19:23:22 -0700 (PDT) X-ASG-Debug-ID: 1458267799-04cb6c51bd15ec0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id uK8fNJpDuOE7rZFm for ; Thu, 17 Mar 2016 19:23:20 -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: A2BTCwAIZutWPFEqLHleKAECgxqBQYJug3mfMAEBAQaMBIlihgcCAgEBAoE1TQEBAQEBAQcBAQEBQUCEQgEBBDocIxAIAw4KCSUPBSUDBxoTiCbBVwEBCAIBHRmFPYUMiHYFl1WNd4FvjSFEhUmIdoRbKC6JKiWBFAEBAQ Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail06.adl6.internode.on.net with ESMTP; 18 Mar 2016 12:52:54 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1agk3x-000372-72; Fri, 18 Mar 2016 13:22:53 +1100 Date: Fri, 18 Mar 2016 13:22:53 +1100 From: Dave Chinner To: Chris Murphy Cc: Eric Sandeen , "xfs@oss.sgi.com" Subject: Re: new fs, xfs_admin new label, metadata corruption detected Message-ID: <20160318022253.GN30721@dastard> X-ASG-Orig-Subj: Re: new fs, xfs_admin new label, metadata corruption detected References: <56E8AA22.7080301@sandeen.net> <20160317205729.GL30721@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: 1458267799 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27936 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Mar 17, 2016 at 05:21:51PM -0600, Chris Murphy wrote: > On Thu, Mar 17, 2016 at 2:57 PM, Dave Chinner wrote: > > On Wed, Mar 16, 2016 at 08:39:21PM -0600, Chris Murphy wrote: > >> OK I can consistently reproduce this on the CLI. I end up with totally different > >> > >> # lvcreate -L 40g VG -n testxfs > >> Logical volume "testxfs" created. > > .... > > [grow] > > .... > >> # xfs_repair -n /dev/VG/testxfs > >> Phase 1 - find and verify superblock... > >> Phase 2 - using internal log > >> - zero log... > >> - scan filesystem freespace and inode maps... > >> Metadata corruption detected at xfs_agf block 0x8c00008/0x1000 > >> fllast 1014 in agf 7 too large (max = 1014) > >> Metadata corruption detected at xfs_agf block 0x6400008/0x1000 > >> fllast 1014 in agf 5 too large (max = 1014) > >> Metadata corruption detected at xfs_agf block 0x5000008/0x1000 > >> fllast 1014 in agf 4 too large (max = 1014) > >> Metadata corruption detected at xfs_agf block 0x7800008/0x1000 > >> fllast 1014 in agf 6 too large (max = 1014) > >> - found root inode chunk > > > > That's caused by commit 96f859d ("libxfs: pack the agfl header > > structure so XFS_AGFL_SIZE is correct") and growfs setting the > > last free list entry to something that a userspace without the > > commit 9fccb9f ("libxfs: pack the agfl header structure so > > XFS_AGFL_SIZE is correct") fails to validate correctly. > > > > i.e. update userspace to 4.5.0, and the repair noise will go away. > > Yep. The problem is not reproducible with xfsprogs 4.5.0. Thanks for confirming that, Chris. Cheers, Dave. -- Dave Chinner david@fromorbit.com From zlang@redhat.com Thu Mar 17 23:43:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 99A517CA0 for ; Thu, 17 Mar 2016 23:43:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0C506AC001 for ; Thu, 17 Mar 2016 21:43:35 -0700 (PDT) X-ASG-Debug-ID: 1458276214-04cb6c51be199d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id c9NHGietVAilp58v (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 17 Mar 2016 21:43:34 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id D651AC00124A; Fri, 18 Mar 2016 04:43:33 +0000 (UTC) Received: from localhost (vpn1-6-236.pek2.redhat.com [10.72.6.236]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2I4hWub021438; Fri, 18 Mar 2016 00:43:32 -0400 Date: Fri, 18 Mar 2016 12:43:31 +0800 From: Zorro Lang To: Chris Murphy Cc: Dave Chinner , Eric Sandeen , "xfs@oss.sgi.com" Subject: Re: new fs, xfs_admin new label, metadata corruption detected Message-ID: <20160318044331.GA3939@dhcp12-237.nay.redhat.com> X-ASG-Orig-Subj: Re: new fs, xfs_admin new label, metadata corruption detected References: <56E8AA22.7080301@sandeen.net> <20160317205729.GL30721@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458276214 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Mar 17, 2016 at 05:21:51PM -0600, Chris Murphy wrote: > On Thu, Mar 17, 2016 at 2:57 PM, Dave Chinner wrote: > > On Wed, Mar 16, 2016 at 08:39:21PM -0600, Chris Murphy wrote: > >> OK I can consistently reproduce this on the CLI. I end up with totally different > >> > >> # lvcreate -L 40g VG -n testxfs > >> Logical volume "testxfs" created. > > .... > > [grow] > > .... > >> # xfs_repair -n /dev/VG/testxfs > >> Phase 1 - find and verify superblock... > >> Phase 2 - using internal log > >> - zero log... > >> - scan filesystem freespace and inode maps... > >> Metadata corruption detected at xfs_agf block 0x8c00008/0x1000 > >> fllast 1014 in agf 7 too large (max = 1014) > >> Metadata corruption detected at xfs_agf block 0x6400008/0x1000 > >> fllast 1014 in agf 5 too large (max = 1014) > >> Metadata corruption detected at xfs_agf block 0x5000008/0x1000 > >> fllast 1014 in agf 4 too large (max = 1014) > >> Metadata corruption detected at xfs_agf block 0x7800008/0x1000 > >> fllast 1014 in agf 6 too large (max = 1014) > >> - found root inode chunk > > > > That's caused by commit 96f859d ("libxfs: pack the agfl header > > structure so XFS_AGFL_SIZE is correct") and growfs setting the > > last free list entry to something that a userspace without the > > commit 9fccb9f ("libxfs: pack the agfl header structure so > > XFS_AGFL_SIZE is correct") fails to validate correctly. > > > > i.e. update userspace to 4.5.0, and the repair noise will go away. > > Yep. The problem is not reproducible with xfsprogs 4.5.0. HaHa, Dave always knows more XFS change history:) BTW, this bug don't need LVM resize, just need --- mkfs.xfs -d size=$half_size $dev mount $dev $mnt xfs_growfs -d $mnt umount $mnt xfs_repair -n $dev --- to reproduce it. And I think xfstests xfs/015 can cover this test. Thanks, Zorro > > From smfrench@gmail.com Fri Mar 18 00:21:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 29B887CA0 for ; Fri, 18 Mar 2016 00:21:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 876FCAC001 for ; Thu, 17 Mar 2016 22:21:07 -0700 (PDT) X-ASG-Debug-ID: 1458278460-04cbb05c451ca80001-NocioJ Received: from mail-io0-f193.google.com (mail-io0-f193.google.com [209.85.223.193]) by cuda.sgi.com with ESMTP id VyWiWezYKOr9Zojn (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 17 Mar 2016 22:21:00 -0700 (PDT) X-Barracuda-Envelope-From: smfrench@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.223.193 Received: by mail-io0-f193.google.com with SMTP id 124so1274791iov.2 for ; Thu, 17 Mar 2016 22:21:00 -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; bh=X6HDRIE3YkAKZm8vSA4W5QDfxhdufM5xbRa6rwUhL6A=; b=TbhRCR9QnzMBHIJ1u3J3RC7epwpeJPo4hKWswaGebIU5n20Wvj/+4TPVX93X/Fwrqd o8WWHCdz1g1PzdUq6iEOx6+LmgrvnOkSuNM98stlCTOBGLwIsq70WbjLz2Q8s00hrDB8 blv+FlTcUHVpJexRS9xH+Ujd64u0FgKKwuOdgbXAoZeVqA0koLf/tc6Uz+oIQlOhKBJk NW7R9dKQAbkCWGkBHiNE1a0GddtuZ1t8fdgsssKC9BhRIj3L0AOsqJS511TVMTgsL6o0 EZQ9lUONictDyUGFuQpsVRrVZhWhvYDJt7UEiFS6XPkq+IBqdzlgDPXMA5laNYF1jYpx R64Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=X6HDRIE3YkAKZm8vSA4W5QDfxhdufM5xbRa6rwUhL6A=; b=atS0rvVJWAQMHfNtcRTljpsICYKpGmXicaB04fIaMpWbk4AAB2Pwzaezm1q/JRG+pJ MFHP/k+wOX15LLfusnCFIoucv49kx5p0lCs/Q+42BvufUjOM1AGpGcolXojKH3yOqm9n z+agGJG9s3N3LautvEX0BlewpUi2ccVsVC+lIXx5Vb2EN2VF6pij6m2BHHQOo/iq/Eo7 8AmhmkWC1zrtHFBDsXL3FW3IfAV+t+wbrjLq0fUA39l6gbPc7HvJIemWdauH8VTevR0u 9wydDpIclgznkYXU0Tqy/4q5sFfeb68/tqiqqdWJqnZyrCmb4gYCXxFr9ebCOvLf00j1 ONUg== X-Gm-Message-State: AD7BkJL7MwyvM4sGjEq2FfXaO2VWWdYTUOs/E19LziWiQZBQcVx4g3RPtYyVHDPOsZkwsH7gwcByAl+ZZfoOwQ== X-Received: by 10.107.136.77 with SMTP id k74mr15834890iod.0.1458278459864; Thu, 17 Mar 2016 22:20:59 -0700 (PDT) MIME-Version: 1.0 Received: by 10.79.104.193 with HTTP; Thu, 17 Mar 2016 22:20:40 -0700 (PDT) In-Reply-To: <1458166743-18488-1-git-send-email-agruenba@redhat.com> References: <1458166743-18488-1-git-send-email-agruenba@redhat.com> From: Steve French Date: Fri, 18 Mar 2016 00:20:40 -0500 Message-ID: Subject: Re: [PATCH v20 00/23] Richacls (Core and Ext4) To: Andreas Gruenbacher X-ASG-Orig-Subj: Re: [PATCH v20 00/23] Richacls (Core and Ext4) Cc: Alexander Viro , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , "linux-ext4@vger.kernel.org" , XFS Developers , LKML , linux-fsdevel , "linux-nfs@vger.kernel.org" , "linux-cifs@vger.kernel.org" , "linux-api@vger.kernel.org" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-io0-f193.google.com[209.85.223.193] X-Barracuda-Start-Time: 1458278460 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27939 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Reviewing the current version of your patch series in your tree git://git.kernel.org/pub/scm/linux/kernel/git/agruen/linux-richacl.git \ richacl-2016-03-16 you can add my reviewed by to the following patches so far: 0001-vfs-Add-IS_ACL-and-IS_RICHACL-tests.patch 0002-vfs-Add-MAY_CREATE_FILE-and-MAY_CREATE_DIR-permissio.patch 0003-vfs-Add-MAY_DELETE_SELF-and-MAY_DELETE_CHILD-permiss.patch 0004-vfs-Make-the-inode-passed-to-inode_change_ok-non-con.patch 0005-vfs-Add-permission-flags-for-setting-file-attributes.patch 0011-posix_acl-Improve-xattr-fixup-code.patch 0013-vfs-Add-get_richacl-and-set_richacl-inode-operations.patch 0024-xfs-Make-xfs_set_mode-non-static.patch 0042-ext4-Don-t-allow-unmapped-identifiers-in-richacls.patch 0043-xfs-Don-t-allow-unmapped-identifiers-in-richacls.patch Reviewed-by: Steve French On Wed, Mar 16, 2016 at 5:18 PM, Andreas Gruenbacher wrote: > Al, > > here is a minor update to the richacl patches with some feedback from Christoph > incorporated. > > Changes since the last posting (https://lkml.org/lkml/2016/3/14/503): > > * Merge richacl_base.c and richacl_inode.c into richacl.c. > > * Add linux/acl.h header including function acl_chmod. > Use it in richacl enabled filesystems. > > > The complete patch queue is available here: > > git://git.kernel.org/pub/scm/linux/kernel/git/agruen/linux-richacl.git \ > richacl-2016-03-16 > > > The richacl user-space utilitites, man pages, and test suite are available > here: > > https://github.com/andreas-gruenbacher/richacl > > > Changes to other user-space packages for richacl: > > https://github.com/andreas-gruenbacher/coreutils > https://github.com/andreas-gruenbacher/e2fsprogs > https://github.com/andreas-gruenbacher/samba > https://github.com/andreas-gruenbacher/xfsprogs-dev > https://github.com/andreas-gruenbacher/nfs-utils > > > Please see the richacl homepage for more information: > > http://www.bestbits.at/richacl/ > > > Thanks, > Andreas > > Andreas Gruenbacher (21): > vfs: Add IS_ACL() and IS_RICHACL() tests > vfs: Add MAY_CREATE_FILE and MAY_CREATE_DIR permission flags > vfs: Add MAY_DELETE_SELF and MAY_DELETE_CHILD permission flags > vfs: Make the inode passed to inode_change_ok non-const > vfs: Add permission flags for setting file attributes > richacl: In-memory representation and helper functions > richacl: Permission mapping functions > richacl: Compute maximum file masks from an acl > richacl: Permission check algorithm > posix_acl: Unexport acl_by_type and make it static > posix_acl: Improve xattr fixup code > vfs: Cache base_acl objects in inodes > vfs: Add get_richacl and set_richacl inode operations > vfs: Cache richacl in struct inode > richacl: Update the file masks in chmod() > richacl: Check if an acl is equivalent to a file mode > richacl: Create-time inheritance > richacl: Automatic Inheritance > richacl: xattr mapping functions > richacl: Add richacl xattr handler > vfs: Add richacl permission checking > > Aneesh Kumar K.V (2): > ext4: Add richacl support > ext4: Add richacl feature flag > > drivers/staging/lustre/lustre/llite/llite_lib.c | 2 +- > fs/Kconfig | 3 + > fs/Makefile | 1 + > fs/attr.c | 81 ++- > fs/ext4/Kconfig | 11 + > fs/ext4/Makefile | 1 + > fs/ext4/ext4.h | 6 +- > fs/ext4/file.c | 3 + > fs/ext4/ialloc.c | 11 +- > fs/ext4/inode.c | 5 +- > fs/ext4/namei.c | 5 + > fs/ext4/richacl.c | 137 ++++ > fs/ext4/richacl.h | 40 ++ > fs/ext4/super.c | 49 +- > fs/ext4/xattr.c | 7 + > fs/f2fs/acl.c | 4 +- > fs/inode.c | 15 +- > fs/jffs2/acl.c | 10 +- > fs/namei.c | 118 +++- > fs/posix_acl.c | 50 +- > fs/richacl.c | 889 ++++++++++++++++++++++++ > fs/richacl_xattr.c | 235 +++++++ > fs/xattr.c | 29 +- > include/linux/acl.h | 15 + > include/linux/fs.h | 60 +- > include/linux/posix_acl.h | 13 +- > include/linux/richacl.h | 205 ++++++ > include/linux/richacl_xattr.h | 31 + > include/uapi/linux/Kbuild | 2 + > include/uapi/linux/fs.h | 3 +- > include/uapi/linux/richacl.h | 152 ++++ > include/uapi/linux/richacl_xattr.h | 44 ++ > include/uapi/linux/xattr.h | 2 + > 33 files changed, 2131 insertions(+), 108 deletions(-) > create mode 100644 fs/ext4/richacl.c > create mode 100644 fs/ext4/richacl.h > create mode 100644 fs/richacl.c > create mode 100644 fs/richacl_xattr.c > create mode 100644 include/linux/acl.h > create mode 100644 include/linux/richacl.h > create mode 100644 include/linux/richacl_xattr.h > create mode 100644 include/uapi/linux/richacl.h > create mode 100644 include/uapi/linux/richacl_xattr.h > > -- > 2.5.0 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-cifs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Thanks, Steve From ni.ketut.b@rspp.co.id Fri Mar 18 02:12:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 6AAE17CA0 for ; Fri, 18 Mar 2016 02:12:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2FE41304048 for ; Fri, 18 Mar 2016 00:12:09 -0700 (PDT) X-ASG-Debug-ID: 1458285122-04cb6c51bd1ceb0001-NocioJ Received: from mail.rspp.co.id ([202.151.11.88]) by cuda.sgi.com with ESMTP id 4BDAtoH0BoElZ5wu (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 18 Mar 2016 00:12:05 -0700 (PDT) X-Barracuda-Envelope-From: ni.ketut.b@rspp.co.id X-Barracuda-Apparent-Source-IP: 202.151.11.88 Received: from localhost (localhost.localdomain [127.0.0.1]) by mail.rspp.co.id (Postfix) with ESMTP id 0DB6B285CE52; Fri, 18 Mar 2016 13:49:09 +0700 (WIB) Received: from mail.rspp.co.id ([127.0.0.1]) by localhost (mail.rspp.co.id [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id WJ2g5gGo-HeC; Fri, 18 Mar 2016 13:49:06 +0700 (WIB) Received: from localhost (localhost.localdomain [127.0.0.1]) by mail.rspp.co.id (Postfix) with ESMTP id 7CE33285CE47; Fri, 18 Mar 2016 13:40:38 +0700 (WIB) DKIM-Filter: OpenDKIM Filter v2.9.2 mail.rspp.co.id 7CE33285CE47 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rspp.co.id; s=8CB6AC22-E666-11E5-B384-A65C98A28952; t=1458283240; bh=FxNCHkfYa7WMxfr6DEA3L1ZgvygZlfl5YQfHZ/flM9c=; h=Date:From:Reply-To:Message-ID:Subject:MIME-Version:Content-Type; b=imWNLZUhEgUMub6PuiLgsZBLZuYioc40qvoHZv1IGyn+dQVTqFpN3R1D6Zlm92C6X JsHp+H+yAehMjyjr0crHJX9lX7itzbxQ1SOg0ATrQh105oh3HlJpg8dKf0mWODZ0Z/ wnrqW1J/ot6bHtCDLO23lh8fGE75ylbL4EpFFIzM= X-Virus-Scanned: amavisd-new at mail.rspp.co.id Received: from mail.rspp.co.id ([127.0.0.1]) by localhost (mail.rspp.co.id [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id j6fo4ipwrsqH; Fri, 18 Mar 2016 13:40:38 +0700 (WIB) Received: from mail.rspp.co.id (mail.rspp.co.id [202.151.11.88]) by mail.rspp.co.id (Postfix) with ESMTP id AB094285C680; Fri, 18 Mar 2016 13:34:19 +0700 (WIB) Date: Fri, 18 Mar 2016 13:34:19 +0700 (WIB) From: "mr. david ibe" Reply-To: "MR. DAVID IBE" Message-ID: <152717996.149086.1458282859509.JavaMail.zimbra@rspp.co.id> In-Reply-To: <1427724826.22986.1458208414660.JavaMail.zimbra@rspp.co.id> References: <862211298.8751.1458200048700.JavaMail.zimbra@rspp.co.id> <1729552735.22782.1458208203640.JavaMail.zimbra@rspp.co.id> <657966769.22833.1458208235103.JavaMail.zimbra@rspp.co.id> <1029217646.22857.1458208269913.JavaMail.zimbra@rspp.co.id> <1910493489.22868.1458208299773.JavaMail.zimbra@rspp.co.id> <1450185395.22917.1458208328780.JavaMail.zimbra@rspp.co.id> <1663713945.22952.1458208375658.JavaMail.zimbra@rspp.co.id> <1427724826.22986.1458208414660.JavaMail.zimbra@rspp.co.id> Subject: info, view the attach and get bark to me... MIME-Version: 1.0 X-ASG-Orig-Subj: info, view the attach and get bark to me... Content-Type: multipart/mixed; boundary="----=_Part_149084_639475518.1458282859504" X-Originating-IP: [197.78.142.209] X-Mailer: Zimbra 8.6.0_GA_1153 (ZimbraWebClient - GC50 (Win)/8.6.0_GA_1153) Thread-Topic: info, view the attach and get bark to me... Thread-Index: X1t/A2vscj7Qpk/ut3MQEjVpefRvJ5jxalSd13b4cxjPQcHmkHT6F2UzZv71pahdb5J3H9wxy09ZQH5/ZuO4c/Gn8DhnvxXDI9zswzKH9OyeY3tLmWT9alYpBnGsCTG0Mo9nyOOVGum+h+saD9pBs/CyGtKtocBYpgXoQZePYnkyaphwYsVq/SnTVcKwU+tPM+wIdh40KOM6/62iaQwMNnipqa8JjIIiGs7ZYwxhopXcQPRlBUA6QK53f0t9gDPrObQwgbvPKommcZWWcve8CvrAWIy9SRo2+f3PapfuGDuh+JxqPb6MCl6+GgqBvJP4X4ZaOufQ5RqQ66p05ShODrDboHHK+BIkc4VRM6qlQ5FmKV2GcwAQcbfyi7N81yeCfoF4rBd9GU4jRxjKJST8rPMS2vmFYPupWFffn99xjyxgy7Sg8dw8oJwlQDeXfnvIUhVE6qPBYEb/aAOQpaSkaXndnJiQjymHnAqG0ioklvS3N2xibxeFLa3UjXWAuZwCnrxLo+VvGm5tFMKiZZN16TvNzN3PClKBh8wIR21kU6cdHGcDtEBw1T8Mseeo2uuW17/QinHvVqAsvWoU7UW8qK3uesARs8S6jtqBvrrpKOXcZ4JllBz8lWC2U339YSbFJv+G4zwvG/ws7qDgbANU6QCkZTbt49IwHx5b810uqAe7itfPeeT1iLLrG13omAIfwRkR6FxtEgwpq4BQEjbMV5wvHmmwZrXe+HOnjWEgTXddoBlJXS6eBw+4D5R+S7DknFfwSwraQ4a/O7/dSPQIFpg4qFAsyWvi0Zfo2AG9bMGtpCxKdMqVVBto0hdvoGxIjLuVVJUh8QIHjrKQj24+hKmk60lcSQPil3XNVm9AyofJMxOhNnsjeVkS0M5X++JLbLqnius8gr2gBdmvxo6ya/8y2wiUOIoqIn35aK12i6Aazb11qZEcgrUmr9FQya36ChXpe2zvAIIXApln pTdcYq7F Kd2FucafOicREfXj/A2rUE7dPXO2SknoMaOT+j8o9yQG+kWIp6tKr9ZF4EY1wBmOrlBJipgidnPf6a7F6DgXzt7T3KsSuzu3Fu5uk8vFYS5WNfR/83xqJ7fzfs6KaXzfasfgcgMkSNyzXvTm8Vfupe/Wo+ZsuX9JOLw4ATMMccxGeufBwkglDaEfspKJ73R2xKJPtTXx2K441IKTOEzRvQAyBGci/PUbjD442t2GRxW4z8yv3pEWH+5/p11UhSFHkh+IeeLwvPEgJC+k X-Barracuda-Connect: UNKNOWN[202.151.11.88] X-Barracuda-Start-Time: 1458285124 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.33 X-Barracuda-Spam-Status: No, SCORE=1.33 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, MISSING_HEADERS, RDNS_NONE, THREAD_INDEX, THREAD_TOPIC, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27940 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 1.21 MISSING_HEADERS Missing To: header 0.00 TO_CC_NONE No To: or Cc: header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS To: undisclosed-recipients:; ------=_Part_149084_639475518.1458282859504 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit ------=_Part_149084_639475518.1458282859504 Content-Type: image/png; name=Untitled.png Content-Disposition: attachment; filename=Untitled.png Content-Transfer-Encoding: base64 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 rkJggg== ------=_Part_149084_639475518.1458282859504-- From ni.ketut.b@rspp.co.id Fri Mar 18 03:25:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 CB7E17CA0 for ; Fri, 18 Mar 2016 03:25:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8FE2C8F8039 for ; Fri, 18 Mar 2016 01:25:25 -0700 (PDT) X-ASG-Debug-ID: 1458289517-04cb6c51bc1e7a0001-NocioJ Received: from mail.rspp.co.id ([202.151.11.88]) by cuda.sgi.com with ESMTP id D74kmWh8hkdov06d (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 18 Mar 2016 01:25:20 -0700 (PDT) X-Barracuda-Envelope-From: ni.ketut.b@rspp.co.id X-Barracuda-Apparent-Source-IP: 202.151.11.88 Received: from localhost (localhost.localdomain [127.0.0.1]) by mail.rspp.co.id (Postfix) with ESMTP id 7B25528606AB; Fri, 18 Mar 2016 14:33:08 +0700 (WIB) Received: from mail.rspp.co.id ([127.0.0.1]) by localhost (mail.rspp.co.id [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id mQEeV_9Mz5BC; Fri, 18 Mar 2016 14:33:05 +0700 (WIB) Received: from localhost (localhost.localdomain [127.0.0.1]) by mail.rspp.co.id (Postfix) with ESMTP id E997E2860BD2; Fri, 18 Mar 2016 14:16:04 +0700 (WIB) DKIM-Filter: OpenDKIM Filter v2.9.2 mail.rspp.co.id E997E2860BD2 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rspp.co.id; s=8CB6AC22-E666-11E5-B384-A65C98A28952; t=1458285365; bh=nuGfDTawPDkjm1YxlQGEZKPV9d2A57XvgI76F8Kn8PA=; h=Date:From:Reply-To:Message-ID:Subject:MIME-Version:Content-Type; b=Wb+UV0uEftYOsIJ+dEfeXxtrdj5CgFzctiPz0bx9R52eqxT0yiv3mDLeWI6BmxA69 a/GH7pDJGJrzD37UHDvgrEC8rLWpZB1oIwnDhXhIqqTzl5ctA4PBk0mRPWLcQ/WhbC y6ZvmmknV2V6Cd9J5b6xLPVrpVX1IYLdyl9MyN/s= X-Virus-Scanned: amavisd-new at mail.rspp.co.id Received: from mail.rspp.co.id ([127.0.0.1]) by localhost (mail.rspp.co.id [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id ECdQTzt2Nje6; Fri, 18 Mar 2016 14:16:04 +0700 (WIB) Received: from mail.rspp.co.id (mail.rspp.co.id [202.151.11.88]) by mail.rspp.co.id (Postfix) with ESMTP id 25044285C4FF; Fri, 18 Mar 2016 14:02:07 +0700 (WIB) Date: Fri, 18 Mar 2016 14:02:07 +0700 (WIB) From: "mr. david ibe" Reply-To: "MR. DAVID IBE" Message-ID: <1296970354.152462.1458284527048.JavaMail.zimbra@rspp.co.id> In-Reply-To: <1082905262.152292.1458284445903.JavaMail.zimbra@rspp.co.id> References: <862211298.8751.1458200048700.JavaMail.zimbra@rspp.co.id> <1690341209.151383.1458283924171.JavaMail.zimbra@rspp.co.id> <303722769.151608.1458284119997.JavaMail.zimbra@rspp.co.id> <949887614.151850.1458284211022.JavaMail.zimbra@rspp.co.id> <1540753208.151885.1458284232583.JavaMail.zimbra@rspp.co.id> <428690679.152028.1458284292425.JavaMail.zimbra@rspp.co.id> <430821618.152077.1458284322284.JavaMail.zimbra@rspp.co.id> <1082905262.152292.1458284445903.JavaMail.zimbra@rspp.co.id> Subject: info, view the attach and get bark to me... MIME-Version: 1.0 X-ASG-Orig-Subj: info, view the attach and get bark to me... Content-Type: multipart/mixed; boundary="----=_Part_152460_875730708.1458284527042" X-Originating-IP: [197.78.142.209] X-Mailer: Zimbra 8.6.0_GA_1153 (ZimbraWebClient - GC50 (Win)/8.6.0_GA_1153) Thread-Topic: info, view the attach and get bark to me... Thread-Index: X1t/A2vscj7Qpk/ut3MQEjVpefRvJ5jxalSd13b4cxjPQcHmkHT6F2UzZv71pahdb5J3H9wxy09ZQH5/ZuO4c/Gn8DhnvxXDI9zswzKH9OyeY3tLmWT9alYpBnGsCTG0Mo9nyOOVGum+h+saD9pBs/CyGtKtocBYpgXoQZePYnkyaphwYsVq/SnTVcKwU+tPM+wIdh40KOM6/62iaQwMNnipqa8JjIIiGs7ZYwxhopXcQPRlBUA6QK53f0t9gDPrObQwgbvPKommcZWWcve8CvrAWIy9SRo2+f3PapfuGDuh+JxqPb6MCl6+GgqBvJP4X4ZaOufQ5RqQ66p05ShODrDboHHK+BIkc4VRM6qlQ5FmKV2GcwAQcbfyi7N81yeCfoF4rBd9GU4jRxjKJST8rPMS2vmFYPupWFffn99xjyxgy7Sg8dw8oJwlQDeXfnvIUhVE6qPBYEb/aAOQpaSkaXndnJiQjymHnAqG0ioklvS3N2xibxeFLa3UjXWAuZwCnrxLo+VvGm5tFMKiZZN16TvNzN3PClKBh8wIR21kU6cdHGcDtEBw1T8Mseeo2uuW17/QinHvVqAsvWoU7UW8qK3uesARs8S6jtqBvrrpKOXcZ4JllBz8lWC2U339YSbFJv+G4zwvG/ws7qDgbANU6QCkZTbt49IwHx5b810uqAe7itfPeeT1iLLrG13omAIfwRkR6FxtEgwpq4BQEjbMV5wvHmmwZrXe+HOnjWEgTXddoBlJXS6eBw+4D5R+S7DknFfwSwraQ4a/O7/dSPQIFpg4qFAsyWvi0Zfo2AG9bMGtpCxKdMqVVBto0hdvoGxIjLuVVJUh8QIHjrKQj24+hKmk60lcSQPil3XNVm9AyofJMxOhNnsjeVkS0M5X++JLbLqnius8gr2gBdmvxo6ya/8y2wiUOIoqIn35aK12i6Aazb11qZEcgrUmr9FQya36ChXpe2zvAIIXApln pTdcYq7F Kd2FucafOicREfXj/A2rUE7dPXO2SknoMaOT+j8o9yQG+kWIp6tKr9ZF4EY1wBmOrlBJipgidnPf6a7F6DgXzt7T3KsSuzu3Fu5uk8vFYS5WNfR/83xqJ7fzfs6KaXzfasfgcgMkSNyzXvTm8Vfupe/Wo+ZsuX9JOLw4ATMMccxGeufBwkglDaEfspKJ73R2xKJPtTXx2K441IKTOEzRvQAyBGci/PUbjD442t2GRxW4z8yv3pEWH+5/p11UhSFHkh+IeeLwvPEgJC+kBmEKiZEVzoH554CjJmvIMUhd6XBAgA8HmJVhl1GjUEB3lDLcErC9h7uzmpnxebm0of8+WXKsbK/Sf6/A/+i4ePalQyUhWNKn7HYco1MWQtREqDOMf7OspjyiJsup59kEQ2lAOuO01FBc4bjt6S18Gy5yCT+aQ5HvcdQEjdc5zv14oeRZCsUACQDetraPL78Blgh5ojAk/IqGu+1OVO3utLZ+Wb9zZxvg2LQvajPyi0mw1/Yb X-Barracuda-Connect: UNKNOWN[202.151.11.88] X-Barracuda-Start-Time: 1458289519 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.33 X-Barracuda-Spam-Status: No, SCORE=1.33 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, MISSING_HEADERS, RDNS_NONE, THREAD_INDEX, THREAD_TOPIC, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27942 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 1.21 MISSING_HEADERS Missing To: header 0.00 TO_CC_NONE No To: or Cc: header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS To: undisclosed-recipients:; ------=_Part_152460_875730708.1458284527042 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit ------=_Part_152460_875730708.1458284527042 Content-Type: image/png; name=Untitled.png Content-Disposition: attachment; filename=Untitled.png Content-Transfer-Encoding: base64 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 rkJggg== ------=_Part_152460_875730708.1458284527042-- From agruenba@redhat.com Fri Mar 18 03:48:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9DB487CA0 for ; Fri, 18 Mar 2016 03:48:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5FD858F8039 for ; Fri, 18 Mar 2016 01:48:17 -0700 (PDT) X-ASG-Debug-ID: 1458290894-04bdf01d3821760001-NocioJ Received: from mail-vk0-f51.google.com (mail-vk0-f51.google.com [209.85.213.51]) by cuda.sgi.com with ESMTP id LJ6cqPg1AiSWksdq (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 18 Mar 2016 01:48:15 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.85.213.51 Received: by mail-vk0-f51.google.com with SMTP id q138so41037323vkb.3 for ; Fri, 18 Mar 2016 01:48:15 -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; bh=rUP+oEbBonEetqvAzJoP9j6/Cyexj+249gX1GKyuIgY=; b=hqkBKme+ySuHqXDkhdCDoRh51aATYI25TnufyPCvFwwUtGijlIY0aVVHoCxnTsatnS mRl+U0c+PjIX498rNT0VzlbGOPMn/bQHk8yq226mZ0Nsto4LQcm2KS+MA0gQ/CdocfWC ReLYjXLwb7Y4aIxc400xhR74jAGo6O8x84I5g8x7jkjUSJbPfDV4RmQ/zwq0Zx2/14q0 JrKZlW8HbVC3JVx9J0bpcmByWdsu1wEUZLFavskjLx0EmczlI8e7oObaEFrlURiFE34i tZczv+JnYcgKFrcXW3FomSVGVzriT9HkXlVFwhQ2vq1wJs+F6/MTv+XHFCi8cjIzuobR UH0w== X-Gm-Message-State: AD7BkJLb6FFsoVUFP/OePiSCU7TVCdn4fP4n+WFlsX9qGqNSz2eB02CXuwOTNc7zR5wgls+RYQpLUyAdQAK/w0Xo MIME-Version: 1.0 X-Received: by 10.31.183.209 with SMTP id h200mr15778527vkf.141.1458290894565; Fri, 18 Mar 2016 01:48:14 -0700 (PDT) Received: by 10.159.33.173 with HTTP; Fri, 18 Mar 2016 01:48:14 -0700 (PDT) In-Reply-To: References: <1458166743-18488-1-git-send-email-agruenba@redhat.com> Date: Fri, 18 Mar 2016 09:48:14 +0100 Message-ID: Subject: Re: [PATCH v20 00/23] Richacls (Core and Ext4) From: Andreas Gruenbacher X-ASG-Orig-Subj: Re: [PATCH v20 00/23] Richacls (Core and Ext4) To: Steve French Cc: Alexander Viro , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , "linux-ext4@vger.kernel.org" , XFS Developers , LKML , linux-fsdevel , "linux-nfs@vger.kernel.org" , "linux-cifs@vger.kernel.org" , "linux-api@vger.kernel.org" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-vk0-f51.google.com[209.85.213.51] X-Barracuda-Start-Time: 1458290895 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.27942 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Mar 18, 2016 at 6:20 AM, Steve French wrote: > Reviewing the current version of your patch series in your tree > git://git.kernel.org/pub/scm/linux/kernel/git/agruen/linux-richacl.git \ > richacl-2016-03-16 > > you can add my reviewed by to the following patches so far: Done, thanks. Andreas From ni.ketut.b@rspp.co.id Fri Mar 18 05:00:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 6F0287CA0 for ; Fri, 18 Mar 2016 05:00:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id ECB00304043 for ; Fri, 18 Mar 2016 03:00:36 -0700 (PDT) X-ASG-Debug-ID: 1458295230-04bdf01d3523da0001-NocioJ Received: from mail.rspp.co.id ([202.151.11.88]) by cuda.sgi.com with ESMTP id UweyeJhpPmD4VhRF (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 18 Mar 2016 03:00:32 -0700 (PDT) X-Barracuda-Envelope-From: ni.ketut.b@rspp.co.id X-Barracuda-Apparent-Source-IP: 202.151.11.88 Received: from localhost (localhost.localdomain [127.0.0.1]) by mail.rspp.co.id (Postfix) with ESMTP id 7680728687FE; Fri, 18 Mar 2016 15:22:53 +0700 (WIB) Received: from mail.rspp.co.id ([127.0.0.1]) by localhost (mail.rspp.co.id [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id Yicj4wi-RKCO; Fri, 18 Mar 2016 15:22:50 +0700 (WIB) Received: from localhost (localhost.localdomain [127.0.0.1]) by mail.rspp.co.id (Postfix) with ESMTP id 86BB82861416; Fri, 18 Mar 2016 15:05:39 +0700 (WIB) DKIM-Filter: OpenDKIM Filter v2.9.2 mail.rspp.co.id 86BB82861416 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rspp.co.id; s=8CB6AC22-E666-11E5-B384-A65C98A28952; t=1458288339; bh=gKFzSjv84qr6h5i1fX0ei8nsG2+L1jr4EH/fjYh/JeQ=; h=Date:From:Reply-To:Message-ID:Subject:MIME-Version:Content-Type; b=IcCXDVhOEOAPkZssKrZ6Vu8HE7RIYposVib+S2/ZrlzbVT8Bpt56/MFu9Ztgc+2Id rfKgskPcm5agusU+IpGROcsnSB1O+GRQKpjomhUYEZOJ+Z7eMYUuxc+rBDig8lVlFg lztq+AJJiyGH2GjGZ7QqJeuKP1Fg1BMHol2BMCrc= X-Virus-Scanned: amavisd-new at mail.rspp.co.id Received: from mail.rspp.co.id ([127.0.0.1]) by localhost (mail.rspp.co.id [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id R8Gl-ZEk0oWY; Fri, 18 Mar 2016 15:05:38 +0700 (WIB) Received: from mail.rspp.co.id (mail.rspp.co.id [202.151.11.88]) by mail.rspp.co.id (Postfix) with ESMTP id 90C12285DEB9; Fri, 18 Mar 2016 14:46:41 +0700 (WIB) Date: Fri, 18 Mar 2016 14:46:41 +0700 (WIB) From: "mr. david ibe" Reply-To: "MR. DAVID IBE" Message-ID: <1892397674.158666.1458287201508.JavaMail.zimbra@rspp.co.id> In-Reply-To: <1249045411.157827.1458287055383.JavaMail.zimbra@rspp.co.id> References: <862211298.8751.1458200048700.JavaMail.zimbra@rspp.co.id> <226581632.156771.1458286697545.JavaMail.zimbra@rspp.co.id> <1712200712.156846.1458286725503.JavaMail.zimbra@rspp.co.id> <1156600936.156993.1458286823046.JavaMail.zimbra@rspp.co.id> <1927858386.157209.1458286946783.JavaMail.zimbra@rspp.co.id> <1842118556.157342.1458286973629.JavaMail.zimbra@rspp.co.id> <1993931529.157525.1458287004218.JavaMail.zimbra@rspp.co.id> <1249045411.157827.1458287055383.JavaMail.zimbra@rspp.co.id> Subject: info, view the attach and get bark to me... MIME-Version: 1.0 X-ASG-Orig-Subj: info, view the attach and get bark to me... Content-Type: multipart/mixed; boundary="----=_Part_158664_232748813.1458287201502" X-Originating-IP: [197.78.142.209] X-Mailer: Zimbra 8.6.0_GA_1153 (ZimbraWebClient - GC50 (Win)/8.6.0_GA_1153) Thread-Topic: info, view the attach and get bark to me... Thread-Index: X1t/A2vscj7Qpk/ut3MQEjVpefRvJ5jxalSd13b4cxjPQcHmkHT6F2UzZv71pahdb5J3H9wxy09ZQH5/ZuO4c/Gn8DhnvxXDI9zswzKH9OyeY3tLmWT9alYpBnGsCTG0Mo9nyOOVGum+h+saD9pBs/CyGtKtocBYpgXoQZePYnkyaphwYsVq/SnTVcKwU+tPM+wIdh40KOM6/62iaQwMNnipqa8JjIIiGs7ZYwxhopXcQPRlBUA6QK53f0t9gDPrObQwgbvPKommcZWWcve8CvrAWIy9SRo2+f3PapfuGDuh+JxqPb6MCl6+GgqBvJP4X4ZaOufQ5RqQ66p05ShODrDboHHK+BIkc4VRM6qlQ5FmKV2GcwAQcbfyi7N81yeCfoF4rBd9GU4jRxjKJST8rPMS2vmFYPupWFffn99xjyxgy7Sg8dw8oJwlQDeXfnvIUhVE6qPBYEb/aAOQpaSkaXndnJiQjymHnAqG0ioklvS3N2xibxeFLa3UjXWAuZwCnrxLo+VvGm5tFMKiZZN16TvNzN3PClKBh8wIR21kU6cdHGcDtEBw1T8Mseeo2uuW17/QinHvVqAsvWoU7UW8qK3uesARs8S6jtqBvrrpKOXcZ4JllBz8lWC2U339YSbFJv+G4zwvG/ws7qDgbANU6QCkZTbt49IwHx5b810uqAe7itfPeeT1iLLrG13omAIfwRkR6FxtEgwpq4BQEjbMV5wvHmmwZrXe+HOnjWEgTXddoBlJXS6eBw+4D5R+S7DknFfwSwraQ4a/O7/dSPQIFpg4qFAsyWvi0Zfo2AG9bMGtpCxKdMqVVBto0hdvoGxIjLuVVJUh8QIHjrKQj24+hKmk60lcSQPil3XNVm9AyofJMxOhNnsjeVkS0M5X++JLbLqnius8gr2gBdmvxo6ya/8y2wiUOIoqIn35aK12i6Aazb11qZEcgrUmr9FQya36ChXpe2zvAIIXApln pTdcYq7F Kd2FucafOicREfXj/A2rUE7dPXO2SknoMaOT+j8o9yQG+kWIp6tKr9ZF4EY1wBmOrlBJipgidnPf6a7F6DgXzt7T3KsSuzu3Fu5uk8vFYS5WNfR/83xqJ7fzfs6KaXzfasfgcgMkSNyzXvTm8Vfupe/Wo+ZsuX9JOLw4ATMMccxGeufBwkglDaEfspKJ73R2xKJPtTXx2K441IKTOEzRvQAyBGci/PUbjD442t2GRxW4z8yv3pEWH+5/p11UhSFHkh+IeeLwvPEgJC+kBmEKiZEVzoH554CjJmvIMUhd6XBAgA8HmJVhl1GjUEB3lDLcErC9h7uzmpnxebm0of8+WXKsbK/Sf6/A/+i4ePalQyUhWNKn7HYco1MWQtREqDOMf7OspjyiJsup59kEQ2lAOuO01FBc4bjt6S18Gy5yCT+aQ5HvcdQEjdc5zv14oeRZCsUACQDetraPL78Blgh5ojAk/IqGu+1OVO3utLZ+Wb9zZxvg2LQvajPyi0mw1/YbmpuVdavIB+4FLbUtw46IJg6p2DJbAbzv+U6myPEPoCGyeDxIemzF5/PO10nf/182OLu8dls5XfgrHhOZ9TSGIc1rieazwdPG75jVM463ZVqoYPb4sOgX4Hv7opNKUnnVH4c4cMhyh07DaIKY7YeD/fG1zMRqHDRVU3354CYp9zniVNt/16qmQhEv5S0h1BUMf2eJ3M25AQ6vzbu8pWgFtUpgpShgcJou9quNvMXLZQ== X-Barracuda-Connect: UNKNOWN[202.151.11.88] X-Barracuda-Start-Time: 1458295231 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.33 X-Barracuda-Spam-Status: No, SCORE=1.33 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, MISSING_HEADERS, RDNS_NONE, THREAD_INDEX, THREAD_TOPIC, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27944 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 1.21 MISSING_HEADERS Missing To: header 0.00 TO_CC_NONE No To: or Cc: header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS To: undisclosed-recipients:; ------=_Part_158664_232748813.1458287201502 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit ------=_Part_158664_232748813.1458287201502 Content-Type: image/png; name=Untitled.png Content-Disposition: attachment; filename=Untitled.png Content-Transfer-Encoding: base64 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 rkJggg== ------=_Part_158664_232748813.1458287201502-- From ni.ketut.b@rspp.co.id Fri Mar 18 06:51:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 D69F47CA0 for ; Fri, 18 Mar 2016 06:51:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A8FD7304043 for ; Fri, 18 Mar 2016 04:51:36 -0700 (PDT) X-ASG-Debug-ID: 1458301885-04cbb05c4428c20001-NocioJ Received: from mail.rspp.co.id ([202.151.11.88]) by cuda.sgi.com with ESMTP id dfLnJ4XSm0kF2i6v (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 18 Mar 2016 04:51:28 -0700 (PDT) X-Barracuda-Envelope-From: ni.ketut.b@rspp.co.id X-Barracuda-Apparent-Source-IP: 202.151.11.88 Received: from localhost (localhost.localdomain [127.0.0.1]) by mail.rspp.co.id (Postfix) with ESMTP id 378DC287898B; Fri, 18 Mar 2016 16:18:03 +0700 (WIB) Received: from mail.rspp.co.id ([127.0.0.1]) by localhost (mail.rspp.co.id [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id axAGTOniOZmf; Fri, 18 Mar 2016 16:18:00 +0700 (WIB) Received: from localhost (localhost.localdomain [127.0.0.1]) by mail.rspp.co.id (Postfix) with ESMTP id 1CF3E28785B7; Fri, 18 Mar 2016 15:58:35 +0700 (WIB) DKIM-Filter: OpenDKIM Filter v2.9.2 mail.rspp.co.id 1CF3E28785B7 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rspp.co.id; s=8CB6AC22-E666-11E5-B384-A65C98A28952; t=1458291515; bh=VshW9PPy44dJv37px0ar6Q9XFf6UnVILso5WmI8OL7M=; h=Date:From:Reply-To:Message-ID:Subject:MIME-Version:Content-Type; b=RtQKH5y0PWvSCiTnCb2jwgXxhKLnIbIkMOIW7uPIh2O/34Le779wZXj/SHkvV9Yyp depYs+PMPjvv+VV34cuDcIXiUV4/4lnPjlvyX9XOzbxA7z/CY7QEBz7SLpxnOcKmQL R/6jxwlzpUHBT3Y+kbq48qenT1c1acjIA5K40YJQ= X-Virus-Scanned: amavisd-new at mail.rspp.co.id Received: from mail.rspp.co.id ([127.0.0.1]) by localhost (mail.rspp.co.id [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id XmqUu4yideL1; Fri, 18 Mar 2016 15:58:34 +0700 (WIB) Received: from mail.rspp.co.id (mail.rspp.co.id [202.151.11.88]) by mail.rspp.co.id (Postfix) with ESMTP id EE86A2868741; Fri, 18 Mar 2016 15:40:43 +0700 (WIB) Date: Fri, 18 Mar 2016 15:40:43 +0700 (WIB) From: "mr. david ibe" Reply-To: "MR. DAVID IBE" Message-ID: <477791578.178392.1458290442513.JavaMail.zimbra@rspp.co.id> In-Reply-To: <1543017828.178020.1458290358442.JavaMail.zimbra@rspp.co.id> References: <862211298.8751.1458200048700.JavaMail.zimbra@rspp.co.id> <1445150804.173930.1458289711056.JavaMail.zimbra@rspp.co.id> <1687398823.176650.1458290085306.JavaMail.zimbra@rspp.co.id> <590423949.177136.1458290190317.JavaMail.zimbra@rspp.co.id> <239561545.177400.1458290241145.JavaMail.zimbra@rspp.co.id> <1468061317.177604.1458290276067.JavaMail.zimbra@rspp.co.id> <447592797.177842.1458290314241.JavaMail.zimbra@rspp.co.id> <1543017828.178020.1458290358442.JavaMail.zimbra@rspp.co.id> Subject: info, view the attach and get bark to me... MIME-Version: 1.0 X-ASG-Orig-Subj: info, view the attach and get bark to me... Content-Type: multipart/mixed; boundary="----=_Part_178390_1896846046.1458290442389" X-Originating-IP: [197.78.142.209] X-Mailer: Zimbra 8.6.0_GA_1153 (ZimbraWebClient - GC50 (Win)/8.6.0_GA_1153) Thread-Topic: info, view the attach and get bark to me... Thread-Index: X1t/A2vscj7Qpk/ut3MQEjVpefRvJ5jxalSd13b4cxjPQcHmkHT6F2UzZv71pahdb5J3H9wxy09ZQH5/ZuO4c/Gn8DhnvxXDI9zswzKH9OyeY3tLmWT9alYpBnGsCTG0Mo9nyOOVGum+h+saD9pBs/CyGtKtocBYpgXoQZePYnkyaphwYsVq/SnTVcKwU+tPM+wIdh40KOM6/62iaQwMNnipqa8JjIIiGs7ZYwxhopXcQPRlBUA6QK53f0t9gDPrObQwgbvPKommcZWWcve8CvrAWIy9SRo2+f3PapfuGDuh+JxqPb6MCl6+GgqBvJP4X4ZaOufQ5RqQ66p05ShODrDboHHK+BIkc4VRM6qlQ5FmKV2GcwAQcbfyi7N81yeCfoF4rBd9GU4jRxjKJST8rPMS2vmFYPupWFffn99xjyxgy7Sg8dw8oJwlQDeXfnvIUhVE6qPBYEb/aAOQpaSkaXndnJiQjymHnAqG0ioklvS3N2xibxeFLa3UjXWAuZwCnrxLo+VvGm5tFMKiZZN16TvNzN3PClKBh8wIR21kU6cdHGcDtEBw1T8Mseeo2uuW17/QinHvVqAsvWoU7UW8qK3uesARs8S6jtqBvrrpKOXcZ4JllBz8lWC2U339YSbFJv+G4zwvG/ws7qDgbANU6QCkZTbt49IwHx5b810uqAe7itfPeeT1iLLrG13omAIfwRkR6FxtEgwpq4BQEjbMV5wvHmmwZrXe+HOnjWEgTXddoBlJXS6eBw+4D5R+S7DknFfwSwraQ4a/O7/dSPQIFpg4qFAsyWvi0Zfo2AG9bMGtpCxKdMqVVBto0hdvoGxIjLuVVJUh8QIHjrKQj24+hKmk60lcSQPil3XNVm9AyofJMxOhNnsjeVkS0M5X++JLbLqnius8gr2gBdmvxo6ya/8y2wiUOIoqIn35aK12i6Aazb11qZEcgrUmr9FQya36ChXpe2zvAIIXApln pTdcYq7F Kd2FucafOicREfXj/A2rUE7dPXO2SknoMaOT+j8o9yQG+kWIp6tKr9ZF4EY1wBmOrlBJipgidnPf6a7F6DgXzt7T3KsSuzu3Fu5uk8vFYS5WNfR/83xqJ7fzfs6KaXzfasfgcgMkSNyzXvTm8Vfupe/Wo+ZsuX9JOLw4ATMMccxGeufBwkglDaEfspKJ73R2xKJPtTXx2K441IKTOEzRvQAyBGci/PUbjD442t2GRxW4z8yv3pEWH+5/p11UhSFHkh+IeeLwvPEgJC+kBmEKiZEVzoH554CjJmvIMUhd6XBAgA8HmJVhl1GjUEB3lDLcErC9h7uzmpnxebm0of8+WXKsbK/Sf6/A/+i4ePalQyUhWNKn7HYco1MWQtREqDOMf7OspjyiJsup59kEQ2lAOuO01FBc4bjt6S18Gy5yCT+aQ5HvcdQEjdc5zv14oeRZCsUACQDetraPL78Blgh5ojAk/IqGu+1OVO3utLZ+Wb9zZxvg2LQvajPyi0mw1/YbmpuVdavIB+4FLbUtw46IJg6p2DJbAbzv+U6myPEPoCGyeDxIemzF5/PO10nf/182OLu8dls5XfgrHhOZ9TSGIc1rieazwdPG75jVM463ZVqoYPb4sOgX4Hv7opNKUnnVH4c4cMhyh07DaIKY7YeD/fG1zMRqHDRVU3354CYp9zniVNt/16qmQhEv5S0h1BUMf2eJ3M25AQ6vzbu8pWgFtUpgpShgcJou9quNvMXLZTG9B9TP8ViOyoVteUPc2qIYHEIjD6xPr8ABaVJBd5VMhjMss708a2DJNnh2F5yv0YgNXGt7eZtpZ7SWq7amsqIHjVCmir4A+rRFSiLxbd2aUNqFKJ6thLrnhrB1FRWAiVTS9WLb8MmB1d4VZUhDR9+NSFnlzJX525TNmIZvsVyo2DaGVQ50dBvJXVwbDUIp2yGJJqFSfvF7/5PXKzZzIuzmMgA65VnDDAysRaWNTAU= X-Barracuda-Connect: UNKNOWN[202.151.11.88] X-Barracuda-Start-Time: 1458301888 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.33 X-Barracuda-Spam-Status: No, SCORE=1.33 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, MISSING_HEADERS, RDNS_NONE, THREAD_INDEX, THREAD_TOPIC, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27946 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 1.21 MISSING_HEADERS Missing To: header 0.00 TO_CC_NONE No To: or Cc: header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS To: undisclosed-recipients:; ------=_Part_178390_1896846046.1458290442389 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit ------=_Part_178390_1896846046.1458290442389 Content-Type: image/png; name=Untitled.png Content-Disposition: attachment; filename=Untitled.png Content-Transfer-Encoding: base64 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 rkJggg== ------=_Part_178390_1896846046.1458290442389-- From rjones@redhat.com Fri Mar 18 07:31:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 152067CA0 for ; Fri, 18 Mar 2016 07:31:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id DD2EF8F8039 for ; Fri, 18 Mar 2016 05:31:11 -0700 (PDT) X-ASG-Debug-ID: 1458304269-04cb6c51be26860001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id FkWtJtbzQQlUyni8 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 18 Mar 2016 05:31:10 -0700 (PDT) X-Barracuda-Envelope-From: rjones@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 95BF4C00F237; Fri, 18 Mar 2016 12:31:09 +0000 (UTC) Received: from localhost (ovpn-204-74.brq.redhat.com [10.40.204.74]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2ICV83m023322; Fri, 18 Mar 2016 08:31:09 -0400 Date: Fri, 18 Mar 2016 12:31:07 +0000 From: "Richard W.M. Jones" To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: xfs_growfs causing "Metadata corruption detected at xfs_agf_read_verify" Message-ID: <20160318123107.GB8856@redhat.com> X-ASG-Orig-Subj: Re: xfs_growfs causing "Metadata corruption detected at xfs_agf_read_verify" References: <20160317224803.GA8856@redhat.com> <56EB35F8.1030601@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56EB35F8.1030601@sandeen.net> User-Agent: Mutt/1.5.20 (2009-12-10) 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: 1458304270 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Mar 17, 2016 at 05:55:52PM -0500, Eric Sandeen wrote: > On 3/17/16 5:48 PM, Richard W.M. Jones wrote: > > > > With recent kernels (or maybe xfsprogs?) we've noticed strange > > filesystem corruption after using xfs_growfs. > > > > Examples: > > > > https://bugzilla.redhat.com/show_bug.cgi?id=1315895 (on aarch64) > > https://www.redhat.com/archives/libguestfs/2016-March/msg00113.html (x86_64) > > https://rwmj.wordpress.com/2015/11/04/virt-builder-fedora-23-image/#comment-15668 (x86_64) > > > > Do these errors look familiar? I don't yet have a simple test case, > > still working on that. > > try: > http://oss.sgi.com/pipermail/xfs/2016-March/047683.html I've tried this patch now, but I still can't get a solid reproducer (one that doesn't involve using aarch64). I just tried to create a filesystem on kernel 4.6.0, grow it on 4.6.0, then copy it to another machine with 4.4.4. However that didn't reproduce the bug, so I couldn't verify if the patch fixes the bug. (Maybe 4.4.4 is too new?) Can you help me to understand under what circumstances this bug would appear, as far as you understand what's happening? Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com virt-p2v converts physical machines to virtual machines. Boot with a live CD or over the network (PXE) and turn machines into KVM guests. http://libguestfs.org/virt-v2v From ni.ketut.b@rspp.co.id Fri Mar 18 07:55:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 9B5627CA0 for ; Fri, 18 Mar 2016 07:55:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2E704AC001 for ; Fri, 18 Mar 2016 05:55:16 -0700 (PDT) X-ASG-Debug-ID: 1458305709-04cbb05c452ad70001-NocioJ Received: from mail.rspp.co.id ([202.151.11.88]) by cuda.sgi.com with ESMTP id Ac1xneRRBOG8CydS (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 18 Mar 2016 05:55:11 -0700 (PDT) X-Barracuda-Envelope-From: ni.ketut.b@rspp.co.id X-Barracuda-Apparent-Source-IP: 202.151.11.88 Received: from localhost (localhost.localdomain [127.0.0.1]) by mail.rspp.co.id (Postfix) with ESMTP id A3C362878E3F; Fri, 18 Mar 2016 17:16:07 +0700 (WIB) Received: from mail.rspp.co.id ([127.0.0.1]) by localhost (mail.rspp.co.id [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id n8svmaGW4jyO; Fri, 18 Mar 2016 17:16:00 +0700 (WIB) Received: from localhost (localhost.localdomain [127.0.0.1]) by mail.rspp.co.id (Postfix) with ESMTP id D46752878E33; Fri, 18 Mar 2016 17:15:59 +0700 (WIB) DKIM-Filter: OpenDKIM Filter v2.9.2 mail.rspp.co.id D46752878E33 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rspp.co.id; s=8CB6AC22-E666-11E5-B384-A65C98A28952; t=1458296160; bh=EOcOaImOurC1M7uCdCLVfqr/9kYW6lWE53t983O6AHY=; h=Date:From:Reply-To:Message-ID:Subject:MIME-Version:Content-Type; b=elpYqgzpSRV7hbDqbSwokmQY8j11lb1CkSEVXXOKVnet1fgWd/MLjq6jY8jgYfpG+ N2zIPI+3DonbsvhXhscY07SRcJZWNdbfOeSQjsH8P7LHX1Kde0AVX5Qn6YknDpSexN wTbQQmG+QqaLGwiA86B7TOnZXijmdXlg0n5skOkI= X-Virus-Scanned: amavisd-new at mail.rspp.co.id Received: from mail.rspp.co.id ([127.0.0.1]) by localhost (mail.rspp.co.id [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id CNfdRqJlj5zA; Fri, 18 Mar 2016 17:15:59 +0700 (WIB) Received: from mail.rspp.co.id (mail.rspp.co.id [202.151.11.88]) by mail.rspp.co.id (Postfix) with ESMTP id 5F2912878E2E; Fri, 18 Mar 2016 17:15:58 +0700 (WIB) Date: Fri, 18 Mar 2016 17:15:58 +0700 (WIB) From: "mr. david ibe" Reply-To: "MR. DAVID IBE" Message-ID: <477509290.188177.1458296158269.JavaMail.zimbra@rspp.co.id> In-Reply-To: <1605919035.188130.1458296124943.JavaMail.zimbra@rspp.co.id> References: <53257809.4162.1458197600352.JavaMail.zimbra@rspp.co.id> <1489908808.187987.1458295934404.JavaMail.zimbra@rspp.co.id> <283952122.188001.1458295972392.JavaMail.zimbra@rspp.co.id> <1529416221.188016.1458295997497.JavaMail.zimbra@rspp.co.id> <1365642562.188027.1458296024056.JavaMail.zimbra@rspp.co.id> <1836949313.188066.1458296049418.JavaMail.zimbra@rspp.co.id> <2051724232.188119.1458296098257.JavaMail.zimbra@rspp.co.id> <1605919035.188130.1458296124943.JavaMail.zimbra@rspp.co.id> Subject: info, view the attach and get bark to me... MIME-Version: 1.0 X-ASG-Orig-Subj: info, view the attach and get bark to me... Content-Type: multipart/mixed; boundary="----=_Part_188175_2073367972.1458296158264" X-Originating-IP: [197.78.142.209] X-Mailer: Zimbra 8.6.0_GA_1153 (ZimbraWebClient - GC50 (Win)/8.6.0_GA_1153) Thread-Topic: info, view the attach and get bark to me... Thread-Index: zIBcPZV6uSuXXxA7YtR5vsIIQnbgz26Llw2XSlV/Dx6L9fLq9ja8Jftw4ateLrGVPB9pRXvHUUcomMT9f8PBEXYtcLjP2S+q+o+nwaxI2Hfeu9GqII21/a38ZqIkXxWk7PIKLshE/V+zYPBNY4eazE6aX1nD8L8t7Fx+u582lAnq/SpTOgvaC55InA78dE5/6THwlvvwg9ivYLmfDQpnx/goxEWIH5LM0/zqgrY41Ccaf1f00646SvI6ksMRJR5umFr+5udkytF4Cgi0EWxpo+/jEr/xWFfG+QA/dL6o88nQHZU1Xx9qOOTlVM+9cYa5qKAhLvCHeg/xNSa2AXnX0hItNC0UPctlSPezoRwHwA6xkHkycRim2m9ne41hVP/klTAj4Q== X-Barracuda-Connect: UNKNOWN[202.151.11.88] X-Barracuda-Start-Time: 1458305711 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.33 X-Barracuda-Spam-Status: No, SCORE=1.33 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, MISSING_HEADERS, RDNS_NONE, THREAD_INDEX, THREAD_TOPIC, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27947 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 1.21 MISSING_HEADERS Missing To: header 0.00 TO_CC_NONE No To: or Cc: header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS To: undisclosed-recipients:; ------=_Part_188175_2073367972.1458296158264 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit ------=_Part_188175_2073367972.1458296158264 Content-Type: image/png; name=Untitled.png Content-Disposition: attachment; filename=Untitled.png Content-Transfer-Encoding: base64 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 rkJggg== ------=_Part_188175_2073367972.1458296158264-- From ni.ketut.b@rspp.co.id Fri Mar 18 08:09:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 A06AB7CA0 for ; Fri, 18 Mar 2016 08:09:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 65C348F8039 for ; Fri, 18 Mar 2016 06:09:55 -0700 (PDT) X-ASG-Debug-ID: 1458306590-04cb6c51bf28120001-NocioJ Received: from mail.rspp.co.id ([202.151.11.88]) by cuda.sgi.com with ESMTP id mdetrWQZGID3rI4i (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 18 Mar 2016 06:09:52 -0700 (PDT) X-Barracuda-Envelope-From: ni.ketut.b@rspp.co.id X-Barracuda-Apparent-Source-IP: 202.151.11.88 Received: from localhost (localhost.localdomain [127.0.0.1]) by mail.rspp.co.id (Postfix) with ESMTP id EDDD22861B56; Fri, 18 Mar 2016 17:44:29 +0700 (WIB) Received: from mail.rspp.co.id ([127.0.0.1]) by localhost (mail.rspp.co.id [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id l7aHKdW71jTF; Fri, 18 Mar 2016 17:44:24 +0700 (WIB) Received: from localhost (localhost.localdomain [127.0.0.1]) by mail.rspp.co.id (Postfix) with ESMTP id 462882861B30; Fri, 18 Mar 2016 17:44:24 +0700 (WIB) DKIM-Filter: OpenDKIM Filter v2.9.2 mail.rspp.co.id 462882861B30 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rspp.co.id; s=8CB6AC22-E666-11E5-B384-A65C98A28952; t=1458297864; bh=WREFvcXOvXfnTJ/Ukq7NL79BHCeS0m3lKNTq/3kq5E8=; h=Date:From:Reply-To:Message-ID:Subject:MIME-Version:Content-Type; b=MNUp6seX+ZVASahCrEF3rmpt+JrGVnCBOdQm1Fyp5dZGsYZdwK9MdjNRKCtmh3aww d3IVkaENecmp0J4YSYNuF7NMfjsv0Bf8CtwJ9VkOhLVTHeJEDnlCg+WVuGOAb6M3Wr +PYnTIKAXsvs/YDx6RzXwr2nmNQZi0GVTQOloWxQ= X-Virus-Scanned: amavisd-new at mail.rspp.co.id Received: from mail.rspp.co.id ([127.0.0.1]) by localhost (mail.rspp.co.id [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id Hwl1Rd0Wyh8W; Fri, 18 Mar 2016 17:44:23 +0700 (WIB) Received: from mail.rspp.co.id (mail.rspp.co.id [202.151.11.88]) by mail.rspp.co.id (Postfix) with ESMTP id 0DEED2861B2D; Fri, 18 Mar 2016 17:44:23 +0700 (WIB) Date: Fri, 18 Mar 2016 17:44:22 +0700 (WIB) From: "mr. david ibe" Reply-To: "MR. DAVID IBE" Message-ID: <1040186183.189174.1458297862934.JavaMail.zimbra@rspp.co.id> In-Reply-To: <1437623360.189147.1458297839419.JavaMail.zimbra@rspp.co.id> References: <53257809.4162.1458197600352.JavaMail.zimbra@rspp.co.id> <1724769977.189019.1458297607382.JavaMail.zimbra@rspp.co.id> <386032534.189042.1458297645133.JavaMail.zimbra@rspp.co.id> <158677101.189094.1458297679094.JavaMail.zimbra@rspp.co.id> <889387902.189108.1458297702529.JavaMail.zimbra@rspp.co.id> <588430838.189131.1458297781414.JavaMail.zimbra@rspp.co.id> <372238072.189136.1458297814973.JavaMail.zimbra@rspp.co.id> <1437623360.189147.1458297839419.JavaMail.zimbra@rspp.co.id> Subject: info, view the attach and get bark to me... MIME-Version: 1.0 X-ASG-Orig-Subj: info, view the attach and get bark to me... Content-Type: multipart/mixed; boundary="----=_Part_189172_923155426.1458297862929" X-Originating-IP: [197.78.142.209] X-Mailer: Zimbra 8.6.0_GA_1153 (ZimbraWebClient - GC50 (Win)/8.6.0_GA_1153) Thread-Topic: info, view the attach and get bark to me... Thread-Index: zIBcPZV6uSuXXxA7YtR5vsIIQnbgz26Llw2XSlV/Dx6L9fLq9ja8Jftw4ateLrGVPB9pRXvHUUcomMT9f8PBEXYtcLjP2S+q+o+nwaxI2Hfeu9GqII21/a38ZqIkXxWk7PIKLshE/V+zYPBNY4eazE6aX1nD8L8t7Fx+u582lAnq/SpTOgvaC55InA78dE5/6THwlvvwg9ivYLmfDQpnx/goxEWIH5LM0/zqgrY41Ccaf1f00646SvI6ksMRJR5umFr+5udkytF4Cgi0EWxpo+/jEr/xWFfG+QA/dL6o88nQHZU1Xx9qOOTlVM+9cYa5qKAhLvCHeg/xNSa2AXnX0hItNC0UPctlSPezoRwHwA6xkHkycRim2m9ne41hVP/klTAj4WoML/excfUTQQHz+dA0fT3AP0EU4bMUAuzBvtabaz5xxXqybkReHPXy0jAJiDAgxaMD81cp6anSifSt147baYpzj/qkBU3f2pTBep3AinC7kJ8YTQjMuCZ6At7xE8UJ1giOJysRfGg/PeI9jCiae4VhYAb/zmJsTa3qIDW5v6ET9yUwE1R6hDyiMXTEPWEcfeeeUMaszw== X-Barracuda-Connect: UNKNOWN[202.151.11.88] X-Barracuda-Start-Time: 1458306591 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.33 X-Barracuda-Spam-Status: No, SCORE=1.33 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, MISSING_HEADERS, RDNS_NONE, THREAD_INDEX, THREAD_TOPIC, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27947 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 1.21 MISSING_HEADERS Missing To: header 0.00 TO_CC_NONE No To: or Cc: header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS To: undisclosed-recipients:; ------=_Part_189172_923155426.1458297862929 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit ------=_Part_189172_923155426.1458297862929 Content-Type: image/png; name=Untitled.png Content-Disposition: attachment; filename=Untitled.png Content-Transfer-Encoding: base64 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 rkJggg== ------=_Part_189172_923155426.1458297862929-- From woodf5@laran.lunarmania.com Fri Mar 18 16:27:56 2016 Return-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_MESSAGE, HTML_OBFUSCATE_05_10,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 80E7A7CA1 for ; Fri, 18 Mar 2016 16:27:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 48ED5304032 for ; Fri, 18 Mar 2016 14:27:53 -0700 (PDT) X-ASG-Debug-ID: 1458336469-04cbb0033a0f220001-NocioJ Received: from laran.lunarmania.com (laran.lunarmania.com [67.210.98.210]) by cuda.sgi.com with ESMTP id KvfukSDoOt7DoI5U (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 18 Mar 2016 14:27:50 -0700 (PDT) X-Barracuda-Envelope-From: woodf5@laran.lunarmania.com X-Barracuda-Apparent-Source-IP: 67.210.98.210 Received: from woodf5 by laran.lunarmania.com with local (Exim 4.86_1) (envelope-from ) id 1ah1vw-0006Xg-B4 for xfs@oss.sgi.com; Fri, 18 Mar 2016 14:27:48 -0700 Date: Fri, 18 Mar 2016 14:27:48 -0700 To: xfs@oss.sgi.com From: PayPal Subject: Verification Required (PayPal) Message-ID: <3419eb0b4e80ea6f4f35a68c8cfe9ee5@laran.lunarmania.com> X-ASG-Orig-Subj: Verification Required (PayPal) X-Priority: 3 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset="us-ascii" X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - laran.lunarmania.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [32303 32305] / [47 12] X-AntiAbuse: Sender Address Domain - laran.lunarmania.com X-Get-Message-Sender-Via: laran.lunarmania.com: authenticated_id: woodf5/only user confirmed/virtual account not confirmed X-Authenticated-Sender: laran.lunarmania.com: woodf5 X-Barracuda-Connect: laran.lunarmania.com[67.210.98.210] X-Barracuda-Start-Time: 1458336470 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, HTML_OBFUSCATE_05_10, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.27960 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_OBFUSCATE_05_10 BODY: Message is 5% to 10% HTML obfuscation 0.00 HTML_MESSAGE BODY: HTML included in message

Ρ= ;ayΡal Secυre


= Notice of changes to the ΡayΡal υser agreement.

Dear Custοmer,

Lοg in to yοur ΡayΡall accοunt as soon as Ρossible

  • We have recenτly encounτered a Ρroblem in your accο= unt.
  • when yοu created yοur &#= 929;ayΡal accοunt to make sure yoυ're the=20 account holder
  • Click τhe Αctivation link and Fοllow the instrυctio= ns. !

[= 3;CTIVATE ΑCCOUNT


Get mοre οut οf yοur accοun= t

Nοw is the time tο make yο= ur ΡayΡal acc= οunt even mοre useful:

Αccοunt O= verview

  • Get υp-tο-date infοrmati= on about yοur Ρayments.
  • Αdd οr= withdraw mοney frοm yοur ΡayΡal accοunt.
  • S= ee a deτailed τransacτion hisτοry.
  • Yοurs sincerely,
    ΡayΡal

From sweil@redhat.com Sun Mar 20 08:43:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 426007CA1 for ; Sun, 20 Mar 2016 08:43:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 96F5BAC002 for ; Sun, 20 Mar 2016 06:43:18 -0700 (PDT) X-ASG-Debug-ID: 1458481396-04cb6c6eb68d9c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id VTOD8vfMEPes3xr7 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 20 Mar 2016 06:43:17 -0700 (PDT) X-Barracuda-Envelope-From: sweil@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 57D4FAA7 for ; Sun, 20 Mar 2016 13:43:16 +0000 (UTC) Received: from cpach (ovpn-112-83.phx2.redhat.com [10.3.112.83]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2KDhEuJ003319 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Sun, 20 Mar 2016 09:43:15 -0400 Date: Sun, 20 Mar 2016 09:43:01 -0400 (EDT) From: Sage Weil X-X-Sender: sage@cpach.fuggernut.com To: xfs@oss.sgi.com Subject: splice vs truncate lockdep splat Message-ID: X-ASG-Orig-Subj: splice vs truncate lockdep splat User-Agent: Alpine 2.11 (DEB 23 2013-08-11) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII 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: 1458481397 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, For the last few kernel releases we've been seeing this pretty regularly: ====================================================== [ INFO: possible circular locking dependency detected ] 4.5.0-rc3-ceph-00790-g2364ac5 #1 Not tainted ------------------------------------------------------- tp_fstore_op/25647 is trying to acquire lock: (&sb->s_type->i_mutex_key#19){+.+.+.}, at: [] xfs_file_buffered_aio_write+0x6d/0x300 [xfs] #012but task is already holding lock: (&pipe->mutex/1){+.+.+.}, at: [] pipe_lock+0x1d/0x20 #012which lock already depends on the new lock. #012the existing dependency chain (in reverse order) is: #012-> #2 (&pipe->mutex/1){+.+.+.}: [] lock_acquire+0x162/0x1b0 [] mutex_lock_nested+0x79/0x380 [] pipe_lock+0x1d/0x20 [] splice_to_pipe+0x30/0x250 [] __generic_file_splice_read+0x4f9/0x620 [] generic_file_splice_read+0x3e/0x70 [] xfs_file_splice_read+0x194/0x220 [xfs] [] do_splice_to+0x6a/0x80 [] SyS_splice+0x6c1/0x720 [] entry_SYSCALL_64_fastpath+0x12/0x76 #012-> #1 (&(&ip->i_iolock)->mr_lock){++++++}: [] lock_acquire+0x162/0x1b0 [] down_write_nested+0x4f/0x80 [] xfs_ilock+0xed/0x1b0 [xfs] [] xfs_vn_setattr+0x30/0x70 [xfs] [] notify_change+0x1ed/0x320 [] do_truncate+0x7c/0xc0 [] do_sys_ftruncate.constprop.12+0x153/0x170 [] SyS_ftruncate+0xe/0x10 [] entry_SYSCALL_64_fastpath+0x12/0x76 #012-> #0 (&sb->s_type->i_mutex_key#19){+.+.+.}: [] __lock_acquire+0x13be/0x1e30 [] lock_acquire+0x162/0x1b0 [] mutex_lock_nested+0x79/0x380 [] xfs_file_buffered_aio_write+0x6d/0x300 [xfs] [] xfs_file_write_iter+0x95/0x140 [xfs] [] vfs_iter_write+0x75/0xb0 [] iter_file_splice_write+0x281/0x3a0 [] SyS_splice+0x4da/0x720 [] entry_SYSCALL_64_fastpath+0x12/0x76 #012other info that might help us debug this: Chain exists of:#012 &sb->s_type->i_mutex_key#19 --> &(&ip->i_iolock)->mr_lock --> &pipe->mutex/1 Possible unsafe locking scenario: CPU0 CPU1 ---- ---- lock(&pipe->mutex/1); lock(&(&ip->i_iolock)->mr_lock); lock(&pipe->mutex/1); lock(&sb->s_type->i_mutex_key#19); #012 *** DEADLOCK *** 2 locks held by tp_fstore_op/25647: #0: (sb_writers#15){.+.+.+}, at: [] __sb_start_write+0xad/0xe0 #1: (&pipe->mutex/1){+.+.+.}, at: [] pipe_lock+0x1d/0x20 #012stack backtrace: CPU: 4 PID: 25647 Comm: tp_fstore_op Not tainted 4.5.0-rc3-ceph-00790-g2364ac5 #1 Hardware name: Supermicro SYS-5018R-WR/X10SRW-F, BIOS 1.0c 09/07/2015 0000000000000086 00000000547c0aa5 ffff880858c0bad8 ffffffff813f8661 ffffffff827127a0 ffffffff82711870 ffff880858c0bb18 ffffffff811c5d39 ffff880858c0bb70 ffff8808530288d8 0000000000000001 0000000000000002 Call Trace: [] dump_stack+0x85/0xc4 [] print_circular_bug+0x200/0x20e [] __lock_acquire+0x13be/0x1e30 [] lock_acquire+0x162/0x1b0 [] ? xfs_file_buffered_aio_write+0x6d/0x300 [xfs] [] mutex_lock_nested+0x79/0x380 [] ? xfs_file_buffered_aio_write+0x6d/0x300 [xfs] [] ? ttwu_stat+0x19d/0x200 [] xfs_file_buffered_aio_write+0x6d/0x300 [xfs] [] ? mark_held_locks+0x6f/0x80 [] ? trace_hardirqs_on_caller+0x163/0x1d0 [] xfs_file_write_iter+0x95/0x140 [xfs] [] vfs_iter_write+0x75/0xb0 [] iter_file_splice_write+0x281/0x3a0 [] SyS_splice+0x4da/0x720 [] ? do_audit_syscall_entry+0x66/0x70 [] entry_SYSCALL_64_fastpath+0x12/0x76 We're not actually doing racing truncate and splice (or any racing operations for that matter) to the same files, so we don't actually hit this, but the lockdep warning is enough to make our test runs fail, and we'd rather not whitelist this if it's something that should get fixed anyway. My apologies for not raising this sooner; I thought I'd already emailed the list about this a few months ago but it looks think I'd only pinged #xfs. sage From alineb@iwakulitzer.net Sun Mar 20 11:57:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C4E747CA7 for ; Sun, 20 Mar 2016 11:57:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 88090304032 for ; Sun, 20 Mar 2016 09:57:48 -0700 (PDT) X-ASG-Debug-ID: 1458493064-04cbb022e409ba0001-NocioJ Received: from sr30.firestorm.ch (sr30.firestorm.ch [62.146.152.53]) by cuda.sgi.com with ESMTP id guGVESPoUGxQGFu3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sun, 20 Mar 2016 09:57:45 -0700 (PDT) X-Barracuda-Envelope-From: alineb@iwakulitzer.net X-Barracuda-Apparent-Source-IP: 62.146.152.53 Received: from sr30.firestorm.ch (sr30.firestorm.ch [IPv6:::1]) by sr30.firestorm.ch (Postfix) with ESMTPSA id EBD2B3502FF9; Sun, 20 Mar 2016 17:37:57 +0100 (CET) Received: from 197.234.219.74 ([197.234.219.74]) by webmail.iwakulitzer.net (Horde Framework) with HTTP; Sun, 20 Mar 2016 16:37:57 +0000 Date: Sun, 20 Mar 2016 16:37:57 +0000 Message-ID: <20160320163757.Horde.75wAKd_wspR9oq-6XjkbIBi@webmail.iwakulitzer.net> From: Mme Aline BORDERIE To: Subject: Bien =?utf-8?b?QWltw6ll?= User-Agent: Horde Application Framework 5 X-ASG-Orig-Subj: Bien =?utf-8?b?QWltw6ll?= Content-Type: text/plain; charset=utf-8; format=flowed; DelSp=Yes MIME-Version: 1.0 Content-Disposition: inline Content-Transfer-Encoding: 8bit X-PPP-Message-ID: <20160320163758.45700.1533@sr30.firestorm.ch> X-PPP-Vhost: iwakulitzer.net X-Barracuda-Connect: sr30.firestorm.ch[62.146.152.53] X-Barracuda-Start-Time: 1458493064 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.20 X-Barracuda-Spam-Status: No, SCORE=0.20 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC7_SA298e, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28007 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 TO_CC_NONE No To: or Cc: header 0.20 BSF_SC7_SA298e Custom Rule SA298e Bonjour Très Cher(e), Permettez-moi avant tout propos de me présenter à vous. A l'état civil je suis Mme Aline BORDERIE (veuf François), née en Février 1955 a M'BOUR (SEN). C'est avec un cœur plein de désespoir que je vous adresse ce courriel afin de solliciter votre accord pour la réalisation d'une donation. En effet, je souffre d'une forme rare d'un cancer de la gorge qui dure depuis plusieurs années et très récemment les tests médicaux effectués ont malheureusement révélé que je n'ai plus vraiment longtemps à vivre parce que le mal qui me ronge est en phase terminale. Face donc à cette terrible et douloureuse situation, j'ai décidé de faire don de tout ce que je possède car je suis veuf depuis quelques années et malheureusement je n’ai jamais eu la chance d'avoir un enfant. Actuellement, je dispose encore d'une importante somme d'argent qui se trouve sur un compte domicilié dans une banque d'affaires basée en Afrique de L'ouest précisément en République du Bénin où ma défunt mari et moi possédions une unité de transformation de noix de cajou. Je souhaite de tout cœur vous léguer une partie de cette somme afin que vous puissiez en disposer pour financer des projets d'appui et d'aide aux personnes en difficultés et/ou soutenir des œuvres de charité. Je tiens tout particulièrement à ce que cet argent serve à atténuer un temps soit peu les souffrances de quelques personnes défavorisées. En conséquence si vous vous en sentez capable, Contactez-moi a mon adresse e mail personnelle : borderiealine1@gmail.com Recevez mes cordiales salutations. Mme Aline BORDERIE From david@fromorbit.com Sun Mar 20 16:59:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B0E847CA1 for ; Sun, 20 Mar 2016 16:59:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 28ED7AC001 for ; Sun, 20 Mar 2016 14:59:10 -0700 (PDT) X-ASG-Debug-ID: 1458511138-04cbb022e619780001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id nTaGxHBSHnNR1Y1a for ; Sun, 20 Mar 2016 14:58: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: A2CGCQCIHO9WPFEqLHldgzNTcoJtozkBAQEGjAaDSIYiI4VkAgIBAQKBH00BAQEBAQEHAQEBAUFAhEEBAQEDATocIwULCAMYCSUPBSUDBxoTiB8HD74/AQEIAgEdGYU9hQyCW4c3BZMEhFOFcYgJjxFEjkKEWyguAYoUAQEB Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Mar 2016 08:28:58 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ahlNA-0008Pm-UV; Mon, 21 Mar 2016 08:58:57 +1100 Date: Mon, 21 Mar 2016 08:58:56 +1100 From: Dave Chinner To: "Richard W.M. Jones" Cc: Eric Sandeen , xfs@oss.sgi.com Subject: Re: xfs_growfs causing "Metadata corruption detected at xfs_agf_read_verify" Message-ID: <20160320215856.GO30721@dastard> X-ASG-Orig-Subj: Re: xfs_growfs causing "Metadata corruption detected at xfs_agf_read_verify" References: <20160317224803.GA8856@redhat.com> <56EB35F8.1030601@sandeen.net> <20160318123107.GB8856@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160318123107.GB8856@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: 1458511138 X-Barracuda-URL: https://192.48.176.25:443/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=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28012 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Mar 18, 2016 at 12:31:07PM +0000, Richard W.M. Jones wrote: > On Thu, Mar 17, 2016 at 05:55:52PM -0500, Eric Sandeen wrote: > > On 3/17/16 5:48 PM, Richard W.M. Jones wrote: > > > > > > With recent kernels (or maybe xfsprogs?) we've noticed strange > > > filesystem corruption after using xfs_growfs. > > > > > > Examples: > > > > > > https://bugzilla.redhat.com/show_bug.cgi?id=1315895 (on aarch64) > > > https://www.redhat.com/archives/libguestfs/2016-March/msg00113.html (x86_64) > > > https://rwmj.wordpress.com/2015/11/04/virt-builder-fedora-23-image/#comment-15668 (x86_64) > > > > > > Do these errors look familiar? I don't yet have a simple test case, > > > still working on that. > > > > try: > > http://oss.sgi.com/pipermail/xfs/2016-March/047683.html > > I've tried this patch now, but I still can't get a solid reproducer > (one that doesn't involve using aarch64). > > I just tried to create a filesystem on kernel 4.6.0, grow it on 4.6.0, > then copy it to another machine with 4.4.4. However that didn't > reproduce the bug, so I couldn't verify if the patch fixes the bug. > (Maybe 4.4.4 is too new?) 4.4.4 has the fix already in it, through the stable kernel backport process. i.e. the original kernel commit had this in it: cc: # 3.10 - 4.4 And so the fix is automatically appearing in stable kernels as they are released. Hence the number of current supported kernels you can reproduce this on is shrinking.... > Can you help me to understand under what circumstances this bug would > appear, as far as you understand what's happening? Take a stock 4.5.0 kernel, mkfs, mount, growfs, unmount go back to a stock 4.4.0 kernel, mount (fails), xfs_repair v4.3.0 (warns, fixes), xfs_repair v4.5.0 (clean, fixes). Cheers, Dave. -- Dave Chinner david@fromorbit.com From info@etpgroup.com Sun Mar 20 17:01:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.4 required=5.0 tests=HTML_MESSAGE, REPLYTO_WITHOUT_TO_CC 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 1B4527CA1 for ; Sun, 20 Mar 2016 17:01:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D465C8F8039 for ; Sun, 20 Mar 2016 15:01:23 -0700 (PDT) X-ASG-Debug-ID: 1458511272-04cbb022e419bc0001-NocioJ Received: from mail.etpgroup.com (mail.etpgroup.com [208.106.182.143]) by cuda.sgi.com with ESMTP id 6d6EieicBEaD3spT; Sun, 20 Mar 2016 15:01:12 -0700 (PDT) X-Barracuda-Envelope-From: info@etpgroup.com X-Barracuda-Apparent-Source-IP: 208.106.182.143 Received: by mail.etpgroup.com via HTTP; Mon, 21 Mar 2016 02:01:00 +0530 From: "Info" To: Subject: Good Day Date: Mon, 21 Mar 2016 02:01:00 +0530 X-ASG-Orig-Subj: Good Day Reply-To: fferan452@gmail.com Message-ID: <539ebd2a$47c1075$4d30cd8b$@com> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0001_594CA53A.48EAF6CB" X-Originating-IP: [154.66.59.196] X-Barracuda-Connect: mail.etpgroup.com[208.106.182.143] X-Barracuda-Start-Time: 1458511272 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.20 X-Barracuda-Spam-Status: No, SCORE=0.20 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC7_SA298e, HTML_MESSAGE, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28012 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.00 TO_CC_NONE No To: or Cc: header 0.20 BSF_SC7_SA298e Custom Rule SA298e This is a multipart message in MIME format. ------=_NextPart_000_0001_594CA53A.48EAF6CB Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Foundation De France has pick you Email. ------=_NextPart_000_0001_594CA53A.48EAF6CB Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable =

Foundation De France has p= ick you Email.
------=_NextPart_000_0001_594CA53A.48EAF6CB-- From david@fromorbit.com Sun Mar 20 18:18:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9A1EC7CA1 for ; Sun, 20 Mar 2016 18:18:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2DAA3AC001 for ; Sun, 20 Mar 2016 16:18:34 -0700 (PDT) X-ASG-Debug-ID: 1458515911-04bdf0756313cb0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Y4Mno4bKqFxrRHgo for ; Sun, 20 Mar 2016 16:18:32 -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: A2AlCQBhL+9WPFEqLHldgzOBRYJtg3mfQAEBAQaMBolqhgcEAgKBHE0BAQEBAQEHAQEBAUFAhEEBAQEDAScTHCMFCwgDDgoJJQ8FJQMHGhOIHwe+RQEBCAIeGYU9hQyKEgWXV4hjhReBb4dxhTGPBoRbKC6KFQEBAQ Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Mar 2016 09:46:39 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ahmaM-0008Uz-Q8; Mon, 21 Mar 2016 10:16:38 +1100 Date: Mon, 21 Mar 2016 10:16:38 +1100 From: Dave Chinner To: Sage Weil Cc: xfs@oss.sgi.com Subject: Re: splice vs truncate lockdep splat Message-ID: <20160320231638.GP30721@dastard> X-ASG-Orig-Subj: Re: splice vs truncate lockdep splat References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1458515912 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28014 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sun, Mar 20, 2016 at 09:43:01AM -0400, Sage Weil wrote: > Hi all, > > For the last few kernel releases we've been seeing this pretty regularly: > [snip] Yup, splice still has locking problems. Always has, and the write_iter rework a few releases ago just moved the warnings elsewhere. > #012-> #2 (&pipe->mutex/1){+.+.+.}: xfs_file_splice_read xfs_iolock(XFS_IOLOCK_SHARED) .... pipe_lock(pipe) XFS takes the XFS_IOLOCK_SHARED here to serialise splice read against truncate. > #012-> #1 (&(&ip->i_iolock)->mr_lock){++++++}: mutex_lock(inode->i_mutex) .... xfs_vn_setattr xfs_iolock(XFS_IOLOCK_EXCL) Truncate lock order for IO serialisation (no pipe lock). > #012-> #0 (&sb->s_type->i_mutex_key#19){+.+.+.}: iter_file_splice_write pipe_lock(pipe) xfs_file_buffered_aio_write mutex_lock(inode->i_mutex) xfs_iolock(XFS_IOLOCK_EXCL) XFS takes i_mutex (required for buffered IO path) and XFS_IOLOCK_EXCL (for atomic write semantics and truncate exclusion), but the splice write path has put this under the pipe lock.... i.e. because the read/write path take the IOLOCK different ways, lockdep seems to think it's OK. Hence IO testing doesn't report issues, but the moment you throw in another operation that takes both the i_mutex and XFS_IOLOCK_EXCL, lockdep will through a lock order violation report. > We're not actually doing racing truncate and splice (or any racing > operations for that matter) to the same files, so we don't actually hit > this, but the lockdep warning is enough to make our test runs fail, and > we'd rather not whitelist this if it's something that should get fixed > anyway. We can't fix it in XFS - the high level splice infrastructure which that read IO serialisation is done entirely based on page cache page locking and so can hold the pipe lock across ->splice_read callouts. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Mar 20 18:30:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 244C97CA1 for ; Sun, 20 Mar 2016 18:30:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id EBD1A304048 for ; Sun, 20 Mar 2016 16:30:06 -0700 (PDT) X-ASG-Debug-ID: 1458516599-04cbb022e424820001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id ab8ygbW9L2W0yFDZ for ; Sun, 20 Mar 2016 16:30:00 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AkCQDCMe9WPFEqLHldgzOBRYJtg3mfQAEBAQaMBolqhgcEAgKBHU0BAQEBAQEHAQEBAUFAhEIBAQQnExwjEAgDDgoJJQ8FJQMHGhOIJr5AAQEIAh4ZhT2FDIoSBZdXiGOFF4Fvh3GFMY8GhFsoLooVAQEB Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Mar 2016 09:59:40 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ahmmx-0008W4-Sj; Mon, 21 Mar 2016 10:29:39 +1100 Date: Mon, 21 Mar 2016 10:29:39 +1100 From: Dave Chinner To: Sage Weil Cc: xfs@oss.sgi.com Subject: Re: splice vs truncate lockdep splat Message-ID: <20160320232939.GQ30721@dastard> X-ASG-Orig-Subj: Re: splice vs truncate lockdep splat References: <20160320231638.GP30721@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160320231638.GP30721@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1458516600 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28015 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Mar 21, 2016 at 10:16:38AM +1100, Dave Chinner wrote: > On Sun, Mar 20, 2016 at 09:43:01AM -0400, Sage Weil wrote: > > Hi all, > > > > For the last few kernel releases we've been seeing this pretty regularly: > > > > [snip] > > Yup, splice still has locking problems. Always has, and the > write_iter rework a few releases ago just moved the warnings > elsewhere. > > > #012-> #2 (&pipe->mutex/1){+.+.+.}: > > xfs_file_splice_read > xfs_iolock(XFS_IOLOCK_SHARED) > .... > pipe_lock(pipe) > > XFS takes the XFS_IOLOCK_SHARED here to serialise splice read > against truncate. > > > #012-> #1 (&(&ip->i_iolock)->mr_lock){++++++}: > > mutex_lock(inode->i_mutex) > .... > xfs_vn_setattr > xfs_iolock(XFS_IOLOCK_EXCL) > > Truncate lock order for IO serialisation (no pipe lock). > > > #012-> #0 (&sb->s_type->i_mutex_key#19){+.+.+.}: > > iter_file_splice_write > pipe_lock(pipe) > xfs_file_buffered_aio_write > mutex_lock(inode->i_mutex) > xfs_iolock(XFS_IOLOCK_EXCL) > > XFS takes i_mutex (required for buffered IO path) and > XFS_IOLOCK_EXCL (for atomic write semantics and truncate exclusion), > but the splice write path has put this under the pipe lock.... > > i.e. because the read/write path take the IOLOCK different ways, > lockdep seems to think it's OK. Hence IO testing doesn't report > issues, but the moment you throw in another operation that takes > both the i_mutex and XFS_IOLOCK_EXCL, lockdep will through a lock > order violation report. > > > We're not actually doing racing truncate and splice (or any racing > > operations for that matter) to the same files, so we don't actually hit > > this, but the lockdep warning is enough to make our test runs fail, and > > we'd rather not whitelist this if it's something that should get fixed > > anyway. > > We can't fix it in XFS - the high level splice infrastructure which > that read IO serialisation is done entirely based on page cache page > locking and so can hold the pipe lock across ->splice_read callouts. ^^^^^^^^^^^ vfs_iter_write() Got my read and write callouts mixed up there. (i.e. splice_read is assumed to have no filesystem locking above the pipe lock, so it is assumed to be safe to take inode locks in vfs_iter_write() whilst under the pipe lock). Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Mar 20 21:07:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 75BBC7CA0 for ; Sun, 20 Mar 2016 21:07:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1F2DF8F8049 for ; Sun, 20 Mar 2016 19:06:59 -0700 (PDT) X-ASG-Debug-ID: 1458526015-04bdf075631b000001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id m5vXFVNBzocByWF6 for ; Sun, 20 Mar 2016 19:06:55 -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: A2DgBwBSVu9WPFEqLHlegzRTcoZmnyYCFgEBBAaBD4p3hV6EDBmFbgICAQGBH00BAQEBAQEHAQEBAUFAhG8THCMYFw00BSUDBy2IJr5oGYU9iRYMC0eFKgWHXQMChwqEGIRThXGICYFvhEqIVgKGDoh4gmIDGYFdKC6IWgEfgRsBAQE Received: from ppp121-44-42-81.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.81]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Mar 2016 12:35:06 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ahpDN-0000G1-C9; Mon, 21 Mar 2016 13:05:05 +1100 Date: Mon, 21 Mar 2016 13:05:05 +1100 From: Dave Chinner To: torvalds@linux-foundation.org Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, jack@suse.cz, tytso@mit.edu Subject: [GIT PULL] xfs: updates for 4.6-rc1 Message-ID: <20160321020505.GJ11812@dastard> X-ASG-Orig-Subj: [GIT PULL] xfs: updates for 4.6-rc1 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: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1458526015 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28018 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi Linus, Can you please pull the XFS update from the location below? There's quite a lot in this request, and there's some cross-over with ext4, dax and quota code due to the nature of the changes being made. There are conflicts with the ext4 code that has already been merged this cycle. Ted didn't pull the stable xfs-dio-fixes-4.6 branch with the DIO completion unwritten extent error handling fixes before merging a rework of the ext4 unwritten extent code, so there's a bunch of non-trivial conflicts in that. The quota changes don't appear to have created any conflicts at this point - I think Jan pulled the stable xfs-get-next-dquot-4.6 branch to base his further work on that, so I don't expect merge problems here. Finally, there's a merge conflict between the XFS writepages rework and the DAX flushing fixes that were merged in 4.5-rc6. That's a trivial conflict to resolve, though. I've attached the merge resolution diff from my local test merge at the end after the pull-req output - the XFS part is correct, but I'm not sure about the ext4 parts of it. If you need confirmation as to whether that is the correct resolution, then Ted and/or Jan (cc'd) will need to look at it.... As for the rest of the XFS changes, there are lots of little things all over the place, which add up to a lot of changes in the end. The major changes are that we've reduced the size of the struct xfs_inode by ~100 bytes (gives an inode cache footprint reduction of >10%), the writepage code now only does a single set of mapping tree lockups so uses less CPU, delayed allocation reservations won't overrun under random write loads anymore, and we added compile time verification for on-disk structure sizes so we find out when a commit or platform/compiler change breaks the on disk structure as early as possible. Cheers, Dave. The following changes since commit 7f6aff3a29b08fc4234c8136eb1ac31b4897522c: xfs: only run torn log write detection on dirty logs (2016-03-07 08:22:22 +1100) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git tags/xfs-for-linus-4.6-rc1 for you to fetch changes up to 2cdb958aba6afbced5bc563167813b972b6acbfe: Merge branch 'xfs-misc-fixes-4.6-4' into for-next (2016-03-15 11:44:35 +1100) ---------------------------------------------------------------- xfs: Changes for 4.6-rc1 Change summary: o error propagation for direct IO failures fixes for both XFS and ext4 o new quota interfaces and XFS implementation for iterating all the quota IDs in the filesystem o locking fixes for real-time device extent allocation o reduction of duplicate information in the xfs and vfs inode, saving roughly 100 bytes of memory per cached inode. o buffer flag cleanup o rework of the writepage code to use the generic write clustering mechanisms o several fixes for inode flag based DAX enablement o rework of remount option parsing o compile time verification of on-disk format structure sizes o delayed allocation reservation overrun fixes o lots of little error handling fixes o small memory leak fixes o enable xfsaild freezing again ---------------------------------------------------------------- Brian Foster (6): xfs: clean up unwritten buffers on write failure xfs: fix xfs_log_ticket leak in xfs_end_io() after fs shutdown xfs: debug mode forced buffered write failure xfs: update freeblocks counter after extent deletion xfs: refactor delalloc indlen reservation split into helper xfs: borrow indirect blocks from freed extent when available Carlos Maiolino (1): xfs: Split default quota limits by quota type Christoph Hellwig (8): direct-io: always call ->end_io if non-NULL xfs: don't use ioends for direct write completions xfs: fold xfs_vm_do_dio into xfs_vm_direct_IO xfs: handle errors from ->free_blocks in xfs_btree_kill_iroot xfs: factor btree block freeing into a helper xfs: move buffer invalidation to xfs_btree_free_block xfs: remove xfs_trans_get_block_res xfs: always set rvalp in xfs_dir2_node_trim_free Colin Ian King (1): xfs: fix format specifier , should be %llx and not %llu Darrick J. Wong (5): xfs: move struct xfs_attr_shortform to xfs_da_format.h xfs: fix computation of inode btree maxlevels xfs: use named array initializers for log item dumping xfs: ioends require logically contiguous file offsets xfs: check sizes of XFS on-disk structures at compile time Dave Chinner (41): xfs: lock rt summary inode on allocation xfs: RT bitmap and summary buffers are not typed xfs: RT bitmap and summary buffers need verifiers xfs: introduce inode log format object xfs: remove timestamps from incore inode xfs: cull unnecessary icdinode fields xfs: move v1 inode conversion to xfs_inode_from_disk xfs: reinitialise recycled VFS inode correctly xfs: use vfs inode nlink field everywhere xfs: move inode generation count to VFS inode xfs: move di_changecount to VFS inode xfs: mode di_mode to vfs inode xfs: remove XBF_DONE flag wrapper macros xfs: remove XBF_ASYNC flag wrapper macros xfs: remove XBF_READ flag wrapper macros xfs: remove XBF_WRITE flag wrapper macros xfs: remove XBF_STALE flag wrapper macros xfs: remove XFS_BUF_ZEROFLAGS macro xfs: remove nonblocking mode from xfs_vm_writepage xfs: remove xfs_cancel_ioend xfs: Introduce writeback context for writepages xfs: xfs_cluster_write is redundant xfs: factor mapping out of xfs_do_writepage xfs: don't chain ioends during writepage submission xfs: XFS_DIFLAG_DAX is only for regular files or directories xfs: S_DAX is only for regular files xfs: dynamically switch modes when XFS_DIFLAG2_DAX is set/cleared xfs: XFS_DIFLAG2_DAX limited by PAGE_SIZE xfs: reinitialise per-AG structures if geometry changes during recovery Merge branch 'xfs-torn-log-fixes-4.5' into for-next Merge branch 'xfs-rt-fixes-4.6' into for-next Merge branch 'xfs-get-next-dquot-4.6' into for-next Merge branch 'xfs-dio-fix-4.6' into for-next Merge branch 'xfs-misc-fixes-4.6' into for-next Merge branch 'xfs-gut-icdinode-4.6' into for-next Merge branch 'xfs-buf-macro-cleanup-4.6' into for-next Merge branch 'xfs-writepage-rework-4.6' into for-next Merge branch 'xfs-dax-fixes-4.6' into for-next Merge branch 'xfs-misc-fixes-4.6-2' into for-next Merge branch 'xfs-misc-fixes-4.6-3' into for-next Merge branch 'xfs-misc-fixes-4.6-4' into for-next Eric Sandeen (12): quota: remove unused cmd argument from quota_quotaon() quota: add new quotactl Q_XGETNEXTQUOTA quota: add new quotactl Q_GETNEXTQUOTA xfs: don't overflow quota ID when initializing dqblk xfs: get quota inode from mp & flags rather than dqp xfs: Factor xfs_seek_hole_data into helper xfs: wire up Q_XGETNEXTQUOTA / get_nextdqblk xfs: remove unused function definitions xfs: convert mount option parsing to tokens xfs: sanitize remount options xfs: fix up inode32/64 (re)mount handling xfs: ensure committed is initialized in xfs_trans_roll Jan Kara (1): ext4: Fix data exposure after failed AIO DIO Luis de Bethencourt (1): xfs: remove impossible condition Mateusz Guzik (1): xfs: fix two memory leaks in xfs_attr_list.c error paths Michal Hocko (1): xfs: Make xfsaild freezeable again fs/dax.c | 9 +- fs/direct-io.c | 9 +- fs/ext4/ext4.h | 30 +- fs/ext4/inode.c | 24 +- fs/ext4/page-io.c | 10 - fs/ocfs2/aops.c | 7 +- fs/quota/quota.c | 66 ++- fs/xfs/libxfs/xfs_alloc_btree.c | 2 - fs/xfs/libxfs/xfs_attr_sf.h | 16 - fs/xfs/libxfs/xfs_bmap.c | 172 +++++-- fs/xfs/libxfs/xfs_bmap_btree.c | 5 +- fs/xfs/libxfs/xfs_btree.c | 32 +- fs/xfs/libxfs/xfs_da_format.h | 16 + fs/xfs/libxfs/xfs_dir2.c | 12 +- fs/xfs/libxfs/xfs_dir2_node.c | 4 +- fs/xfs/libxfs/xfs_ialloc.c | 4 +- fs/xfs/libxfs/xfs_ialloc_btree.c | 12 +- fs/xfs/libxfs/xfs_inode_buf.c | 170 ++++--- fs/xfs/libxfs/xfs_inode_buf.h | 38 +- fs/xfs/libxfs/xfs_inode_fork.c | 3 +- fs/xfs/libxfs/xfs_log_format.h | 19 +- fs/xfs/libxfs/xfs_quota_defs.h | 3 +- fs/xfs/libxfs/xfs_rtbitmap.c | 32 +- fs/xfs/libxfs/xfs_sb.h | 1 - fs/xfs/libxfs/xfs_shared.h | 1 + fs/xfs/xfs_aops.c | 1016 ++++++++++++++------------------------ fs/xfs/xfs_aops.h | 4 +- fs/xfs/xfs_attr_list.c | 19 +- fs/xfs/xfs_bmap_util.c | 8 +- fs/xfs/xfs_buf.c | 2 +- fs/xfs/xfs_buf.h | 26 +- fs/xfs/xfs_buf_item.c | 10 +- fs/xfs/xfs_dir2_readdir.c | 2 +- fs/xfs/xfs_discard.c | 2 +- fs/xfs/xfs_dquot.c | 129 ++++- fs/xfs/xfs_export.c | 2 +- fs/xfs/xfs_file.c | 88 ++-- fs/xfs/xfs_filestream.c | 4 +- fs/xfs/xfs_fsops.h | 1 - fs/xfs/xfs_icache.c | 43 +- fs/xfs/xfs_inode.c | 174 +++---- fs/xfs/xfs_inode.h | 10 +- fs/xfs/xfs_inode_item.c | 82 ++- fs/xfs/xfs_ioctl.c | 121 ++++- fs/xfs/xfs_iops.c | 59 +-- fs/xfs/xfs_itable.c | 22 +- fs/xfs/xfs_log.c | 152 +++--- fs/xfs/xfs_log_recover.c | 101 ++-- fs/xfs/xfs_mount.c | 24 +- fs/xfs/xfs_mount.h | 31 +- fs/xfs/xfs_ondisk.h | 117 +++++ fs/xfs/xfs_qm.c | 55 ++- fs/xfs/xfs_qm.h | 48 +- fs/xfs/xfs_qm_syscalls.c | 27 +- fs/xfs/xfs_quotaops.c | 36 +- fs/xfs/xfs_rtalloc.c | 2 +- fs/xfs/xfs_super.c | 528 +++++++++++--------- fs/xfs/xfs_super.h | 4 +- fs/xfs/xfs_sysfs.c | 78 ++- fs/xfs/xfs_trace.h | 9 +- fs/xfs/xfs_trans.c | 4 +- fs/xfs/xfs_trans.h | 1 - fs/xfs/xfs_trans_ail.c | 5 +- fs/xfs/xfs_trans_buf.c | 10 +- fs/xfs/xfs_trans_dquot.c | 15 +- fs/xfs/xfs_trans_inode.c | 14 +- include/linux/fs.h | 2 +- include/linux/quota.h | 2 + include/uapi/linux/dqblk_xfs.h | 1 + include/uapi/linux/quota.h | 14 + 70 files changed, 2198 insertions(+), 1603 deletions(-) create mode 100644 fs/xfs/xfs_ondisk.h commit 05f470851a43827f51e7acb12282793a795f0690 Merge: 46e595a 2cdb958 Author: Dave Chinner Date: Mon Mar 21 12:14:09 2016 +1100 Merge branch 'for-next' into test-merge diff --cc fs/ext4/inode.c index b2e9576,2b98171..e5ba3b0 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@@ -3289,10 -3161,10 +3289,10 @@@ out } #endif - static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset, + static int ext4_end_io_dio(struct kiocb *iocb, loff_t offset, ssize_t size, void *private) { - ext4_io_end_t *io_end = iocb->private; + ext4_io_end_t *io_end = private; /* if not async direct IO just return */ if (!io_end) @@@ -3300,8 -3172,18 +3300,17 @@@ ext_debug("ext4_end_io_dio(): io_end 0x%p " "for inode %lu, iocb 0x%p, offset %llu, size %zd\n", - iocb->private, io_end->inode->i_ino, iocb, offset, - size); + io_end, io_end->inode->i_ino, iocb, offset, size); + iocb->private = NULL; + /* + * Error during AIO DIO. We cannot convert unwritten extents as the + * data was not written. Just clear the unwritten flag and drop io_end. + */ + if (size <= 0) { + ext4_clear_io_unwritten_flag(io_end); + size = 0; + } io_end->offset = offset; io_end->size = size; ext4_put_io_end(io_end); diff --cc fs/xfs/xfs_aops.c index 5c57b7b,7ba680e..d445a64 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@@ -1207,12 -1006,16 +1006,20 @@@ xfs_vm_writepages struct address_space *mapping, struct writeback_control *wbc) { + struct xfs_writepage_ctx wpc = { + .io_type = XFS_IO_INVALID, + }; + int ret; + xfs_iflags_clear(XFS_I(mapping->host), XFS_ITRUNCATED); + if (dax_mapping(mapping)) + return dax_writeback_mapping_range(mapping, + xfs_find_bdev_for_inode(mapping->host), wbc); + - return generic_writepages(mapping, wbc); + ret = write_cache_pages(mapping, wbc, xfs_do_writepage, &wpc); + if (wpc.ioend) + ret = xfs_submit_ioend(wbc, wpc.ioend, ret); + return ret; } /* -- Dave Chinner david@fromorbit.com From sonia.mandelbrott@gmail.com Sun Mar 20 23:57:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 1749F7CA0 for ; Sun, 20 Mar 2016 23:57:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7B260AC003 for ; Sun, 20 Mar 2016 21:57:43 -0700 (PDT) X-ASG-Debug-ID: 1458536259-04cbb022e741540001-NocioJ Received: from mail-lf0-f66.google.com (mail-lf0-f66.google.com [209.85.215.66]) by cuda.sgi.com with ESMTP id 9hA8nN6YdvGCr84N (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 20 Mar 2016 21:57:41 -0700 (PDT) X-Barracuda-Envelope-From: sonia.mandelbrott@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.215.66 Received: by mail-lf0-f66.google.com with SMTP id h198so9003721lfh.3 for ; Sun, 20 Mar 2016 21:57:41 -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; bh=Hoitq+nLAh7IoUxkysrsXLqi8acTkrN001d+VSNdBek=; b=LvFq1XSmAQDNqbgazbPpeiBYaJsD7vTMUx8HbJ9Gb34Hp8AaIM/3M4n+irlzUP/N8w 55hkyq75XgEBvUVeA3ZnNfATHEvhI2c5atAm8G2y+2CBXmusWzJy5dLCTuG6yASVtIbe hVVG+wSzrTgwLvPgyfePXpKzDwu3Y9F7q+4BSECWspLuo+Y9Skwd3vyBa8mEJA32Mr/z AyJn8swYmkE3Rfca8/3d0eAZBI0yTNScwFv4ob4Qm/pnQkQkZh4EFTnruNWVU1Jlx0c7 dN9lXwCn/laLrWHvOtCWpV1gTPnO6lmoqYBea5cTv9pE6sl9iSaayiKekLtJZhFwX9bR sKnw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to; bh=Hoitq+nLAh7IoUxkysrsXLqi8acTkrN001d+VSNdBek=; b=fOW3NNaPEVtoXzDAOyx3PRPb3hnrOqg07CKfadN1jI8nbaH+JA1EXdvmDUQvXasQu6 dq8saYrdy08MyFTmdHGaly9CDrU0nobVYb8dxfTfmNlaghAWpoM9TRbwiO8Ufg7zXCrR FE6Rh/V50wmLuLDk079PB4JCFSiWQgtiHRtMJyTz1d1Ce7Lw6P2qUrUq7Hn7ZySfIMas uXmil+j9wb6bzKhxK65xhYEe6Rq7JMH0BNWyfWNw36zyR1dnd9ouSKnMXiV/FHQE5T8S te50qHWmlvx1lBRKNUf+9SNdCY7iBVtmCk5+75hZMgBMZdEgZ9r3QKFaIeKdQ1Pn31vP AhVg== X-Gm-Message-State: AD7BkJLs9MkeoeLmbfQH8gZlQNIXXe4YvkDU65zcuXMbGFYm1evmmsGeWMQniLT8w8Yq/sTntYk8SeEfnejMoA== MIME-Version: 1.0 X-Received: by 10.25.166.65 with SMTP id p62mr11086891lfe.51.1458536259196; Sun, 20 Mar 2016 21:57:39 -0700 (PDT) Received: by 10.112.2.99 with HTTP; Sun, 20 Mar 2016 21:57:39 -0700 (PDT) Date: Mon, 21 Mar 2016 05:57:39 +0100 Message-ID: Subject: obtaining xfstests repository From: Sonia mandelbrott X-ASG-Orig-Subj: obtaining xfstests repository To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a114105049f1c5f052e87efe9 X-Barracuda-Connect: mail-lf0-f66.google.com[209.85.215.66] X-Barracuda-Start-Time: 1458536260 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28021 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 --001a114105049f1c5f052e87efe9 Content-Type: text/plain; charset=UTF-8 Hi. This might sound stupid to you, but I have gotproblem with obtaining xfstests repo. When I try git clone git://oss.sgi.com/xfs/cmds/xfstests I get timeout after several minutes. I think it is problem with ssh keys? Can You possibly guide me step by step what I need to do? Sorry for all the trouble, Sonia --001a114105049f1c5f052e87efe9 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Hi. This might sound stupid to you, but I have gotproblem = with obtaining xfstests repo.=C2=A0
When I try=C2=A0git clone git://oss.sgi.com/xfs/cmds/xfstests
I g= et timeout after several minutes. I think it is problem with ssh keys?
Can You possibly guide me step by step what I need to do?
S= orry for all the trouble,

Sonia
--001a114105049f1c5f052e87efe9-- From david@fromorbit.com Mon Mar 21 01:39:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3FB347CA0 for ; Mon, 21 Mar 2016 01:39:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A3084AC002 for ; Sun, 20 Mar 2016 23:39:14 -0700 (PDT) X-ASG-Debug-ID: 1458542350-04cb6c1e5d24070001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id NVIOE8RWQEYoxsBr for ; Sun, 20 Mar 2016 23:39: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: A2AGBwDElu9W/zGaLHlegzNTcoJtozsBAQEGjAaJahmFbgQCAoEdTQEBAQEBAWUnhEIBAQQ6HCMQCAMYCSUPBSUDIROIJr4cAQseGYU9hQyKEgWXV4VxiAmBWY04jwZig3koLooVAQEB Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail07.adl2.internode.on.net with ESMTP; 21 Mar 2016 17:09:01 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ahtUG-0000ae-RW; Mon, 21 Mar 2016 17:38:48 +1100 Date: Mon, 21 Mar 2016 17:38:48 +1100 From: Dave Chinner To: Sonia mandelbrott Cc: xfs@oss.sgi.com Subject: Re: obtaining xfstests repository Message-ID: <20160321063848.GK11812@dastard> X-ASG-Orig-Subj: Re: obtaining xfstests repository 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: 1458542350 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28023 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Mar 21, 2016 at 05:57:39AM +0100, Sonia mandelbrott wrote: > Hi. This might sound stupid to you, but I have gotproblem with obtaining > xfstests repo. > When I try git clone git://oss.sgi.com/xfs/cmds/xfstests > I get timeout after several minutes. I think it is problem with ssh keys? > Can You possibly guide me step by step what I need to do? > Sorry for all the trouble, Just use this repository: git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git Cheers, Dave. -- Dave Chinner david@fromorbit.com From sonia.mandelbrott@gmail.com Mon Mar 21 02:22:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 53ED67CA0 for ; Mon, 21 Mar 2016 02:22:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2759230404E for ; Mon, 21 Mar 2016 00:22:13 -0700 (PDT) X-ASG-Debug-ID: 1458544929-04cb6c1e5a25770001-NocioJ Received: from mail-lb0-f194.google.com (mail-lb0-f194.google.com [209.85.217.194]) by cuda.sgi.com with ESMTP id zBrQwR6ksubQHC8J (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 21 Mar 2016 00:22:10 -0700 (PDT) X-Barracuda-Envelope-From: sonia.mandelbrott@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.194 Received: by mail-lb0-f194.google.com with SMTP id bc4so10335141lbc.0 for ; Mon, 21 Mar 2016 00:22:10 -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; bh=7G9IAVJxu4zyGz1QIMudV9qN0K4bVLKvsOSw2uLciP0=; b=c5JJTC6lngv0zEd9RzbhDiQWZPrgg7TB1MAEx+LEBnRYB3krv4l+PhSMHfVTv7kK8H lAKZ5pZ0fn/J+avty0Z7wsWIgpVIEQs5flcdIF2LB+UaakRvcTj1DFNhcoVDH6/gE/HS earurd0FZV5pEjh1cERCmgx91b2LwtSb+LFavwS5bZYXfa2Ku6BepmxzMCKb+owWiEUW w3DjhvzhBBNuj4Zexbdz9wZ/FnI6ndhnShnFM7zBxJZfaYStW1LoZ8vh2f0cK83qNNaP 3dwgKngIEbCpmWx6hub1ZZNcIq6O1QOOJ+d+/S4zquZQipbuh/1tujf9VbeO62frIeMN 1Ngg== 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; bh=7G9IAVJxu4zyGz1QIMudV9qN0K4bVLKvsOSw2uLciP0=; b=d31jNdkFsycyKWw7cxJl0iSABa0cJ12Q4xswzuuwkmzNuI6KoG3GF8MlTkNVmyikcE DgtAS5Gmxjlup2YHHK3nYd+Ge4a7dPoKIb4/Plqq9hiGQCUwe45jv7kZXV8yjVNik2B3 TYOGKoGOTw3SMShswCJ8SO1aIbsQZjbqZVTzoyueGGJUShxKDU0ik0F2JX4NqhRTm3lW 42rM87YehG7uGcQcpmI2OvMCiDaeacE/vr+mOMvFGBH1mFNaJnlb5nXfpH2y7WwVENWq OuaRE1YbWrriBUEo+CHQ59quSKdLqgQE7HM7Hdb83+9lgeuZrSnHDD+u1MfQEZpm/HZ/ X8bQ== X-Gm-Message-State: AD7BkJIzzFKdgL3DQ8JNSDx3m7xo7hcVB6oWMbiDXyPHQFh18/k0Oh8LiSBWqyAN4x0n1kX6l+BzwjpP80gr6A== MIME-Version: 1.0 X-Received: by 10.112.150.133 with SMTP id ui5mr9997669lbb.12.1458544929130; Mon, 21 Mar 2016 00:22:09 -0700 (PDT) Received: by 10.112.2.99 with HTTP; Mon, 21 Mar 2016 00:22:09 -0700 (PDT) In-Reply-To: <20160321063848.GK11812@dastard> References: <20160321063848.GK11812@dastard> Date: Mon, 21 Mar 2016 08:22:09 +0100 Message-ID: Subject: Re: obtaining xfstests repository From: Sonia mandelbrott X-ASG-Orig-Subj: Re: obtaining xfstests repository To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=047d7b3a822463d13a052e89f4b1 X-Barracuda-Connect: mail-lb0-f194.google.com[209.85.217.194] X-Barracuda-Start-Time: 1458544930 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28023 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --047d7b3a822463d13a052e89f4b1 Content-Type: text/plain; charset=UTF-8 Thank you for your replies, here is output when used your link: -bash-4.2$ git clone git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git Cloning into 'xfstests-dev'... fatal: unable to connect to git.kernel.org: git.kernel.org[0: 149.20.4.72]: errno=Connection timed out git.kernel.org[1: 199.204.44.194]: errno=Connection timed out git.kernel.org[2: 198.145.20.140]: errno=Connection timed out git.kernel.org[3: 2620:3:c000:a:0:1991:8:25]: errno=Network is unreachable git.kernel.org[4: 2001:4f8:1:10:0:1991:8:25]: errno=Network is unreachable On Mon, Mar 21, 2016 at 7:38 AM, Dave Chinner wrote: > On Mon, Mar 21, 2016 at 05:57:39AM +0100, Sonia mandelbrott wrote: > > Hi. This might sound stupid to you, but I have gotproblem with obtaining > > xfstests repo. > > When I try git clone git://oss.sgi.com/xfs/cmds/xfstests > > I get timeout after several minutes. I think it is problem with ssh keys? > > Can You possibly guide me step by step what I need to do? > > Sorry for all the trouble, > > Just use this repository: > > git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > --047d7b3a822463d13a052e89f4b1 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Thank you for your replies, here is output when used = your link:

Cloning into 'xfstests-dev'= ...
fatal: unable to connect to git.kernel.org:
git.kernel= .org[0: 149.20.4.72]: errno=3DConnection timed out
git.kernel.org[1: 199.204.44.194]: errno=3DConn= ection timed out
git.kernel.org= [2: 198.145.20.140]: errno=3DConnection timed out
git.kernel.org[3: 2620:3:c000:a:0:1991:8:25]: er= rno=3DNetwork is unreachable
gi= t.kernel.org[4: 2001:4f8:1:10:0:1991:8:25]: errno=3DNetwork is unreacha= ble


On Mon, Mar 21, 2016 at 7:38 AM, Dave Chinner <david@fromor= bit.com> wrote:
On Mon, Mar 21, 2016 at 05:57:39AM +0100, Sonia mandelbrott wrote: > Hi. This might sound stupid to you, but I have gotproblem with obtaini= ng
> xfstests repo.
> When I try git clone git://oss.sgi.com/xfs/cmds/xfstests
> I get timeout after several minutes. I think it is problem with ssh ke= ys?
> Can You possibly guide me step by step what I need to do?
> Sorry for all the trouble,

Just use this repository:

git://
git.kernel.org/pub/scm/fs/xfs/xfstests-de= v.git

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com

--047d7b3a822463d13a052e89f4b1-- From eguan@redhat.com Mon Mar 21 02:27:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CCBB57CA0 for ; Mon, 21 Mar 2016 02:27:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9D69B8F8039 for ; Mon, 21 Mar 2016 00:27:38 -0700 (PDT) X-ASG-Debug-ID: 1458545257-04cb6c1e5c25b30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id m0QdnE0Bgh3TdaHE (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 21 Mar 2016 00:27:37 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id DA8B51E50; Mon, 21 Mar 2016 07:27:36 +0000 (UTC) Received: from localhost (dhcp12-128.nay.redhat.com [10.66.12.128] (may be forged)) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2L7RZed013106; Mon, 21 Mar 2016 03:27:36 -0400 Date: Mon, 21 Mar 2016 15:27:35 +0800 From: Eryu Guan To: Sonia mandelbrott Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: obtaining xfstests repository Message-ID: <20160321072735.GB11419@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: obtaining xfstests repository References: <20160321063848.GK11812@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458545257 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Mar 21, 2016 at 08:22:09AM +0100, Sonia mandelbrott wrote: > Thank you for your replies, here is output when used your link: > > -bash-4.2$ git clone git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git > Cloning into 'xfstests-dev'... > fatal: unable to connect to git.kernel.org: > git.kernel.org[0: 149.20.4.72]: errno=Connection timed out > git.kernel.org[1: 199.204.44.194]: errno=Connection timed out > git.kernel.org[2: 198.145.20.140]: errno=Connection timed out > git.kernel.org[3: 2620:3:c000:a:0:1991:8:25]: errno=Network is unreachable > git.kernel.org[4: 2001:4f8:1:10:0:1991:8:25]: errno=Network is unreachable I have no problem cloning both repos, perhaps something went wrong with your network connection? Thanks, Eryu > > On Mon, Mar 21, 2016 at 7:38 AM, Dave Chinner wrote: > > On Mon, Mar 21, 2016 at 05:57:39AM +0100, Sonia mandelbrott wrote: > > Hi. This might sound stupid to you, but I have gotproblem with obtaining > > xfstests repo. > > When I try git clone git://oss.sgi.com/xfs/cmds/xfstests > > I get timeout after several minutes. I think it is problem with ssh keys? > > Can You possibly guide me step by step what I need to do? > > Sorry for all the trouble, > > Just use this repository: > > git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Mon Mar 21 02:30:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 32C5E7CA0 for ; Mon, 21 Mar 2016 02:30:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 99A3DAC001 for ; Mon, 21 Mar 2016 00:30:36 -0700 (PDT) X-ASG-Debug-ID: 1458545429-04cbb022e551590001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id W1RCGU7StNBCiyIW for ; Mon, 21 Mar 2016 00:30: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: A2AGBwCNou9W/zGaLHlegzNTcoJtozsBAQEGjAaJahmFbgQCAoEdTQEBAQEBAWUnhEIBAQQ6HCMQCAMYCSUPBSUDIROIJr4TAQEBBwIeGYU9hQyKEgWXV4VxiAmPEY8GYoN5KC6KFQEBAQ Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail07.adl2.internode.on.net with ESMTP; 21 Mar 2016 18:00:29 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ahuI4-0000fp-BP; Mon, 21 Mar 2016 18:30:16 +1100 Date: Mon, 21 Mar 2016 18:30:16 +1100 From: Dave Chinner To: Sonia mandelbrott Cc: xfs@oss.sgi.com Subject: Re: obtaining xfstests repository Message-ID: <20160321073016.GR30721@dastard> X-ASG-Orig-Subj: Re: obtaining xfstests repository References: <20160321063848.GK11812@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: 1458545429 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28023 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Mar 21, 2016 at 08:22:09AM +0100, Sonia mandelbrott wrote: > Thank you for your replies, here is output when used your link: > > -bash-4.2$ git clone git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git > Cloning into 'xfstests-dev'... > fatal: unable to connect to git.kernel.org: > git.kernel.org[0: 149.20.4.72]: errno=Connection timed out > git.kernel.org[1: 199.204.44.194]: errno=Connection timed out > git.kernel.org[2: 198.145.20.140]: errno=Connection timed out > git.kernel.org[3: 2620:3:c000:a:0:1991:8:25]: errno=Network is unreachable > git.kernel.org[4: 2001:4f8:1:10:0:1991:8:25]: errno=Network is unreachable There's almost certainly a firewall in your way. Try cloning over http. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sonia.mandelbrott@gmail.com Mon Mar 21 02:39:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 D338A7CA0 for ; Mon, 21 Mar 2016 02:39:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 928038F8040 for ; Mon, 21 Mar 2016 00:39:40 -0700 (PDT) X-ASG-Debug-ID: 1458545977-04cbb022e652610001-NocioJ Received: from mail-lb0-f193.google.com (mail-lb0-f193.google.com [209.85.217.193]) by cuda.sgi.com with ESMTP id hY6Vfa8drnV470M9 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 21 Mar 2016 00:39:38 -0700 (PDT) X-Barracuda-Envelope-From: sonia.mandelbrott@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.193 Received: by mail-lb0-f193.google.com with SMTP id wn5so10293440lbb.2 for ; Mon, 21 Mar 2016 00:39:38 -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; bh=qqctkwE4cU25R/kFQ7vDo7+HAOSBjkBf7Ge1/73mzEI=; b=LFXuLW9UIlGyVBKhs0HZ9Nmo0ZNekvSZx6gqrMlAkyCM8NmkDuryFNC4v9BcVC0Xd1 94mNFQGkDTsuBcKrD1a2VKcHf+lMDsEgnr8hJDvUXN+4j0LzfLedaKvNNEl02LqqcQ5t ENM80HhoeANkTJTpjdKGJgMtbgaFH4zTMrHbnFUi0nPOXebfSp+m+0SSdINeENPlDmVs hOMbcoA5c1AWdr0DzY6hRXoPEkzdf7ILhPzOpWo7kGlqgmwweKFQzkfBfWupAcPXwdNm XbUh737m63x0zj7j56ZSx24RCcysfH/pcuyqmE4j+0EH+wMWVrxC8IjpvAv3Xah3eviZ 2Tag== 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; bh=qqctkwE4cU25R/kFQ7vDo7+HAOSBjkBf7Ge1/73mzEI=; b=Wj1ELdWBPWrv97kgfJSb4XDJmnsnShGsn6si6lYnVCjSjjlL9aESTnAL22aRH8SfzS k0HaXgGHG6qqTBSvI3Vg8vx2J2A2YtVKq7wL8Q5bW8ODJRCYH/a5lsL/FBwHlgC8W5Ll 0K3RdxYg0TLwH+WtxSIz1rIyocITvZAniuIWyYZ6ol71ayt65o6+kHzxcwdQ4dugw1Et i41mAhSKOiJybk1NWl2YKanQZ0kQtIfEU0dpXasyO1PHKQVufu6NFdKIkIkq0tDBzR/+ jLDBsKa0D3Ni8VCgvL8nfi2VCc8/pOA47JIqpH1tevtOvrEovaTlbLiFbcGgM7JC2GOz eiWw== X-Gm-Message-State: AD7BkJLP6dvgtXKhX+9pq/XcpeYH6kuJYWJFC+jQtppk+8refsfSDvq+8e7uftjrrCxgVf6kK3icW4lvEP7OqQ== MIME-Version: 1.0 X-Received: by 10.112.55.200 with SMTP id u8mr9377802lbp.51.1458545977246; Mon, 21 Mar 2016 00:39:37 -0700 (PDT) Received: by 10.112.2.99 with HTTP; Mon, 21 Mar 2016 00:39:37 -0700 (PDT) In-Reply-To: <20160321073016.GR30721@dastard> References: <20160321063848.GK11812@dastard> <20160321073016.GR30721@dastard> Date: Mon, 21 Mar 2016 08:39:37 +0100 Message-ID: Subject: Re: obtaining xfstests repository From: Sonia mandelbrott X-ASG-Orig-Subj: Re: obtaining xfstests repository To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a1133bad0dcc7e2052e8a32fc X-Barracuda-Connect: mail-lb0-f193.google.com[209.85.217.193] X-Barracuda-Start-Time: 1458545978 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28023 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 --001a1133bad0dcc7e2052e8a32fc Content-Type: text/plain; charset=UTF-8 It is probably because I am using my work connection... But thank you for all the replies :) On Mon, Mar 21, 2016 at 8:30 AM, Dave Chinner wrote: > On Mon, Mar 21, 2016 at 08:22:09AM +0100, Sonia mandelbrott wrote: > > Thank you for your replies, here is output when used your link: > > > > -bash-4.2$ git clone git:// > git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git > > Cloning into 'xfstests-dev'... > > fatal: unable to connect to git.kernel.org: > > git.kernel.org[0: 149.20.4.72]: errno=Connection timed out > > git.kernel.org[1: 199.204.44.194]: errno=Connection timed out > > git.kernel.org[2: 198.145.20.140]: errno=Connection timed out > > git.kernel.org[3: 2620:3:c000:a:0:1991:8:25]: errno=Network is > unreachable > > git.kernel.org[4: 2001:4f8:1:10:0:1991:8:25]: errno=Network is > unreachable > > There's almost certainly a firewall in your way. Try cloning over > http. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > --001a1133bad0dcc7e2052e8a32fc Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
It is probably because I am using my work connection...But thank you for all the replies :)


On Mon, Mar 21, 2016 at= 8:30 AM, Dave Chinner <david@fromorbit.com> wrote:
On Mon, Mar 21, 2016 at 08:22:= 09AM +0100, Sonia mandelbrott wrote:
> Thank you for your replies, here is output whe= n used your link:
>
> -bash-4.2$ git clone git://git.kernel.org/= pub/scm/fs/xfs/xfstests-dev.git
> Cloning into 'xfstests-dev'...
> fatal: unable to connect to git.kernel.org:
> git.kernel.org[0: 149.20.4.72]: errno=3DConnection timed out
> git.kernel.org[1: 199.204.44.194]: errno=3DConnection timed out
> git.kernel.org[2: 198.145.20.140]: errno=3DConnection timed out
> git.kernel.org[3: 2620:3:c000:a:0:1991:8:25]: errno=3DNetwork is unrea= chable
> git.kernel.org[4: 2001:4f8:1:10:0:1991:8:25]: errno=3DNetwork is unrea= chable

There's almost certainly a firewall in your way. Try cloning ove= r
http.

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com

--001a1133bad0dcc7e2052e8a32fc-- From jack@suse.cz Mon Mar 21 04:16:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A3FBE7CA0 for ; Mon, 21 Mar 2016 04:16:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7546B304048 for ; Mon, 21 Mar 2016 02:16:04 -0700 (PDT) X-ASG-Debug-ID: 1458551760-04cbb022e65f480001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id WLH4HXBQlzR7WQJO (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 21 Mar 2016 02:16:02 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 8307CABC7; Mon, 21 Mar 2016 09:15:59 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id D5BA28251E; Mon, 21 Mar 2016 10:16:28 +0100 (CET) Date: Mon, 21 Mar 2016 10:16:28 +0100 From: Jan Kara To: Dave Chinner Cc: torvalds@linux-foundation.org, akpm@linux-foundation.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, jack@suse.cz, tytso@mit.edu Subject: Re: [GIT PULL] xfs: updates for 4.6-rc1 Message-ID: <20160321091628.GE30819@quack.suse.cz> X-ASG-Orig-Subj: Re: [GIT PULL] xfs: updates for 4.6-rc1 References: <20160321020505.GJ11812@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160321020505.GJ11812@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1458551761 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28025 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon 21-03-16 13:05:05, Dave Chinner wrote: The resolution of conflict in fs/ext4/inode.c is fine except for one minor issue: > diff --cc fs/ext4/inode.c > index b2e9576,2b98171..e5ba3b0 > --- a/fs/ext4/inode.c > +++ b/fs/ext4/inode.c > @@@ -3289,10 -3161,10 +3289,10 @@@ out > } > #endif > > - static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset, > + static int ext4_end_io_dio(struct kiocb *iocb, loff_t offset, > ssize_t size, void *private) > { > - ext4_io_end_t *io_end = iocb->private; > + ext4_io_end_t *io_end = private; > > /* if not async direct IO just return */ > if (!io_end) > @@@ -3300,8 -3172,18 +3300,17 @@@ > > ext_debug("ext4_end_io_dio(): io_end 0x%p " > "for inode %lu, iocb 0x%p, offset %llu, size %zd\n", > - iocb->private, io_end->inode->i_ino, iocb, offset, > - size); > + io_end, io_end->inode->i_ino, iocb, offset, size); > > + iocb->private = NULL; The line above should not exist in the result. It does no harm but is unnecessary. Honza -- Jan Kara SUSE Labs, CR From cmaiolino@redhat.com Mon Mar 21 06:20:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C92C27CA0 for ; Mon, 21 Mar 2016 06:20:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 495F8AC001 for ; Mon, 21 Mar 2016 04:20:36 -0700 (PDT) X-ASG-Debug-ID: 1458559235-04bdf07563337a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id XMUnl0Lot7QP4Mhs (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 21 Mar 2016 04:20:35 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 0F0378F4E2 for ; Mon, 21 Mar 2016 11:20:34 +0000 (UTC) Received: from redhat.com (vpn-61-170.rdu2.redhat.com [10.10.61.170]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2LBKVbe011365 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 21 Mar 2016 07:20:33 -0400 Date: Mon, 21 Mar 2016 12:20:30 +0100 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: obtaining xfstests repository Message-ID: <20160321112030.GA25476@redhat.com> X-ASG-Orig-Subj: Re: obtaining xfstests repository Mail-Followup-To: xfs@oss.sgi.com References: <20160321063848.GK11812@dastard> <20160321073016.GR30721@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458559235 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 As Dave suggested, try cloning over http, your work firewall might be blocking different protocols. $git clone https://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git On Mon, Mar 21, 2016 at 08:39:37AM +0100, Sonia mandelbrott wrote: > It is probably because I am using my work connection... > But thank you for all the replies :) > > On Mon, Mar 21, 2016 at 8:30 AM, Dave Chinner <[1]david@fromorbit.com> > wrote: > > On Mon, Mar 21, 2016 at 08:22:09AM +0100, Sonia mandelbrott wrote: > > Thank you for your replies, here is output when used your link: > > > > -bash-4.2$ git clone > git://[2]git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git > > Cloning into 'xfstests-dev'... > > fatal: unable to connect to [3]git.kernel.org: > > [4]git.kernel.org[0: 149.20.4.72]: errno=Connection timed out > > [5]git.kernel.org[1: 199.204.44.194]: errno=Connection timed out > > [6]git.kernel.org[2: 198.145.20.140]: errno=Connection timed out > > [7]git.kernel.org[3: 2620:3:c000:a:0:1991:8:25]: errno=Network is > unreachable > > [8]git.kernel.org[4: 2001:4f8:1:10:0:1991:8:25]: errno=Network is > unreachable > There's almost certainly a firewall in your way. Try cloning over > http. > > Cheers, > Dave. > -- > Dave Chinner > [9]david@fromorbit.com > > References > > 1. mailto:david@fromorbit.com > 2. http://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git > 3. http://git.kernel.org/ > 4. http://git.kernel.org/ > 5. http://git.kernel.org/ > 6. http://git.kernel.org/ > 7. http://git.kernel.org/ > 8. http://git.kernel.org/ > 9. mailto:david@fromorbit.com > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From cmaiolino@redhat.com Mon Mar 21 07:08:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 838237CA0 for ; Mon, 21 Mar 2016 07:08:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 51FCB30404E for ; Mon, 21 Mar 2016 05:08:35 -0700 (PDT) X-ASG-Debug-ID: 1458562113-04cb6c1e5c33490001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ikYVAsivRQ91xJRb (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 21 Mar 2016 05:08:34 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 7729F7F0A2; Mon, 21 Mar 2016 12:08:33 +0000 (UTC) Received: from redhat.com (vpn-61-170.rdu2.redhat.com [10.10.61.170]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2LC8UWG022691 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Mon, 21 Mar 2016 08:08:32 -0400 Date: Mon, 21 Mar 2016 13:08:29 +0100 From: Carlos Maiolino To: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org Subject: Re: [RFC PATCH 1/9] block: add block_device_operations methods to set and get reserved space Message-ID: <20160321120829.GB25476@redhat.com> X-ASG-Orig-Subj: Re: [RFC PATCH 1/9] block: add block_device_operations methods to set and get reserved space Mail-Followup-To: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org References: <1458225037-24155-1-git-send-email-bfoster@redhat.com> <1458225037-24155-2-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1458225037-24155-2-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458562114 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi, Good news about this interface, I just have a small suggestion in this patch: On Thu, Mar 17, 2016 at 10:30:29AM -0400, Brian Foster wrote: > From: Mike Snitzer > > Signed-off-by: Mike Snitzer > --- > fs/block_dev.c | 20 ++++++++++++++++++++ > include/linux/blkdev.h | 5 +++++ > 2 files changed, 25 insertions(+) > > diff --git a/fs/block_dev.c b/fs/block_dev.c > index 826b164..375a2e4 100644 > --- a/fs/block_dev.c > +++ b/fs/block_dev.c > @@ -497,6 +497,26 @@ long bdev_direct_access(struct block_device *bdev, struct blk_dax_ctl *dax) > } > EXPORT_SYMBOL_GPL(bdev_direct_access); > > +int blk_reserve_space(struct block_device *bdev, sector_t nr_sects) > +{ > + const struct block_device_operations *ops = bdev->bd_disk->fops; > + > + if (!ops->reserve_space) > + return -EOPNOTSUPP; > + return ops->reserve_space(bdev, nr_sects); > +} > +EXPORT_SYMBOL_GPL(blk_reserve_space); Wouldn't be better to have this function name standardized accordingly to the next one? Something like blk_set_reserved_space() maybe? > + > +int blk_get_reserved_space(struct block_device *bdev, sector_t *nr_sects) > +{ > + const struct block_device_operations *ops = bdev->bd_disk->fops; > + > + if (!ops->get_reserved_space) > + return -EOPNOTSUPP; > + return ops->get_reserved_space(bdev, nr_sects); > +} > +EXPORT_SYMBOL_GPL(blk_get_reserved_space); > + > /* > * pseudo-fs > */ > diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h > index 413c84f..f212fe5 100644 > --- a/include/linux/blkdev.h > +++ b/include/linux/blkdev.h > @@ -1664,6 +1664,8 @@ struct block_device_operations { > int (*getgeo)(struct block_device *, struct hd_geometry *); > /* this callback is with swap_lock and sometimes page table lock held */ > void (*swap_slot_free_notify) (struct block_device *, unsigned long); > + int (*reserve_space) (struct block_device *, sector_t); > + int (*get_reserved_space) (struct block_device *, sector_t *); > struct module *owner; > const struct pr_ops *pr_ops; > }; > @@ -1674,6 +1676,9 @@ extern int bdev_read_page(struct block_device *, sector_t, struct page *); > extern int bdev_write_page(struct block_device *, sector_t, struct page *, > struct writeback_control *); > extern long bdev_direct_access(struct block_device *, struct blk_dax_ctl *); > + > +extern int blk_reserve_space(struct block_device *, sector_t); > +extern int blk_get_reserved_space(struct block_device *, sector_t *); > #else /* CONFIG_BLOCK */ > > struct block_device; > -- > 2.4.3 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Carlos From cmaiolino@redhat.com Mon Mar 21 07:17:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 559FC7CA0 for ; Mon, 21 Mar 2016 07:17:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 16C12304048 for ; Mon, 21 Mar 2016 05:17:32 -0700 (PDT) X-ASG-Debug-ID: 1458562650-04cbb022e579420001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id e6jyWY81YXTVEJb0 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 21 Mar 2016 05:17:31 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 734EF7F097; Mon, 21 Mar 2016 12:17:30 +0000 (UTC) Received: from redhat.com (vpn-61-170.rdu2.redhat.com [10.10.61.170]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2LCHRGV021840 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Mon, 21 Mar 2016 08:17:29 -0400 Date: Mon, 21 Mar 2016 13:17:26 +0100 From: Carlos Maiolino To: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org Subject: Re: [RFC PATCH 2/9] dm: add methods to set and get reserved space Message-ID: <20160321121726.GC25476@redhat.com> X-ASG-Orig-Subj: Re: [RFC PATCH 2/9] dm: add methods to set and get reserved space Mail-Followup-To: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org References: <1458225037-24155-1-git-send-email-bfoster@redhat.com> <1458225037-24155-3-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1458225037-24155-3-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458562651 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 > +static int dm_blk_reserve_space(struct block_device *bdev, sector_t nr_sects) > +{ > + > +static int dm_blk_get_reserved_space(struct block_device *bdev, > + sector_t *nr_sects) > +{ These two functions are almost identical, what about refactoring it to a single function like dm_blk_reserved_space(), and maybe adding a flags argument, for choosing between set/get reserved space? Or maybe just add the common parts of these two functions inside a helper function or a macro?! -- Carlos From cmaiolino@redhat.com Mon Mar 21 08:33:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 503887CA0 for ; Mon, 21 Mar 2016 08:33:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B1965AC005 for ; Mon, 21 Mar 2016 06:33:56 -0700 (PDT) X-ASG-Debug-ID: 1458567231-04cbb022e680630001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GGMP1XBwJyHxCLpR (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 21 Mar 2016 06:33:51 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id D60EF711D0; Mon, 21 Mar 2016 13:33:50 +0000 (UTC) Received: from redhat.com (vpn-61-170.rdu2.redhat.com [10.10.61.170]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2LDXlrm019764 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Mon, 21 Mar 2016 09:33:49 -0400 Date: Mon, 21 Mar 2016 14:33:46 +0100 From: Carlos Maiolino To: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org Subject: Re: [RFC PATCH 0/9] dm-thin/xfs: prototype a block reservation allocation model Message-ID: <20160321133346.GD25476@redhat.com> X-ASG-Orig-Subj: Re: [RFC PATCH 0/9] dm-thin/xfs: prototype a block reservation allocation model Mail-Followup-To: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org References: <1458225037-24155-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1458225037-24155-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Mon, 21 Mar 2016 13:33:50 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458567231 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi. >From my point of view, I like the idea of an interface between the filesystem, and the thin-provisioned device, so that we can actually know if the thin volume is running out of space or not, but, before we actually start to discuss how this should be implemented, I'd like to ask if this should be implemented. After a few days discussing this with some block layer and dm-thin developers, what I most hear/read is that a thin volume should be transparent to the filesystem. So, the filesystem itself should not know it's running over a thin-provisioned volume. And such interface being discussed here, breaks this abstraction. What I would like to know is the POV of block layer and dm-thin developers regarding this. I know that this subject is being discussed for a while, but I really have never seen a conclusion about if thin provisioned devices should be transparent or not to the filesystem. >From a storage perspective, I believe that all dedicated storage hardwares that actually provide thin provisioning, does it in a transparent way to the filesystem, which doesn't mean dm-thin must follow the same behavior. A layer of communication between the fs and dm-thin will be great, mainly to avoid cases, like you already mentioned, about data loss, such as items in AIL can not be written back to disk due lack of space (which I've been working on the past days), but before actually work and change the filesystem, I'd like to understand what block/dm-thin layer actually expects about it. I tried to google it a bit, to see if there is any standard regarding how thin provisioned devices should behave, but I didn't find anything, so, any input about it will be appreciated. Cheers -- Carlos On Thu, Mar 17, 2016 at 10:30:28AM -0400, Brian Foster wrote: > Hi all, > > This is a proof-of-concept of a block reservation allocation model > between XFS and dm-thin. The purpose is to create a mechanism by which > the filesystem can determine an underlying thin volume is out of space > and opt to return -ENOSPC to userspace rather than waiting until the > volume is driven out of space (and deactivated or transitioned > read-only). The idea, in principle, is to use a similar reservation > model for thin pool blocks as the filesystem does today for delayed > allocation blocks and to prevent similar risk of overprovisioning of fs > blocks. > > This idea was concocted a while back during some discussions around how > to provide a more user friendly out of space condition to users of > filesystems on top of thin devices. At the moment, we (XFS) write to the > underlying volume until it runs out of space and transitions to > read-only. The administrator is responsible to prevent or recover from > this condition via auto provisioning and/or monitoring for low watermark > notifications. With a reservation model, the filesytem returns -ENOSPC > at write time when the underlying pool is out of space and operation > otherwise continues (e.g., space can be freed from the fs) as if the fs > itself were out of space. > > Joe and Mike were kind enough to hack together a dm block reservation > mechanism to help us experiment further. I slightly modified and hacked > in an additional provision call based on their code, and then hacked up > an integration with the existing XFS resource reservation mechanism. I > think the results are slightly encouraging, at least in that the basic > buffered write mechanism works as expected without too much inefficiency > due to the over-reservation. > > There are still flaws and tradeoffs to this approach, of course. The > current implementation uses a worst case reservation model that assumes > every unallocated filesystem block requires a new dm-thin block > allocation. With dm-thin block sizes on the order of 256k-1MB for larger > volumes, this is a significant over-reservation for 4k (or smaller) > filesystem blocks. XFS has algorithms in some areas (buffered writes) > that deal with this problem already, but at the very least, further > optimization might be in order to improve performance. This also doesn't > consider other operations (fallocate) or filesystems that might not be > immediately suited to handle this limitation. Also, the interface to the > block device is clearly crude, incomplete and hacked together > (particularly the provision bits added by me). It remains to be seen > whether we can define a sane interface to fully support this > functionality. > > As far as the implementation goes, this is a toy/experiment with various > other known issues (mostly documented in the code, see the comments in > xfs_thin.c) and should not be used for anything outside of > experimentation. I haven't done much testing beyond simple buffered > write runs to ENOSPC, so problems in other areas can be expected. > Apologies for whatever general shoddiness might be discovered, but I > wanted to get something posted to generate discussion before putting too > much effort into testing and exploring all of the dark corners where > more issues certainly lurk. > > In summary, the primary purpose of this series is to close the loop on > some of the early XFS/dm-thin discussion around whether something like > this is feasible, worthwhile, and to otherwise gather initial thoughts > from fs and dm folks on the general topic. If worth pursuing further, > discussion around things like an appropriate interface to the block > device is certainly warranted. > > Thanks again to Joe and Mike for entertaining the idea and hacking > something together to play around with. Thoughts, reviews, flames > appreciated. (BTW, I'm also planning to be at LSF if anybody is > interested in discussing this further). > > Brian > > P.S., With these patches applied, use the following to create an > over-provisioned thin volume and mount XFS in "reservation mode:" > > # lvcreate --thinpool test/pool -L1G > # lvcreate -T test/pool -n thin -V 10G > # mkfs.xfs -f /dev/test/thin > # mount /dev/test/thin /mnt -o discard > # dmesg | tail > ... > XFS (dm-8): Mounting V5 Filesystem > XFS (dm-8): Ending clean mount > XFS (dm-8): Thin pool reservation enabled > XFS (dm-8): Thin reserve blocksize: 512 sectors > # dd if=/dev/zero of=/mnt/file bs=4k > dd: error writing '/mnt/file': No space left on device > ... > > Brian Foster (6): > dm thin: update reserve space func to allow reduction > block: add a block_device_operations method to provision space > dm: add method to provision space > dm thin: add method to provision space > xfs: thin block device reservation mechanism > xfs: adopt a reserved allocation model on dm-thin devices > > Joe Thornber (1): > dm thin: add methods to set and get reserved space > > Mike Snitzer (2): > block: add block_device_operations methods to set and get reserved > space > dm: add methods to set and get reserved space > > drivers/md/dm-thin.c | 187 +++++++++++++++++++++++++++-- > drivers/md/dm.c | 110 +++++++++++++++++ > fs/block_dev.c | 30 +++++ > fs/xfs/Makefile | 1 + > fs/xfs/libxfs/xfs_alloc.c | 6 + > fs/xfs/xfs_mount.c | 81 +++++++++++-- > fs/xfs/xfs_mount.h | 7 ++ > fs/xfs/xfs_thin.c | 273 ++++++++++++++++++++++++++++++++++++++++++ > fs/xfs/xfs_thin.h | 9 ++ > fs/xfs/xfs_trace.h | 27 +++++ > fs/xfs/xfs_trans.c | 26 +++- > include/linux/blkdev.h | 7 ++ > include/linux/device-mapper.h | 7 ++ > 13 files changed, 749 insertions(+), 22 deletions(-) > create mode 100644 fs/xfs/xfs_thin.c > create mode 100644 fs/xfs/xfs_thin.h > > -- > 2.4.3 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html From MAILER-DAEMON Mon Mar 21 10:29:48 2016 Return-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.7 required=5.0 tests=FH_FROMEML_NOTLD,FROM_NO_USER, FSL_MISSP_REPLYTO,HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 03EE57CA0 for ; Mon, 21 Mar 2016 10:29:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A3486304051 for ; Mon, 21 Mar 2016 08:29:47 -0700 (PDT) X-ASG-Debug-ID: 1458574184-04bdf07eac02370001-NocioJ Received: from mail.br.inter.net (mail.br.inter.net [187.191.127.20]) by cuda.sgi.com with ESMTP id DGZzHGalYrX6R3Uo for ; Mon, 21 Mar 2016 08:29:45 -0700 (PDT) X-Barracuda-Envelope-From: X-Barracuda-Apparent-Source-IP: 187.191.127.20 Received: from [192.168.43.8] (unknown [151.47.43.244]) (Authenticated sender: tomas@sti.com.br) by mail.br.inter.net (Postfix) with ESMTPSA id 7B8CB42250; Mon, 21 Mar 2016 11:49:38 -0300 (BRT) Content-Type: multipart/alternative; boundary="===============1664536951==" MIME-Version: 1.0 Subject: Urgent donation information To: Ugo X-ASG-Orig-Subj: Urgent donation information From: "Ugo"<> Date: Mon, 21 Mar 2016 15:57:20 +0100 Reply-To: ugoverni@aim.com X-Antivirus: avast! (VPS 160321-0, 03/21/2016), Outbound message X-Antivirus-Status: Clean X-Barracuda-Connect: mail.br.inter.net[187.191.127.20] X-Barracuda-Start-Time: 1458574184 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.64 X-Barracuda-Spam-Status: No, SCORE=0.64 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=ANY_BOUNCE_MESSAGE, BOUNCE_MESSAGE, BSF_SC0_MISMATCH_TO, EMPTY_ENV_FROM, FROM_NO_USER, HTML_MESSAGE, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28027 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 EMPTY_ENV_FROM Empty Envelope From Address 0.50 FROM_NO_USER From: has no local-part before @ sign 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BOUNCE_MESSAGE MTA bounce message 0.00 ANY_BOUNCE_MESSAGE Message is some kind of bounce message Message-Id: <20160321152947.53AB7A420AD@cuda.sgi.com> You will not see this in a MIME-aware mail reader. --===============1664536951== Content-Type: text/plain; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body Your Attention Please, My name is Ugo Verni and I have an urgent donation information for you whic= h will benefit you and your entire family, with the less privileged in your= local community. Respond back to this email immediately so as to enable me provide you with = the complete information regarding this donation. God Bless you richly. Ugo Verni.=20 --===============1664536951== Content-Type: text/html; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body Your Attention Please,

My name is Ugo Verni and I have an urgent donation information for y= ou which will benefit you and your entire family, with the less privileged = in your local community.

= Respond ba= ck to this email immediately so as to enable me provide you with the comple= te information regarding this donation.

God Bless you richly.

Ugo Vern= i.  --===============1664536951==-- From BATV+e8622a914439b518f42a+4593+infradead.org+hch@bombadil.srs.infradead.org Mon Mar 21 10:46:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 832B97CA0 for ; Mon, 21 Mar 2016 10:46:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3E5F0304048 for ; Mon, 21 Mar 2016 08:46:45 -0700 (PDT) X-ASG-Debug-ID: 1458575198-04cbb04da702a60001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id FyS9LeyRcwmD2krO (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 21 Mar 2016 08:46:39 -0700 (PDT) X-Barracuda-Envelope-From: BATV+e8622a914439b518f42a+4593+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 1ai22P-0006UI-Aa; Mon, 21 Mar 2016 15:46:37 +0000 Date: Mon, 21 Mar 2016 08:46:37 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, linux-api@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] vfs: support FS_XFLAG_REFLINK and FS_XFLAG_COWEXTSIZE Message-ID: <20160321154637.GA15069@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] vfs: support FS_XFLAG_REFLINK and FS_XFLAG_COWEXTSIZE References: <20160302235638.GA27962@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160302235638.GA27962@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458575199 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28027 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Mar 02, 2016 at 03:56:38PM -0800, Darrick J. Wong wrote: > Introduce XFLAGs for the new XFS reflink inode flag and the CoW extent > size hint, and actually plumb the CoW extent size hint into the fsxattr > structure. > > Signed-off-by: Darrick J. Wong Looks fine, Reviewed-by: Christoph Hellwig From BATV+e8622a914439b518f42a+4593+infradead.org+hch@bombadil.srs.infradead.org Mon Mar 21 11:09:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D14C87CA1 for ; Mon, 21 Mar 2016 11:09:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9CA9330404E for ; Mon, 21 Mar 2016 09:09:30 -0700 (PDT) X-ASG-Debug-ID: 1458576567-04cbb04da403640001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id yRBVRMCA2CtOcwjX (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 21 Mar 2016 09:09:28 -0700 (PDT) X-Barracuda-Envelope-From: BATV+e8622a914439b518f42a+4593+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 1ai2OQ-0006iI-V0; Mon, 21 Mar 2016 16:09:22 +0000 Date: Mon, 21 Mar 2016 09:09:22 -0700 From: Christoph Hellwig To: "J. Bruce Fields" Cc: Christoph Hellwig , Andreas Gruenbacher , Alexander Viro , linux-nfs@vger.kernel.org, Theodore Ts'o , linux-cifs@vger.kernel.org, linux-api@vger.kernel.org, Trond Myklebust , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Andreas Dilger , linux-fsdevel@vger.kernel.org, Jeff Layton , linux-ext4@vger.kernel.org, Anna Schumaker Subject: Re: [PATCH v18 19/22] richacl: Add richacl xattr handler Message-ID: <20160321160922.GA18734@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v18 19/22] richacl: Add richacl xattr handler References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <1456733847-17982-20-git-send-email-agruenba@redhat.com> <20160311141735.GF14808@infradead.org> <20160311141905.GC13178@fieldses.org> <20160315071014.GB19747@infradead.org> <20160315210526.GC3658@fieldses.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160315210526.GC3658@fieldses.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458576568 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28027 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Mar 15, 2016 at 05:05:26PM -0400, J. Bruce Fields wrote: > > That people get confused between the attr used by the xattr syscall > > interface and the attr used to store things on disk or the protocol. > > This has happened every time we have non-native support, e.g. XFS, NFS, > > CIFS, ntfs, etc. And it's only going to become worse. > > How has that confusion caused problems in practice? We had all kinds of bugs in this area that were only slowly uncovered. We also had all kind of privilegue escalations with (non-ACLs) xattrs as people never grasped the way different free-form namespaces have different permission checking. From obnox@samba.org Mon Mar 21 13:21:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 8164E7CA3 for ; Mon, 21 Mar 2016 13:21:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5558E30405F for ; Mon, 21 Mar 2016 11:21:56 -0700 (PDT) X-ASG-Debug-ID: 1458584509-04cbb04da408090001-NocioJ Received: from hr2.samba.org (hr2.samba.org [144.76.82.148]) by cuda.sgi.com with ESMTP id y1mWzDV5ZBXBRHoq (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 21 Mar 2016 11:21:50 -0700 (PDT) X-Barracuda-Envelope-From: obnox@samba.org X-Barracuda-Apparent-Source-IP: 144.76.82.148 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=samba.org; s=42627210; h=Message-ID:Cc:To:From:Date; bh=pqgpJtcEoVJQMzDlnTyDgoQtInCp4ahr2w+lkNqbau4=; b=KjEhQA9kVOWcKJUewEUYEerV+0MC1yLOdxZTS7yi7gEW8xS9ord7RGW2aS0JE4MIBOZc+RymhPWQcR9p3AREhJ3Ugp3tBSM0nRbp7jMXBlM654selTzoEZV0SHP+zkZ+feRprCuCZ85vfOIHwBc7IUVjdK6H96d5pQ01f2zeGzs=; Received: from [127.0.0.2] (localhost [127.0.0.1]) by hr2.samba.org with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim) id 1ai4S6-0004YM-LA; Mon, 21 Mar 2016 18:21:18 +0000 Date: Mon, 21 Mar 2016 19:20:57 +0100 From: Michael Adam To: Volker Lendecke , Christoph Hellwig Cc: Jeremy Allison , Andreas Gruenbacher , Alexander Viro , "J. Bruce Fields" , Linux NFS Mailing List , Theodore Ts'o , linux-cifs@vger.kernel.org, Linux API , Trond Myklebust , LKML , XFS Developers , Andreas Dilger , linux-fsdevel , Jeff Layton , linux-ext4 , Anna Schumaker Subject: Re: [PATCH v18 00/22] Richacls (Core and Ext4) Message-ID: <20160321182057.GF1044@samba.org> X-ASG-Orig-Subj: Re: [PATCH v18 00/22] Richacls (Core and Ext4) References: <1456733847-17982-1-git-send-email-agruenba@redhat.com> <20160311140134.GA14808@infradead.org> <20160315071103.GC19747@infradead.org> <20160315154514.GB39038@jra3> <20160315201700.GA22945@sernet.de> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="NklN7DEeGtkPCoo3" Content-Disposition: inline In-Reply-To: <20160315201700.GA22945@sernet.de> User-Agent: Mutt/1.5.24 (2015-08-30) X-Barracuda-Connect: hr2.samba.org[144.76.82.148] X-Barracuda-Start-Time: 1458584510 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28027 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature --NklN7DEeGtkPCoo3 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On 2016-03-15 at 21:17 +0100, Volker Lendecke wrote: > On Tue, Mar 15, 2016 at 08:45:14AM -0700, Jeremy Allison wrote: > > On Tue, Mar 15, 2016 at 12:11:03AM -0700, Christoph Hellwig wrote: > > > People have long learned that we only have 'alloc' permissions. Any > > > model that mixes allow and deny ACE is a mistake. > >=20 > > People can also learn and change though :-). One of the > > biggest complaints people deploying Samba on Linux have is the > > incompatible ACL models. >=20 > Just to confirm: I see this a lot in the field. NFSv4 ACLs, while not a > perfect match for NTFS ACLs are a lot closer much more usable to people > who want to serve Windows clients. >=20 > Also in the pure linux world there is a lot that you can not express > with just rwx, sgid, sticky bits and friends. If you want the additional > functionality of the richacl bits, I would call it a big mistake to > omit negative aces, if just for the reason not to create yet another > ACLs flavor. >=20 > > Whilst I have sympathy with your intense dislike of the > > Windows ACL model, this comes down to the core of "who > > do we serve ?" >=20 > The world has enough confusion around ACL semanics, please do not add > more to it by creating your own model of the day. Exacty: Like it or not, Windows ACLs are a fact. And the approximation by the NFSv4 ACLs is getting closer and closer with each iteration... ;-) So it is not only that Windows world looking into this. As Volker and Jeremy have pointed out, the lack of ACL semantics is one of things the users of Samba complain about most bitterly. While Samba can work around it when it is acting exclusively on the files, this is not an option when NFS or other protocols are to access the data concurrently. In that case we need more precision down in the file system. So because they make use of *existing* formats and semantics, I think Andreas' richacls are just the way to go, as alien as they may seem from the pure linux filesystem point of view at first. Cheers - Michael --NklN7DEeGtkPCoo3 Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 Comment: comment iEYEARECAAYFAlbwO4kACgkQyU9JOBhPkDSbLgCgg014joqbBszyQNQOfv6cNSVX GSIAoJHvKMybjmmMy0l/xqCBjTDuVjzS =vumV -----END PGP SIGNATURE----- --NklN7DEeGtkPCoo3-- From tytso@thunk.org Mon Mar 21 13:34:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 72C0A7CA3 for ; Mon, 21 Mar 2016 13:34:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C6513AC004 for ; Mon, 21 Mar 2016 11:34:25 -0700 (PDT) X-ASG-Debug-ID: 1458585260-04bdf07eab14c80001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id FBCZstwGZjYDYB7N (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 21 Mar 2016 11:34:20 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=WZVZzh/l21nRGDni49sN2FUmUUTcjGv2u3xxdDamKOg=; b=GA/Zw+Fu1cT+cg1clNp8ls8A6BF5xwPUQDysG9SDcBUA+coCCEd0e8+GlP1P+tZAOKKKjK1n2sjieAM4Rdj0tkmby8qXX6fBFQuJJBfPE1X5Q254E6bNAuR283aqPg500Ubjh2SOSrUf4p8qfyKWjPNx3iUHgzTY9a4/RLmLJms=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.84) (envelope-from ) id 1ai4ed-0004tY-Ty; Mon, 21 Mar 2016 18:34:15 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 86359825D15; Mon, 21 Mar 2016 14:34:14 -0400 (EDT) Date: Mon, 21 Mar 2016 14:34:14 -0400 From: Theodore Ts'o To: Jan Kara Cc: Dave Chinner , torvalds@linux-foundation.org, akpm@linux-foundation.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [GIT PULL] xfs: updates for 4.6-rc1 Message-ID: <20160321183414.GB3490@thunk.org> X-ASG-Orig-Subj: Re: [GIT PULL] xfs: updates for 4.6-rc1 Mail-Followup-To: Theodore Ts'o , Jan Kara , Dave Chinner , torvalds@linux-foundation.org, akpm@linux-foundation.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com References: <20160321020505.GJ11812@dastard> <20160321091628.GE30819@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160321091628.GE30819@quack.suse.cz> User-Agent: Mutt/1.5.24 (2015-08-30) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1458585260 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28027 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Thanks Jan, for checking the merge. I didn't realize the ext4 fixups were going in via the xfs tree. I didn't see any merge conflicts from the linux-next tree (or maybe I missed it) so I had assumed it wasn't in Dave's xfs.git tree. My plan had been to deal with it after the prereq patch went in via the xfs tree --- in fact I was thinking about checking to see if the xfs.git tree had been merged so I could get the ext4 commit merged and sent to Linus. Sorry I lost track of things. If I had known I would have indeed manually merged in the branch, resolved the merge, and done a regression test cycle before pushing to Linus. - Ted On Mon, Mar 21, 2016 at 10:16:28AM +0100, Jan Kara wrote: > On Mon 21-03-16 13:05:05, Dave Chinner wrote: > The resolution of conflict in fs/ext4/inode.c is fine except for one minor > issue: > > > diff --cc fs/ext4/inode.c > > index b2e9576,2b98171..e5ba3b0 > > --- a/fs/ext4/inode.c > > +++ b/fs/ext4/inode.c > > @@@ -3289,10 -3161,10 +3289,10 @@@ out > > } > > #endif > > > > - static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset, > > + static int ext4_end_io_dio(struct kiocb *iocb, loff_t offset, > > ssize_t size, void *private) > > { > > - ext4_io_end_t *io_end = iocb->private; > > + ext4_io_end_t *io_end = private; > > > > /* if not async direct IO just return */ > > if (!io_end) > > @@@ -3300,8 -3172,18 +3300,17 @@@ > > > > ext_debug("ext4_end_io_dio(): io_end 0x%p " > > "for inode %lu, iocb 0x%p, offset %llu, size %zd\n", > > - iocb->private, io_end->inode->i_ino, iocb, offset, > > - size); > > + io_end, io_end->inode->i_ino, iocb, offset, size); > > > > + iocb->private = NULL; > > The line above should not exist in the result. It does no harm but is > unnecessary. > > Honza > -- > Jan Kara > SUSE Labs, CR From linus971@gmail.com Mon Mar 21 14:00:36 2016 Return-Path: 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 4C3447CAE for ; Mon, 21 Mar 2016 14:00:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id CDB8FAC001 for ; Mon, 21 Mar 2016 12:00:35 -0700 (PDT) X-ASG-Debug-ID: 1458586794-04bdf07eab180f0001-NocioJ Received: from mail-io0-f170.google.com (mail-io0-f170.google.com [209.85.223.170]) by cuda.sgi.com with ESMTP id CotQne81GpDioEgA (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 21 Mar 2016 11:59:54 -0700 (PDT) X-Barracuda-Envelope-From: linus971@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.223.170 Received: by mail-io0-f170.google.com with SMTP id m184so220501645iof.1 for ; Mon, 21 Mar 2016 11:59:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc; bh=WX14ZK+IfqNswwcLN9X1Q5CC5Xs35WtPkKw030O/xxs=; b=hVljjJtiBc0Vb8tHY7UzRYafti0bmlZzscH0Z/Yl+HKMu/3RQK0ALAEXTchMgA8W6p 7fX0lYm90dOdnSh5bBd+ky51ZPjHi1fdHHuP9HkqJb3BWkR2wY31ROdER7cRoUeNsSLL 6abOSr6Cz5uPOEvAtquFqOGpQVkyjl73cBSWzOeQN5VI3Dw/ISyXMzzCsnm82VplkeBU 1oSn1ainvFndY7wr7FkgX5rjQ0m66tGN+6RrLBKhrQR3AbuxS+CBdf1AqqQe6rx+K8OZ LdrG2zF0EPT6qit+NSpw/Wa/LA4z9y4noSp+jOAeaIrYE4hZKt7HpOgFj/yqhIendH/N VS+w== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux-foundation.org; s=google; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc; bh=WX14ZK+IfqNswwcLN9X1Q5CC5Xs35WtPkKw030O/xxs=; b=Z0dAz76tZUQAMC0bL27MjP3++sDTvDSGwZsNWPsAJrQ9efpxZ+6zQ9ryqNfG1FLQM8 peHgujDeY6h40fhZmcQaYunwL33SsqgYIgI8JWSlCoEAJSQ5IBSW1MbX3JfpslIa9oZl XA4WLME2PJ8isqvgzQHDx7zfQj1A+WCLCr3qE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:date :message-id:subject:from:to:cc; bh=WX14ZK+IfqNswwcLN9X1Q5CC5Xs35WtPkKw030O/xxs=; b=ZWRVrWr5qF1x6XANlKpNWdLR7aIP4kKtuxpla20C/LY2Im7nr2ZD+zDOTHDNnFEdqr 9v09eLaZZzTlipZNfh3gmoUpDtxMm1br64M2Qeq6vp0qIZiXjCrbVI96HZg2ANookB0o NYR9PGNw6HFvssxWeF8cYVvQwFESih0ClkqgjgzYSCczfQbmF1CV5+Z2CHqcvxImN8wZ eQV58hXUmA/cSnepe5Sik3md57T8CSwR+wemCDjxN5zezOisf2Q4DpyvcpaoebZVZp6e Avjcq2wVl5BqQx3anIKhwjOz+Y/X0V7PKZQTtlbtQXHcs85ipQwuDXmdMs10SOZB7a9n vXAA== X-Gm-Message-State: AD7BkJKq0lJeEaR6n3yKj2ZtIas1AVxOdgxKeoPdNTP6xSJx2ogJy8sO1Wdich5/C+UF+JaJg5Uj3Iu7t7eieA== MIME-Version: 1.0 X-Received: by 10.107.13.65 with SMTP id 62mr31048333ion.186.1458586794252; Mon, 21 Mar 2016 11:59:54 -0700 (PDT) Sender: linus971@gmail.com Received: by 10.36.93.202 with HTTP; Mon, 21 Mar 2016 11:59:54 -0700 (PDT) In-Reply-To: <20160321020505.GJ11812@dastard> References: <20160321020505.GJ11812@dastard> Date: Mon, 21 Mar 2016 11:59:54 -0700 X-Google-Sender-Auth: 8FiIAh45MiJwW6X0tjdj9jLS7ZA Message-ID: Subject: Re: [GIT PULL] xfs: updates for 4.6-rc1 From: Linus Torvalds X-ASG-Orig-Subj: Re: [GIT PULL] xfs: updates for 4.6-rc1 To: Dave Chinner Cc: Andrew Morton , Linux Kernel Mailing List , xfs@oss.sgi.com, Jan Kara , "Theodore Ts'o" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-io0-f170.google.com[209.85.223.170] X-Barracuda-Start-Time: 1458586794 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/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=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28028 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Sun, Mar 20, 2016 at 7:05 PM, Dave Chinner wrote: > > There are conflicts with the ext4 code that has already been merged > this cycle. The merge looked pretty straightforward, but both of you (ie both the xfs and ext4 people, please) should check the end result please. My sanity-check is still building, but it should be all pushed out in another 15 minutes or so. Linus From david@fromorbit.com Mon Mar 21 16:53:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 586897CA3 for ; Mon, 21 Mar 2016 16:53:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 22EA38F8039 for ; Mon, 21 Mar 2016 14:53:38 -0700 (PDT) X-ASG-Debug-ID: 1458597214-04cbb04da511280001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 2vNbqT1PnNOLAFwz for ; Mon, 21 Mar 2016 14:53: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: A2CdCAAIbPBWNTGaLHlegzOBTYZmn0IBAQEGjAaDSIIWhA2GBwICAQECgS9NAQEBAQEBBwEBAQFBQIRBAQEBBCcTHDMIAxUDCSUPBSUDBxsSGogMvmwMHhmFPYUMihIBBI07ihyNeo8RRI5CgxKBSSguigYBAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail04.adl6.internode.on.net with ESMTP; 22 Mar 2016 08:23:34 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ai7lV-0002QH-F7; Tue, 22 Mar 2016 08:53:33 +1100 Date: Tue, 22 Mar 2016 08:53:33 +1100 From: Dave Chinner To: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org Subject: Re: [RFC PATCH 1/9] block: add block_device_operations methods to set and get reserved space Message-ID: <20160321215333.GM11812@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 1/9] block: add block_device_operations methods to set and get reserved space References: <1458225037-24155-1-git-send-email-bfoster@redhat.com> <1458225037-24155-2-git-send-email-bfoster@redhat.com> <20160321120829.GB25476@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160321120829.GB25476@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: 1458597214 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28031 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 21, 2016 at 01:08:29PM +0100, Carlos Maiolino wrote: > Hi, > > Good news about this interface, I just have a small suggestion in this patch: > > On Thu, Mar 17, 2016 at 10:30:29AM -0400, Brian Foster wrote: > > From: Mike Snitzer > > > > Signed-off-by: Mike Snitzer > > --- > > fs/block_dev.c | 20 ++++++++++++++++++++ > > include/linux/blkdev.h | 5 +++++ > > 2 files changed, 25 insertions(+) > > > > diff --git a/fs/block_dev.c b/fs/block_dev.c > > index 826b164..375a2e4 100644 > > --- a/fs/block_dev.c > > +++ b/fs/block_dev.c > > @@ -497,6 +497,26 @@ long bdev_direct_access(struct block_device *bdev, struct blk_dax_ctl *dax) > > } > > EXPORT_SYMBOL_GPL(bdev_direct_access); > > > > +int blk_reserve_space(struct block_device *bdev, sector_t nr_sects) > > +{ > > + const struct block_device_operations *ops = bdev->bd_disk->fops; > > + > > + if (!ops->reserve_space) > > + return -EOPNOTSUPP; > > + return ops->reserve_space(bdev, nr_sects); > > +} > > +EXPORT_SYMBOL_GPL(blk_reserve_space); > > Wouldn't be better to have this function name standardized accordingly to the > next one? Something like blk_set_reserved_space() maybe? Personally I see no point in wrappers like this. We don't add wrappers for ops methods in any other layers of the stack, filesystems are quite capable of checking if the method is available directly, so it seems pretty pointless to me... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Mar 21 17:36:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 11CD07CA1 for ; Mon, 21 Mar 2016 17:36:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 93A3CAC003 for ; Mon, 21 Mar 2016 15:36:26 -0700 (PDT) X-ASG-Debug-ID: 1458599783-04bdf07eaa34fb0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id hq5dVoz4GwFspsKH for ; Mon, 21 Mar 2016 15:36:23 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BGCADFdvBWNTGaLHlegzOBTYZmn0IBAQEGjAaFXoQNhgcEAgKBL00BAQEBAQEHAQEBAUFAhEEBAQEDATocKAsIAxgJJQ8FJQMHGxKIHwe/DhmFPYQNf4QmhWwFl1eNeoFvh3GFMY8GgmUZgV0oLohMgToBAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail04.adl6.internode.on.net with ESMTP; 22 Mar 2016 09:06:22 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ai8Qv-0002Ue-DU; Tue, 22 Mar 2016 09:36:21 +1100 Date: Tue, 22 Mar 2016 09:36:21 +1100 From: Dave Chinner To: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org Subject: Re: [RFC PATCH 0/9] dm-thin/xfs: prototype a block reservation allocation model Message-ID: <20160321223621.GN11812@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 0/9] dm-thin/xfs: prototype a block reservation allocation model References: <1458225037-24155-1-git-send-email-bfoster@redhat.com> <20160321133346.GD25476@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160321133346.GD25476@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: 1458599783 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28032 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 21, 2016 at 02:33:46PM +0100, Carlos Maiolino wrote: > Hi. > > From my point of view, I like the idea of an interface between the filesystem, > and the thin-provisioned device, so that we can actually know if the thin > volume is running out of space or not, but, before we actually start to discuss > how this should be implemented, I'd like to ask if this should be implemented. TL;DR: No-brainer, yes. > After a few days discussing this with some block layer and dm-thin developers, > what I most hear/read is that a thin volume should be transparent to the > filesystem. So, the filesystem itself should not know it's running over a > thin-provisioned volume. And such interface being discussed here, breaks this > abstraction. We're adding things like fallocate to block devices to control preallocation, zeroing and freeing of ranges within the block device from user space. If filesystems can't directly control and query block device ranges on thinp block devices, then why should we let userspace have this capability? The problem we need to solve is that users want transparency between filesystems and thinp devices. They don't want the filesytsem to tell them they have lots of space available, and then get unexpected ENOSPC because the thinp pool backing the fs has run out of space. Users don't want a write over a region they have run posix_fallocate() on to return ENOSPC because the thinp pool ran out of space, even after the filesystem said it guaranteed space was available.Filesystems want to know that they should run fstrim passes internally when the underlying thinp pool is running out of space so that it can free as much unused space as possible. So there's lots of reasons why we need closer functional integration of the filesytem and block layers, but doing this does not need to break the abstraction layer between the filesystem and block device. Indeed, we have already have mechanisms to provide block layer functionality to the filesystems, and this patchset uses it - the bdev ops structure. Just because the filesystem knows that the underlying device has it's own space management and it has to interact with it to give users the correct results does not mean we are "breaking layering abstractions". Filesystems has long assumed that the the LBA space presented by the block device is a physical representation of the underlying device. We know this is not true, and has not been true for a long time. Most devices really present a virtual LBA space to the higher layers, and manipulate their underlying "physical" storage in a manner that suits them best. SSDs do this, thinp does this, RAID does this, dedupe/compressing/encrypting storage does this, etc. IOWs, we've got virtual LBA abstractions right through the storage stack, whether the higher layers realise it or not. IOWs, we know that filesystems have been using virutal LBA address spaces for a long time, yet we keep a block device model that treats them as a physical, unchangable address space with known physical characteristics (e.g. seek time is correlated with LBA distance). We need to stop thinking of block devices as linear devices and start treating them as they really are - a set of devices capable of complex management operations, and we need to start exposing those management operations for the higher layer to be able to take advantage of. Filesystems can take advantage of block devices that expose some of their space management operations. We can make the interactions users have on these storage stacks much better if we expose smarter primitives from the block devices to the filesystems. We don't need to break or change any abstractions - the filesystem is still very much separate from the block device - but we need to improve the communications and functionality channels between them. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Mar 21 17:41:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CBB467CA3 for ; Mon, 21 Mar 2016 17:41:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A382B30405F for ; Mon, 21 Mar 2016 15:41:18 -0700 (PDT) X-ASG-Debug-ID: 1458600075-04cbb04da7132c0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id tblLVk8QCFIdael1 for ; Mon, 21 Mar 2016 15:41:15 -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: A2CbCADed/BWNTGaLHlegzOBTYZmn0IBAQEGjAaFXoQNhgcCAgEBAoEvTQEBAQEBAQcBAQEBQUCEQgEBBDocIxAIAxgJJQ8FJQMHGhOIJr5gAQseGYU9hQyKEgEEl1eNeoFZFoRKiFiPBoRbKC6KBgEBAQ Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail04.adl6.internode.on.net with ESMTP; 22 Mar 2016 09:10:58 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ai8VN-0002VO-Ew; Tue, 22 Mar 2016 09:40:57 +1100 Date: Tue, 22 Mar 2016 09:40:57 +1100 From: Dave Chinner To: Linus Torvalds Cc: Andrew Morton , Linux Kernel Mailing List , xfs@oss.sgi.com, Jan Kara , Theodore Ts'o Subject: Re: [GIT PULL] xfs: updates for 4.6-rc1 Message-ID: <20160321224057.GO11812@dastard> X-ASG-Orig-Subj: Re: [GIT PULL] xfs: updates for 4.6-rc1 References: <20160321020505.GJ11812@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: 1458600075 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28031 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Mar 21, 2016 at 11:59:54AM -0700, Linus Torvalds wrote: > On Sun, Mar 20, 2016 at 7:05 PM, Dave Chinner wrote: > > > > There are conflicts with the ext4 code that has already been merged > > this cycle. > > The merge looked pretty straightforward, but both of you (ie both the > xfs and ext4 people, please) should check the end result please. > > My sanity-check is still building, but it should be all pushed out in > another 15 minutes or so. Merged XFS bits look fine, ext4 parts look ok according to Jan's last comments. Cheers, Dave. -- Dave Chinner david@fromorbit.com From vtraktov@inbox.ru Mon Mar 21 20:58:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=FREEMAIL_FROM, HTML_FONT_SIZE_LARGE,HTML_MESSAGE,HTML_MIME_NO_HTML_TAG,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DDAF27CA0 for ; Mon, 21 Mar 2016 20:58:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 962448F804B for ; Mon, 21 Mar 2016 18:58:31 -0700 (PDT) X-ASG-Debug-ID: 1458611903-04bdf07eac4ef20001-NocioJ Received: from mxs.mail.ru (host-195.242.232.136.c3.net.pl [195.242.232.136]) by cuda.sgi.com with ESMTP id clSfdEnIQ5SsVbqd for ; Mon, 21 Mar 2016 18:58:25 -0700 (PDT) X-Barracuda-Envelope-From: vtraktov@inbox.ru X-Barracuda-Apparent-Source-IP: 195.242.232.136 From: "=?utf-8?B?0KLRgNGD0LTQvtCy0L7QtSDQt9Cw0LrQvtC90L7QtNCw0YLQtdC70YzRgdGC0LLQvg==?=" To: xfs@oss.sgi.com Subject: =?utf-8?B?0KPQstC+0LvRjNC90LXQvdC40LUg0LHQtdC3INC/0YDQvtCx0LvQtdC8?= MIME-Version: 1.0 X-ASG-Orig-Subj: =?utf-8?B?0KPQstC+0LvRjNC90LXQvdC40LUg0LHQtdC3INC/0YDQvtCx0LvQtdC8?= Message-ID: <476878716.20160322045826@LXFEWOCM> X-Mailer: Yamail [ http://yandex.ru ] 5.0 Date: Tue, 22 Mar 2016 04:58:26 +0300 Content-Transfer-Encoding: base64 Content-Type: text/html; charset=utf-8 X-Barracuda-Connect: host-195.242.232.136.c3.net.pl[195.242.232.136] X-Barracuda-Start-Time: 1458611904 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.66 X-Barracuda-Spam-Status: No, SCORE=1.66 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_FONT_SIZE_LARGE, HTML_MESSAGE, HTML_MIME_NO_HTML_TAG, MIME_HTML_ONLY, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28040 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_FONT_SIZE_LARGE BODY: HTML font size is large 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 1.05 HTML_MIME_NO_HTML_TAG HTML-only message, but there is no HTML tag 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 PGRpdj48dGFibGUgYmdjb2xvcj0iIzcwNzBBMyIgYm9yZGVyPSIxIj48dGJvZHk+PHRyPjx0ZD48 ZGl2IGFsaWduPSJjZW50ZXIiPjx0YWJsZSBiZ2NvbG9yPSIjREZERkVBIiBib3JkZXI9IjEiPjx0 Ym9keT48dHI+PHRkPjxkaXYgYWxpZ249ImNlbnRlciI+PHRhYmxlIGJnY29sb3I9IiM5ODk4QkMi IGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIzIj48dGJvZHk+PHRyPjx0 ZD48ZGl2IGFsaWduPSJjZW50ZXIiPjx0YWJsZSBiZ2NvbG9yPSIjQjZCNkNGIiBib3JkZXI9IjEi Pjx0Ym9keT48dHI+PHRkPjxkaXYgYWxpZ249ImNlbnRlciI+PHRhYmxlIGJnY29sb3I9IiNERkRG RUEiIGJvcmRlcj0iMSI+PHRib2R5Pjx0cj48dGQ+PGRpdiBhbGlnbj0iY2VudGVyIj48dGFibGUg Ymdjb2xvcj0iIzcwNzBBMyIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9 IjMiPjx0Ym9keT48dHI+PHRkIGJnY29sb3I9IiNGMEYwRjQiPjxwIGFsaWduPSJjZW50ZXIiPjxm b250IGZhY2U9IkNhbWJyaWEiPjxiciAvPtCj0YfQtdCx0L3Ri9C5INGG0LXQvdGC0YAg0L/RgNC4 0LPQu9Cw0YjQsNC10YIg0L3QsCDQt9Cw0L3Rj9GC0LjRjyAoPGk+PHNwYW4gbGFuZz0iZW4tdXMi PsKgPC9zcGFuPtC/0YDQvtC80L7QutC+0LQ6PGI+wqAzNTU8c3BhbiBsYW5nPSJlbi11cyI+wqA8 L3NwYW4+PC9iPjwvaT4pINC/0L4g0YLQtdC80LU6PGJyIC8+PGJyIC8+PGJyIC8+PC9mb250Pjxm b250IGNvbG9yPSIjMDAwMENDIj48Yj48Zm9udCBmYWNlPSJDYWxpYnJpIiBzaXplPSI2Ij7QkdC1 0LfQvtC/0LDRgdC90L7QtSDRg9Cy0L7Qu9GM0L3QtdC90LjQtSDQv9C10YDRgdC+0L3QsNC70LA6 wqA8YnIgLz7QutCw0Log0YPQstC+0LvQuNGC0Ywg0YHQvtGC0YDRg9C00L3QuNC60LAsINC10YHQ u9C4INC+0L0g0Y3RgtC+0LPQviDQvdC1INGF0L7Rh9C10YI8L2ZvbnQ+PC9iPjwvZm9udD48L3A+ PHAgYWxpZ249ImxlZnQiPjxmb250IGZhY2U9IkNhbWJyaWEiPjxiciAvPsKg0JTQsNGC0LAg0L/R gNC+0LLQtdC00LXQvdC40Y86PGZvbnQgY29sb3I9IiNBQzAwMzgiPjxiPsKgMSDQsNC/0YDQtdC7 0Y88L2I+PC9mb250PjxiciAvPjxiciAvPsKg0JLRgNC10LzRjyDQt9Cw0L3Rj9GC0LjRjyDRgSAx MDxzcGFuIGxhbmc9ImVuLXVzIj46PC9zcGFuPjAwINC00L4gMTc8c3BhbiBsYW5nPSJlbi11cyI+ Ojwvc3Bhbj4zMDxiciAvPjxiciAvPsKgPGI+0JzQtdGB0YLQviDQv9GA0L7QstC10LTQtdC90LjR jzo8L2I+wqDQs9C+0YDQvtC0INCc0L7RgdC60LLQsCwg0YPQuy4g0JHQsNGD0LzQsNC90YHQutCw 0Y8sINC0LjYsINGB0YLRgC4yLCDQkS7Qpi7CoDxzcGFuIGxhbmc9ImVuLXVzIj4iPC9zcGFuPtCS 0LjQutGC0L7RgNC40Y8g0J/Qu9Cw0LfQsDxzcGFuIGxhbmc9ImVuLXVzIj4iPC9zcGFuPi48YnIg Lz48YnIgLz7CoDxiPtCY0L3RhNC+0YDQvNCw0YbQuNGPINC4INGA0LXQs9C40YHRgtGA0LDRhtC4 0Y86PC9iPsKgPGZvbnQgc2l6ZT0iNCI+ODwvZm9udD7CoNC60L7QtCDQs9C+0YDQvtC00LDCoDxm b250IHNpemU9IjQiPig0OTUpPC9mb250PsKg0L3QvtC80LXRgMKgPGZvbnQgc2l6ZT0iNCI+NzI1 PHNwYW4gbGFuZz0iZW4tdXMiPsKgLcKgPC9zcGFuPjA0wqA8c3BhbiBsYW5nPSJlbi11cyI+LTwv c3Bhbj7CoDQ4PC9mb250PjxzcGFuIGxhbmc9ImVuLXVzIj7CoCg8L3NwYW4+0LzQvdC+0LPQvtC6 0LDQvdCw0LvRjNC90YvQuTxzcGFuIGxhbmc9ImVuLXVzIj4pPC9zcGFuPjwvZm9udD48L3A+PHAg YWxpZ249ImxlZnQiPjxmb250IGZhY2U9IkNhbWJyaWEiPsKgPHNwYW4gbGFuZz0iZW4tdXMiPtCS 0Ysg0LzQvtC20LXRgtC1INGD0YfQsNGB0YLQstC+0LLQsNGC0Ywg0LIg0L7QsdGD0YfQtdC90LjQ uCDQutCw0Log0L7RgiDQutC+0LzQv9Cw0L3QuNC4LCDRgtCw0Log0Lgg0LrQsNC6INGH0LDRgdGC 0L3QvtC1INC70LjRhtC+LjxiciAvPjwvc3Bhbj7CoDxzcGFuIGxhbmc9ImVuLXVzIj48Zm9udCBz aXplPSIyIj4o0L/QvtC20LDQu9GD0LnRgdGC0LAg0L3QtSDQvtGC0LLQtdGH0LDQudGC0LUg0L3Q sCDQvtCx0YDQsNGC0L3Ri9C5INCw0LTRgNC10YEg0Y3Quy7Qv9C+0YfRgtGLKTwvZm9udD48L3Nw YW4+PC9mb250PjwvcD48cCBhbGlnbj0ibGVmdCI+PGZvbnQgZmFjZT0iQ2FtYnJpYSI+PGZvbnQg Y29sb3I9IiMwMDAwQ0MiPsKgPC9mb250Pjxmb250IGNvbG9yPSIjOTkwMDMzIj48Yj7QlNC70Y86 PC9iPsKgPC9mb250PtGA0YPQutC+0LLQvtC00LjRgtC10LvQtdC5INC4INGB0L/QtdGG0LjQsNC7 0LjRgdGC0L7QsiDRgdC70YPQttCxINC/0LXRgNGB0L7QvdCw0LvQsCwg0LHQtdC30L7Qv9Cw0YHQ vdC+0YHRgtC4LCDQutCw0LTRgNC+0LLQuNC60L7Qsiwg0Y7RgNC40YHRgtC+0LIuPGJyIC8+wqA8 L2ZvbnQ+PC9wPjx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0i MyI+PHRib2R5Pjx0cj48dGQ+wqA8L3RkPjx0ZCBiZ2NvbG9yPSIjREZERkVBIj7CoDwvdGQ+PHRk IGJnY29sb3I9IiNGOEY4RkEiPjxwIGFsaWduPSJsZWZ0Ij48YnIgLz48Zm9udCBmYWNlPSJDYW1i cmlhIj7CoMKgwqA8Zm9udCBjb2xvcj0iIzAwMDA4MCI+PGI+PGZvbnQgc2l6ZT0iNCI+0KE8L2Zv bnQ+PGZvbnQgc2l6ZT0iMiI+0J7QlNCV0KDQltCQ0J3QmNCVPC9mb250PjwvYj46PC9mb250Pjxi ciAvPjxmb250IHNpemU9IjQiPjxpPjxiPjxiciAvPjwvYj48L2k+PC9mb250PjwvZm9udD48Zm9u dCBmYWNlPSJDYWxpYnJpIj48Yj4xLjwvYj7CoNCd0L7RgNC80Ysg0KLRgNGD0LTQvtCy0L7Qs9C+ INC60L7QtNC10LrRgdCwLCDRgNC10LPQu9Cw0LzQtdC90YLQuNGA0YPRjtGJ0LjQtSDRg9Cy0L7Q u9GM0L3QtdC90LjQtSDRgdC+0YLRgNGD0LTQvdC40LrQvtCyLiDQntCx0YnQuNC1INC+0YHQvdC+ 0LLQsNC90LjRj8KgPGJyIC8+wqDQv9GA0LXQutGA0LDRidC10L3QuNGPINGC0YDRg9C00L7QstC+ 0LPQviDQtNC+0LPQvtCy0L7RgNCwLiDQn9C+0LfQuNGG0LjQuCDRgdGD0LTQvtCyINC/0YDQuCDR gNCw0YHRgdC80L7RgtGA0LXQvdC40Lgg0YLRgNGD0LTQvtCy0YvRhSDRgdC/0L7RgNC+0LIg0L7C oDxiciAvPsKg0L3QtdC/0YDQsNCy0L7QvNC10YDQvdC+0Lwg0YPQstC+0LvRjNC90LXQvdC40Lgu INCe0LHQt9C+0YAg0YHRg9C00LXQsdC90L7QuSDQv9GA0LDQutGC0LjQutC4LiDQmtCw0LrQuNC1 INGB0YLQsNGC0YzQuCDRg9Cy0L7Qu9GM0L3QtdC90LjRjyDQv9GA0LDQutGC0LjRh9C10YHQutC4 wqA8YnIgLz7CoNC90LUg0L7RgdC/0LDRgNC40LLQsNGO0YLRgdGPINCyINGB0YPQtNCw0YUuINCc 0LXRgtC+0LTRiywg0L/RgNC40LzQtdC90Y/QtdC80YvQtSDQsNC00LLQvtC60LDRgtCw0LzQuCDQ tNC70Y8g0LfQsNGJ0LjRgtGLINGB0LLQvtC40YUg0LrQu9C40LXQvdGC0L7QsiDQssKgPGJyIC8+ wqDRgtGA0YPQtNC+0LLRi9GFINGB0L/QvtGA0LDRhTxiciAvPjxiPjIuPC9iPsKg0J/QvtGA0Y/Q tNC+0Log0LLQt9Cw0LjQvNC+0LTQtdC50YHRgtCy0LjRjyDQv9C+0LTRgNCw0LfQtNC10LvQtdC9 0LjQuSDQuCDQtNC+0LvQttC90L7RgdGC0L3Ri9GFINC70LjRhiDQutC+0LzQv9Cw0L3QuNC4INC/ 0L4g0LLQvtC/0YDQvtGB0LDQvMKgPGJyIC8+wqDRg9Cy0L7Qu9GM0L3QtdC90LjRjyDQv9C10YDR gdC+0L3QsNC70LAuINCe0L/RgNC10LTQtdC70LXQvdC40LUg0LzQtdGC0L7QtNC+0LIg0YPQstC+ 0LvRjNC90LXQvdC40Y8g0L/RgNC40LzQtdC90LjRgtC10LvRjNC90L4g0Log0YDQsNC30LvQuNGH 0L3Ri9C8wqA8YnIgLz7CoNC00L7Qu9C20L3QvtGB0YLRj9C8LiDQoNCw0YHRgdGC0LDQstCw0L3Q uNC1INGBINGB0L7RgtGA0YPQtNC90LjQutC+0LIsINC60L7RgtC+0YDRi9C5INC80L7QttC10YIg 0L/RgNC10LTRgdGC0LDQstC70Y/RgtGMINC+0L/QsNGB0L3QvtGB0YLRjCDQv9GA0LjCoDxiciAv PsKg0YPQstC+0LvRjNC90LXQvdC40LggKNGC0L7Qv9GLLCDQmNCiINGB0L/QtdGG0LjQsNC70LjR gdGC0YssINCx0YPRhdCz0LDQu9GC0LXRgNCwLCDQu9C40YbQsCwg0LjQvNC10Y7RidC40LUg0LTQ vtGB0YLRg9C/INC6INC60L7QvNC80LXRgNGH0LXRgdC60L7QuSDRgtCw0LnQvdC1wqA8YnIgLz7C oNC4INGCLtC0LikuINCj0LLQvtC70YzQvdC10L3QuNC1INC60LDQuiDQutC+0LzQv9GA0L7QvNC4 0YHRgSDQvNC10LbQtNGDINGA0LDQsdC+0YLQvdC40LrQvtC8INC4INGA0LDQsdC+0YLQvtC00LDR gtC10LvQtdC8PGJyIC8+PGI+My48L2I+wqDQn9C+0LvQuNGC0LjQutCwINC60LDQtNGA0L7QstC+ 0Lkg0LHQtdC30L7Qv9Cw0YHQvdC+0YHRgtC4LiDQn9C+0LTQs9C+0YLQvtCy0LjRgtC10LvRjNC9 0YvQtSDQvNC10YDQvtC/0YDQuNGP0YLQuNGPLCDQv9GA0LXQtNGI0LXRgdGC0LLRg9GO0YnQuNC1 wqA8YnIgLz7CoNGD0LLQvtC70YzQvdC10L3QuNGOLiDQodCx0L7RgCDQuCDQsNC90LDQu9C40Lcg 0LjQvdGE0L7RgNC80LDRhtC40Lgg0L4g0YTQuNC30LjRh9C10YHQutC+0Lwg0LvQuNGG0LUg0L/Q viDQvNC10YLQvtC00YMgU01JQ0UuINCk0L7RgNC80LjRgNC+0LLQsNC90LjQtcKgPGJyIC8+wqDQ vNCw0YLQtdGA0LjQsNC70L7QsiDQuCDQtNC+0YHRjNC1INC90LAg0YHQvtGC0YDRg9C00L3QuNC6 0LAsINC/0L7Qt9Cy0L7Qu9GP0Y7RidC40LUg0YPQsdC10LTQuNGC0Ywg0LXQs9C+INGD0LLQvtC7 0LjRgtGM0YHRjy4g0J/RgNC+0LLQvtC60LDRhtC40L7QvdC90YvQtcKgPGJyIC8+wqDQvNC10YDQ vtC/0YDQuNGP0YLQuNGPINCyINC60LDQtNGA0L7QstC+0Lkg0YDQsNCx0L7RgtC1PGJyIC8+PGI+ NC48L2I+wqDQpNC+0YDQvNC40YDQvtCy0LDQvdC40LUg0L/RgdC40YXQvtC70L7Qs9C40YfQtdGB 0LrQuNGFINC/0L7RgNGC0YDQtdGC0L7QsiDRgdC+0YLRgNGD0LTQvdC40LrQvtCyLiDQn9GB0LjR hdC+0LvQvtCz0LjRh9C10YHQutC40LUg0L/RgNC40LXQvNGLLMKgPGJyIC8+wqDQv9GA0LjQvNC1 0L3Rj9C10LzRi9C1INC00LvRjyDRg9Cx0LXQttC00LXQvdC40Y8g0YHQvtGC0YDRg9C00L3QuNC6 0LAg0YPQstC+0LvQuNGC0YzRgdGPLiDQp9GC0L4g0LvRg9GH0YjQtSAtINGB0L7Qs9C70LDRiNC1 0L3QuNC1INGB0YLQvtGA0L7QvSDQuNC70LjCoDxiciAvPsKg0YHQvtCx0YHRgtCy0LXQvdC90L7Q tSDQttC10LvQsNC90LjQtS4g0KfRgtC+INGB0LTQtdC70LDRgtGMLCDRh9GC0L7QsdGLINGB0L7R gtGA0YPQtNC90LjQuiDQvdC1INGB0LzQvtCzINC/0LXRgNC10LTRg9C80LDRgtGMLiDQkdC+0YDR jNCx0LDCoDxiciAvPsKg0LrQvtC80L/RgNC+0LzQsNGC0L7Qsi4g0JjQvNC40LTQttC10LLRi9C1 INC4INGA0LXQv9GD0YLQsNGG0LjQvtC90L3Ri9C1INCw0YHQv9C10LrRgtGLINCy0L7Qt9C00LXQ udGB0YLQstC40Y8g0L3QsCDRg9Cy0L7Qu9GM0L3Rj9GO0YnQtdCz0L7RgdGPwqA8YnIgLz7CoNGB 0L7RgtGA0YPQtNC90LjQutCwPGJyIC8+PGI+NS48L2I+wqDQpNC+0YDQvNC40YDQvtCy0LDQvdC4 0LUg0LrQvtC00LXQutGB0LAg0LrQvtGA0L/QvtGA0LDRgtC40LLQvdC+0Lkg0Y3RgtC40LrQuCDQ uCDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjQtSDQtdCz0L4g0YLRgNC10LHQvtCy0LDQvdC40Lkg 0L/RgNC4INGD0LLQvtC70YzQvdC10L3QuNC4wqA8YnIgLz7CoNGB0L7RgtGA0YPQtNC90LjQutCw LiDQmNGB0L/QvtC70YzQt9C+0LLQsNC90LjQtSDRgNCw0LfQu9C40YfQvdGL0YUg0YDQvtC70LXQ stGL0YUg0LjQs9GAINCyINC/0YDQvtGG0LXRgdGB0LUg0L/RgNC40LzQtdC90LXQvdC40Y8g0L3Q sCDQv9GA0LDQutGC0LjQutC1wqA8YnIgLz7CoNGC0YDQtdCx0L7QstCw0L3QuNC5INC60L7QtNC1 0LrRgdCwINC60L7RgNC/0L7RgNCw0YLQuNCy0L3QvtC5INGN0YLQuNC60LU8YnIgLz48Yj42Ljwv Yj7CoNCe0YHRg9GJ0LXRgdGC0LLQu9C10L3QuNC1INC60L7QvNC/0LvQsNC10L3RgS3QutC+0L3R gtGA0L7Qu9GPINC30LAg0YHQvtGC0YDRg9C00L3QuNC60LDQvNC4INC60L7QvNC/0LDQvdC40Lgu INCf0YDQuNC80LXQvdC10L3QuNC1INC10LPQviDRgNC10LfRg9C70YzRgtCw0YLQvtCywqA8YnIg Lz7CoNC00LvRjyDQstC+0LfQtNC10LnRgdGC0LLQuNGPINC90LAg0YHQvtGC0YDRg9C00L3QuNC6 0LA8YnIgLz48Yj43LjwvYj7CoNCa0LDQuiDRgNCw0YHRgdGC0LDRgtGM0YHRjyDRgSDQvdC10L/R gNC+0YTQtdGB0YHQuNC+0L3QsNC70LDQvNC4LiDQmNGB0L/Ri9GC0LDQvdC40LUg0LrQsNC6INGB 0L/QvtGB0L7QsSDQvtGG0LXQvdC60Lgg0LrQstCw0LvQuNGE0LjQutCw0YbQuNC4LsKgPGJyIC8+ wqDQo9Cy0L7Qu9GM0L3QtdC90LjQtSDRgdC+0YLRgNGD0LTQvdC40LrQsCDQvdC1INC/0YDQvtGI 0LXQtNGI0LXQs9C+INC40YHQv9GL0YLQsNC90LjRjy4g0J/RgNCw0LLQuNC70LAg0YDQsNCx0L7R gtGLINCw0YLRgtC10YHRgtCw0YbQuNC+0L3QvdGL0YUg0LrQvtC80LjRgdGB0LjQucKgPGJyIC8+ wqDQtNC70Y8g0L/QvtC00YLQstC10YDQttC00LXQvdC40Y8g0LrQstCw0LvQuNGE0LjQutCw0YbQ uNC4PGJyIC8+PGI+OC48L2I+wqDQodC+0LrRgNCw0YnQtdC90LjQtSDRiNGC0LDRgtC+0LIg0LjQ u9C4INC40LfQvNC10L3QtdC90LjQtSDRg9GB0LvQvtCy0LjQuSDRgtGA0YPQtNC+0LLQvtCz0L4g 0LTQvtCz0L7QstC+0YDQsCDQutCw0Log0YHQv9C+0YHQvtCxINC40LfQsdCw0LLQuNGC0YzRgdGP INC+0YLCoDxiciAvPsKg0L3QtdC90YPQttC90YvRhSDRgdC+0YLRgNGD0LTQvdC40LrQvtCyLiDQ n9GA0L7RhtC10LTRg9GA0Ysg0L/RgNC40LzQtdC90LXQvdC40Y8g0L3QsCDQv9GA0LDQutGC0LjQ utC1PGJyIC8+PGI+OS48L2I+wqDQmtCw0Log0YPQstC+0LvQuNGC0Ywg0YHQvtGC0YDRg9C00L3Q uNC60LAsINC6INC60L7RgtC+0YDQvtC80YMg0YPRgtGA0LDRh9C10L3QviDQtNC+0LLQtdGA0LjQ tS4g0J7RgdC+0LHQtdC90L3QvtGB0YLQuCDRg9Cy0L7Qu9GM0L3QtdC90LjRjyDQvNCw0YLQtdGA 0LjQsNC70YzQvdC+wqA8YnIgLz7CoNC+0YLQstC10YLRgdGC0LLQtdC90L3Ri9GFINC70LjRhi4g 0J/RgNC+0YbQtdC00YPRgNGLINC/0YDQvtCy0LXQtNC10L3QuNGPINC40L3QstC10L3RgtCw0YDQ uNC30LDRhtC40Lgg0LjQvNGD0YnQtdGB0YLQstCwINC4INC40L3Ri9GFINCw0LrRgtC40LLQvtCy PGJyIC8+PGI+MTAuPC9iPsKg0J/RgNCw0LLQviDRgNCw0LHQvtGC0L7QtNCw0YLQtdC70Y8g0L3Q sCDRg9Cy0L7Qu9GM0L3QtdC90LjQtSDRgdC+0YLRgNGD0LTQvdC40LrQsCDQuNC3LdC30LAg0L3Q tdC+0LTQvdC+0LrRgNCw0YLQvdC+0LPQviDQvdC10LjRgdC/0L7Qu9C90LXQvdC40Y8g0LjQvMKg PGJyIC8+wqDRgtGA0YPQtNC+0LLRi9GFINC+0LHRj9C30LDQvdC90L7RgdGC0LXQuSDQuNC70Lgg 0LfQsCDQvtC00L3QvtC60YDQsNGC0L3QvtC1INCz0YDRg9Cx0L7QtSDQvdCw0YDRg9GI0LXQvdC4 0LUuINCe0YHQvtCx0LXQvdC90L7RgdGC0Lgg0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40Y/CoDxi ciAvPsKg0Y3RgtC+0LPQviDQv9GA0LDQstCwINC4INC/0YDQvtGG0LXRgdGB0YPQsNC70YzQvdGL 0LUg0L3QvtGA0LzRiywg0LrQvtGC0L7RgNGL0LUg0LTQvtC70LbQvdGLINC/0YDQuCDRjdGC0L7Q vCDRgdC+0LHQu9GO0LTQsNGC0YzRgdGPPGJyIC8+PGI+MTEuPC9iPsKg0J/RgNC+0YTRgdC+0Y7Q t9GLINC60LDQuiDRjdC70LXQvNC10L3RgiDQt9Cw0YnQuNGC0Ysg0YHQvtGC0YDRg9C00L3QuNC6 0LAg0L/RgNC4INGD0LLQvtC70YzQvdC10L3QuNC4LiDQmtCw0Log0YPQsdC10LTQuNGC0Ywg0L/R gNC+0YTRgdC+0Y7Qt8KgPGJyIC8+wqDRgdC+0LPQu9Cw0YHQvtCy0LDRgtGMINC/0YDQvtGG0LXQ tNGD0YDRiyDRg9Cy0L7Qu9GM0L3QtdC90LjRjy4g0KHQv9C+0YHQvtCx0Ysg0LTQvtGB0YLQuNC2 0LXQvdC40Y8g0LvQvtGP0LvRjNC90L7RgdGC0Lgg0YfQu9C10L3QvtCyINC/0YDQvtGE0YHQvtGO 0LfQsCDQv9C+wqA8YnIgLz7CoNC+0YLQvdC+0YjQtdC90LjRjiDQuiDRgNCw0LHQvtGC0L7QtNCw 0YLQtdC70Y48YnIgLz48Yj4xMi48L2I+wqDQn9GA0L7QstC10LTQtdC90LjQtSDQstC90YPRgtGA 0LXQvdC90LjRhSDQv9GA0L7QstC10YDQvtC6INC4INGA0LDRgdGB0LvQtdC00L7QstCw0L3QuNC5 INCyINGB0LvRg9GH0LDQtSDQv9GA0LjQstC70LXRh9C10L3QuNGPINGB0L7RgtGA0YPQtNC90LjQ utCwINC6wqA8YnIgLz7CoNC00LjRgdGG0LjQv9C70LjQvdCw0YDQvdC+0Lkg0L7RgtCy0LXRgtGB 0YLQstC10L3QvdC+0YHRgtC4INCyINCy0LjQtNC1INGD0LLQvtC70YzQvdC10L3QuNGPLiDQntGB 0L7QsdC10L3QvdC+0YHRgtC4INC/0YDQvtCy0LXQtNC10L3QuNGPINGA0LDRgdGB0LvQtdC00L7Q stCw0L3QuNC5wqA8YnIgLz7CoNC/0L4g0YTQsNC60YLQsNC8INGA0LDQt9Cz0LvQsNGI0LXQvdC4 0Y8g0LrQvtC90YTQuNC00LXQvdGG0LjQsNC70YzQvdC+0Lkg0LjQvdGE0L7RgNC80LDRhtC40Lgs INC/0L7Rj9Cy0LvQtdC90LjRjyDQvdCwINGA0LDQsdC+0YLQtSDQsiDRgdC+0YHRgtC+0Y/QvdC4 0LjCoDxiciAvPsKg0L7Qv9GM0Y/QvdC10L3QuNGPLCDQv9GA0L7Qs9GD0LvQsCDQuCDQuNC90YvR hSDQtNC10LnRgdGC0LLQuNC5LCDQv9C+0L/QsNC00LDRjtGJ0LjRhSDQv9C+0LQg0L/QvtC90Y/R gtC40LUg0LPRgNGD0LHQvtC1INC90LDRgNGD0YjQtdC90LjQtTxiciAvPjxiPjEzLjwvYj7CoNCY 0YHQv9C+0LvRjNC30L7QstCw0L3QuNC1INC/0L7Qu9C40LPRgNCw0YTQsCAo0LTQtdGC0LXQutGC 0L7RgNCwINC70LbQuCkg0L/RgNC4INC/0YDQvtCy0LXQtNC10L3QuNC4INCy0L3Rg9GC0YDQtdC9 0L3QuNGFINC/0YDQvtCy0LXRgNC+0Log0LjCoDxiciAvPsKg0YDQsNGB0YHQu9C10LTQvtCy0LDQ vdC40LkuINCa0L7QvdGC0LDQutGC0L3Ri9C5INC40LvQuCDQsdC10YHQutC+0L3RgtCw0LrRgtC9 0YvQuSDQv9C+0LvQuNCz0YDQsNGELCDRh9GC0L4g0LvRg9GH0YjQtT8g0J/RgNCw0LLQvtCy0LDR jyDQuMKgPGJyIC8+wqDQvtGA0LPQsNC90LjQt9Cw0YbQuNC+0L3QvdCw0Y8g0YHRgtC+0YDQvtC9 0LAg0LLQvtC/0YDQvtGB0LAuINCc0L7QttC90L4g0LvQuCDQvtCx0LzQsNC90YPRgtGMINC/0L7Q u9C40LPRgNCw0YQ/wqA8YnIgLz48Yj4xNC48L2I+wqDQlNC+0LrRg9C80LXQvdGC0LDQu9GM0L3Q vtC1INC+0YTQvtGA0LzQu9C10L3QuNC1INGA0LXQt9GD0LvRjNGC0LDRgtC+0LIg0LLQvdGD0YLR gNC10L3QvdC40YUg0L/RgNC+0LLQtdGA0L7QuiAo0YDQsNGB0YHQu9C10LTQvtCy0LDQvdC40Lkp LsKgPGJyIC8+wqDQktC+0LfQvNC+0LbQvdC+0YHRgtGMINC40YHQv9C+0LvRjNC30L7QstCw0L3Q uNGPINGA0LXQt9GD0LvRjNGC0LDRgtC+0LIg0LIg0LrQsNGH0LXRgdGC0LLQtSDQtNC+0LrQsNC3 0LDRgtC10LvRjNGB0YLQstCwINCy0LjQvdGLINGB0L7RgtGA0YPQtNC90LjQutCwLjwvZm9udD48 Zm9udCBmYWNlPSJDYW1icmlhIj48YnIgLz7CoDwvZm9udD48L3A+PC90ZD48dGQgYmdjb2xvcj0i I0RGREZFQSI+wqA8L3RkPjx0ZD7CoDwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PHA+PGZvbnQg ZmFjZT0iQ2FtYnJpYSI+PHNwYW4gbGFuZz0iZW4tdXMiPsKgwqDCoMKgwqDCoMKgwqDCoMKgPC9z cGFuPsKgPGZvbnQgY29sb3I9IiM5ODk4QkMiIHNpemU9IjEiPiogKiAqICogKiAqICogKiAqICog KiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAq ICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqPC9m b250PjxiciAvPjxzcGFuIGxhbmc9ImVuLXVzIj7CoMKgwqDCoMKgwqDCoMKgwqDCoDwvc3Bhbj7C oDxiPtCh0YLQvtC40LzQvtGB0YLRjCDRg9GH0LDRgdGC0LjRjzo8L2I+wqAxMSA4MDAg0YDRg9Cx LjxiciAvPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqA8Yj7QodC60LjQtNC60LggKNC+0YIgMiDRh9C1 0LvQvtCy0LXQutCwIOKAkyAxMCUsIDMg0YfQtdC70L7QstC10LrQsCDigJMgMTUlLCA0INGH0LXQ u9C+0LLQtdC60LAg0Lgg0LHQvtC70LXQtSDigJMgMjAlLik8L2I+PGJyIC8+wqDCoMKgwqDCoMKg wqDCoMKgwqAg0JIg0YHRgtC+0LjQvNC+0YHRgtGMINCy0YXQvtC00LjRgiDQvNC10YLQvtC00LjR h9C10YHQutC40Lkg0LzQsNGC0LXRgNC40LDQuywg0L7QsdC10LTRiywg0LrQvtGE0LUt0L/QsNGD 0LfRiywg0YHQtdGA0YLQuNGE0LjQutCw0YIuPGJyIC8+wqA8L2ZvbnQ+PC9wPjwvdGQ+PC90cj48 L3Rib2R5PjwvdGFibGU+PC9kaXY+PC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj48L3Rk PjwvdHI+PC90Ym9keT48L3RhYmxlPjwvZGl2PjwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PC9k aXY+PC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj48L3RkPjwvdHI+PC90Ym9keT48L3Rh YmxlPjwvZGl2Pg== From tom.leiming@gmail.com Tue Mar 22 01:12:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 883577CA0 for ; Tue, 22 Mar 2016 01:12:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3CFF28F8040 for ; Mon, 21 Mar 2016 23:12:43 -0700 (PDT) X-ASG-Debug-ID: 1458627161-04bdf07eaa729d0001-NocioJ Received: from mail-pf0-f196.google.com (mail-pf0-f196.google.com [209.85.192.196]) by cuda.sgi.com with ESMTP id wvrh8hEbc0gCqYBn (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 21 Mar 2016 23:12:41 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.196 Received: by mail-pf0-f196.google.com with SMTP id u190so34029349pfb.2 for ; Mon, 21 Mar 2016 23:12:41 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=fJlKUlo+6ceK728qPXjq/VtL8O+kzEC0j3qGI1bT6m4=; b=HD8JPI4H0wDOyrX3qF8Si7FzjJWiaFlkx0IUzCMZ/I7jGqdWPzC6zn3FjDi4T5xS8Q +59c9FyjLHNV6m7W1vNcsqjFnXyqlPZP8sxmKfJ8MLMB2n2wE9myGhNDeQt5WyzFsgb0 jjgICTIwy4rAv+L4KFT8/stp080RD0X2NM2+vSySbwyrKSqOp5yV+cC9kLNYkzkjlYlq 1zwijqhSzF79fcYQO1QVldU+e5R0ErHxlmwS8DHdmsiLwoja8qep923BR1Tw8GP0cM9a RPxxqKHVu92Qw1LzYTgoLC3nMdrCGkHI0fGBkw+uSVP5WxMR3H856aUuCAAm/SGFuysL IEiQ== X-Gm-Message-State: AD7BkJL4kAEnm+sAQ9S/in3GUQ3zNpBisnKiEYK/FzCXg20Zfz8nA73k6XAuA71wbHPIbg== X-Received: by 10.66.102.106 with SMTP id fn10mr52182164pab.60.1458627161144; Mon, 21 Mar 2016 23:12:41 -0700 (PDT) Received: from localhost ([116.251.212.171]) by smtp.gmail.com with ESMTPSA id g23sm45058850pfg.35.2016.03.21.23.12.39 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Mon, 21 Mar 2016 23:12:40 -0700 (PDT) From: Ming Lei To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh Subject: [PATCH 0/8] block: prepare for multipage bvecs Date: Tue, 22 Mar 2016 14:12:21 +0800 X-ASG-Orig-Subj: [PATCH 0/8] block: prepare for multipage bvecs Message-Id: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 X-Barracuda-Connect: mail-pf0-f196.google.com[209.85.192.196] X-Barracuda-Start-Time: 1458627161 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-ASG-Whitelist: Body =?UTF-8?B?aHR0cDovL21hcmNcLmluZm8vXD8=?= X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi, Interests[1] have been shown in multipage bvecs, so this patchset try to prepare for the support and do two things: 1) the 1st 4 patches use bvec iterator to implement iterate_bvec(), then we can drop the non-standard way for iterating bvec 2) remove BIO_MAX_SECTORS & BIO_MAX_SIZE, and now there is only one user for each. Once multipage bvecs is introduced, one bio may hold lots of sectors, and we should always use sort of BIO_MAX_VECS which should be introduced in future and is similiar with current BIO_MAX_PAGES. xfstests(-a auto) have been run and no regression found by this patchset against linus v4.5+. drivers/block/drbd/drbd_int.h | 4 +-- fs/xfs/xfs_buf.c | 2 +- include/linux/bio.h | 55 +------------------------------ include/linux/blk_types.h | 4 +-- include/linux/bvec_iter.h | 77 +++++++++++++++++++++++++++++++++++++++++++ lib/iov_iter.c | 31 +++++++---------- 6 files changed, 94 insertions(+), 79 deletions(-) [1], http://marc.info/?w=2&r=1&s=++[LSF%2FMM+ATTEND]+block%3A+multipage+bvecs&q=t Thanks, Ming From tom.leiming@gmail.com Tue Mar 22 01:12:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6F5E37CA4 for ; Tue, 22 Mar 2016 01:12:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2564B304051 for ; Mon, 21 Mar 2016 23:12:49 -0700 (PDT) X-ASG-Debug-ID: 1458627165-04bdf07eab72a10001-NocioJ Received: from mail-pf0-f195.google.com (mail-pf0-f195.google.com [209.85.192.195]) by cuda.sgi.com with ESMTP id JEXlpHLjb7fFdBtO (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 21 Mar 2016 23:12:45 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.195 Received: by mail-pf0-f195.google.com with SMTP id n5so33915675pfn.1 for ; Mon, 21 Mar 2016 23:12:45 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=SUT6VNxCEyG08YkxPdJMy7J2ll0aDfRSuVsQqzJ5e6U=; b=cp2tP7d0IG3QpqGA52L0dBREMsy7Ub//du0qk2rpZli1W7OC5krGJm2koUNOGd56cT cb6/4mwFqiy6QtQnmkdJwkA5Vnz5USUdE2J1savG3dNoHUUji9WXrm6g1yXvDwcJf9BT HRWEuLa6cqbeDJzdoHHVFhSMAWExpjKVkBNtyMUOp+PEMUXlRZ7W+vflE19EnoikVekv RZDmZHOHvGIGIUW97Gv/pDUwyFmouVRav0R7uCiOyUpTNxe3TllcvrCqKYM0Jb9rOyqu bz2p07fd9ZPaVcjNljqqVTgoWP7Sikrzfv/QRijEEVQ/Us4L3JXuxLmwxY9har0L2N9c 26Sw== X-Gm-Message-State: AD7BkJJoq5uyeCfQrFfT+TOWi8JTJSNOed8AQQRzBimV10wxkNxceBywqY2TIbOr1oDHHA== X-Received: by 10.98.19.2 with SMTP id b2mr49477107pfj.93.1458627165125; Mon, 21 Mar 2016 23:12:45 -0700 (PDT) Received: from localhost ([116.251.212.171]) by smtp.gmail.com with ESMTPSA id e87sm45049096pfb.76.2016.03.21.23.12.42 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Mon, 21 Mar 2016 23:12:43 -0700 (PDT) From: Ming Lei To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH 1/8] block: move bvec iterator into include/linux/bvec_iter.h Date: Tue, 22 Mar 2016 14:12:22 +0800 X-ASG-Orig-Subj: [PATCH 1/8] block: move bvec iterator into include/linux/bvec_iter.h Message-Id: <1458627149-12988-2-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> References: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pf0-f195.google.com[209.85.192.195] X-Barracuda-Start-Time: 1458627165 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28044 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header bvec iterator helpers should be used to implement by iterate_bvec():lib/iov_iter.c too, and move them into one header, so that we can keep bvec iterator header out of CONFIG_BLOCK. Then we can remove the inventing of wheel in iterate_bvec(). Signed-off-by: Ming Lei --- include/linux/bio.h | 55 +-------------------------------- include/linux/bvec_iter.h | 78 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 54 deletions(-) create mode 100644 include/linux/bvec_iter.h diff --git a/include/linux/bio.h b/include/linux/bio.h index 88bc64f..4abc129 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -31,6 +31,7 @@ /* struct bio, bio_vec and BIO_* flags are defined in blk_types.h */ #include +#include #define BIO_DEBUG @@ -40,10 +41,6 @@ #define BIO_BUG_ON #endif -#define BIO_MAX_PAGES 256 -#define BIO_MAX_SIZE (BIO_MAX_PAGES << PAGE_CACHE_SHIFT) -#define BIO_MAX_SECTORS (BIO_MAX_SIZE >> 9) - /* * upper 16 bits of bi_rw define the io priority of this bio */ @@ -57,29 +54,6 @@ (bio)->bi_rw |= ((unsigned long) (prio) << BIO_PRIO_SHIFT); \ } while (0) -/* - * various member access, note that bio_data should of course not be used - * on highmem page vectors - */ -#define __bvec_iter_bvec(bvec, iter) (&(bvec)[(iter).bi_idx]) - -#define bvec_iter_page(bvec, iter) \ - (__bvec_iter_bvec((bvec), (iter))->bv_page) - -#define bvec_iter_len(bvec, iter) \ - min((iter).bi_size, \ - __bvec_iter_bvec((bvec), (iter))->bv_len - (iter).bi_bvec_done) - -#define bvec_iter_offset(bvec, iter) \ - (__bvec_iter_bvec((bvec), (iter))->bv_offset + (iter).bi_bvec_done) - -#define bvec_iter_bvec(bvec, iter) \ -((struct bio_vec) { \ - .bv_page = bvec_iter_page((bvec), (iter)), \ - .bv_len = bvec_iter_len((bvec), (iter)), \ - .bv_offset = bvec_iter_offset((bvec), (iter)), \ -}) - #define bio_iter_iovec(bio, iter) \ bvec_iter_bvec((bio)->bi_io_vec, (iter)) @@ -193,33 +167,6 @@ static inline void *bio_data(struct bio *bio) #define bio_for_each_segment_all(bvl, bio, i) \ for (i = 0, bvl = (bio)->bi_io_vec; i < (bio)->bi_vcnt; i++, bvl++) -static inline void bvec_iter_advance(struct bio_vec *bv, struct bvec_iter *iter, - unsigned bytes) -{ - WARN_ONCE(bytes > iter->bi_size, - "Attempted to advance past end of bvec iter\n"); - - while (bytes) { - unsigned len = min(bytes, bvec_iter_len(bv, *iter)); - - bytes -= len; - iter->bi_size -= len; - iter->bi_bvec_done += len; - - if (iter->bi_bvec_done == __bvec_iter_bvec(bv, *iter)->bv_len) { - iter->bi_bvec_done = 0; - iter->bi_idx++; - } - } -} - -#define for_each_bvec(bvl, bio_vec, iter, start) \ - for (iter = (start); \ - (iter).bi_size && \ - ((bvl = bvec_iter_bvec((bio_vec), (iter))), 1); \ - bvec_iter_advance((bio_vec), &(iter), (bvl).bv_len)) - - static inline void bio_advance_iter(struct bio *bio, struct bvec_iter *iter, unsigned bytes) { diff --git a/include/linux/bvec_iter.h b/include/linux/bvec_iter.h new file mode 100644 index 0000000..cc43055 --- /dev/null +++ b/include/linux/bvec_iter.h @@ -0,0 +1,78 @@ +/* + * bvec iterator + * + * Copyright (C) 2001 Ming Lei + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public Licens + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111- + */ +#ifndef __LINUX_BVEC_ITER_H +#define __LINUX_BVEC_ITER_H + +#include + +#define BIO_MAX_PAGES 256 +#define BIO_MAX_SIZE (BIO_MAX_PAGES << PAGE_CACHE_SHIFT) +#define BIO_MAX_SECTORS (BIO_MAX_SIZE >> 9) + +/* + * various member access, note that bio_data should of course not be used + * on highmem page vectors + */ +#define __bvec_iter_bvec(bvec, iter) (&(bvec)[(iter).bi_idx]) + +#define bvec_iter_page(bvec, iter) \ + (__bvec_iter_bvec((bvec), (iter))->bv_page) + +#define bvec_iter_len(bvec, iter) \ + min((iter).bi_size, \ + __bvec_iter_bvec((bvec), (iter))->bv_len - (iter).bi_bvec_done) + +#define bvec_iter_offset(bvec, iter) \ + (__bvec_iter_bvec((bvec), (iter))->bv_offset + (iter).bi_bvec_done) + +#define bvec_iter_bvec(bvec, iter) \ +((struct bio_vec) { \ + .bv_page = bvec_iter_page((bvec), (iter)), \ + .bv_len = bvec_iter_len((bvec), (iter)), \ + .bv_offset = bvec_iter_offset((bvec), (iter)), \ +}) + +static inline void bvec_iter_advance(struct bio_vec *bv, struct bvec_iter *iter, + unsigned bytes) +{ + WARN_ONCE(bytes > iter->bi_size, + "Attempted to advance past end of bvec iter\n"); + + while (bytes) { + unsigned len = min(bytes, bvec_iter_len(bv, *iter)); + + bytes -= len; + iter->bi_size -= len; + iter->bi_bvec_done += len; + + if (iter->bi_bvec_done == __bvec_iter_bvec(bv, *iter)->bv_len) { + iter->bi_bvec_done = 0; + iter->bi_idx++; + } + } +} + +#define for_each_bvec(bvl, bio_vec, iter, start) \ + for (iter = (start); \ + (iter).bi_size && \ + ((bvl = bvec_iter_bvec((bio_vec), (iter))), 1); \ + bvec_iter_advance((bio_vec), &(iter), (bvl).bv_len)) + +#endif /* __LINUX_BVEC_ITER_H */ -- 1.9.1 From tom.leiming@gmail.com Tue Mar 22 01:12:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A41D47CA4 for ; Tue, 22 Mar 2016 01:12:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 22C80AC005 for ; Mon, 21 Mar 2016 23:12:50 -0700 (PDT) X-ASG-Debug-ID: 1458627168-04bdf07eaa72a30001-NocioJ Received: from mail-pf0-f196.google.com (mail-pf0-f196.google.com [209.85.192.196]) by cuda.sgi.com with ESMTP id LQNirH17apCDcFDS (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 21 Mar 2016 23:12:48 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.196 Received: by mail-pf0-f196.google.com with SMTP id x3so33961910pfb.0 for ; Mon, 21 Mar 2016 23:12:48 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=JRGrZxXc3isi/75LqDTXCJyziPV08Vr6wbwyv+3Qi38=; b=m0EVbavFLZGsTztQUnb+D1YNEAL7IZKka+t88f0xYmexvyTdYFpSVmaaLkY4KEWPyj MtLZAQimya5dXGmXqFWqf8bQaSQ5nNpuwGgDRc29R0Fi6PlgcA18NhXfuwWq6wrXwqxG dNpRbEpcaKiu0xz3JPQRsubdMssJZXo8Z8Rm864nwUbJo+i2ihcs8voDUJQv5FcvoG5f PrGLFd4k2uKOZvUI2KDdMtikGC/65rXpfM89wa1MCNKTFU+6+wSMCdak7sYdvvKVlXjQ iAYuff2oimIXyNDUsfaLoIlgTpeV9rPUSuMyFE/BX3yKRcfiV/qcMtO1KfmZ/fmjQAmO sfSQ== X-Gm-Message-State: AD7BkJJBn5fLym6c5BdgswImNMlb5I8uqltQ96TdYTmdaGB3p1r+gpX2a2OoFWFOIqGR2w== X-Received: by 10.98.86.157 with SMTP id h29mr51310284pfj.105.1458627168144; Mon, 21 Mar 2016 23:12:48 -0700 (PDT) Received: from localhost ([116.251.212.171]) by smtp.gmail.com with ESMTPSA id l4sm30021452pfi.73.2016.03.21.23.12.46 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Mon, 21 Mar 2016 23:12:47 -0700 (PDT) From: Ming Lei To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH 2/8] block: make 'struct bvec_iter' not depend on CONFIG_BLOCK Date: Tue, 22 Mar 2016 14:12:23 +0800 X-ASG-Orig-Subj: [PATCH 2/8] block: make 'struct bvec_iter' not depend on CONFIG_BLOCK Message-Id: <1458627149-12988-3-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> References: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pf0-f196.google.com[209.85.192.196] X-Barracuda-Start-Time: 1458627168 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28044 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header We will use bvec iterator to implement iterate_bvec(): lib/iov_iter.c. Signed-off-by: Ming Lei --- include/linux/blk_types.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index 86a38ea..fd8527b 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h @@ -26,8 +26,6 @@ struct bio_vec { unsigned int bv_offset; }; -#ifdef CONFIG_BLOCK - struct bvec_iter { sector_t bi_sector; /* device address in 512 byte sectors */ @@ -39,6 +37,8 @@ struct bvec_iter { current bvec */ }; +#ifdef CONFIG_BLOCK + /* * main unit of I/O for the block layer and lower layers (ie drivers and * stacking drivers) -- 1.9.1 From tom.leiming@gmail.com Tue Mar 22 01:12:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5E30F7CA4 for ; Tue, 22 Mar 2016 01:12:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2D292304051 for ; Mon, 21 Mar 2016 23:12:54 -0700 (PDT) X-ASG-Debug-ID: 1458627171-04cb6c05a030650001-NocioJ Received: from mail-pf0-f194.google.com (mail-pf0-f194.google.com [209.85.192.194]) by cuda.sgi.com with ESMTP id wV0wSC3fDN6BcPhH (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 21 Mar 2016 23:12:51 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.194 Received: by mail-pf0-f194.google.com with SMTP id n5so33916050pfn.1 for ; Mon, 21 Mar 2016 23:12: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:from:to:cc:subject:date:message-id:in-reply-to :references; bh=5ZA6Ax9OBrp41iHL/m3r4hZE6YApLNY6MZLi/cjRlW8=; b=KFgLFSxyPtsrhhvgzU2YPsm0u4Lfg/wDDaQvmBjREwJ9qeIvb6gI6OGk3UisMuIpEI hyVBXjk1U8fGqZML2isw5s1qDYd3Loa/K3iKOQnBWwCFXet45aKVbU+hp3Bv2HTbYkb3 3p1pOZ/1xbAyuOnA/kw4MAN8PpVQKRJF+0Aq14AUa1HQNVgvdJBg/bEEzW4V+I1OhTXL 9cXZnjUt+fp6p7gWKD2fTHS54IsCAP34Uy69soT9fbvqShkJu5u0jS1qBIqHIShxxgK/ jm+WPnsMpDxhnsm3SQglAgfIcQNEQdYxpwnZCiGYN229vB7tgbuEGn4TGTKQDlJYMxM2 s7WQ== X-Gm-Message-State: AD7BkJJPBmkz0bi3tOvDB9RTlT++1d1/gEaRG2xRsS+9BftTdOnWsXI1lZ3F1idRpD4PNw== X-Received: by 10.66.139.234 with SMTP id rb10mr50912578pab.104.1458627171292; Mon, 21 Mar 2016 23:12:51 -0700 (PDT) Received: from localhost ([116.251.212.171]) by smtp.gmail.com with ESMTPSA id 20sm44633290pfj.80.2016.03.21.23.12.49 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Mon, 21 Mar 2016 23:12:50 -0700 (PDT) From: Ming Lei To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH 3/8] block: mark 1st parameter of bvec_iter_advance as const Date: Tue, 22 Mar 2016 14:12:24 +0800 X-ASG-Orig-Subj: [PATCH 3/8] block: mark 1st parameter of bvec_iter_advance as const Message-Id: <1458627149-12988-4-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> References: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pf0-f194.google.com[209.85.192.194] X-Barracuda-Start-Time: 1458627171 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28044 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header bvec_iter_advance() only writes the parameter of iterator, so the base address of bvec can be marked as const safely. Without the change, we can see compiling warning in the following patch for implementing iterate_bvec(): lib/iov_iter.c with bvec iterator. Signed-off-by: Ming Lei --- include/linux/bvec_iter.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/linux/bvec_iter.h b/include/linux/bvec_iter.h index cc43055..5798c21 100644 --- a/include/linux/bvec_iter.h +++ b/include/linux/bvec_iter.h @@ -49,7 +49,8 @@ .bv_offset = bvec_iter_offset((bvec), (iter)), \ }) -static inline void bvec_iter_advance(struct bio_vec *bv, struct bvec_iter *iter, +static inline void bvec_iter_advance(const struct bio_vec *bv, + struct bvec_iter *iter, unsigned bytes) { WARN_ONCE(bytes > iter->bi_size, -- 1.9.1 From tom.leiming@gmail.com Tue Mar 22 01:12:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6F94F7CA0 for ; Tue, 22 Mar 2016 01:12:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 308B7304059 for ; Mon, 21 Mar 2016 23:12:57 -0700 (PDT) X-ASG-Debug-ID: 1458627175-04cb6c059e30660001-NocioJ Received: from mail-pf0-f194.google.com (mail-pf0-f194.google.com [209.85.192.194]) by cuda.sgi.com with ESMTP id IHUlgKx8FU6z49E3 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 21 Mar 2016 23:12:55 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.194 Received: by mail-pf0-f194.google.com with SMTP id q129so34518446pfb.3 for ; Mon, 21 Mar 2016 23:12:55 -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=sqH+M04IB5voUIBmOkvSetipqppS8wuuKQ8USkT2zHY=; b=Cb9cNf4OHPXr9dkF/ETDATp1ZAxKJk7zJexovKtxY7sjDiH4OAPu/AqluO+0wF+BwR SxNQt8GbFz23Rmp1WFKyykfjejmx4FuYCN+/DxCRHciyO7R7EyIggTWvaUm6ZhqOH5wT 5t7NS4hcVXskKVdeVL8lEUGLyiyuj/ClRBN2rtFOMKzNSByVDDuLU7FtWF4E1ePbsbh3 BaNt5PFWn0n7mOgrkvqu/aduL03B++0hRE0cLxcPVWXsfwXgOAs1/NSDELpejb1ww+6B /doTba6P0AdWNxNp+NBTs5lkGrz9t3JXc/nMLRI+8HjY5KraJ17rVHWN9uMAYIUB/Fno q7dQ== X-Gm-Message-State: AD7BkJInxhuvAZtT1bLU/bHQISnAOh/aNnPHAlLhvYRYGy3HpBzZ19wZOxNbp0c4Tko2+Q== X-Received: by 10.67.21.231 with SMTP id hn7mr51428424pad.150.1458627174869; Mon, 21 Mar 2016 23:12:54 -0700 (PDT) Received: from localhost ([116.251.212.171]) by smtp.gmail.com with ESMTPSA id y7sm39006429pfa.82.2016.03.21.23.12.53 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Mon, 21 Mar 2016 23:12:54 -0700 (PDT) From: Ming Lei To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH 4/8] iov_iter: use bvec iterator to implement iterate_bvec() Date: Tue, 22 Mar 2016 14:12:25 +0800 X-ASG-Orig-Subj: [PATCH 4/8] iov_iter: use bvec iterator to implement iterate_bvec() Message-Id: <1458627149-12988-5-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> References: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pf0-f194.google.com[209.85.192.194] X-Barracuda-Start-Time: 1458627175 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28044 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header bvec has provided one iterator already, so not necessary to invent a new wheel for this job. Signed-off-by: Ming Lei --- lib/iov_iter.c | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/lib/iov_iter.c b/lib/iov_iter.c index 5fecddc..5e1b224 100644 --- a/lib/iov_iter.c +++ b/lib/iov_iter.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #define iterate_iovec(i, n, __v, __p, skip, STEP) { \ @@ -57,35 +58,25 @@ } #define iterate_bvec(i, n, __v, __p, skip, STEP) { \ - size_t wanted = n; \ + struct bvec_iter __bi, __start; \ + __start.bi_size = n; \ + __start.bi_bvec_done = skip; \ + __start.bi_idx = 0; \ __p = i->bvec; \ - __v.bv_len = min_t(size_t, n, __p->bv_len - skip); \ - if (likely(__v.bv_len)) { \ - __v.bv_page = __p->bv_page; \ - __v.bv_offset = __p->bv_offset + skip; \ + for_each_bvec(__v, __p, __bi, __start) { \ (void)(STEP); \ - skip += __v.bv_len; \ - n -= __v.bv_len; \ } \ - while (unlikely(n)) { \ - __p++; \ - __v.bv_len = min_t(size_t, n, __p->bv_len); \ - if (unlikely(!__v.bv_len)) \ - continue; \ - __v.bv_page = __p->bv_page; \ - __v.bv_offset = __p->bv_offset; \ - (void)(STEP); \ + if (!__bi.bi_idx) \ + skip += __v.bv_len; \ + else \ skip = __v.bv_len; \ - n -= __v.bv_len; \ - } \ - n = wanted; \ } #define iterate_all_kinds(i, n, v, I, B, K) { \ size_t skip = i->iov_offset; \ if (unlikely(i->type & ITER_BVEC)) { \ const struct bio_vec *bvec; \ - struct bio_vec v; \ + struct bio_vec v = { 0 }; \ iterate_bvec(i, n, v, bvec, skip, (B)) \ } else if (unlikely(i->type & ITER_KVEC)) { \ const struct kvec *kvec; \ @@ -102,7 +93,7 @@ size_t skip = i->iov_offset; \ if (unlikely(i->type & ITER_BVEC)) { \ const struct bio_vec *bvec; \ - struct bio_vec v; \ + struct bio_vec v = { 0 }; \ iterate_bvec(i, n, v, bvec, skip, (B)) \ if (skip == bvec->bv_len) { \ bvec++; \ -- 1.9.1 From tom.leiming@gmail.com Tue Mar 22 01:13:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6CB997CA0 for ; Tue, 22 Mar 2016 01:13:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3E6AA304059 for ; Mon, 21 Mar 2016 23:13:00 -0700 (PDT) X-ASG-Debug-ID: 1458627178-04cb6c059e30670001-NocioJ Received: from mail-pf0-f196.google.com (mail-pf0-f196.google.com [209.85.192.196]) by cuda.sgi.com with ESMTP id JPDbPHc6iEEZG7Yo (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 21 Mar 2016 23:12:58 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.196 Received: by mail-pf0-f196.google.com with SMTP id n5so33916501pfn.1 for ; Mon, 21 Mar 2016 23:12: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:from:to:cc:subject:date:message-id:in-reply-to :references; bh=4YK/YD4qFMw5mKW50lYzYBUxPVa1T9Hs6+bw/7iE5oE=; b=F7O7WBjCpRsHT8V2Qi8T95m6j6zU7tjQ5yEy/OJv+CHxQoKtSp7ttNfnzgM+PPzuU0 5tg0PeAeXOgDE2MkIOH/JUKhaa2/y5U65jB8/uPTFwq2VzGm/tRZckZ6nzRaUIsciqJH DEAX3xE7cR9ppE2jCl5Hva6EkUDYWFz2c4HdAoVL1UBZqYNVFN7I8n070U1VaoPNZeGT aB+27KZp5K7VnFBb/rkrqRiWYF/BD9oKvT+fVgj/wMwPMq8iwJIq5Q8nySW9xmwKOSFa m9euAPXDEKpqoKJiqAOhqLwNLkQabl/o6bQXOt+Z0XiUfF058nTGR4NzQuZqtMAbTGka zlQg== X-Gm-Message-State: AD7BkJLEUyLYZ5wbjtRP6PJUGN4DVq0dDS9eD67Mjsbdvwl3i4Th8LdvQp7ZBK6jJ1zQRw== X-Received: by 10.66.118.7 with SMTP id ki7mr51461881pab.152.1458627178117; Mon, 21 Mar 2016 23:12:58 -0700 (PDT) Received: from localhost ([116.251.212.171]) by smtp.gmail.com with ESMTPSA id x18sm45047580pfi.42.2016.03.21.23.12.56 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Mon, 21 Mar 2016 23:12:57 -0700 (PDT) From: Ming Lei To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH 5/8] fs: xfs: replace BIO_MAX_SECTORS with BIO_MAX_PAGES Date: Tue, 22 Mar 2016 14:12:26 +0800 X-ASG-Orig-Subj: [PATCH 5/8] fs: xfs: replace BIO_MAX_SECTORS with BIO_MAX_PAGES Message-Id: <1458627149-12988-6-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> References: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pf0-f196.google.com[209.85.192.196] X-Barracuda-Start-Time: 1458627178 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28044 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header BIO_MAX_PAGES is used as maximum count of bvecs, so replace BIO_MAX_SECTORS with BIO_MAX_PAGES since BIO_MAX_SECTORS is to be removed. Signed-off-by: Ming Lei --- fs/xfs/xfs_buf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 9a2191b..01ef6d2 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1161,7 +1161,7 @@ xfs_buf_ioapply_map( next_chunk: atomic_inc(&bp->b_io_remaining); - nr_pages = BIO_MAX_SECTORS >> (PAGE_SHIFT - BBSHIFT); + nr_pages = BIO_MAX_PAGES; if (nr_pages > total_nr_pages) nr_pages = total_nr_pages; -- 1.9.1 From tom.leiming@gmail.com Tue Mar 22 01:13:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6D16A7CC7 for ; Tue, 22 Mar 2016 01:13:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2D8D68F8040 for ; Mon, 21 Mar 2016 23:13:03 -0700 (PDT) X-ASG-Debug-ID: 1458627181-04bdf07eac72ad0001-NocioJ Received: from mail-pf0-f194.google.com (mail-pf0-f194.google.com [209.85.192.194]) by cuda.sgi.com with ESMTP id FaFqXeYsNUd3z7yV (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 21 Mar 2016 23:13:01 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.194 Received: by mail-pf0-f194.google.com with SMTP id u190so34030692pfb.2 for ; Mon, 21 Mar 2016 23:13: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:from:to:cc:subject:date:message-id:in-reply-to :references; bh=iv1O1BPxf5n0BBs5kAyY0ga0kU++GkPfWYkZcGUfZxI=; b=c6CQURlO6o/LAnZVqV3mw+9SnXc4ItO7RvcDyoryXd3V8LwocoifyFWjiXBlfOTQ+x CkzcKSBPVk9kFsDyHy7fahOOPAVJcr1nW3VXH8TPSpkEKXTAcawHAQti5E88ooBE6COP iPBp9HPc1QG02ty0DuMeqWlJy96+v9HLn/UTar7E08w8CnSQUYvz2ihBP/HGWS0wLXVc X9vZhTb1/5X+oqAymN/g//d2mV059P+6Dk6sOMIKsrebljn1S/13IhvBfpBLT7I4dfqS p6vOdfVOi51PTe886JU8kHzawSsXvi4BS+YWHiJliicN9eAHWTaOuP588WsmBEEfaf0p +jAA== X-Gm-Message-State: AD7BkJLZizrETZC+moo3fZBl4AtfTx24mI5hidk6PU//rwoiq+fGc1Wk9lYOUarieCxapA== X-Received: by 10.98.70.138 with SMTP id o10mr51403767pfi.123.1458627181313; Mon, 21 Mar 2016 23:13:01 -0700 (PDT) Received: from localhost ([116.251.212.171]) by smtp.gmail.com with ESMTPSA id s87sm45020801pfa.89.2016.03.21.23.13.00 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Mon, 21 Mar 2016 23:13:00 -0700 (PDT) From: Ming Lei To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH 6/8] block: bio: remove BIO_MAX_SECTORS Date: Tue, 22 Mar 2016 14:12:27 +0800 X-ASG-Orig-Subj: [PATCH 6/8] block: bio: remove BIO_MAX_SECTORS Message-Id: <1458627149-12988-7-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> References: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pf0-f194.google.com[209.85.192.194] X-Barracuda-Start-Time: 1458627181 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28044 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header No one need this macro, so remove it. The motivation is for supporting multipage bvecs, in which we only know what the max count of bvecs is supported in the bio, instead of max size or max sectors. Signed-off-by: Ming Lei --- include/linux/bvec_iter.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/linux/bvec_iter.h b/include/linux/bvec_iter.h index 5798c21..a979690 100644 --- a/include/linux/bvec_iter.h +++ b/include/linux/bvec_iter.h @@ -24,7 +24,6 @@ #define BIO_MAX_PAGES 256 #define BIO_MAX_SIZE (BIO_MAX_PAGES << PAGE_CACHE_SHIFT) -#define BIO_MAX_SECTORS (BIO_MAX_SIZE >> 9) /* * various member access, note that bio_data should of course not be used -- 1.9.1 From tom.leiming@gmail.com Tue Mar 22 01:13:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 086147CCA for ; Tue, 22 Mar 2016 01:13:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CE945304051 for ; Mon, 21 Mar 2016 23:13:06 -0700 (PDT) X-ASG-Debug-ID: 1458627184-04cbb04da742590001-NocioJ Received: from mail-pf0-f196.google.com (mail-pf0-f196.google.com [209.85.192.196]) by cuda.sgi.com with ESMTP id YCpVbc90e2IbzH0S (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 21 Mar 2016 23:13:04 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.196 Received: by mail-pf0-f196.google.com with SMTP id x3so33962966pfb.0 for ; Mon, 21 Mar 2016 23:13:04 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=VotkddvTvrfFJtAyWCWY1HyUH+HcurGAhCsUzdRX95c=; b=Xfklhp66JB7xm8kXWT6wyF51djMODg31IbWh1hABDBBdXQbRtt3ktYxpvhr9Blqo3x cSR/8P3C+x9FbEXchzGy0yHGVdAppdZNJG8mEGanrCKoC9NlwPIpiY7uFs2SAecQfptv HN5+n/XtQh7zhvrwp7idarWpg0rJUGQ6+pBAwKroZy0xBTp39u9ZxOqoHw9v69UW57X5 6+c7HA6yRKtXLT+h9GWAcjyHzDMDk6QBICDIKko465F3VK9EreraawnHABAE/BeqkaI7 fE5Nd/5+uRoKIEBU2+ujSobLFZrPeodRc0zEs9xWey73Sjw+fF6lcFHYJyrmNh1vkFfe nbfA== X-Gm-Message-State: AD7BkJIJxQXPdjHaUr17Ym5Dl4GuKKlvmqkvXETO/1cXURMZUcjGvdUOvX/J4nrbFLe8rQ== X-Received: by 10.66.164.39 with SMTP id yn7mr51535676pab.107.1458627184213; Mon, 21 Mar 2016 23:13:04 -0700 (PDT) Received: from localhost ([116.251.212.171]) by smtp.gmail.com with ESMTPSA id p79sm45037010pfi.61.2016.03.21.23.13.03 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Mon, 21 Mar 2016 23:13:03 -0700 (PDT) From: Ming Lei To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH 7/8] block: drbd: avoid to use BIO_MAX_SIZE Date: Tue, 22 Mar 2016 14:12:28 +0800 X-ASG-Orig-Subj: [PATCH 7/8] block: drbd: avoid to use BIO_MAX_SIZE Message-Id: <1458627149-12988-8-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> References: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pf0-f196.google.com[209.85.192.196] X-Barracuda-Start-Time: 1458627184 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28044 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header drbd is the only user of BIO_MAX_SIZE, so use BIO_MAX_PAGES instead. Signed-off-by: Ming Lei --- drivers/block/drbd/drbd_int.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index c227fd4..10bfff1 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h @@ -1327,14 +1327,14 @@ struct bm_extent { #endif #endif -/* BIO_MAX_SIZE is 256 * PAGE_CACHE_SIZE, +/* Estimate max bio size as 256 * PAGE_CACHE_SIZE, * so for typical PAGE_CACHE_SIZE of 4k, that is (1<<20) Byte. * Since we may live in a mixed-platform cluster, * we limit us to a platform agnostic constant here for now. * A followup commit may allow even bigger BIO sizes, * once we thought that through. */ #define DRBD_MAX_BIO_SIZE (1U << 20) -#if DRBD_MAX_BIO_SIZE > BIO_MAX_SIZE +#if DRBD_MAX_BIO_SIZE > (BIO_MAX_PAGES << PAGE_CACHE_SHIFT) #error Architecture not supported: DRBD_MAX_BIO_SIZE > BIO_MAX_SIZE #endif #define DRBD_MAX_BIO_SIZE_SAFE (1U << 12) /* Works always = 4k */ -- 1.9.1 From tom.leiming@gmail.com Tue Mar 22 01:13:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 10A197CD1 for ; Tue, 22 Mar 2016 01:13:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C7D088F8039 for ; Mon, 21 Mar 2016 23:13:10 -0700 (PDT) X-ASG-Debug-ID: 1458627187-04cbb04da442590001-NocioJ Received: from mail-pf0-f195.google.com (mail-pf0-f195.google.com [209.85.192.195]) by cuda.sgi.com with ESMTP id pEiueVTyk2Etf4qh (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 21 Mar 2016 23:13:08 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.195 Received: by mail-pf0-f195.google.com with SMTP id x3so33963220pfb.0 for ; Mon, 21 Mar 2016 23:13: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:from:to:cc:subject:date:message-id:in-reply-to :references; bh=tbosPduufi2w9qKVZJkiTRlLhLWbBmkwHtD/gNRNQcc=; b=E1oCtkAn/J1t3TL9OFoBEREzHNg/3BjoWpHmFTc22uDn6FBqcepVvclnubDecL8RvC bZtMpT+BTK4HFCtOliwVtw+KSCowPhWwau0be3/BzNvtSh821/0Jw/KP9RStV9BtIYQk gLwSXo4s3TbspJb9F+Mk7jOJbyBfgsThVekoZixPbQxoAz7IU6l3O+SnUU92hhaOgb5g /5ZmaytvaZAj7rg5UW9lSo4yk+0R3R9yXb9/bzxY30tjAqvaiOXqA7Tur7be0/BHXU90 G8JKox4zTXDCbKy1rbS+PDqQNfLf1JKCgOTOPBu9kRST9zfPvn66m06QsrPaTcXnnwm1 tu/w== X-Gm-Message-State: AD7BkJKbZqPcpnVfX44eqI3ryzH10noyNLq8GiAQvXPYZaP4Vs9ML6z4qjkhEce9KcyAOg== X-Received: by 10.98.80.206 with SMTP id g75mr51280666pfj.127.1458627187648; Mon, 21 Mar 2016 23:13:07 -0700 (PDT) Received: from localhost ([116.251.212.171]) by smtp.gmail.com with ESMTPSA id u21sm44627071pfa.60.2016.03.21.23.13.06 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Mon, 21 Mar 2016 23:13:06 -0700 (PDT) From: Ming Lei To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH 8/8] block: bio: remove BIO_MAX_SIZE Date: Tue, 22 Mar 2016 14:12:29 +0800 X-ASG-Orig-Subj: [PATCH 8/8] block: bio: remove BIO_MAX_SIZE Message-Id: <1458627149-12988-9-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> References: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pf0-f195.google.com[209.85.192.195] X-Barracuda-Start-Time: 1458627188 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28044 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header No one need this macro now, so remove it. The motivation is for supporting multipage bvecs, in which we only know what the max count of bvecs is supported in the bio, instead of max bio size. Signed-off-by: Ming Lei --- include/linux/bvec_iter.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/linux/bvec_iter.h b/include/linux/bvec_iter.h index a979690..8ddaacf 100644 --- a/include/linux/bvec_iter.h +++ b/include/linux/bvec_iter.h @@ -23,7 +23,6 @@ #include #define BIO_MAX_PAGES 256 -#define BIO_MAX_SIZE (BIO_MAX_PAGES << PAGE_CACHE_SHIFT) /* * various member access, note that bio_data should of course not be used -- 1.9.1 From shyam@zadarastorage.com Tue Mar 22 06:21:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 BE66D7CA0 for ; Tue, 22 Mar 2016 06:21:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7572D304051 for ; Tue, 22 Mar 2016 04:21:44 -0700 (PDT) X-ASG-Debug-ID: 1458645701-04bdf07eaba2100001-NocioJ Received: from mail-ob0-f175.google.com (mail-ob0-f175.google.com [209.85.214.175]) by cuda.sgi.com with ESMTP id pNaP1O1OxtIvxeEd (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 22 Mar 2016 04:21:41 -0700 (PDT) X-Barracuda-Envelope-From: shyam@zadarastorage.com X-Barracuda-Apparent-Source-IP: 209.85.214.175 Received: by mail-ob0-f175.google.com with SMTP id xj3so28956695obb.0 for ; Tue, 22 Mar 2016 04:21:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zadarastorage-com.20150623.gappssmtp.com; s=20150623; h=from:mime-version:thread-index:date:message-id:subject:to:cc; bh=kbLpbmxJUiS2YoUEkfn4c3cnrj+rq+7LWt7dBSKJNhU=; b=nQt8yJ0w0f1N2gprhzCLWb++FKb1Yih6qbm1P1H4qdxrBbd4rf8hfSIcXP5tI03OQR GpFuB3V54fGVo/9i0CDCwyLHspS6y1RLKVTTj4YVJbhpuNrSeoanH1+rw1qPR95GLlk3 KSwW6Lb3srfo8DRivsKp+Xq5BYLJjhHQ9qAsij95das18sbHw/3/halFx4Q1YuPNndUD 9QWTwnrKaRqh5+ewkVBiSk/25o9+9chpJe5OnuoHnrIjQYxpqAZyxzKRzun9zMnGYRHX ANAQmSGOv3aGyVFS9RNQrx599DFm+8yvUklqycielQ7xEXkyCNqfinW9yEZvFqtrCrHT 3cFA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:mime-version:thread-index:date:message-id :subject:to:cc; bh=kbLpbmxJUiS2YoUEkfn4c3cnrj+rq+7LWt7dBSKJNhU=; b=QgFG+n97Fkrht5ghxRJ0XYpP9XS0aDCzFOTbXSDZNY/BjmgZPYgfIFKFgcRkRA4Uj5 0KKGPQAx0+PBvscXe+/3BfmjFM1XUI0AiEdEj8PDl5lwRTglaqont2yVPLex2RFMtltV Ylh2aRiuCTQjcFs2cdnIqH0Lr8h78hhpUt/cGzumlaQ+SKOMGoR/srqz6oEnfq9sxcQo AqgY4djeN/LIYai5xEu5iiJbmA/M3dZ9mIb3vNMjBvE/aN7gZmbqllpJs4XYdcXlwxgr NTm+3+33IHRfHWt/ElKp6WnIv8QMZ7WQeiLZ9Kbg9FJyQtmY4g/FpMaH4Y4Y9sPd5PWK HiIQ== X-Gm-Message-State: AD7BkJItTEQb9R6VVsd+tEBWcrrfW9nbAGdweWA3xlqBb+Gx+zJNDzNSpjwOm8eZ+GIMAJ3M1WvK4eAEX0Yf0A== X-Received: by 10.182.39.162 with SMTP id q2mr19920845obk.65.1458645701028; Tue, 22 Mar 2016 04:21:41 -0700 (PDT) From: Shyam Kaushik MIME-Version: 1.0 X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AdGELQEMYEFz06aHSzSLSYobQ6jdRg== Date: Tue, 22 Mar 2016 16:51:39 +0530 Message-ID: Subject: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery To: xfs@oss.sgi.com X-ASG-Orig-Subj: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Cc: Alex Lyakas Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ob0-f175.google.com[209.85.214.175] X-Barracuda-Start-Time: 1458645701 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/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=DKIM_SIGNED, DKIM_VERIFIED, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28050 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi XFS developers, We are seeing the following issue with XFS on kernel 3.18.19. We have XFS mounted over a raw disk. Disk was pulled out manually. There were async writes on files that were errored like this Mar 16 16:03:21 host0 kernel: [ 4635.645613] XFS (dm-29): metadata I/O error: block 0x7442c20 ("xfs_buf_iodone_callbacks") error 5 numblks 8 Mar 16 16:03:21 host0 kernel: [ 4635.945044] XFS (dm-29): Detected failing async write on buffer block 0x7442c20. Retrying async write. Mar 16 16:03:21 host0 kernel: [ 4635.945048] XFS (dm-29): Detected failing async write on buffer block 0x7442c28. Retrying async write. Mar 16 16:03:21 host0 kernel: [ 4635.945050] XFS (dm-29): Detected failing async write on buffer block 0x7442c30. Retrying async write. Mar 16 16:03:21 host0 kernel: [ 4635.965056] XFS (dm-29): Detected failing async write on buffer block 0x7443008. Retrying async write. Mar 16 16:03:21 host0 kernel: [ 4635.965070] XFS (dm-29): Detected failing async write on buffer block 0xae64230. Retrying async write. Mar 16 16:03:21 host0 kernel: [ 4635.965075] XFS (dm-29): Detected failing async write on buffer block 0xae64210. Retrying async write. Mar 16 16:03:21 host0 kernel: [ 4635.965080] XFS (dm-29): Detected failing async write on buffer block 0xae64228. Retrying async write. Mar 16 16:03:21 host0 kernel: [ 4635.965085] XFS (dm-29): Detected failing async write on buffer block 0xae64220. Retrying async write. Mar 16 16:03:21 host0 kernel: [ 4635.965090] XFS (dm-29): Detected failing async write on buffer block 0xae64208. Retrying async write. Mar 16 16:03:21 host0 kernel: [ 4636.005024] XFS (dm-29): Detected failing async write on buffer block 0xe885828. Retrying async write. And XFS hit metadata & Log IO errors that it decides to shutdown: Mar 16 16:03:22 host0 kernel: [ 4637.351841] XFS (dm-29): metadata I/O error: block 0x3a27fbd0 ("xlog_iodone") error 5 numblks 64 Mar 16 16:03:22 host0 kernel: [ 4637.352820] XFS(dm-29): SHUTDOWN!!! old_flags=0x0 new_flags=0x2 Mar 16 16:03:22 host0 kernel: [ 4637.353187] XFS (dm-29): Log I/O Error Detected. Shutting down filesystem Mar 16 16:03:22 host0 kernel: [ 4637.353202] XFS (dm-29): xfs_log_force: error -5 returned. Mar 16 16:03:22 host0 kernel: [ 4637.354037] XFS (dm-29): Please umount the filesystem and rectify the problem(s) Mar 16 16:03:22 host0 kernel: [ 4637.354704] Buffer I/O error on dev dm-29, logical block 122146379, lost async page write After this happens, constantly XFS prints log force failure every 30-secs Mar 16 16:03:51 host0 kernel: [ 4665.695023] XFS (dm-29): xfs_log_force: error -5 returned. Mar 16 16:04:21 host0 kernel: [ 4695.775022] XFS (dm-29): xfs_log_force: error -5 returned. Mar 16 16:04:51 host0 kernel: [ 4725.855021] XFS (dm-29): xfs_log_force: error -5 returned. Mar 16 16:05:21 host0 kernel: [ 4755.935033] XFS (dm-29): xfs_log_force: error -5 returned. Later the drive was re-inserted back. After the drive was re-inserted, XFS was attempted to be unmounted Mar 16 16:16:53 host0 controld: [2557] [ ] umount[202] : umount(/sdisk/vol5b0, xfs) But nothing happens except for the 30-secs xfs_log_force errors that keeps repeating Mar 16 16:16:53 host0 kernel: [ 5448.122129] XFS (dm-29): xfs_log_force: error -5 returned. Mar 16 16:16:53 host0 kernel: [ 5448.135107] XFS (dm-29): xfs_log_force: error -5 returned. Mar 16 16:17:23 host0 kernel: [ 5477.855028] XFS (dm-29): xfs_log_force: error -5 returned. Mar 16 16:17:53 host0 kernel: [ 5507.935034] XFS (dm-29): xfs_log_force: error -5 returned. Mar 16 16:18:23 host0 kernel: [ 5538.015020] XFS (dm-29): xfs_log_force: error -5 returned. Mar 16 16:18:53 host0 kernel: [ 5568.095031] XFS (dm-29): xfs_log_force: error -5 returned. Mar 16 16:19:23 host0 kernel: [ 5598.175025] XFS (dm-29): xfs_log_force: error -5 returned. Mar 16 16:19:53 host0 kernel: [ 5628.255023] XFS (dm-29): xfs_log_force: error -5 returned. Mar 16 16:20:23 host0 kernel: [ 5658.335027] XFS (dm-29): xfs_log_force: error -5 returned. Mar 16 16:20:54 host0 kernel: [ 5688.415028] XFS (dm-29): xfs_log_force: error -5 returned. Mar 16 16:21:24 host0 kernel: [ 5718.495021] XFS (dm-29): xfs_log_force: error -5 returned. Mar 16 16:21:54 host0 kernel: [ 5748.575024] XFS (dm-29): xfs_log_force: error -5 returned. & we run into a hung-task timeout like this Mar 16 16:22:07 host0 kernel: [ 5762.085031] INFO: task controld:2557 blocked for more than 180 seconds. Mar 16 16:22:07 host0 kernel: [ 5762.086224] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Mar 16 16:22:07 host0 kernel: [ 5762.086897] controld D ffff88023fc13540 0 2557 1 0x00000000 Mar 16 16:22:07 host0 kernel: [ 5762.086901] ffff880223a07d58 0000000000000086 ffff88023332d100 0000000000013540 Mar 16 16:22:07 host0 kernel: [ 5762.086903] ffff880223a07fd8 0000000000013540 ffffffff81c1d4c0 ffff88023332d100 Mar 16 16:22:07 host0 kernel: [ 5762.086906] ffff880210f5f980 ffff88020fdb1600 ffff880210f5f980 ffff88020fdb1640 Mar 16 16:22:07 host0 kernel: [ 5762.086908] Call Trace: Mar 16 16:22:07 host0 kernel: [ 5762.086914] [] schedule+0x29/0x70 Mar 16 16:22:07 host0 kernel: [ 5762.086939] [] xfs_ail_push_all_sync+0xa9/0xe0 [xfs] Mar 16 16:22:07 host0 kernel: [ 5762.086942] [] ? prepare_to_wait_event+0x110/0x110 Mar 16 16:22:07 host0 kernel: [ 5762.086958] [] xfs_unmountfs+0x61/0x1a0 [xfs] Mar 16 16:22:07 host0 kernel: [ 5762.086970] [] ? xfs_mru_cache_destroy+0x6b/0x90 [xfs] Mar 16 16:22:07 host0 kernel: [ 5762.086982] [] xfs_fs_put_super+0x2d/0x70 [xfs] Mar 16 16:22:07 host0 kernel: [ 5762.086985] [] generic_shutdown_super+0x76/0x100 Mar 16 16:22:07 host0 kernel: [ 5762.086987] [] kill_block_super+0x27/0x70 Mar 16 16:22:07 host0 kernel: [ 5762.086990] [] deactivate_locked_super+0x49/0x60 Mar 16 16:22:07 host0 kernel: [ 5762.086992] [] deactivate_super+0x4e/0x70 Mar 16 16:22:07 host0 kernel: [ 5762.086995] [] cleanup_mnt+0x43/0x90 Mar 16 16:22:07 host0 kernel: [ 5762.086998] [] __cleanup_mnt+0x12/0x20 Mar 16 16:22:07 host0 kernel: [ 5762.087003] [] task_work_run+0xa7/0xe0 Mar 16 16:22:07 host0 kernel: [ 5762.087016] [] do_notify_resume+0x97/0xb0 Mar 16 16:22:07 host0 kernel: [ 5762.087019] [] int_signal+0x12/0x17 Looks like unmount/xfs_ail_push_all_sync() decided to wake up the aild task to flush, but is never woken up at all after this. These are the other stack traces [8506] xfsalloc [] rescuer_thread+0x209/0x2a0 [] kthread+0xc9/0xe0 [] ret_from_fork+0x58/0x90 [] 0xffffffffffffffff [8507] xfs_mru_cache [] rescuer_thread+0x209/0x2a0 [] kthread+0xc9/0xe0 [] ret_from_fork+0x58/0x90 [] 0xffffffffffffffff [8508] xfslogd [] rescuer_thread+0x209/0x2a0 [] kthread+0xc9/0xe0 [] ret_from_fork+0x58/0x90 [] 0xffffffffffffffff [8663] xfs-data/dm-29 [] rescuer_thread+0x209/0x2a0 [] kthread+0xc9/0xe0 [] ret_from_fork+0x58/0x90 [] 0xffffffffffffffff [8665] xfs-conv/dm-29 [] rescuer_thread+0x209/0x2a0 [] kthread+0xc9/0xe0 [] ret_from_fork+0x58/0x90 [] 0xffffffffffffffff [8670] xfs-cil/dm-29 [] rescuer_thread+0x209/0x2a0 [] kthread+0xc9/0xe0 [] ret_from_fork+0x58/0x90 [] 0xffffffffffffffff [8672] xfsaild/dm-29 [] xfsaild+0x5a7/0x630 [xfs] [] kthread+0xc9/0xe0 [] ret_from_fork+0x58/0x90 [] 0xffffffffffffffff This problem doesn't happen consistently, but happens periodically with a drive failure/recovery followed by XFS unmount. I couldn't find this issue fixed in later kernels. Can you please suggest how I can debug this issue further? Thanks! --Shyam From bfoster@redhat.com Tue Mar 22 07:05:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0205F7CA4 for ; Tue, 22 Mar 2016 07:05:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6E5EBAC003 for ; Tue, 22 Mar 2016 05:05:52 -0700 (PDT) X-ASG-Debug-ID: 1458648351-04bdf07ea9a92f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GZCEkFtkGSrQSnIw (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 22 Mar 2016 05:05:51 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 166D3219E; Tue, 22 Mar 2016 12:05:51 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-24.bos.redhat.com [10.18.41.24]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2MC5oSo029213; Tue, 22 Mar 2016 08:05:50 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id B2A59120EE7; Tue, 22 Mar 2016 08:05:49 -0400 (EDT) Date: Tue, 22 Mar 2016 08:05:49 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, dm-devel@redhat.com, linux-block@vger.kernel.org Subject: Re: [RFC PATCH 1/9] block: add block_device_operations methods to set and get reserved space Message-ID: <20160322120548.GA51718@bfoster.bfoster> X-ASG-Orig-Subj: Re: [RFC PATCH 1/9] block: add block_device_operations methods to set and get reserved space References: <1458225037-24155-1-git-send-email-bfoster@redhat.com> <1458225037-24155-2-git-send-email-bfoster@redhat.com> <20160321120829.GB25476@redhat.com> <20160321215333.GM11812@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160321215333.GM11812@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458648351 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Re-add dm-devel@redhat.com, linux-block@vger.kernel.org to CC. On Tue, Mar 22, 2016 at 08:53:33AM +1100, Dave Chinner wrote: > On Mon, Mar 21, 2016 at 01:08:29PM +0100, Carlos Maiolino wrote: > > Hi, > > > > Good news about this interface, I just have a small suggestion in this patch: > > > > On Thu, Mar 17, 2016 at 10:30:29AM -0400, Brian Foster wrote: > > > From: Mike Snitzer > > > > > > Signed-off-by: Mike Snitzer > > > --- > > > fs/block_dev.c | 20 ++++++++++++++++++++ > > > include/linux/blkdev.h | 5 +++++ > > > 2 files changed, 25 insertions(+) > > > > > > diff --git a/fs/block_dev.c b/fs/block_dev.c > > > index 826b164..375a2e4 100644 > > > --- a/fs/block_dev.c > > > +++ b/fs/block_dev.c > > > @@ -497,6 +497,26 @@ long bdev_direct_access(struct block_device *bdev, struct blk_dax_ctl *dax) > > > } > > > EXPORT_SYMBOL_GPL(bdev_direct_access); > > > > > > +int blk_reserve_space(struct block_device *bdev, sector_t nr_sects) > > > +{ > > > + const struct block_device_operations *ops = bdev->bd_disk->fops; > > > + > > > + if (!ops->reserve_space) > > > + return -EOPNOTSUPP; > > > + return ops->reserve_space(bdev, nr_sects); > > > +} > > > +EXPORT_SYMBOL_GPL(blk_reserve_space); > > > > Wouldn't be better to have this function name standardized accordingly to the > > next one? Something like blk_set_reserved_space() maybe? > > Personally I see no point in wrappers like this. We don't add > wrappers for ops methods in any other layers of the stack, > filesystems are quite capable of checking if the method is available > directly, so it seems pretty pointless to me... > I don't have too much of a preference, personally. I think these were slapped together fairly quickly just to get some kind of mechanism exposed. I was thinking more of combining them into a single method that takes a signed value for a reservation delta rather than an absolute value and simultaneously supports the ability to adjust or retrieve the current reservation. Unless I hear other thoughts or objections, I can probably clean that up and drop the wrappers for a subsequent post as I have some other fixes pending as well. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > -- > To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html From bfoster@redhat.com Tue Mar 22 07:07:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E7C837CA6 for ; Tue, 22 Mar 2016 07:07:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A8DA2304059 for ; Tue, 22 Mar 2016 05:07:00 -0700 (PDT) X-ASG-Debug-ID: 1458648418-04cbb04da461420001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id nioaHcUkhWD1BAwW (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 22 Mar 2016 05:06: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-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id C4D756445F; Tue, 22 Mar 2016 12:06:58 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-24.bos.redhat.com [10.18.41.24]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2MC6wqT029737; Tue, 22 Mar 2016 08:06:58 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 75517120EE7; Tue, 22 Mar 2016 08:06:57 -0400 (EDT) Date: Tue, 22 Mar 2016 08:06:57 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, dm-devel@redhat.com, linux-block@vger.kernel.org Subject: Re: [RFC PATCH 0/9] dm-thin/xfs: prototype a block reservation allocation model Message-ID: <20160322120656.GB51718@bfoster.bfoster> X-ASG-Orig-Subj: Re: [RFC PATCH 0/9] dm-thin/xfs: prototype a block reservation allocation model References: <1458225037-24155-1-git-send-email-bfoster@redhat.com> <20160321133346.GD25476@redhat.com> <20160321223621.GN11812@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160321223621.GN11812@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Tue, 22 Mar 2016 12:06:58 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458648419 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Re-add dm-devel@redhat.com, linux-block@vger.kernel.org to CC. (Also not trimming since the previous replies dropped some CCs) On Tue, Mar 22, 2016 at 09:36:21AM +1100, Dave Chinner wrote: > On Mon, Mar 21, 2016 at 02:33:46PM +0100, Carlos Maiolino wrote: > > Hi. > > > > From my point of view, I like the idea of an interface between the filesystem, > > and the thin-provisioned device, so that we can actually know if the thin > > volume is running out of space or not, but, before we actually start to discuss > > how this should be implemented, I'd like to ask if this should be implemented. > > TL;DR: No-brainer, yes. > > > After a few days discussing this with some block layer and dm-thin developers, > > what I most hear/read is that a thin volume should be transparent to the > > filesystem. So, the filesystem itself should not know it's running over a > > thin-provisioned volume. And such interface being discussed here, breaks this > > abstraction. > > We're adding things like fallocate to block devices to control > preallocation, zeroing and freeing of ranges within the block device > from user space. If filesystems can't directly control and query > block device ranges on thinp block devices, then why should we let > userspace have this capability? > > The problem we need to solve is that users want transparency between > filesystems and thinp devices. They don't want the filesytsem to > tell them they have lots of space available, and then get unexpected > ENOSPC because the thinp pool backing the fs has run out of space. > Users don't want a write over a region they have run > posix_fallocate() on to return ENOSPC because the thinp pool ran out > of space, even after the filesystem said it guaranteed space was > available.Filesystems want to know that they should run fstrim > passes internally when the underlying thinp pool is running out of > space so that it can free as much unused space as possible. > > So there's lots of reasons why we need closer functional integration of > the filesytem and block layers, but doing this does not need to > break the abstraction layer between the filesystem and block device. > Indeed, we have already have mechanisms to provide block layer > functionality to the filesystems, and this patchset uses it - the > bdev ops structure. > > Just because the filesystem knows that the underlying device has > it's own space management and it has to interact with it to give > users the correct results does not mean we are "breaking layering > abstractions". Filesystems has long assumed that the the LBA space > presented by the block device is a physical representation of the > underlying device. > > We know this is not true, and has not been true for a long time. > Most devices really present a virtual LBA space to the higher > layers, and manipulate their underlying "physical" storage in a > manner that suits them best. SSDs do this, thinp does this, RAID > does this, dedupe/compressing/encrypting storage does this, etc. > IOWs, we've got virtual LBA abstractions right through the storage > stack, whether the higher layers realise it or not. > > IOWs, we know that filesystems have been using virutal LBA address > spaces for a long time, yet we keep a block device model that > treats them as a physical, unchangable address space with known > physical characteristics (e.g. seek time is correlated with LBA > distance). We need to stop thinking of block devices as linear > devices and start treating them as they really are - a set of > devices capable of complex management operations, and we need > to start exposing those management operations for the higher layer > to be able to take advantage of. > > Filesystems can take advantage of block devices that expose some of > their space management operations. We can make the interactions > users have on these storage stacks much better if we expose smarter > primitives from the block devices to the filesystems. We don't need > to break or change any abstractions - the filesystem is still very > much separate from the block device - but we need to improve the > communications and functionality channels between them. > Thanks for the replies. I don't have a ton to add on this point beyond that I tend to agree with Dave. I don't think the mere existence of additional functionality in the thin bdev necessarily breaks any kind of contract or layering between the filesystem and thin volume. The key point there is everything should continue to work as it does today if the underlying device doesn't support the particular mechanism (i.e., reservation), the filesystem doesn't have support, or if the administrator simply chooses not to enable it at mount time (I'd expect a new mount option, though this rfc enlists '-o discard' for that purpose ;) due to the tradeoffs. The bigger questions I have are whether people agree the solution is useful, whether the reserve/provision interface is appropriate or generic enough for outside the XFS sandbox I'm playing in, etc. For example, I wonder if something similar could be extended to writeable snapshots in the future to avoid exhaustion of the exception store. Last I knew, this currently can result in invalidating the entire snapshot. I think COW down in the volume turns that into a slightly different problem for the fs, but I would expect to be able to use the same general mechanism there. That said, if these are internal only interfaces, perhaps it's not such a big deal if they evolve a bit as we go. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > -- > To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html From bfoster@redhat.com Tue Mar 22 07:19:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 13A057CAF for ; Tue, 22 Mar 2016 07:19:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D5DE88F8040 for ; Tue, 22 Mar 2016 05:19:26 -0700 (PDT) X-ASG-Debug-ID: 1458649164-04cbb04da563390001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id tncNv8plVYEogHj0 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 22 Mar 2016 05:19:25 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 9AEE6C049D5D; Tue, 22 Mar 2016 12:19:24 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-24.bos.redhat.com [10.18.41.24]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2MCJO0e005344; Tue, 22 Mar 2016 08:19:24 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 49E40120EE7; Tue, 22 Mar 2016 08:19:23 -0400 (EDT) Date: Tue, 22 Mar 2016 08:19:23 -0400 From: Brian Foster To: Shyam Kaushik Cc: xfs@oss.sgi.com, Alex Lyakas Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Message-ID: <20160322121922.GA53693@bfoster.bfoster> X-ASG-Orig-Subj: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458649165 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Mar 22, 2016 at 04:51:39PM +0530, Shyam Kaushik wrote: > Hi XFS developers, > > We are seeing the following issue with XFS on kernel 3.18.19. > > We have XFS mounted over a raw disk. Disk was pulled out manually. There > were async writes on files that were errored like this > ... > > And XFS hit metadata & Log IO errors that it decides to shutdown: > > Mar 16 16:03:22 host0 kernel: [ 4637.351841] XFS (dm-29): metadata I/O > error: block 0x3a27fbd0 ("xlog_iodone") error 5 numblks 64 > Mar 16 16:03:22 host0 kernel: [ 4637.352820] XFS(dm-29): SHUTDOWN!!! > old_flags=0x0 new_flags=0x2 > Mar 16 16:03:22 host0 kernel: [ 4637.353187] XFS (dm-29): Log I/O Error > Detected. Shutting down filesystem ... > Later the drive was re-inserted back. After the drive was re-inserted, XFS > was attempted to be unmounted > > Mar 16 16:16:53 host0 controld: [2557] [ ] umount[202] > : umount(/sdisk/vol5b0, xfs) > > But nothing happens except for the 30-secs xfs_log_force errors that keeps > repeating > ... > > This problem doesn't happen consistently, but happens periodically with a > drive failure/recovery followed by XFS unmount. I couldn't find this issue > fixed in later kernels. Can you please suggest how I can debug this issue > further? > Similar problems have been reproduced due to racy/incorrect EFI/EFD object tracking, which are internal data structures associated with freeing extents. What happens if you enable tracepoints while the fs is in this hung unmount state? # trace-cmd start -e "xfs:*" # cat /sys/kernel/debug/tracing/trace_pipe Brian > Thanks! > > --Shyam > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From shyam@zadarastorage.com Tue Mar 22 08:01:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 B15317CB7 for ; Tue, 22 Mar 2016 08:01:58 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 56D32304051 for ; Tue, 22 Mar 2016 06:01:54 -0700 (PDT) X-ASG-Debug-ID: 1458651710-04bdf07eaab1ca0001-NocioJ Received: from mail-ob0-f178.google.com (mail-ob0-f178.google.com [209.85.214.178]) by cuda.sgi.com with ESMTP id gYD9nc8CV7uI8BVr (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 22 Mar 2016 06:01:51 -0700 (PDT) X-Barracuda-Envelope-From: shyam@zadarastorage.com X-Barracuda-Apparent-Source-IP: 209.85.214.178 Received: by mail-ob0-f178.google.com with SMTP id m7so199663561obh.3 for ; Tue, 22 Mar 2016 06:01:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zadarastorage-com.20150623.gappssmtp.com; s=20150623; h=from:references:in-reply-to:mime-version:thread-index:date :message-id:subject:to:cc; bh=6CN0xMASbkgHr3OtTKS7OfoomFv0wclKv/R3pacVhMk=; b=zSolvX9anZkPjeZbTHVaautk4O568Wi2kLI1ZZbT7zsqho7Mh+HdfLHmfGzTN2Wfnr b++0U45sAjHkHRRRWX6mgDO7Mk72bh+TcdLJ5lqqTyGyDeCdRGYPOD5mgvqXSPX6akNg IZhQQTPDkHPvXjA0USJ3JHBN+fWMG0Tv26yRUfiXc2Gzj0GfHRFbshCBPsdml+egykKX 6QZpNv+4/EPgigu/0tBB5r5+zDqFoO3JawyYGzX5/AcSyYWf4r/QS0zVue9RGp+VZhmn 19hzddm04l2wbTnKxsOIrufF8iekezwz8WrO5oM8UkSWZFO4uA6VaaGfA1rTzv7ULsQd mFzA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:references:in-reply-to:mime-version :thread-index:date:message-id:subject:to:cc; bh=6CN0xMASbkgHr3OtTKS7OfoomFv0wclKv/R3pacVhMk=; b=Cs8nFPqk+UgaQ95vdCh0nqirhX3Xs8MFH4LXXipQK0pBdHR2wU68z58SYRjjD946By AvkspUKXbCzVRg/brpmp2xf9j6AeSbBLSXE37LvjJLq/MYMbrxRGxh0+O6CR7eC1hnwl NvJYa9cD9dZCSU4M+Q0AcQ4fC2xnNuDWVMZVdhqjhrfAp9GQqTBfuY2Fn4liLvXuIX1w la4xptYJFy9VpDXtqBdI5KBsrzOeBU7L0NekQfnVzQC86WaOCAcdObj4W6jyAwVkRYZH a6biEe41YK0/b//33dkA+TSDJ22r0TxYTny0NGo5NLDh9MAAlkzh1JM/esdLccECvCN8 z8zw== X-Gm-Message-State: AD7BkJKg31FRK6WmSVufRM6B93P4JFVoDlmiiAvXHbf3wykpe5ln1T1+ducbmZzgFPsg0HcweIUXVjxIw13zxw== X-Received: by 10.182.165.8 with SMTP id yu8mr21669631obb.63.1458651710447; Tue, 22 Mar 2016 06:01:50 -0700 (PDT) From: Shyam Kaushik References: <20160322121922.GA53693@bfoster.bfoster> In-Reply-To: <20160322121922.GA53693@bfoster.bfoster> MIME-Version: 1.0 X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AdGENRKPygQUtyusRzyfZh8lYSPNuwABVHnw Date: Tue, 22 Mar 2016 18:31:48 +0530 Message-ID: <6457b1d9de271ec6cca6bc2626aac161@mail.gmail.com> Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery To: Brian Foster X-ASG-Orig-Subj: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Cc: xfs@oss.sgi.com, Alex Lyakas Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ob0-f178.google.com[209.85.214.178] X-Barracuda-Start-Time: 1458651710 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/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, DKIM_SIGNED, DKIM_VERIFIED, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28051 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi Brian, Thanks for your quick reply. I repeated the test & trace-pipe is constantly filled with this: xfsaild/dm-10-3335 [003] ...2 24890.546491: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.546492: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.546493: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 24890.596491: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.596492: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.596494: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 24890.646497: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.646498: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.646500: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 24890.696467: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 24890.746548: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 24890.796479: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 24890.846467: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.846468: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] while regular activity seems to happen on other inodes/kworker threads kworker/u8:4-27691 [001] ...1 24895.811474: xfs_writepage: dev 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811477: xfs_invalidatepage: dev 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811478: xfs_releasepage: dev 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 0 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811482: xfs_writepage: dev 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811482: xfs_invalidatepage: dev 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 1000 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811483: xfs_releasepage: dev 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 0 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811485: xfs_writepage: dev 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811486: xfs_invalidatepage: dev 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811486: xfs_releasepage: dev 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 0 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.812381: xfs_writepage: dev 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.812382: xfs_invalidatepage: dev 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 1000 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.812382: xfs_releasepage: dev 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 0 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.812385: xfs_writepage: dev 253:10 ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.812385: xfs_invalidatepage: dev 253:10 ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 1000 delalloc 1 unwritten 0 looks like xfsaild is not able to take lock until hung-task timeout kicks in xfsaild/dm-10-3335 [003] ...2 25247.649468: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 25247.699478: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 25247.699516: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 25247.699517: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 25247.749471: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 25247.749478: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 25247.749479: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL Please let me know how to debug this further. Thanks. --Shyam -----Original Message----- From: Brian Foster [mailto:bfoster@redhat.com] Sent: 22 March 2016 17:49 To: Shyam Kaushik Cc: xfs@oss.sgi.com; Alex Lyakas Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery On Tue, Mar 22, 2016 at 04:51:39PM +0530, Shyam Kaushik wrote: > Hi XFS developers, > > We are seeing the following issue with XFS on kernel 3.18.19. > > We have XFS mounted over a raw disk. Disk was pulled out manually. There > were async writes on files that were errored like this > ... > > And XFS hit metadata & Log IO errors that it decides to shutdown: > > Mar 16 16:03:22 host0 kernel: [ 4637.351841] XFS (dm-29): metadata I/O > error: block 0x3a27fbd0 ("xlog_iodone") error 5 numblks 64 > Mar 16 16:03:22 host0 kernel: [ 4637.352820] XFS(dm-29): SHUTDOWN!!! > old_flags=0x0 new_flags=0x2 > Mar 16 16:03:22 host0 kernel: [ 4637.353187] XFS (dm-29): Log I/O Error > Detected. Shutting down filesystem ... > Later the drive was re-inserted back. After the drive was re-inserted, XFS > was attempted to be unmounted > > Mar 16 16:16:53 host0 controld: [2557] [ ] umount[202] > : umount(/sdisk/vol5b0, xfs) > > But nothing happens except for the 30-secs xfs_log_force errors that keeps > repeating > ... > > This problem doesn't happen consistently, but happens periodically with a > drive failure/recovery followed by XFS unmount. I couldn't find this issue > fixed in later kernels. Can you please suggest how I can debug this issue > further? > Similar problems have been reproduced due to racy/incorrect EFI/EFD object tracking, which are internal data structures associated with freeing extents. What happens if you enable tracepoints while the fs is in this hung unmount state? # trace-cmd start -e "xfs:*" # cat /sys/kernel/debug/tracing/trace_pipe Brian > Thanks! > > --Shyam > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Mar 22 09:03:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A32B67CA1 for ; Tue, 22 Mar 2016 09:03:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 670C38F8039 for ; Tue, 22 Mar 2016 07:03:50 -0700 (PDT) X-ASG-Debug-ID: 1458655428-04cb6c059e5f560001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id iVZFXSLKJIdaSl6j (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 22 Mar 2016 07:03:48 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 0B36A804EF; Tue, 22 Mar 2016 14:03:47 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-24.bos.redhat.com [10.18.41.24]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2ME3l8U024524; Tue, 22 Mar 2016 10:03:47 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 17C2F120EE7; Tue, 22 Mar 2016 10:03:46 -0400 (EDT) Date: Tue, 22 Mar 2016 10:03:46 -0400 From: Brian Foster To: Shyam Kaushik Cc: Alex Lyakas , xfs@oss.sgi.com Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Message-ID: <20160322140345.GA54245@bfoster.bfoster> X-ASG-Orig-Subj: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery References: <20160322121922.GA53693@bfoster.bfoster> <6457b1d9de271ec6cca6bc2626aac161@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <6457b1d9de271ec6cca6bc2626aac161@mail.gmail.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458655428 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Mar 22, 2016 at 06:31:48PM +0530, Shyam Kaushik wrote: > Hi Brian, > > Thanks for your quick reply. I repeated the test & trace-pipe is > constantly filled with this: > > xfsaild/dm-10-3335 [003] ...2 24890.546491: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.546492: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.546493: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.596491: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.596492: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.596494: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.646497: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.646498: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.646500: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.696467: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.746548: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.796479: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.846467: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.846468: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > So xfsaild is spinning on this inode. It was presumably modified, logged and flushed to the log, hence it's sitting in the AIL waiting to be flushed to disk. xfsaild wants to push it to get it flushed to disk and off the AIL, but it sees it is already in the flushing state as the flush lock is held. It's not clear to me why the inode is not removed from the AIL, or whether that I/O was actually submitted or aborted with an error. The shutdown involved here most likely affects this one way or the other. IIUC, the I/O completion should eventually release the flush lock and remove the inode from the AIL. A complete trace log of the entire reproducer might shed more light as to what's going on. Also, it sounds like you have a reliable reproducer. Does this reproduce on a recent kernel? Brian > > while regular activity seems to happen on other inodes/kworker threads > > kworker/u8:4-27691 [001] ...1 24895.811474: xfs_writepage: dev 253:10 > ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811477: xfs_invalidatepage: dev > 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > delalloc 1 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811478: xfs_releasepage: dev > 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 > delalloc 0 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811482: xfs_writepage: dev 253:10 > ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811482: xfs_invalidatepage: dev > 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > delalloc 1 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811483: xfs_releasepage: dev > 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 > delalloc 0 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811485: xfs_writepage: dev 253:10 > ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811486: xfs_invalidatepage: dev > 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > delalloc 1 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811486: xfs_releasepage: dev > 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 > delalloc 0 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812381: xfs_writepage: dev 253:10 > ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812382: xfs_invalidatepage: dev > 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 1000 > delalloc 1 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812382: xfs_releasepage: dev > 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc > 0 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812385: xfs_writepage: dev 253:10 > ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812385: xfs_invalidatepage: dev > 253:10 ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 1000 > delalloc 1 unwritten 0 > > > looks like xfsaild is not able to take lock until hung-task timeout kicks > in > > xfsaild/dm-10-3335 [003] ...2 25247.649468: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 25247.699478: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.699516: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.699517: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 25247.749471: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.749478: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.749479: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > Please let me know how to debug this further. Thanks. > > --Shyam > -----Original Message----- > From: Brian Foster [mailto:bfoster@redhat.com] > Sent: 22 March 2016 17:49 > To: Shyam Kaushik > Cc: xfs@oss.sgi.com; Alex Lyakas > Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > after disk failure/recovery > > On Tue, Mar 22, 2016 at 04:51:39PM +0530, Shyam Kaushik wrote: > > Hi XFS developers, > > > > We are seeing the following issue with XFS on kernel 3.18.19. > > > > We have XFS mounted over a raw disk. Disk was pulled out manually. There > > were async writes on files that were errored like this > > > ... > > > > And XFS hit metadata & Log IO errors that it decides to shutdown: > > > > Mar 16 16:03:22 host0 kernel: [ 4637.351841] XFS (dm-29): metadata I/O > > error: block 0x3a27fbd0 ("xlog_iodone") error 5 numblks 64 > > Mar 16 16:03:22 host0 kernel: [ 4637.352820] XFS(dm-29): SHUTDOWN!!! > > old_flags=0x0 new_flags=0x2 > > Mar 16 16:03:22 host0 kernel: [ 4637.353187] XFS (dm-29): Log I/O Error > > Detected. Shutting down filesystem > ... > > Later the drive was re-inserted back. After the drive was re-inserted, > XFS > > was attempted to be unmounted > > > > Mar 16 16:16:53 host0 controld: [2557] [ ] umount[202] > > : umount(/sdisk/vol5b0, xfs) > > > > But nothing happens except for the 30-secs xfs_log_force errors that > keeps > > repeating > > > ... > > > > This problem doesn't happen consistently, but happens periodically with > a > > drive failure/recovery followed by XFS unmount. I couldn't find this > issue > > fixed in later kernels. Can you please suggest how I can debug this > issue > > further? > > > > Similar problems have been reproduced due to racy/incorrect EFI/EFD > object tracking, which are internal data structures associated with > freeing extents. > > What happens if you enable tracepoints while the fs is in this hung > unmount state? > > # trace-cmd start -e "xfs:*" > # cat /sys/kernel/debug/tracing/trace_pipe > > Brian > > > Thanks! > > > > --Shyam > > > > _______________________________________________ > > 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 cmaiolino@redhat.com Tue Mar 22 10:38:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C6D297CB7 for ; Tue, 22 Mar 2016 10:38:34 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 88C53304064 for ; Tue, 22 Mar 2016 08:38:31 -0700 (PDT) X-ASG-Debug-ID: 1458661109-04cb6c059d70fd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ZDELhEjkSOdMWRdw (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 22 Mar 2016 08:38:30 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 089B7C049D60 for ; Tue, 22 Mar 2016 15:38:29 +0000 (UTC) Received: from redhat.com (dhcp-26-103.brq.redhat.com [10.34.26.103]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2MFcQqg024088 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 22 Mar 2016 11:38:28 -0400 Date: Tue, 22 Mar 2016 16:38:25 +0100 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Message-ID: <20160322153825.GA2802@redhat.com> X-ASG-Orig-Subj: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Mail-Followup-To: xfs@oss.sgi.com References: <20160322121922.GA53693@bfoster.bfoster> <6457b1d9de271ec6cca6bc2626aac161@mail.gmail.com> <20160322140345.GA54245@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160322140345.GA54245@bfoster.bfoster> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458661109 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi Brian, These traces, and the stack trace presented, looks quite similar with the one we were discussing a few days ago, using a dm-thin snapshot. Looks like with the same bug I've been hunting and Shyam confirmed my hypothesis of this bug be able to be reproduced with a regular device. If it's the same bug, yes, I reproduced it using upstream kernel. The difference between both (this bug and the one I've been working on) is how xfs actually behaves when async metadata writes fail. Other than that, it pretty much looks the same. Trying to unmount the filesystem hungs in xfs_log_force(), well, basically the reason I submitted the patch to include the caller into xfs_log_force trace. I'd like to see ftrace traces from this system with that patch if possible. I didn't have time to keep working on this for the past few days, but looks like it's time to come back to it. Shyam, after you reconnected the disks, the messages about failed async metadata writes stops to be logged? Any chance you can reliably reproduce it? I'm not a xfs journal expert, but it looks like the writeback of items in AIL got stuck due the IO errors, and were never completed, but I don't know what I should expect after the disk is reconnected. In my case though, with upstream kernel, I didn't get a XFS_SHUTDOWN until I tried to unmount the filesystem, which differs from this case, where xfs looks to have shutdown the filesystem after a few tries to writeback the metadata. Anyway, I can dig more into it this week, if nobody knows what is going on before I do it :) On Tue, Mar 22, 2016 at 10:03:46AM -0400, Brian Foster wrote: > On Tue, Mar 22, 2016 at 06:31:48PM +0530, Shyam Kaushik wrote: > > Hi Brian, > > > > Thanks for your quick reply. I repeated the test & trace-pipe is > > constantly filled with this: > > > > xfsaild/dm-10-3335 [003] ...2 24890.546491: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.546492: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.546493: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 24890.596491: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.596492: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.596494: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 24890.646497: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.646498: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.646500: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 24890.696467: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 24890.746548: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 24890.796479: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 24890.846467: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.846468: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > > So xfsaild is spinning on this inode. It was presumably modified, logged > and flushed to the log, hence it's sitting in the AIL waiting to be > flushed to disk. xfsaild wants to push it to get it flushed to disk and > off the AIL, but it sees it is already in the flushing state as the > flush lock is held. > > It's not clear to me why the inode is not removed from the AIL, or > whether that I/O was actually submitted or aborted with an error. The > shutdown involved here most likely affects this one way or the other. > IIUC, the I/O completion should eventually release the flush lock and > remove the inode from the AIL. A complete trace log of the entire > reproducer might shed more light as to what's going on. > > Also, it sounds like you have a reliable reproducer. Does this reproduce > on a recent kernel? > > Brian > > > > > while regular activity seems to happen on other inodes/kworker threads > > > > kworker/u8:4-27691 [001] ...1 24895.811474: xfs_writepage: dev 253:10 > > ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > > unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811477: xfs_invalidatepage: dev > > 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > > delalloc 1 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811478: xfs_releasepage: dev > > 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 > > delalloc 0 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811482: xfs_writepage: dev 253:10 > > ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > > unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811482: xfs_invalidatepage: dev > > 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > > delalloc 1 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811483: xfs_releasepage: dev > > 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 > > delalloc 0 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811485: xfs_writepage: dev 253:10 > > ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > > unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811486: xfs_invalidatepage: dev > > 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > > delalloc 1 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811486: xfs_releasepage: dev > > 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 > > delalloc 0 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.812381: xfs_writepage: dev 253:10 > > ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 > > unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.812382: xfs_invalidatepage: dev > > 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 1000 > > delalloc 1 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.812382: xfs_releasepage: dev > > 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc > > 0 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.812385: xfs_writepage: dev 253:10 > > ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 > > unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.812385: xfs_invalidatepage: dev > > 253:10 ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 1000 > > delalloc 1 unwritten 0 > > > > > > looks like xfsaild is not able to take lock until hung-task timeout kicks > > in > > > > xfsaild/dm-10-3335 [003] ...2 25247.649468: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 25247.699478: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 25247.699516: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 25247.699517: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 25247.749471: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 25247.749478: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 25247.749479: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > > > Please let me know how to debug this further. Thanks. > > > > --Shyam > > -----Original Message----- > > From: Brian Foster [mailto:bfoster@redhat.com] > > Sent: 22 March 2016 17:49 > > To: Shyam Kaushik > > Cc: xfs@oss.sgi.com; Alex Lyakas > > Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > > after disk failure/recovery > > > > On Tue, Mar 22, 2016 at 04:51:39PM +0530, Shyam Kaushik wrote: > > > Hi XFS developers, > > > > > > We are seeing the following issue with XFS on kernel 3.18.19. > > > > > > We have XFS mounted over a raw disk. Disk was pulled out manually. There > > > were async writes on files that were errored like this > > > > > ... > > > > > > And XFS hit metadata & Log IO errors that it decides to shutdown: > > > > > > Mar 16 16:03:22 host0 kernel: [ 4637.351841] XFS (dm-29): metadata I/O > > > error: block 0x3a27fbd0 ("xlog_iodone") error 5 numblks 64 > > > Mar 16 16:03:22 host0 kernel: [ 4637.352820] XFS(dm-29): SHUTDOWN!!! > > > old_flags=0x0 new_flags=0x2 > > > Mar 16 16:03:22 host0 kernel: [ 4637.353187] XFS (dm-29): Log I/O Error > > > Detected. Shutting down filesystem > > ... > > > Later the drive was re-inserted back. After the drive was re-inserted, > > XFS > > > was attempted to be unmounted > > > > > > Mar 16 16:16:53 host0 controld: [2557] [ ] umount[202] > > > : umount(/sdisk/vol5b0, xfs) > > > > > > But nothing happens except for the 30-secs xfs_log_force errors that > > keeps > > > repeating > > > > > ... > > > > > > This problem doesn't happen consistently, but happens periodically with > > a > > > drive failure/recovery followed by XFS unmount. I couldn't find this > > issue > > > fixed in later kernels. Can you please suggest how I can debug this > > issue > > > further? > > > > > > > Similar problems have been reproduced due to racy/incorrect EFI/EFD > > object tracking, which are internal data structures associated with > > freeing extents. > > > > What happens if you enable tracepoints while the fs is in this hung > > unmount state? > > > > # trace-cmd start -e "xfs:*" > > # cat /sys/kernel/debug/tracing/trace_pipe > > > > Brian > > > > > Thanks! > > > > > > --Shyam > > > > > > _______________________________________________ > > > xfs mailing list > > > xfs@oss.sgi.com > > > http://oss.sgi.com/mailman/listinfo/xfs > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From cmaiolino@redhat.com Tue Mar 22 10:56:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E7B1D7CB1 for ; Tue, 22 Mar 2016 10:56:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 83D4A8F8065 for ; Tue, 22 Mar 2016 08:56:44 -0700 (PDT) X-ASG-Debug-ID: 1458662202-04bdf07ea9d1d40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id upl1BfgUOBniifq3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 22 Mar 2016 08:56:42 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 4AC9A821C3 for ; Tue, 22 Mar 2016 15:56:42 +0000 (UTC) Received: from redhat.com (dhcp-26-103.brq.redhat.com [10.34.26.103]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2MFud86000538 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 22 Mar 2016 11:56:41 -0400 Date: Tue, 22 Mar 2016 16:56:38 +0100 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Message-ID: <20160322155638.GB2802@redhat.com> X-ASG-Orig-Subj: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Mail-Followup-To: xfs@oss.sgi.com References: <20160322121922.GA53693@bfoster.bfoster> <6457b1d9de271ec6cca6bc2626aac161@mail.gmail.com> <20160322140345.GA54245@bfoster.bfoster> <20160322153825.GA2802@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160322153825.GA2802@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458662202 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 I think I know how to reproduce it, I'll give a try and let you know On Tue, Mar 22, 2016 at 04:38:25PM +0100, Carlos Maiolino wrote: > Hi Brian, > > These traces, and the stack trace presented, looks quite similar with the > one we were discussing a few days ago, using a dm-thin snapshot. > > Looks like with the same bug I've been hunting and Shyam confirmed my hypothesis > of this bug be able to be reproduced with a regular device. > > If it's the same bug, yes, I reproduced it using upstream kernel. > > The difference between both (this bug and the one I've been working on) is how > xfs actually behaves when async metadata writes fail. Other than that, it pretty > much looks the same. > > Trying to unmount the filesystem hungs in xfs_log_force(), well, basically the > reason I submitted the patch to include the caller into xfs_log_force trace. I'd > like to see ftrace traces from this system with that patch if possible. > > I didn't have time to keep working on this for the past few days, but looks like > it's time to come back to it. > > Shyam, after you reconnected the disks, the messages about failed async metadata > writes stops to be logged? > > Any chance you can reliably reproduce it? > > I'm not a xfs journal expert, but it looks like the writeback of items in AIL > got stuck due the IO errors, and were never completed, but I don't know what I > should expect after the disk is reconnected. > > In my case though, with upstream kernel, I didn't get a XFS_SHUTDOWN until I > tried to unmount the filesystem, which differs from this case, where xfs looks > to have shutdown the filesystem after a few tries to writeback the metadata. > > Anyway, I can dig more into it this week, if nobody knows what is going on > before I do it :) > > > On Tue, Mar 22, 2016 at 10:03:46AM -0400, Brian Foster wrote: > > On Tue, Mar 22, 2016 at 06:31:48PM +0530, Shyam Kaushik wrote: > > > Hi Brian, > > > > > > Thanks for your quick reply. I repeated the test & trace-pipe is > > > constantly filled with this: > > > > > > xfsaild/dm-10-3335 [003] ...2 24890.546491: xfs_ilock_nowait: dev > > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 24890.546492: xfs_iunlock: dev 253:10 > > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 24890.546493: xfs_ail_flushing: dev > > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > > xfsaild/dm-10-3335 [003] ...2 24890.596491: xfs_ilock_nowait: dev > > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 24890.596492: xfs_iunlock: dev 253:10 > > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 24890.596494: xfs_ail_flushing: dev > > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > > xfsaild/dm-10-3335 [003] ...2 24890.646497: xfs_ilock_nowait: dev > > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 24890.646498: xfs_iunlock: dev 253:10 > > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 24890.646500: xfs_ail_flushing: dev > > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > > xfsaild/dm-10-3335 [003] ...2 24890.696467: xfs_ilock_nowait: dev > > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_iunlock: dev 253:10 > > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_ail_flushing: dev > > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > > xfsaild/dm-10-3335 [003] ...2 24890.746548: xfs_ilock_nowait: dev > > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_iunlock: dev 253:10 > > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_ail_flushing: dev > > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > > xfsaild/dm-10-3335 [003] ...2 24890.796479: xfs_ilock_nowait: dev > > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_iunlock: dev 253:10 > > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_ail_flushing: dev > > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > > xfsaild/dm-10-3335 [003] ...2 24890.846467: xfs_ilock_nowait: dev > > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 24890.846468: xfs_iunlock: dev 253:10 > > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > > > > > So xfsaild is spinning on this inode. It was presumably modified, logged > > and flushed to the log, hence it's sitting in the AIL waiting to be > > flushed to disk. xfsaild wants to push it to get it flushed to disk and > > off the AIL, but it sees it is already in the flushing state as the > > flush lock is held. > > > > It's not clear to me why the inode is not removed from the AIL, or > > whether that I/O was actually submitted or aborted with an error. The > > shutdown involved here most likely affects this one way or the other. > > IIUC, the I/O completion should eventually release the flush lock and > > remove the inode from the AIL. A complete trace log of the entire > > reproducer might shed more light as to what's going on. > > > > Also, it sounds like you have a reliable reproducer. Does this reproduce > > on a recent kernel? > > > > Brian > > > > > > > > while regular activity seems to happen on other inodes/kworker threads > > > > > > kworker/u8:4-27691 [001] ...1 24895.811474: xfs_writepage: dev 253:10 > > > ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > > > unwritten 0 > > > kworker/u8:4-27691 [001] ...1 24895.811477: xfs_invalidatepage: dev > > > 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > > > delalloc 1 unwritten 0 > > > kworker/u8:4-27691 [001] ...1 24895.811478: xfs_releasepage: dev > > > 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 > > > delalloc 0 unwritten 0 > > > kworker/u8:4-27691 [001] ...1 24895.811482: xfs_writepage: dev 253:10 > > > ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > > > unwritten 0 > > > kworker/u8:4-27691 [001] ...1 24895.811482: xfs_invalidatepage: dev > > > 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > > > delalloc 1 unwritten 0 > > > kworker/u8:4-27691 [001] ...1 24895.811483: xfs_releasepage: dev > > > 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 > > > delalloc 0 unwritten 0 > > > kworker/u8:4-27691 [001] ...1 24895.811485: xfs_writepage: dev 253:10 > > > ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > > > unwritten 0 > > > kworker/u8:4-27691 [001] ...1 24895.811486: xfs_invalidatepage: dev > > > 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > > > delalloc 1 unwritten 0 > > > kworker/u8:4-27691 [001] ...1 24895.811486: xfs_releasepage: dev > > > 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 > > > delalloc 0 unwritten 0 > > > kworker/u8:4-27691 [001] ...1 24895.812381: xfs_writepage: dev 253:10 > > > ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 > > > unwritten 0 > > > kworker/u8:4-27691 [001] ...1 24895.812382: xfs_invalidatepage: dev > > > 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 1000 > > > delalloc 1 unwritten 0 > > > kworker/u8:4-27691 [001] ...1 24895.812382: xfs_releasepage: dev > > > 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc > > > 0 unwritten 0 > > > kworker/u8:4-27691 [001] ...1 24895.812385: xfs_writepage: dev 253:10 > > > ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 > > > unwritten 0 > > > kworker/u8:4-27691 [001] ...1 24895.812385: xfs_invalidatepage: dev > > > 253:10 ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 1000 > > > delalloc 1 unwritten 0 > > > > > > > > > looks like xfsaild is not able to take lock until hung-task timeout kicks > > > in > > > > > > xfsaild/dm-10-3335 [003] ...2 25247.649468: xfs_ilock_nowait: dev > > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_iunlock: dev 253:10 > > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_ail_flushing: dev > > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > > xfsaild/dm-10-3335 [003] ...2 25247.699478: xfs_ilock_nowait: dev > > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 25247.699516: xfs_iunlock: dev 253:10 > > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 25247.699517: xfs_ail_flushing: dev > > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > > xfsaild/dm-10-3335 [003] ...2 25247.749471: xfs_ilock_nowait: dev > > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 25247.749478: xfs_iunlock: dev 253:10 > > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 25247.749479: xfs_ail_flushing: dev > > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > > > > > Please let me know how to debug this further. Thanks. > > > > > > --Shyam > > > -----Original Message----- > > > From: Brian Foster [mailto:bfoster@redhat.com] > > > Sent: 22 March 2016 17:49 > > > To: Shyam Kaushik > > > Cc: xfs@oss.sgi.com; Alex Lyakas > > > Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > > > after disk failure/recovery > > > > > > On Tue, Mar 22, 2016 at 04:51:39PM +0530, Shyam Kaushik wrote: > > > > Hi XFS developers, > > > > > > > > We are seeing the following issue with XFS on kernel 3.18.19. > > > > > > > > We have XFS mounted over a raw disk. Disk was pulled out manually. There > > > > were async writes on files that were errored like this > > > > > > > ... > > > > > > > > And XFS hit metadata & Log IO errors that it decides to shutdown: > > > > > > > > Mar 16 16:03:22 host0 kernel: [ 4637.351841] XFS (dm-29): metadata I/O > > > > error: block 0x3a27fbd0 ("xlog_iodone") error 5 numblks 64 > > > > Mar 16 16:03:22 host0 kernel: [ 4637.352820] XFS(dm-29): SHUTDOWN!!! > > > > old_flags=0x0 new_flags=0x2 > > > > Mar 16 16:03:22 host0 kernel: [ 4637.353187] XFS (dm-29): Log I/O Error > > > > Detected. Shutting down filesystem > > > ... > > > > Later the drive was re-inserted back. After the drive was re-inserted, > > > XFS > > > > was attempted to be unmounted > > > > > > > > Mar 16 16:16:53 host0 controld: [2557] [ ] umount[202] > > > > : umount(/sdisk/vol5b0, xfs) > > > > > > > > But nothing happens except for the 30-secs xfs_log_force errors that > > > keeps > > > > repeating > > > > > > > ... > > > > > > > > This problem doesn't happen consistently, but happens periodically with > > > a > > > > drive failure/recovery followed by XFS unmount. I couldn't find this > > > issue > > > > fixed in later kernels. Can you please suggest how I can debug this > > > issue > > > > further? > > > > > > > > > > Similar problems have been reproduced due to racy/incorrect EFI/EFD > > > object tracking, which are internal data structures associated with > > > freeing extents. > > > > > > What happens if you enable tracepoints while the fs is in this hung > > > unmount state? > > > > > > # trace-cmd start -e "xfs:*" > > > # cat /sys/kernel/debug/tracing/trace_pipe > > > > > > Brian > > > > > > > Thanks! > > > > > > > > --Shyam > > > > > > > > _______________________________________________ > > > > xfs mailing list > > > > xfs@oss.sgi.com > > > > http://oss.sgi.com/mailman/listinfo/xfs > > > > > > _______________________________________________ > > > xfs mailing list > > > xfs@oss.sgi.com > > > http://oss.sgi.com/mailman/listinfo/xfs > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > -- > Carlos > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From jack@suse.cz Tue Mar 22 10:57:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8429D7CB1 for ; Tue, 22 Mar 2016 10:57:17 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 563173040E9 for ; Tue, 22 Mar 2016 08:57:17 -0700 (PDT) X-ASG-Debug-ID: 1458662233-04cbb04da589c10001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id q2zOrGKXh5NmLpG2 (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 22 Mar 2016 08:57:14 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id BC3E9AB5D; Tue, 22 Mar 2016 15:57:11 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 527BF8251E; Tue, 22 Mar 2016 16:57:40 +0100 (CET) Date: Tue, 22 Mar 2016 16:57:40 +0100 From: Jan Kara To: stable@vger.kernel.org Cc: xfs@oss.sgi.com, Dave Chinner Subject: XFS hole punch races Message-ID: <20160322155740.GB28772@quack.suse.cz> X-ASG-Orig-Subj: XFS hole punch races MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1458662234 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28054 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi, similarly to ext4 also XFS had races between hole punching and page faults which could result in data corruption. The fixes were merged in 4.1-rc1 but it might make sense to backport them to older stable releases given the nature of the issue. Relevant fixes are: de0e8c20ba3a65b0f15040aabbefdc1999876e6b 075a924d45cc69c75a35f20b4912b85aa98b180a e8e9ad42c1f1e1bfbe0e8c32c8cac02e9ebfb7ef 0f9160b444e4de33b65dfcd3b901358a3129461a 723cac48473358939759885a18e8df113ea96138 ec56b1f1fdc69599963574ce94cc5693d535dd64 Honza -- Jan Kara SUSE Labs, CR From david@fromorbit.com Tue Mar 22 22:41:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B601C7CA0 for ; Tue, 22 Mar 2016 22:41:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 38D1AAC007 for ; Tue, 22 Mar 2016 20:41:09 -0700 (PDT) X-ASG-Debug-ID: 1458704465-04cb6c059d110580001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id xuBW6VAXyLbWgtVb for ; Tue, 22 Mar 2016 20:41:06 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CIBwBVD/JWNTGaLHlegzOBTYJtg3mgBgEBBAaMCoVfhA2GBwQCAoFLTQEBAQEBAQcBAQEBQUCEQgEBBDocIxAIAw4KCSUPBSUDBxoTiCbBCwEBAQEGAgEdGYU9hQyHZ4IrAQSXWI16jxSPB4RbKC6KBgEBAQ Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail04.adl6.internode.on.net with ESMTP; 23 Mar 2016 14:10:41 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aiZey-0005e2-S3; Wed, 23 Mar 2016 14:40:40 +1100 Date: Wed, 23 Mar 2016 14:40:40 +1100 From: Dave Chinner To: Christoph Hellwig Cc: "Darrick J. Wong" , linux-ext4@vger.kernel.org, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 06/12] xfs/030: fix output on newer filesystems Message-ID: <20160323034040.GA11812@dastard> X-ASG-Orig-Subj: Re: [PATCH 06/12] xfs/030: fix output on newer filesystems References: <20160305003717.28738.98818.stgit@birch.djwong.org> <20160305003756.28738.26362.stgit@birch.djwong.org> <20160305202050.GF10245@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160305202050.GF10245@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: 1458704465 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28074 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sat, Mar 05, 2016 at 12:20:50PM -0800, Christoph Hellwig wrote: > Still fails for me: > > --- tests/xfs/030.out 2016-03-03 07:55:58.556427678 +0000 > +++ /root/xfstests/results//xfs/030.out.bad 2016-03-05 20:20:17.561433837 +0000 > @@ -231,8 +231,6 @@ > bad agbno AGBNO in agfl, agno 0 > bad agbno AGBNO in agfl, agno 0 > bad agbno AGBNO in agfl, agno 0 > -bad agbno AGBNO in agfl, agno 0 > -bad agbno AGBNO in agfl, agno 0 That's because the free lists are of different lengths on the different fs configs. Not sure how best to handle it - maybe just filter then entire bad agbno in agfl line out? I'm going to commit the change anyway, as this is a separate issue that needs to be solved. Cheers, Dave. -- Dave Chinner david@fromorbit.com From zenuzara@korea.com Wed Mar 23 00:39:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE, HTML_MIME_NO_HTML_TAG,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9FBC97CA0 for ; Wed, 23 Mar 2016 00:39:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 45A008F8035 for ; Tue, 22 Mar 2016 22:39:23 -0700 (PDT) X-ASG-Debug-ID: 1458711557-04bdf07eac190880001-NocioJ Received: from r-smtp6.korea.com (98.202.24.185-rev.hti.pl [185.24.202.98]) by cuda.sgi.com with ESMTP id qZKXpRc21EKWxmWx for ; Tue, 22 Mar 2016 22:39:19 -0700 (PDT) X-Barracuda-Envelope-From: zenuzara@korea.com X-Barracuda-Apparent-Source-IP: 185.24.202.98 From: "=?utf-8?B?0JfQtdC80LvRjw==?=" To: xfs@oss.sgi.com Subject: =?utf-8?B?0KHRgtGA0L7QuNGC0LXQu9GM0YHRgtCy0L4g0LvQuNC90LXQudC90YvRhSDQvtCx0YrQtdC60YLQvtCy?= MIME-Version: 1.0 X-ASG-Orig-Subj: =?utf-8?B?0KHRgtGA0L7QuNGC0LXQu9GM0YHRgtCy0L4g0LvQuNC90LXQudC90YvRhSDQvtCx0YrQtdC60YLQvtCy?= Message-ID: <840373350.20160323083920@KHQWSGXTLAC> X-Mailer: Yamail [ http://yandex.ru ] 5.0 Date: Wed, 23 Mar 2016 08:39:20 +0300 Content-Transfer-Encoding: base64 Content-Type: text/html; charset=utf-8 X-Barracuda-Connect: 98.202.24.185-rev.hti.pl[185.24.202.98] X-Barracuda-Start-Time: 1458711558 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.65 X-Barracuda-Spam-Status: No, SCORE=1.65 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, HTML_MIME_NO_HTML_TAG, MIME_HTML_ONLY, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28077 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 1.05 HTML_MIME_NO_HTML_TAG HTML-only message, but there is no HTML tag 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 PGRpdj48dGFibGUgYmdjb2xvcj0iI0ZBRjVGNSIgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMCI+ PHRib2R5Pjx0cj48dGQgYmdjb2xvcj0iIzk0NDk0OSI+wqA8L3RkPjx0ZCBiZ2NvbG9yPSIjRDlC M0IzIj7CoDwvdGQ+PHRkIGJnY29sb3I9IiM5NDQ5NDkiPsKgPC90ZD48L3RyPjx0cj48dGQgYmdj b2xvcj0iI0Q5QjNCMyI+wqA8L3RkPjx0ZD48dGFibGUgYmdjb2xvcj0iI0ZBRjVGNSIgYm9yZGVy PSIxIiB3aWR0aD0iMTAwJSI+PHRib2R5Pjx0cj48dGQgYmdjb2xvcj0iIzZDMzUzNSI+wqA8L3Rk Pjx0ZCBiZ2NvbG9yPSIjOTQ0OTQ5Ij7CoDwvdGQ+PHRkIGJnY29sb3I9IiM2QzM1MzUiPsKgPC90 ZD48L3RyPjx0cj48dGQgYmdjb2xvcj0iIzk0NDk0OSI+wqA8L3RkPjx0ZD48cCBhbGlnbj0iY2Vu dGVyIj48YnIgLz48Zm9udCBmYWNlPSJUYWhvbWEiPjxmb250IGNvbG9yPSIjQzgwMDAwIj48Yj4y PHNwYW4gbGFuZz0iZW4tdXMiPjg8L3NwYW4+wqAtIDI8c3BhbiBsYW5nPSJlbi11cyI+OTwvc3Bh bj7CoNC80LDRgNGC0LDCoCB8INCzLiDQnNC+0YHQutCy0LDCoDxiciAvPjwvYj48L2ZvbnQ+0J/R gNC+0LzQvtC60L7QtDogMzU0PC9mb250PjwvcD48cCBhbGlnbj0iY2VudGVyIj48Zm9udCBmYWNl PSJUYWhvbWEiPtCj0YfQtdCx0L3Ri9C5INGG0LXQvdGC0YAg0L/RgNC40LPQu9Cw0YjQsNC10YIg 0L3QsCDQvtCx0YPRh9C10L3QuNC1PHNwYW4gbGFuZz0iZW4tdXMiPsKgPC9zcGFuPtC/0L4g0YLQ tdC80LU6PGJyIC8+PGJyIC8+PC9mb250Pjxmb250IGNvbG9yPSIjQ0MwMDAwIiBmYWNlPSJUYWhv bWEiIHNpemU9IjQiPtCg0JDQl9Cc0JXQqdCV0J3QmNCVINCb0JjQndCV0JnQndCr0KUg0J7QkdCq 0JXQmtCi0J7Qkiwg0JIg0KLQntCcINCn0JjQodCb0JUg0JrQntCc0JzQo9Cd0JjQmtCQ0KbQmNCZ INCYINCh0JXQotCV0JnCoDxiciAvPtCY0J3QltCV0J3QldCg0J3Qni3QotCV0KXQndCY0KfQldCh 0JrQntCT0J4g0J7QkdCV0KHQn9CV0KfQldCd0JjQrzog0LfQsNC60L7QvdC+0LTQsNGC0LXQu9GM 0YHRgtCy0L4g0Lgg0L/RgNCw0LrRgtC40LrQsC48L2ZvbnQ+PGZvbnQgZmFjZT0iVGFob21hIj48 Zm9udCBjb2xvcj0iIzAwMDBGRiI+PGJyIC8+PGJyIC8+PC9mb250PjxzcGFuIGxhbmc9ImVuLXVz Ij48Zm9udCBzaXplPSI0Ij7QktC10LTRg9GJ0LjQuTrCoDxiciAvPjwvZm9udD7QnNCw0LfRg9GA 0L7QsiDQkC7Qki4gLSDQmi7Rji7QvS4sINGN0LrRgdC/0LXRgNGC0LAg0L/QviDQt9C10LzQtdC7 0YzQvdC+0LzRgyDQuCDRgdC80LXQttC90L7QvNGDINC30LDQutC+0L3QvtC00LDRgtC10LvRjNGB 0YLQstGDLjwvc3Bhbj48L2ZvbnQ+PC9wPjxwIGFsaWduPSJsZWZ0Ij48Zm9udCBmYWNlPSJUYWhv bWEiPjxmb250IHNpemU9IjIiPtCS0YDQtdC80Y8g0L/RgNC+0LLQtdC00LXQvdC40Y8g0LfQsNC9 0Y/RgtC40Lk8c3BhbiBsYW5nPSJlbi11cyI+Ojwvc3Bhbj7CoNGBIDEwOjAwINC00L4gMTc6MzAu PGJyIC8+0JzQtdGA0L7Qv9GA0LjRj9GC0LjQtSDRgdC+0YHRgtC+0LjRgtGB0Y8g0L/QviDQsNC0 0YDQtdGB0YM6INGD0LsuINCR0LDRg9C80LDQvdGB0LrQsNGPLCDQtC42LCDRgdGC0YAuMiwg0JEu 0KYuwqA8c3BhbiBsYW5nPSJlbi11cyI+Ijwvc3Bhbj7QktC40LrRgtC+0YDQuNGPINCf0LvQsNC3 0LA8c3BhbiBsYW5nPSJlbi11cyI+Ijwvc3Bhbj4uPGJyIC8+0JjQvdGE0L7RgNC80LDRhtC40Y8g 0Lgg0YDQtdCz0LjRgdGC0YDQsNGG0LjRjyDQv9C+INGC0LXQu9C10YTQvtC90YM6wqA8L2ZvbnQ+ PHNwYW4gbGFuZz0iZW4tdXMiPsKgwqA8L3NwYW4+ODxzcGFuIGxhbmc9ImVuLXVzIj7CoDwvc3Bh bj7CoCg0OTUpwqA8c3BhbiBsYW5nPSJlbi11cyI+wqA8L3NwYW4+NzI1PHNwYW4gbGFuZz0iZW4t dXMiPsKgLcKgPC9zcGFuPjA0PHNwYW4gbGFuZz0iZW4tdXMiPsKgLcKgPC9zcGFuPjQ4PHNwYW4g bGFuZz0iZW4tdXMiPsKgPC9zcGFuPjxmb250IHNpemU9IjIiPijQvNC90L7Qs9C+0LrQsNC90LDQ u9GM0L3Ri9C5KTwvZm9udD48L2ZvbnQ+PC9wPjxwIGFsaWduPSJsZWZ0Ij48Zm9udCBmYWNlPSJU YWhvbWEiIHNpemU9IjIiPtCS0Ysg0LzQvtC20LXRgtC1INGD0YfQsNGB0YLQstC+0LLQsNGC0Ywg 0LIg0L7QsdGD0YfQtdC90LjQuCDQutCw0Log0L7RgiDQutC+0LzQv9Cw0L3QuNC4LCDRgtCw0Log 0Lgg0LrQsNC6INGH0LDRgdGC0L3QvtC1INC70LjRhtC+LjxiciAvPijQv9C+0LbQsNC70YPQudGB 0YLQsCDQvdC1INC+0YLQstC10YfQsNC50YLQtSDQvdCwINC+0LHRgNCw0YLQvdGL0Lkg0LDQtNGA 0LXRgSDRjdC7LtC/0L7Rh9GC0YspPC9mb250PjxiciAvPsKgPC9wPjwvdGQ+PHRkIGJnY29sb3I9 IiM5NDQ5NDkiPsKgPC90ZD48L3RyPjx0cj48dGQgYmdjb2xvcj0iIzZDMzUzNSI+wqA8L3RkPjx0 ZCBiZ2NvbG9yPSIjOTQ0OTQ5Ij7CoDwvdGQ+PHRkIGJnY29sb3I9IiM2QzM1MzUiPsKgPC90ZD48 L3RyPjwvdGJvZHk+PC90YWJsZT48cD48Zm9udCBmYWNlPSJDYWxpYnJpIj48Yj4xLjwvYj7CoNCg 0LDQt9GK0Y/RgdC90LXQvdC40Y8g0KTQlyDQvtGCIDIzINC40Y7QvdGPIDIwMTQg0LPQvtC00LAg 4oSWIDE3MS3QpNCXIOKAkyAi0L3QvtCy0L7Qs9C+INCX0LXQvNC10LvRjNC90L7Qs9C+INC60L7Q tNC10LrRgdCwINCg0KQiIOKAkyDQsiDRh9Cw0YHRgtC4LMKgPGJyIC8+0LrQsNGB0LDRjtGJ0LXQ udGB0Y8g0LvQuNC90LXQudC90YvRhSDQvtCx0YrQtdC60YLQvtCyPGJyIC8+PGI+Mi48L2I+wqDQ ntGC0LPRgNCw0L3QuNGH0LXQvdC40LUg0LvQuNC90LXQudC90YvRhSDQvtCx0YrQtdC60YLQvtCy INC+0YIg0L/Qu9C+0YnQsNC00L3Ri9GFLCDQutGA0LjRgtC10YDQuNC4INC/0YDQuNC30L3QsNC9 0LjRjyDQutC+0LzQvNGD0L3QuNC60LDRhtC40LkgKNGB0LXRgtC10LkpwqA8YnIgLz7Qu9C40L3Q tdC50L3Ri9C80Lgg0L7QsdGK0LXQutGC0LDQvNC4PGJyIC8+PGI+My48L2I+wqDQmNC80YPRidC1 0YHRgtCy0LXQvdC90L4t0YLQtdGF0L3QvtC70L7Qs9C40YfQtdGB0LrQuNC5INGB0L7RgdGC0LDQ siDQu9C40L3QtdC50L3QvtCz0L4g0L7QsdGK0LXQutGC0LAsINC70LjQvdC10LnQvdGL0Lkg0L7Q sdGK0LXQutGCINC60LDQuiDQtdC00LjQvdGL0LnCoDxiciAvPtC90LXQtNCy0LjQttC40LzRi9C5 INC60L7QvNC/0LvQtdC60YEsINC00LLQuNC20LjQvNGL0LUg0Lgg0L3QtdC00LLQuNC20LjQvNGL 0LUg0LvQuNC90LXQudC90YvQtSDQvtCx0YrQtdC60YLRiyDQuCDQuNGFINGH0LDRgdGC0Lg6INC/ 0YDQsNC60YLQuNGH0LXRgdC60L7QtcKgPGJyIC8+0LfQvdCw0YfQtdC90LjQtTxiciAvPjxiPjQu PC9iPsKg0JfQtdC80LvQuCAo0YLQtdGA0YDQuNGC0L7RgNC40LgsINC30L7QvdGLKSwg0LfQsNC/ 0YDQtdGJ0ZHQvdC90YvQtSDQuNC70Lgg0L/RgNC10LTQv9C40YHQsNC90L3Ri9C1INC00LvRjyDR gdGC0YDQvtC40YLQtdC70YzRgdGC0LLQsCDQu9C40L3QtdC50L3Ri9GFwqA8YnIgLz7QvtCx0YrQ tdC60YLQvtCyLCDQvtCx0L7RgdC90L7QstCw0L3QuNGPL9GB0L7Qs9C70LDRgdC+0LLQsNC90LjR jyDRgdGC0YDQvtC40YLQtdC70YzRgdGC0LLQsCDQu9C40L3QtdC50L3Ri9GFINC+0LHRitC10LrR gtC+0LIg0LIg0YDQsNC30LvQuNGH0L3Ri9GFINC30L7QvdCw0YU8YnIgLz48Yj41LjwvYj7CoNCX 0L3QsNGH0LXQvdC40LUg0L/QvtC90Y/RgtC40Y8gItGA0LXQutC+0L3RgdGC0YDRg9C60YbQuNGP INC70LjQvdC10LnQvdC+0LPQviDQvtCx0YrQtdC60YLQsCI8YnIgLz48Yj42LjwvYj7CoNCT0J/Q l9CjINC00LvRjyDRgdGC0YDQvtC40YLQtdC70YzRgdGC0LLQsC/RgNC10LrQvtC90YHRgtGA0YPQ utGG0LjQuCDQu9C40L3QtdC50L3Ri9GFINC+0LHRitC10LrRgtC+0LIg0LIg0L/QtdGA0LXRhdC+ 0LTQvdGL0Lkg0L/QtdGA0LjQvtC0PGJyIC8+PGI+Ny48L2I+wqDQn9C+0YDRj9C00L7QuiDQv9C+ 0LTQs9C+0YLQvtCy0LrQuCDQv9GA0L7QtdC60YLQsCDQv9C70LDQvdC40YDQvtCy0LrQuCDQuCDQ vNC10LbQtdCy0LDQvdC40Y8g0YLQtdGA0YDQuNGC0L7RgNC40Lgg0LTQu9GPwqA8YnIgLz7RgdGC 0YDQvtC40YLQtdC70YzRgdGC0LLQsC/RgNC10LrQvtC90YHRgtGA0YPQutGG0LjQuCDQu9C40L3Q tdC50L3QvtCz0L4g0L7QsdGK0LXQutGC0LA8YnIgLz48Yj44LjwvYj7CoNCS0LvQuNGP0L3QuNC1 INC30LDQutC+0L3QvtC00LDRgtC10LvRjNGB0YLQstCwINC+0LEg0LDQstGC0L7QtNC+0YDQvtCz 0LDRhSDQvdCwINGA0LDQt9C80LXRidC10L3QuNC1INC70LjQvdC10LnQvdGL0YUg0L7QsdGK0LXQ utGC0L7Qsiwg0YDQsNC30LzQtdGJ0LXQvdC40LXCoDxiciAvPtC60L7QvNC80YPQvdC40LrQsNGG 0LjQuSDQstC00L7Qu9GMINC40LvQuCDRgSAi0L/QtdGA0LXRgdC10YfQtdC90LjQtdC8IiDQsNCy 0YLQvtC00L7RgNC+0LPQuDxiciAvPjxiPjkuPC9iPsKg0J7RgdC+0LHQtdC90L3QvtGB0YLQuCDR gNCw0LfQvNC10YnQtdC90LjRjyDQu9C40L3QtdC50L3Ri9GFINC+0LHRitC10LrRgtC+0LIg0LLQ tNC+0LvRjCDQuNC70Lgg0YEgItC/0LXRgNC10YHQtdGH0LXQvdC40LXQvCIg0LbQtdC70LXQt9C9 0YvRhSDQtNC+0YDQvtCzPGJyIC8+PGI+MTAuPC9iPsKg0J3QtdC00YDQvtC/0L7Qu9GM0LfQvtCy 0LDQvdC40LUg0LIg0YHQstGP0LfQuCDRgSDRgNCw0LfQvNC10YnQtdC90LjQtdC8INC70LjQvdC1 0LnQvdC+0LPQviDQvtCx0YrQtdC60YLQsCwg0YDQsNC30LzQtdGJ0LXQvdC40LUg0L/QvtC0INC3 0LXQvNC70ZHQucKgPGJyIC8+0LzQtdGC0L7QtNC+0Lwg0LHQtdGB0YLRgNCw0L3RiNC10LnQvdC+ 0Lkg0L/RgNC+0LrQu9Cw0LTQutC4LCDQsiDRgtC+0Lwg0YfQuNGB0LvQtSDQvdCwINC80LXRgdGC 0LUg0L/RgNC10LbQvdC10LPQviDQu9C40L3QtdC50L3QvtCz0L4g0L7QsdGK0LXQutGC0LA8YnIg Lz48Yj4xMS48L2I+wqDQn9C+0YDRj9C00L7QuiDQuCDQv9C+0YHQu9C10LTRgdGC0LLQuNGPINC0 0LvRjyDQuNC90YvRhSDQu9C40YYg0YPRgdGC0LDQvdC+0LLQu9C10L3QuNGPINC+0YXRgNCw0L3Q vdGL0YUg0LfQvtC9INGA0LDQt9C70LjRh9C90YvRhSDQu9C40L3QtdC50L3Ri9GFwqA8YnIgLz7Q vtCx0YrQtdC60YLQvtCyLCDQv9GA0LDQstCwINGH0LDRgdGC0L3Ri9GFINC70LjRhiDQsiDRgdCy 0Y/Qt9C4INGBINGD0YHRgtCw0L3QvtCy0LvQtdC90LjQtdC8INC90LAg0LjRhSDQt9C10LzQtdC7 0YzQvdGL0YUg0YPRh9Cw0YHRgtC60LDRhSDQvtGF0YDQsNC90L3QvtC5wqA8YnIgLz7Qt9C+0L3R iyDQu9C40L3QtdC50L3QvtCz0L4g0L7QsdGK0LXQutGC0LA8YnIgLz48Yj4xMi48L2I+wqDQodC1 0YDQstC40YLRg9GC0Ysg0L3QsCDQt9C10LzQtdC70YzQvdGL0LUg0YPRh9Cw0YHRgtC60Lgg0LIg 0YHQstGP0LfQuCDRgSDRgNCw0LfQvNC10YnQtdC90LjQtdC8INC70LjQvdC10LnQvdGL0YUg0L7Q sdGK0LXQutGC0L7QsjxiciAvPjxiPjEzLjwvYj7CoCLQl9C10LzQtdC70YzQvdGL0LUiINC/0L7Q u9C+0LbQtdC90LjRjyDQv9GA0L7QtdC60YLQvdC+0Lkg0LTQvtC60YPQvNC10L3RgtCw0YbQuNC4 INC70LjQvdC10LnQvdC+0LPQviDQvtCx0YrQtdC60YLQsDxiciAvPjxiPjE0LjwvYj7CoNCi0YDQ tdCx0L7QstCw0L3QuNGPINC6INGA0LXQutGD0LvRjNGC0LjQstCw0YbQuNC4INC30LXQvNC10LvR jCDQsiDRgdCy0Y/Qt9C4INGB0L4g0YHRgtGA0L7QuNGC0LXQu9GM0YHRgtCy0L7QvC/RgNC10LrQ vtC90YHRgtGA0YPQutGG0LjQtdC5INC70LjQvdC10LnQvdC+0LPQvsKgPGJyIC8+0L7QsdGK0LXQ utGC0LA8YnIgLz48Yj4xNS48L2I+wqDQoNCw0LfRgNC10YjQtdC90LjRjyDQvdCwINGB0YLRgNC+ 0LjRgtC10LvRjNGB0YLQstC+L9GA0LXQutC+0L3RgdGC0YDRg9C60YbQuNGOINC4INCy0LLQvtC0 INCyINGN0LrRgdC/0LvRg9Cw0YLQsNGG0LjRjiDQu9C40L3QtdC50L3Ri9GFINC+0LHRitC10LrR gtC+0LIswqA8YnIgLz7RgdC70YPRh9Cw0Lgg0L7RgdCy0L7QsdC+0LbQtNC10L3QuNGPINC+0YIg 0Y3QutGB0L/QtdGA0YLQuNC30Ysg0L/RgNC+0LXQutGC0L3QvtC5INC00L7QutGD0LzQtdC90YLQ sNGG0LjQuCwg0L/QvtC70YPRh9C10L3QuNGPINGA0LDQt9GA0LXRiNC10L3QuNC5INC90LDCoDxi ciAvPtGB0YLRgNC+0LjRgtC10LvRjNGB0YLQstC+L9GA0LXQutC+0L3RgdGC0YDRg9C60YbQuNGO INC4INCy0LLQvtC0INCyINGN0LrRgdC/0LvRg9Cw0YLQsNGG0LjRjiDQu9C40L3QtdC50L3Ri9GF INC+0LHRitC10LrRgtC+0LI8YnIgLz48Yj4xNi48L2I+wqDQntGB0L7QsdC10L3QvdC+0YHRgtC4 INGA0LDQt9C80LXRidC10L3QuNGPINC70LjQvdC10LnQvdGL0YUg0L7QsdGK0LXQutGC0L7QsiDQ s9C+0YHRg9C00LDRgNGB0YLQstC10L3QvdC+0LPQviDQuNC70Lgg0LzRg9C90LjRhtC40L/QsNC7 0YzQvdC+0LPQvsKgPGJyIC8+0LfQvdCw0YfQtdC90LjRjywg0LIg0YLQvtC8INGH0LjRgdC70LUg 0LjRgdGF0L7QtNGPINC40Lcg0KTQlyAi0J4g0LrQvtC90YLRgNCw0LrRgtC90L7QuSDRgdC40YHR gtC10LzQtSIgKNCk0Jcg4oSWIDQ0LdCk0JcpPGJyIC8+PGI+MTcuPC9iPsKg0J/QtdGA0LXQstC+ 0LQg0LfQtdC80LXQu9GM0L3QvtCz0L4g0YPRh9Cw0YHRgtC60LAg0LjQtyDQvtC00L3QvtC5INC6 0LDRgtC10LPQvtGA0LjQuCDQsiDQtNGA0YPQs9GD0Y4g0LIg0YHQstGP0LfQuCDRgdC+INGB0YLR gNC+0LjRgtC10LvRjNGB0YLQstC+0LzCoDxiciAvPtC70LjQvdC10LnQvdC+0LPQviDQvtCx0YrQ tdC60YLQsDxiciAvPjxiPjE4LjwvYj7CoNCe0YHQvtCx0LXQvdC90L7RgdGC0Lgg0LvQtdGB0L7Q v9C+0LvRjNC30L7QstCw0L3QuNGPINC4INGA0LXQttC40LzQsCDQtNGA0LXQstC10YHQuNC90Ysg 0LIg0YHQstGP0LfQuCDRgdC+wqA8YnIgLz7RgdGC0YDQvtC40YLQtdC70YzRgdGC0LLQvtC8L9GA 0LXQutC+0L3RgdGC0YDRg9C60YbQuNC10Lkg0LjQu9C4INGN0LrRgdC/0LvRg9Cw0YLQsNGG0LjQ tdC5INC70LjQvdC10LnQvdC+0LPQviDQvtCx0YrQtdC60YLQsCwg0LIg0YDQsNC30L3Ri9GFINC7 0LXRgdCw0YU8YnIgLz48Yj4xOS48L2I+wqDQntGE0L7RgNC80LvQtdC90LjQtSAi0L/QtdGA0LXR gdC10YfQtdC90LjRjyDQstC+0LTQvdGL0YUg0L/RgNC10LPRgNCw0LQiINC4INCy0L7QtNC+0L/Q vtC70YzQt9C+0LLQsNC90LjRjywg0YDQsNC30LzQtdGJ0LXQvdC40LUg0LvQuNC90LXQudC90L7Q s9C+wqA8YnIgLz7QvtCx0YrQtdC60YLQsCDQstC00L7Qu9GMINCy0L7QtNC90L7Qs9C+INC+0LHR itC10LrRgtCwPGJyIC8+PGI+MjAuPC9iPsKg0KLQtdGF0L3QuNGH0LXRgdC60LjQtSDQv9C70LDQ vdGLINC70LjQvdC10LnQvdGL0YUg0L7QsdGK0LXQutGC0L7QsjxiciAvPjxiPjIxLjwvYj7CoNCe 0YHQvtCx0LXQvdC90L7RgdGC0Lgg0LrQsNC00LDRgdGC0YDQvtCy0L7Qs9C+INGD0YfRkdGC0LAg 0LvQuNC90LXQudC90YvRhSDQvtCx0YrQtdC60YLQvtCyINC4INC30LXQvNC10LvRjNC90YvRhSDR g9GH0LDRgdGC0LrQvtCyINC/0L7QtCDQvdC40LzQuDxiciAvPjxiPjIyLjwvYj7CoNCg0LXQs9C4 0YHRgtGA0LDRhtC40Y8g0L/RgNCw0LIg0L3QsCDQu9C40L3QtdC50L3Ri9C1INC+0LHRitC10LrR gtGLPC9mb250PjwvcD48dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSI+PHRib2R5Pjx0cj48 dGQ+PHAgYWxpZ249ImNlbnRlciI+PGZvbnQgZmFjZT0iVGFob21hIj48Yj7Qo9GH0LDRgdGC0LjQ tSDRgdC+0YHRgtCw0LLQuNGCOjwvYj7CoDIyPHNwYW4gbGFuZz0iZW4tdXMiPi48L3NwYW4+ODAw INGA0YPQsS48L2ZvbnQ+PC9wPjwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PHRhYmxlIGJvcmRl cj0iMSIgd2lkdGg9IjEwMCUiPjx0Ym9keT48dHI+PHRkPjxwIGFsaWduPSJjZW50ZXIiPjxmb250 IGZhY2U9IlRhaG9tYSI+PGI+PGZvbnQgc2l6ZT0iMiI+0KHQutC40LTQutC4ICjQvtGCIDIg0YfQ tdC70L7QstC10LrQsCDigJMgMTAlLCAzINGH0LXQu9C+0LLQtdC60LAg4oCTIDE1JSwgNCDRh9C1 0LvQvtCy0LXQutCwINC4INCx0L7Qu9C10LUg4oCTIDIwJS4pPGJyIC8+PC9mb250PjwvYj7CoNCS INGB0YLQvtC40LzQvtGB0YLRjCDQstGF0L7QtNC40YIg0LzQtdGC0L7QtNC40YfQtdGB0LrQuNC5 INC80LDRgtC10YDQuNCw0LssINC+0LHQtdC00YssINC60L7RhNC1LdC/0LDRg9C30YssINGB0LXR gNGC0LjRhNC40LrQsNGCLjxiciAvPsKgPC9mb250PjwvcD48L3RkPjwvdHI+PC90Ym9keT48L3Rh YmxlPjwvdGQ+PHRkIGJnY29sb3I9IiNEOUIzQjMiPsKgPC90ZD48L3RyPjx0cj48dGQgYmdjb2xv cj0iIzk0NDk0OSI+wqA8L3RkPjx0ZCBiZ2NvbG9yPSIjRDlCM0IzIj7CoDwvdGQ+PHRkIGJnY29s b3I9IiM5NDQ5NDkiPsKgPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj4= From shyam@zadarastorage.com Wed Mar 23 04:44:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 37A197CA0 for ; Wed, 23 Mar 2016 04:44:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 571A6AC005 for ; Wed, 23 Mar 2016 02:44:04 -0700 (PDT) X-ASG-Debug-ID: 1458726239-04cb6c059f169d80001-NocioJ Received: from mail-oi0-f44.google.com (mail-oi0-f44.google.com [209.85.218.44]) by cuda.sgi.com with ESMTP id Oyky5ov6Gw5eHjVM (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 23 Mar 2016 02:43:59 -0700 (PDT) X-Barracuda-Envelope-From: shyam@zadarastorage.com X-Barracuda-Apparent-Source-IP: 209.85.218.44 Received: by mail-oi0-f44.google.com with SMTP id d205so12065109oia.0 for ; Wed, 23 Mar 2016 02:43:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zadarastorage-com.20150623.gappssmtp.com; s=20150623; h=from:references:in-reply-to:mime-version:thread-index:date :message-id:subject:to:cc; bh=8yIijUNyYtAf7DQRdEXqUz/HwOtG5Jnu/fKg8GXlS1Q=; b=YbL2/z4hNn6cyL/dnovjOLmQhlwJeojDNWO+DF/tgxSl2WARCkXwZXxjp7BlCbmWuz cQGG7ftOiDy41W1OYTe3uJSvmLor2U7X3fp2kVtz9wIRo/zAGF7VJdqaXN5tW67nVmpj +KbNwWjTj58bOFfQqXevyEemf4DZfq7p0KdcKndQriGMfjd3a6JgPoytWrj4lROs/3gN skWrgb/tBIdjc/fQ/4qvBgHq7FNfrWH3PgOmZC0zA3zOXRdPOldujowfHxReV+lZrs6k gXNbnk4maiMIGBN0WiPybnEsbC0HKwMMCeoK+kpmDT9iiqvCLi1PhFFsO4BwOyDbukCs j0lA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:references:in-reply-to:mime-version :thread-index:date:message-id:subject:to:cc; bh=8yIijUNyYtAf7DQRdEXqUz/HwOtG5Jnu/fKg8GXlS1Q=; b=aQjQFdJLqwQv4TBV+wNDZzaFj4fWtQGRdevJ72c7G3Dk1fA2Lej0tsrdA0YeECQDcr wh18mpxYD6odpwouWJgBRbBPp4vnw2TOD7Ga/A6SF1+fxkYkU0BDhS8uN1Ou4lLWkayd L3Z7gS9KTzbHAtFUXypsuEPUbgRTL/7KisrbijH0MyYzACgdf4CWiXnaVNukFeA7olKt nnSKxwcGtRy7v1w3aqe5D/JWkTC+ph5AIRm0/Z09h09M5F98nlBHnN8txzK+3Es+6QR7 rPGMtPCjudTjKItq1TdnIbXjJuNM1HzPthEBCqPQXfkAIUqpNqbxvOOm/4fBk4TuLd3W lICQ== X-Gm-Message-State: AD7BkJJL3SbSVSMU2mC0jBJl92X/D++6xlezrCgP3KDX+ZNqdkHlrV65F5kXpyuvHcJirfYStNnN3EWwY3qlqw== X-Received: by 10.157.26.37 with SMTP id a34mr887312ote.91.1458726238806; Wed, 23 Mar 2016 02:43:58 -0700 (PDT) From: Shyam Kaushik References: <20160322121922.GA53693@bfoster.bfoster> <6457b1d9de271ec6cca6bc2626aac161@mail.gmail.com> <20160322140345.GA54245@bfoster.bfoster> In-Reply-To: <20160322140345.GA54245@bfoster.bfoster> MIME-Version: 1.0 X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AdGEQ6gyj1w8NUKrTQag68XNq2NT0AAoIHzA Date: Wed, 23 Mar 2016 15:13:57 +0530 Message-ID: <0f3832c45509f444f55fda2aaf9c9deb@mail.gmail.com> Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery To: Brian Foster X-ASG-Orig-Subj: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Cc: Alex Lyakas , xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-oi0-f44.google.com[209.85.218.44] X-Barracuda-Start-Time: 1458726239 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/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, DKIM_SIGNED, DKIM_VERIFIED, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28080 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi Brian, Here are two inodes on which the xfsaild is looping over & over during unmount. This captures right from the cp that I started with copying some files to xfs while the drive was pulled out, later drive was pushed back & unmount was attempted. Does this give you better picture on the issue? Please let me know if you prefer to do some other steps in the reproducer. cp-30344 [001] ...1 7474.284000: xfs_iget_miss: dev 253:11 ino 0x103c84a cp-30344 [001] ...2 7474.284000: xfs_ilock_nowait: dev 253:11 ino 0x103c84a flags ILOCK_EXCL caller xfs_iget [xfs] cp-30344 [001] ...1 7474.284004: xfs_dir2_block_addname: dev 253:11 ino 0x103c839 name drop-append.gif namelen 15 hashval 0x23c66973 inumber 0x103c84a op_flags ADDNAME|OKNOENT cp-30344 [001] ...1 7474.284014: xfs_inode_pin: dev 253:11 ino 0x103c84a count 1 pincount 0 caller xfs_cil_prepare_item.isra.1 [xfs] cp-30344 [001] ...1 7474.284021: xfs_iunlock: dev 253:11 ino 0x103c84a flags ILOCK_EXCL caller xfs_inode_item_unlock [xfs] cp-30344 [001] ...1 7474.284028: xfs_getattr: dev 253:11 ino 0x103c84a cp-30344 [001] ...1 7474.284033: xfs_ilock: dev 253:11 ino 0x103c84a flags IOLOCK_EXCL caller xfs_file_buffered_aio_write.isra.9 [xfs] cp-30344 [001] ...1 7474.284034: xfs_file_buffered_write: dev 253:11 ino 0x103c84a size 0x0 offset 0x0 count 0x3e9 ioflags cp-30344 [001] ...1 7474.284038: xfs_ilock: dev 253:11 ino 0x103c84a flags ILOCK_EXCL caller __xfs_get_blocks [xfs] cp-30344 [001] ...1 7474.284040: xfs_iext_insert: dev 253:11 ino 0x103c84a state idx 0 offset 0 block 4503599627239429 count 1 flag 0 caller xfs_bmap_add_extent_hole_delay [xfs] cp-30344 [001] ...1 7474.284040: xfs_iunlock: dev 253:11 ino 0x103c84a flags ILOCK_EXCL caller __xfs_get_blocks [xfs] cp-30344 [001] ...1 7474.284041: xfs_get_blocks_alloc: dev 253:11 ino 0x103c84a size 0x0 offset 0x0 count 4096 type 0x0 startoff 0x0 startblock -1 blockcount 0x1 cp-30344 [001] ...1 7474.284044: xfs_iunlock: dev 253:11 ino 0x103c84a flags IOLOCK_EXCL caller xfs_file_buffered_aio_write.isra.9 [xfs] cp-30344 [001] ...1 7474.284047: xfs_ilock: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_free_eofblocks [xfs] cp-30344 [001] ...1 7474.284048: xfs_iunlock: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_free_eofblocks [xfs] cp-30344 [001] ...1 7474.284048: xfs_ilock_nowait: dev 253:11 ino 0x103c84a flags IOLOCK_EXCL caller xfs_free_eofblocks [xfs] cp-30344 [001] ...1 7474.284051: xfs_ilock: dev 253:11 ino 0x103c84a flags ILOCK_EXCL caller xfs_free_eofblocks [xfs] cp-30344 [001] ...1 7474.284051: xfs_itruncate_extents_start: dev 253:11 ino 0x103c84a size 0x0 new_size 0x3e9 cp-30344 [001] ...1 7474.284052: xfs_bunmap: dev 253:11 ino 0x103c84a size 0x0 bno 0x1 len 0x8000000000000flags caller xfs_itruncate_extents [xfs] cp-30344 [001] ...1 7474.284055: xfs_itruncate_extents_end: dev 253:11 ino 0x103c84a size 0x0 new_size 0x3e9 cp-30344 [001] ...2 7474.284058: xfs_inode_clear_eofblocks_tag: dev 253:11 ino 0x103c84a cp-30344 [001] ...1 7474.284059: xfs_iunlock: dev 253:11 ino 0x103c84a flags ILOCK_EXCL caller xfs_free_eofblocks [xfs] cp-30344 [001] ...1 7474.284060: xfs_iunlock: dev 253:11 ino 0x103c84a flags IOLOCK_EXCL caller xfs_free_eofblocks [xfs] kworker/0:1H-257 [000] ...1 7477.849984: xfs_inode_unpin: dev 253:11 ino 0x103c84a count 1 pincount 1 caller xfs_trans_committed_bulk [xfs] xfsaild/dm-11-22098 [002] ...1 7484.461991: xfs_ilock_nowait: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_iflush_cluster [xfs] xfsaild/dm-11-22098 [002] ...1 7484.461991: xfs_iunlock: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_iflush_cluster [xfs] xfsaild/dm-11-22098 [002] ...2 7484.462174: xfs_ilock_nowait: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7484.462174: xfs_iunlock: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.831384: xfs_ilock_nowait: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.831384: xfs_iunlock: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.855242: xfs_ilock_nowait: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.855242: xfs_iunlock: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.876488: xfs_ilock_nowait: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.876489: xfs_iunlock: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.898474: xfs_ilock_nowait: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.898474: xfs_iunlock: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.920398: xfs_ilock_nowait: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.920398: xfs_iunlock: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.942246: xfs_ilock_nowait: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.942246: xfs_iunlock: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.963293: xfs_ilock_nowait: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.963293: xfs_iunlock: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.984229: xfs_ilock_nowait: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.984229: xfs_iunlock: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] .N.2 7515.005554: xfs_ilock_nowait: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] .N.2 7515.005555: xfs_iunlock: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7515.027267: xfs_ilock_nowait: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7515.027267: xfs_iunlock: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] .N.2 7515.048246: xfs_ilock_nowait: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] .N.2 7515.048246: xfs_iunlock: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7515.069222: xfs_ilock_nowait: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] .... xfsaild/dm-11-22098 [002] ...2 7616.981090: xfs_iunlock: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7617.032312: xfs_ilock_nowait: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7617.032312: xfs_iunlock: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7617.083162: xfs_ilock_nowait: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7617.083163: xfs_iunlock: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7617.134140: xfs_ilock_nowait: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7617.134140: xfs_iunlock: dev 253:11 ino 0x103c84a flags ILOCK_SHARED caller xfs_inode_item_push [xfs] cp-30344 [001] ...1 7474.284111: xfs_iget_miss: dev 253:11 ino 0x103c84b cp-30344 [001] ...2 7474.284112: xfs_ilock_nowait: dev 253:11 ino 0x103c84b flags ILOCK_EXCL caller xfs_iget [xfs] cp-30344 [001] ...1 7474.284115: xfs_dir2_block_addname: dev 253:11 ino 0x103c839 name s.gif namelen 5 hashval 0x35d9f4e1 inumber 0x103c84b op_flags ADDNAME|OKNOENT cp-30344 [001] ...1 7474.284126: xfs_inode_pin: dev 253:11 ino 0x103c84b count 1 pincount 0 caller xfs_cil_prepare_item.isra.1 [xfs] cp-30344 [001] ...1 7474.284133: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_EXCL caller xfs_inode_item_unlock [xfs] cp-30344 [001] ...1 7474.284139: xfs_getattr: dev 253:11 ino 0x103c84b cp-30344 [001] ...1 7474.284145: xfs_ilock: dev 253:11 ino 0x103c84b flags IOLOCK_EXCL caller xfs_file_buffered_aio_write.isra.9 [xfs] cp-30344 [001] ...1 7474.284146: xfs_file_buffered_write: dev 253:11 ino 0x103c84b size 0x0 offset 0x0 count 0x2b ioflags cp-30344 [001] ...1 7474.284153: xfs_ilock: dev 253:11 ino 0x103c84b flags ILOCK_EXCL caller __xfs_get_blocks [xfs] cp-30344 [001] ...1 7474.284155: xfs_iext_insert: dev 253:11 ino 0x103c84b state idx 0 offset 0 block 4503599627239429 count 1 flag 0 caller xfs_bmap_add_extent_hole_delay [xfs] cp-30344 [001] ...1 7474.284156: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_EXCL caller __xfs_get_blocks [xfs] cp-30344 [001] ...1 7474.284156: xfs_get_blocks_alloc: dev 253:11 ino 0x103c84b size 0x0 offset 0x0 count 4096 type 0x0 startoff 0x0 startblock -1 blockcount 0x1 cp-30344 [001] ...1 7474.284159: xfs_iunlock: dev 253:11 ino 0x103c84b flags IOLOCK_EXCL caller xfs_file_buffered_aio_write.isra.9 [xfs] cp-30344 [001] ...1 7474.284162: xfs_ilock: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_free_eofblocks [xfs] cp-30344 [001] ...1 7474.284163: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_free_eofblocks [xfs] cp-30344 [001] ...1 7474.284163: xfs_ilock_nowait: dev 253:11 ino 0x103c84b flags IOLOCK_EXCL caller xfs_free_eofblocks [xfs] cp-30344 [001] ...1 7474.284165: xfs_ilock: dev 253:11 ino 0x103c84b flags ILOCK_EXCL caller xfs_free_eofblocks [xfs] cp-30344 [001] ...1 7474.284165: xfs_itruncate_extents_start: dev 253:11 ino 0x103c84b size 0x0 new_size 0x2b cp-30344 [001] ...1 7474.284166: xfs_bunmap: dev 253:11 ino 0x103c84b size 0x0 bno 0x1 len 0x8000000000000flags caller xfs_itruncate_extents [xfs] cp-30344 [001] ...1 7474.284169: xfs_itruncate_extents_end: dev 253:11 ino 0x103c84b size 0x0 new_size 0x2b cp-30344 [001] ...2 7474.284172: xfs_inode_clear_eofblocks_tag: dev 253:11 ino 0x103c84b cp-30344 [001] ...1 7474.284173: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_EXCL caller xfs_free_eofblocks [xfs] cp-30344 [001] ...1 7474.284174: xfs_iunlock: dev 253:11 ino 0x103c84b flags IOLOCK_EXCL caller xfs_free_eofblocks [xfs] kworker/0:1H-257 [000] ...1 7477.849984: xfs_inode_unpin: dev 253:11 ino 0x103c84b count 1 pincount 1 caller xfs_trans_committed_bulk [xfs] xfsaild/dm-11-22098 [002] ...1 7484.461992: xfs_ilock_nowait: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_iflush_cluster [xfs] xfsaild/dm-11-22098 [002] ...1 7484.461992: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_iflush_cluster [xfs] xfsaild/dm-11-22098 [002] ...2 7484.462173: xfs_ilock_nowait: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7484.462173: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.831382: xfs_ilock_nowait: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.831383: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.855241: xfs_ilock_nowait: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.855241: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.876487: xfs_ilock_nowait: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.876487: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.898472: xfs_ilock_nowait: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.898473: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.920396: xfs_ilock_nowait: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.920397: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.942245: xfs_ilock_nowait: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.942245: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.963292: xfs_ilock_nowait: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.963292: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.984228: xfs_ilock_nowait: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7514.984228: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] .N.2 7515.005553: xfs_ilock_nowait: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] .N.2 7515.005553: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7515.027266: xfs_ilock_nowait: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7515.027266: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] .N.2 7515.048245: xfs_ilock_nowait: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] .N.2 7515.048246: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7515.069221: xfs_ilock_nowait: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7515.069221: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7515.090315: xfs_ilock_nowait: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7515.090315: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7515.111351: xfs_ilock_nowait: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7515.111351: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] .... xfsaild/dm-11-22098 [002] ...2 7616.673429: xfs_ilock_nowait: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7616.673429: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7616.725283: xfs_ilock_nowait: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7616.725283: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7616.777260: xfs_ilock_nowait: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7616.777260: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7616.828237: xfs_ilock_nowait: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7616.828237: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] .N.2 7616.879318: xfs_ilock_nowait: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] .N.2 7616.879319: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild was stuck towards the end like. The inode number varies, some of which trace-buffer doesn't capture as with too many events, trace-buffer lost several events. xfsaild/dm-11-22098 [001] ...2 7596.447019: xfs_ilock_nowait: dev 253:11 ino 0x6842bb6 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [001] ...2 7596.447020: xfs_iunlock: dev 253:11 ino 0x6842bb6 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [001] ...2 7596.447020: xfs_ail_flushing: dev 253:11 lip 0xffff880095382130 lsn 4/8128 type XFS_LI_INODE flags IN_AIL xfsaild/dm-11-22098 [001] ...2 7596.447020: xfs_ilock_nowait: dev 253:11 ino 0x6842bb4 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [001] ...2 7596.447020: xfs_iunlock: dev 253:11 ino 0x6842bb4 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [001] ...2 7596.447020: xfs_ail_flushing: dev 253:11 lip 0xffff880095382000 lsn 4/8128 type XFS_LI_INODE flags IN_AIL xfsaild/dm-11-22098 [001] ...2 7596.447021: xfs_ilock_nowait: dev 253:11 ino 0x58302e1 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [001] ...2 7596.447021: xfs_iunlock: dev 253:11 ino 0x58302e1 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [001] ...2 7596.447021: xfs_ail_flushing: dev 253:11 lip 0xffff880093623ed8 lsn 4/8128 type XFS_LI_INODE flags IN_AIL xfsaild/dm-11-22098 [001] ...2 7596.447021: xfs_ilock_nowait: dev 253:11 ino 0x6842bb3 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [001] ...2 7596.447022: xfs_iunlock: dev 253:11 ino 0x6842bb3 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [001] ...2 7596.447022: xfs_ail_flushing: dev 253:11 lip 0xffff8800334fded8 lsn 4/8128 type XFS_LI_INODE flags IN_AIL xfsaild/dm-11-22098 [001] ...2 7596.447022: xfs_ilock_nowait: dev 253:11 ino 0x6842bd1 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [001] ...2 7596.447022: xfs_iunlock: dev 253:11 ino 0x6842bd1 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] .... xfsaild/dm-11-22098 [002] ...2 7616.673429: xfs_ilock_nowait: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7616.673429: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7616.725283: xfs_ilock_nowait: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7616.725283: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7616.777260: xfs_ilock_nowait: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7616.777260: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7616.828237: xfs_ilock_nowait: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7616.828237: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] .N.2 7616.879318: xfs_ilock_nowait: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-11-22098 [002] .N.2 7616.879319: xfs_iunlock: dev 253:11 ino 0x103c84b flags ILOCK_SHARED caller xfs_inode_item_push [xfs] It will be hard for me to shift to a newer kernel. But if you say we are left with no options to root cause this issue, I can attempt at this direction. Pls let me know. Thanks. --Shyam -----Original Message----- From: Brian Foster [mailto:bfoster@redhat.com] Sent: 22 March 2016 19:34 To: Shyam Kaushik Cc: Alex Lyakas; xfs@oss.sgi.com Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery On Tue, Mar 22, 2016 at 06:31:48PM +0530, Shyam Kaushik wrote: > Hi Brian, > > Thanks for your quick reply. I repeated the test & trace-pipe is > constantly filled with this: > > xfsaild/dm-10-3335 [003] ...2 24890.546491: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.546492: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.546493: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.596491: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.596492: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.596494: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.646497: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.646498: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.646500: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.696467: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.746548: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.796479: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.846467: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.846468: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > So xfsaild is spinning on this inode. It was presumably modified, logged and flushed to the log, hence it's sitting in the AIL waiting to be flushed to disk. xfsaild wants to push it to get it flushed to disk and off the AIL, but it sees it is already in the flushing state as the flush lock is held. It's not clear to me why the inode is not removed from the AIL, or whether that I/O was actually submitted or aborted with an error. The shutdown involved here most likely affects this one way or the other. IIUC, the I/O completion should eventually release the flush lock and remove the inode from the AIL. A complete trace log of the entire reproducer might shed more light as to what's going on. Also, it sounds like you have a reliable reproducer. Does this reproduce on a recent kernel? Brian > > while regular activity seems to happen on other inodes/kworker threads > > kworker/u8:4-27691 [001] ...1 24895.811474: xfs_writepage: dev 253:10 > ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811477: xfs_invalidatepage: dev > 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > delalloc 1 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811478: xfs_releasepage: dev > 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 > delalloc 0 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811482: xfs_writepage: dev 253:10 > ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811482: xfs_invalidatepage: dev > 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > delalloc 1 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811483: xfs_releasepage: dev > 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 > delalloc 0 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811485: xfs_writepage: dev 253:10 > ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811486: xfs_invalidatepage: dev > 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > delalloc 1 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811486: xfs_releasepage: dev > 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 > delalloc 0 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812381: xfs_writepage: dev 253:10 > ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812382: xfs_invalidatepage: dev > 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 1000 > delalloc 1 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812382: xfs_releasepage: dev > 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc > 0 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812385: xfs_writepage: dev 253:10 > ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812385: xfs_invalidatepage: dev > 253:10 ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 1000 > delalloc 1 unwritten 0 > > > looks like xfsaild is not able to take lock until hung-task timeout kicks > in > > xfsaild/dm-10-3335 [003] ...2 25247.649468: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 25247.699478: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.699516: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.699517: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 25247.749471: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.749478: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.749479: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > Please let me know how to debug this further. Thanks. > > --Shyam > -----Original Message----- > From: Brian Foster [mailto:bfoster@redhat.com] > Sent: 22 March 2016 17:49 > To: Shyam Kaushik > Cc: xfs@oss.sgi.com; Alex Lyakas > Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > after disk failure/recovery > > On Tue, Mar 22, 2016 at 04:51:39PM +0530, Shyam Kaushik wrote: > > Hi XFS developers, > > > > We are seeing the following issue with XFS on kernel 3.18.19. > > > > We have XFS mounted over a raw disk. Disk was pulled out manually. There > > were async writes on files that were errored like this > > > ... > > > > And XFS hit metadata & Log IO errors that it decides to shutdown: > > > > Mar 16 16:03:22 host0 kernel: [ 4637.351841] XFS (dm-29): metadata I/O > > error: block 0x3a27fbd0 ("xlog_iodone") error 5 numblks 64 > > Mar 16 16:03:22 host0 kernel: [ 4637.352820] XFS(dm-29): SHUTDOWN!!! > > old_flags=0x0 new_flags=0x2 > > Mar 16 16:03:22 host0 kernel: [ 4637.353187] XFS (dm-29): Log I/O Error > > Detected. Shutting down filesystem > ... > > Later the drive was re-inserted back. After the drive was re-inserted, > XFS > > was attempted to be unmounted > > > > Mar 16 16:16:53 host0 controld: [2557] [ ] umount[202] > > : umount(/sdisk/vol5b0, xfs) > > > > But nothing happens except for the 30-secs xfs_log_force errors that > keeps > > repeating > > > ... > > > > This problem doesn't happen consistently, but happens periodically with > a > > drive failure/recovery followed by XFS unmount. I couldn't find this > issue > > fixed in later kernels. Can you please suggest how I can debug this > issue > > further? > > > > Similar problems have been reproduced due to racy/incorrect EFI/EFD > object tracking, which are internal data structures associated with > freeing extents. > > What happens if you enable tracepoints while the fs is in this hung > unmount state? > > # trace-cmd start -e "xfs:*" > # cat /sys/kernel/debug/tracing/trace_pipe > > Brian > > > Thanks! > > > > --Shyam > > > > _______________________________________________ > > 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 shyam@zadarastorage.com Wed Mar 23 04:52:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 2F8547CA0 for ; Wed, 23 Mar 2016 04:52:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 82E09AC005 for ; Wed, 23 Mar 2016 02:52:54 -0700 (PDT) X-ASG-Debug-ID: 1458726770-04cbb04da718f6c0001-NocioJ Received: from mail-oi0-f51.google.com (mail-oi0-f51.google.com [209.85.218.51]) by cuda.sgi.com with ESMTP id 9PKmoZtZmld1G1ED (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 23 Mar 2016 02:52:51 -0700 (PDT) X-Barracuda-Envelope-From: shyam@zadarastorage.com X-Barracuda-Apparent-Source-IP: 209.85.218.51 Received: by mail-oi0-f51.google.com with SMTP id w20so12327548oia.2 for ; Wed, 23 Mar 2016 02:52:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zadarastorage-com.20150623.gappssmtp.com; s=20150623; h=from:references:in-reply-to:mime-version:thread-index:date :message-id:subject:to:cc; bh=vK0teViGf+j+gquGT9zqS4YIMv8rRaKVncaZxGCdvs4=; b=aA4wmSkw69BDzDGyaEtvdO6zx7ckNnaQud3zoqQ1QY0fDP7Cf9tjfrXvmzLoQWfIBy Ke+jN6Q8W6DsW9uiBQ76Kf9az6wXTL2JDzxA3f0VlXVQmOm7p8piK2j94Dk7flAAypiF 1pHrLzkBS+IBxoQFacP/EE4AEao7ORNhL7T6+HFmCzBcIR/qB8oQTFMue6Zkw+ixLppa jDR1DpYLSc/WyzK210k7CV8N3c4yPTkCP25PtLorVg1wMCsYiHinVGVI2i9XzptJBugA nHKKEnzo4WVD32HFKXV3wy9JQsJDXqoeWAt/ZS19WQh23LHg/RO+Q8MX4YHXU+Y74XYo M3eg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:references:in-reply-to:mime-version :thread-index:date:message-id:subject:to:cc; bh=vK0teViGf+j+gquGT9zqS4YIMv8rRaKVncaZxGCdvs4=; b=UTeUDJnqJ1zp7x6ppI0Z3TBPCtYW8q44uUFC2PtId4Ri1yPTIidMYjZxN1IWVDlQdL 3JpCV5jauUzqiZMxB3APzn5s9sqDsQA9FAVSZ3sbhDkY6izR4gpDEqrinbDUiBhNroqV byh5O85GhM272VouMzHKs64eKG05nEJ8Gym8/J1MGw9ozCX8jI3jhIELwyP6PQaNR1Co 3873qVB28V+sUr20QCpfDguA1YySNy7lfvg/r3/eQ5FFVf7a2g9Hp1GNAd8i8dV6K1aw qBPEvkdv0ibIbnYWQeIROZuyqPZ0Q1BkmyFjzpxrOthSrjR+vpkc5TC1jHsT/Ng17lMu p2hQ== X-Gm-Message-State: AD7BkJInu298ksJ5i7W6ZFMy9VEk3Kqdj7+WAuDswkbQvVFlfXWcorw4X9BfFYfoziHzFGtdmRIzz7/QIs13jg== X-Received: by 10.157.16.29 with SMTP id h29mr715131ote.181.1458726770221; Wed, 23 Mar 2016 02:52:50 -0700 (PDT) From: Shyam Kaushik References: <20160322121922.GA53693@bfoster.bfoster> 6457b1d9de271ec6cca6bc2626aac161@mail.gmail.com In-Reply-To: 6457b1d9de271ec6cca6bc2626aac161@mail.gmail.com MIME-Version: 1.0 X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AdGENRKPygQUtyusRzyfZh8lYSPNuwABVHnwACushLA= Date: Wed, 23 Mar 2016 15:22:41 +0530 Message-ID: <91068979ae9a5999b4774a06b8f1d14c@mail.gmail.com> Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery To: Brian Foster X-ASG-Orig-Subj: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Cc: xfs@oss.sgi.com, Alex Lyakas Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-oi0-f51.google.com[209.85.218.51] X-Barracuda-Start-Time: 1458726771 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/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, DKIM_SIGNED, DKIM_VERIFIED, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28081 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi Carlos, w.r.t. your question below >>> Shyam, after you reconnected the disks, the messages about failed async metadata >>> writes stops to be logged? After I reconnect the disks, messages about failed async metadata writes stops to be logged. But the key thing is messages like XFS (dm-29): xfs_log_force: error -5 returned Keeps repeating every 30-secs which indicates that there is some buf/io error status that is being carried forward. >>> Any chance you can reliably reproduce it? Yes I have a way to reproduce it, but its not reliable. What I do is setup a dm-linear over a disk. Create XFS, mount & trigger few copy threads to copy varying sized files into the FS. At this point pull out the drive (with scsi-remove-single-device in /proc/scsi/scsi) & in a short-while convert the dm-linear to dm-ioerror. Then I bring back the underlying drive, convert back dm-ioerror to dm-linear & try to unmount XFS. This problem somehow happens on a newly created XFS. If I copy several files into XFS/delete them & then copy them again, repeat the drive failure/recovery experiment it doesn't reproduce. Thanks. --Shyam Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery From: Carlos Maiolino Date: Tue, 22 Mar 2016 16:38:25 +0100 In-reply-to: <20160322140345.GA54245@bfoster.bfoster> Mail-followup-to: xfs@xxxxxxxxxxx User-agent: Mutt/1.5.24 (2015-08-30) Hi Brian, These traces, and the stack trace presented, looks quite similar with the one we were discussing a few days ago, using a dm-thin snapshot. Looks like with the same bug I've been hunting and Shyam confirmed my hypothesis of this bug be able to be reproduced with a regular device. If it's the same bug, yes, I reproduced it using upstream kernel. The difference between both (this bug and the one I've been working on) is how xfs actually behaves when async metadata writes fail. Other than that, it pretty much looks the same. Trying to unmount the filesystem hungs in xfs_log_force(), well, basically the reason I submitted the patch to include the caller into xfs_log_force trace. I'd like to see ftrace traces from this system with that patch if possible. I didn't have time to keep working on this for the past few days, but looks like it's time to come back to it. Shyam, after you reconnected the disks, the messages about failed async metadata writes stops to be logged? Any chance you can reliably reproduce it? I'm not a xfs journal expert, but it looks like the writeback of items in AIL got stuck due the IO errors, and were never completed, but I don't know what I should expect after the disk is reconnected. In my case though, with upstream kernel, I didn't get a XFS_SHUTDOWN until I tried to unmount the filesystem, which differs from this case, where xfs looks to have shutdown the filesystem after a few tries to writeback the metadata. Anyway, I can dig more into it this week, if nobody knows what is going on before I do it :) -----Original Message----- From: Shyam Kaushik [mailto:shyam@zadarastorage.com] Sent: 22 March 2016 18:32 To: 'Brian Foster' Cc: 'xfs@oss.sgi.com'; Alex Lyakas Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Hi Brian, Thanks for your quick reply. I repeated the test & trace-pipe is constantly filled with this: xfsaild/dm-10-3335 [003] ...2 24890.546491: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.546492: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.546493: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 24890.596491: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.596492: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.596494: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 24890.646497: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.646498: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.646500: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 24890.696467: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 24890.746548: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 24890.796479: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 24890.846467: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.846468: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] while regular activity seems to happen on other inodes/kworker threads kworker/u8:4-27691 [001] ...1 24895.811474: xfs_writepage: dev 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811477: xfs_invalidatepage: dev 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811478: xfs_releasepage: dev 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 0 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811482: xfs_writepage: dev 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811482: xfs_invalidatepage: dev 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 1000 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811483: xfs_releasepage: dev 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 0 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811485: xfs_writepage: dev 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811486: xfs_invalidatepage: dev 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811486: xfs_releasepage: dev 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 0 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.812381: xfs_writepage: dev 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.812382: xfs_invalidatepage: dev 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 1000 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.812382: xfs_releasepage: dev 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 0 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.812385: xfs_writepage: dev 253:10 ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.812385: xfs_invalidatepage: dev 253:10 ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 1000 delalloc 1 unwritten 0 looks like xfsaild is not able to take lock until hung-task timeout kicks in xfsaild/dm-10-3335 [003] ...2 25247.649468: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 25247.699478: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 25247.699516: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 25247.699517: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 25247.749471: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 25247.749478: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 25247.749479: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL Please let me know how to debug this further. Thanks. --Shyam -----Original Message----- From: Brian Foster [mailto:bfoster@redhat.com] Sent: 22 March 2016 17:49 To: Shyam Kaushik Cc: xfs@oss.sgi.com; Alex Lyakas Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery On Tue, Mar 22, 2016 at 04:51:39PM +0530, Shyam Kaushik wrote: > Hi XFS developers, > > We are seeing the following issue with XFS on kernel 3.18.19. > > We have XFS mounted over a raw disk. Disk was pulled out manually. There > were async writes on files that were errored like this > ... > > And XFS hit metadata & Log IO errors that it decides to shutdown: > > Mar 16 16:03:22 host0 kernel: [ 4637.351841] XFS (dm-29): metadata I/O > error: block 0x3a27fbd0 ("xlog_iodone") error 5 numblks 64 > Mar 16 16:03:22 host0 kernel: [ 4637.352820] XFS(dm-29): SHUTDOWN!!! > old_flags=0x0 new_flags=0x2 > Mar 16 16:03:22 host0 kernel: [ 4637.353187] XFS (dm-29): Log I/O Error > Detected. Shutting down filesystem ... > Later the drive was re-inserted back. After the drive was re-inserted, XFS > was attempted to be unmounted > > Mar 16 16:16:53 host0 controld: [2557] [ ] umount[202] > : umount(/sdisk/vol5b0, xfs) > > But nothing happens except for the 30-secs xfs_log_force errors that keeps > repeating > ... > > This problem doesn't happen consistently, but happens periodically with a > drive failure/recovery followed by XFS unmount. I couldn't find this issue > fixed in later kernels. Can you please suggest how I can debug this issue > further? > Similar problems have been reproduced due to racy/incorrect EFI/EFD object tracking, which are internal data structures associated with freeing extents. What happens if you enable tracepoints while the fs is in this hung unmount state? # trace-cmd start -e "xfs:*" # cat /sys/kernel/debug/tracing/trace_pipe Brian > Thanks! > > --Shyam > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From n.borisov@siteground.com Wed Mar 23 05:15:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id ADF257CA4 for ; Wed, 23 Mar 2016 05:15:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 12E2BAC005 for ; Wed, 23 Mar 2016 03:15:48 -0700 (PDT) X-ASG-Debug-ID: 1458728144-04cb6c059d16d5a0001-NocioJ Received: from mail-wm0-f50.google.com (mail-wm0-f50.google.com [74.125.82.50]) by cuda.sgi.com with ESMTP id OfGVBbo3MMagk8tv (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 23 Mar 2016 03:15:45 -0700 (PDT) X-Barracuda-Envelope-From: n.borisov@siteground.com X-Barracuda-Apparent-Source-IP: 74.125.82.50 Received: by mail-wm0-f50.google.com with SMTP id l68so226793455wml.0 for ; Wed, 23 Mar 2016 03:15:45 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:to:cc:from:subject:message-id:date:user-agent :mime-version:content-transfer-encoding; bh=tMsn2I6GqF+iCn40W876dRz+eye1LcRagGENHCFAg5U=; b=a0JzzbaYDiqFboIJnZPVH82rlCPsRPNDdi7Js51v2iEtVH6ZuLDGN7zz1R+EPL0d2P 72CJOlcfGDjKdB08TElXAZ+OqCdVKi8X2KkdiNJDgywcyZt0ins1cKOxrh8fQZ8k7tOC mu22/6yVxfFXITuWP57g2KZBwdq1WJP12+OzMjlMnbjwbFyvdM7G3UF/puRnvMiHZRtY 7BimKXQ7YESF9Odte82ViU2K/RHlHpXJPxXeWru+WPuh9enRa6FQb47rZ9Xf2gVbgjX1 4Kmjz1IMFBdsHWlPBnsMuB7HfigTFO0GzqBmFRt3+Pafm9tNOLNmVJcTMtllvTi8DNeb l2PA== X-Gm-Message-State: AD7BkJKnZEW/Y6v3K8XXILnIM9udKR+wHg/2hMC1KHzr3G0o2hpNPv3oArlAezmExuvllyx0 X-Received: by 10.28.23.70 with SMTP id 67mr2834398wmx.70.1458728144643; Wed, 23 Mar 2016 03:15:44 -0700 (PDT) Received: from localhost.localdomain (admins.1h.com. [82.118.240.130]) by smtp.gmail.com with ESMTPSA id h67sm2169029wmf.15.2016.03.23.03.15.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 23 Mar 2016 03:15:44 -0700 (PDT) To: Dave Chinner Cc: xfs@oss.sgi.com From: Nikolay Borisov Subject: Failing XFS memory allocation Message-ID: <56F26CCE.6010502@kyup.com> X-ASG-Orig-Subj: Failing XFS memory allocation Date: Wed, 23 Mar 2016 12:15:42 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.1.0 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-wm0-f50.google.com[74.125.82.50] X-Barracuda-Start-Time: 1458728145 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28081 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hello, So I have an XFS filesystem which houses 2 2.3T sparse files, which are loop-mounted. Recently I migrated a server to a 4.4.6 kernel and this morning I observed the following in my dmesg: XFS: loop0(15174) possible memory allocation deadlock size 107168 in kmem_alloc (mode:0x2400240) the mode is essentially (GFP_KERNEL | GFP_NOWARN) &= ~__GFP_FS. Here is the site of the loop file in case it matters: du -h --apparent-size /storage/loop/file1 2.3T /storage/loop/file1 du -h /storage/loop/file1 878G /storage/loop/file1 And this string is repeated multiple times. Looking at the output of "echo w > /proc/sysrq-trigger" I see the following suspicious entry: loop0 D ffff881fe081f038 0 15174 2 0x00000000 ffff881fe081f038 ffff883ff29fa700 ffff881fecb70d00 ffff88407fffae00 0000000000000000 0000000502404240 ffffffff81e30d60 0000000000000000 0000000000000000 ffff881f00000003 0000000000000282 ffff883f00000000 Call Trace: [] ? _raw_spin_lock_irqsave+0x21/0x60 [] schedule+0x47/0x90 [] schedule_timeout+0x113/0x1e0 [] ? lock_timer_base+0x80/0x80 [] io_schedule_timeout+0xa4/0x110 [] congestion_wait+0x7f/0x130 [] ? woken_wake_function+0x20/0x20 [] kmem_alloc+0x8c/0x120 [xfs] [] ? __kmalloc+0x121/0x250 [] kmem_realloc+0x33/0x80 [xfs] [] xfs_iext_realloc_indirect+0x3d/0x60 [xfs] [] xfs_iext_irec_new+0x3f/0xf0 [xfs] [] xfs_iext_add_indirect_multi+0x14d/0x210 [xfs] [] xfs_iext_add+0xc5/0x230 [xfs] [] ? mempool_alloc_slab+0x15/0x20 [] xfs_iext_insert+0x59/0x110 [xfs] [] ? xfs_bmap_add_extent_hole_delay+0xd8/0x740 [xfs] [] xfs_bmap_add_extent_hole_delay+0xd8/0x740 [xfs] [] ? mempool_alloc_slab+0x15/0x20 [] ? mempool_alloc+0x65/0x180 [] ? xfs_iext_get_ext+0x38/0x70 [xfs] [] ? xfs_iext_bno_to_ext+0xed/0x150 [xfs] [] xfs_bmapi_reserve_delalloc+0x225/0x250 [xfs] [] xfs_bmapi_delay+0x13e/0x290 [xfs] [] xfs_iomap_write_delay+0x17d/0x300 [xfs] [] ? xfs_bmapi_read+0x114/0x330 [xfs] [] __xfs_get_blocks+0x585/0xa90 [xfs] [] ? __percpu_counter_add+0x63/0x80 [] ? account_page_dirtied+0xed/0x1b0 [] ? alloc_buffer_head+0x49/0x60 [] ? alloc_page_buffers+0x60/0xb0 [] ? create_empty_buffers+0x45/0xc0 [] xfs_get_blocks+0x14/0x20 [xfs] [] __block_write_begin+0x1c2/0x580 [] ? xfs_get_blocks_direct+0x20/0x20 [xfs] [] xfs_vm_write_begin+0x61/0xf0 [xfs] [] generic_perform_write+0xd0/0x1f0 [] xfs_file_buffered_aio_write+0xe1/0x240 [xfs] [] ? bt_clear_tag+0xb2/0xd0 [] xfs_file_write_iter+0x167/0x170 [xfs] [] vfs_iter_write+0x76/0xa0 [] lo_write_bvec+0x65/0x100 [loop] [] loop_queue_work+0x689/0x924 [loop] [] ? retint_kernel+0x10/0x10 [] kthread_worker_fn+0x61/0x1c0 [] ? flush_kthread_work+0x120/0x120 [] ? flush_kthread_work+0x120/0x120 [] kthread+0xd7/0xf0 [] ? schedule_tail+0x1e/0xd0 [] ? kthread_freezable_should_stop+0x80/0x80 [] ret_from_fork+0x3f/0x70 [] ? kthread_freezable_should_stop+0x80/0x80 So this seems that there are writes to the loop device being queued and while being served XFS has to do some internal memory allocation to fit the new data, however due to some *uknown* reason it fails and starts looping in kmem_alloc. I didn't see any OOM reports so presumably the server was not out of memory, but unfortunately I didn't check the memory fragmentation, though I collected a crash dump in case you need further info. The one thing which bugs me is that XFS tried to allocate 107 contiguous kb which is page-order-26 isn't this waaaaay too big and almost never satisfiable, despite direct/bg reclaim to be enabled? For now I've reverted to using 3.12.52 kernel, where this issue hasn't been observed (yet) any ideas would be much appreciated. From bfoster@redhat.com Wed Mar 23 07:30:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2D2B27CA0 for ; Wed, 23 Mar 2016 07:30:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A09C4AC005 for ; Wed, 23 Mar 2016 05:30:16 -0700 (PDT) X-ASG-Debug-ID: 1458736214-04bdf07eaa2075c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 53xHbOsyVmy2F9NS (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 23 Mar 2016 05:30: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-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id F230D804E4; Wed, 23 Mar 2016 12:30:13 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-6.bos.redhat.com [10.18.41.6]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2NCUDnQ014039; Wed, 23 Mar 2016 08:30:13 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4AD581205DF; Wed, 23 Mar 2016 08:30:12 -0400 (EDT) Date: Wed, 23 Mar 2016 08:30:12 -0400 From: Brian Foster To: Shyam Kaushik Cc: Alex Lyakas , xfs@oss.sgi.com Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Message-ID: <20160323123010.GA43073@bfoster.bfoster> X-ASG-Orig-Subj: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery References: <20160322121922.GA53693@bfoster.bfoster> <6457b1d9de271ec6cca6bc2626aac161@mail.gmail.com> <20160322140345.GA54245@bfoster.bfoster> <0f3832c45509f444f55fda2aaf9c9deb@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <0f3832c45509f444f55fda2aaf9c9deb@mail.gmail.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458736214 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Mar 23, 2016 at 03:13:57PM +0530, Shyam Kaushik wrote: > Hi Brian, > > Here are two inodes on which the xfsaild is looping over & over during > unmount. This captures right from the cp that I started with copying some > files to xfs while the drive was pulled out, later drive was pushed back & > unmount was attempted. Does this give you better picture on the issue? > Please let me know if you prefer to do some other steps in the reproducer. > ... > kworker/0:1H-257 [000] ...1 7477.849984: xfs_inode_unpin: dev > 253:11 ino 0x103c84a count 1 pincount 1 caller xfs_trans_committed_bulk > [xfs] So it looks like the transaction is committed to the log. We don't necessarily know whether the I/O completed or this was aborted, though I suppose we can infer the former since the inode ends up on the AIL. There's not much else that I can go on here, however. It looks like this trace output is redacted and/or some events were lost. For example, I don't see any xfs_ail_insert/move events at all, etc. I'd suggest to use trace-record to collect and send (or post somewhere) the full, raw trace dump. Something like 'trace-record -e xfs:* sleep 999' should dump everything to a file while you try and reproduce. Alternatively, it sounds like Carlos is working towards a reproducer on a recent kernel and might be closer to tracking this down. One random thought/guess from skimming through the code: I wonder if there's some kind of race going on between a failed metadata write retry and the fs shutdown. It looks like we retry once in xfs_buf_iodone_callbacks(). If the fs is shutdown, we invoke the callbacks which look like it should ultimately release the flush lock (in xfs_iflush_done()), but I'm not sure that happens if the shutdown occurs after a failed retry. ... > It will be hard for me to shift to a newer kernel. But if you say we are > left with no options to root cause this issue, I can attempt at this > direction. Pls let me know. Thanks. > I ask mainly for informational and debugging purposes. If the problem doesn't occur on a recent kernel, we might have a fix that could be identified via a bisect. If it does, then it's still preferable to debug on something more recent. As mentioned above, it sounds like Carlos has been working on tracking this down on recent kernels already. Brian > --Shyam > -----Original Message----- > From: Brian Foster [mailto:bfoster@redhat.com] > Sent: 22 March 2016 19:34 > To: Shyam Kaushik > Cc: Alex Lyakas; xfs@oss.sgi.com > Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > after disk failure/recovery > > On Tue, Mar 22, 2016 at 06:31:48PM +0530, Shyam Kaushik wrote: > > Hi Brian, > > > > Thanks for your quick reply. I repeated the test & trace-pipe is > > constantly filled with this: > > > > xfsaild/dm-10-3335 [003] ...2 24890.546491: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.546492: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.546493: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 24890.596491: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.596492: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.596494: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 24890.646497: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.646498: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.646500: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 24890.696467: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 24890.746548: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 24890.796479: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 24890.846467: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.846468: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > > So xfsaild is spinning on this inode. It was presumably modified, logged > and flushed to the log, hence it's sitting in the AIL waiting to be > flushed to disk. xfsaild wants to push it to get it flushed to disk and > off the AIL, but it sees it is already in the flushing state as the > flush lock is held. > > It's not clear to me why the inode is not removed from the AIL, or > whether that I/O was actually submitted or aborted with an error. The > shutdown involved here most likely affects this one way or the other. > IIUC, the I/O completion should eventually release the flush lock and > remove the inode from the AIL. A complete trace log of the entire > reproducer might shed more light as to what's going on. > > Also, it sounds like you have a reliable reproducer. Does this reproduce > on a recent kernel? > > Brian > > > > > while regular activity seems to happen on other inodes/kworker threads > > > > kworker/u8:4-27691 [001] ...1 24895.811474: xfs_writepage: dev > 253:10 > > ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > > unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811477: xfs_invalidatepage: dev > > 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > > delalloc 1 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811478: xfs_releasepage: dev > > 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 > > delalloc 0 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811482: xfs_writepage: dev > 253:10 > > ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > > unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811482: xfs_invalidatepage: dev > > 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > > delalloc 1 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811483: xfs_releasepage: dev > > 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 > > delalloc 0 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811485: xfs_writepage: dev > 253:10 > > ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > > unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811486: xfs_invalidatepage: dev > > 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > > delalloc 1 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811486: xfs_releasepage: dev > > 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 > > delalloc 0 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.812381: xfs_writepage: dev > 253:10 > > ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 > > unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.812382: xfs_invalidatepage: dev > > 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 1000 > > delalloc 1 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.812382: xfs_releasepage: dev > > 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 > delalloc > > 0 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.812385: xfs_writepage: dev > 253:10 > > ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 > > unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.812385: xfs_invalidatepage: dev > > 253:10 ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 1000 > > delalloc 1 unwritten 0 > > > > > > looks like xfsaild is not able to take lock until hung-task timeout > kicks > > in > > > > xfsaild/dm-10-3335 [003] ...2 25247.649468: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 25247.699478: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 25247.699516: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 25247.699517: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 25247.749471: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 25247.749478: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 25247.749479: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > > > Please let me know how to debug this further. Thanks. > > > > --Shyam > > -----Original Message----- > > From: Brian Foster [mailto:bfoster@redhat.com] > > Sent: 22 March 2016 17:49 > > To: Shyam Kaushik > > Cc: xfs@oss.sgi.com; Alex Lyakas > > Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > > after disk failure/recovery > > > > On Tue, Mar 22, 2016 at 04:51:39PM +0530, Shyam Kaushik wrote: > > > Hi XFS developers, > > > > > > We are seeing the following issue with XFS on kernel 3.18.19. > > > > > > We have XFS mounted over a raw disk. Disk was pulled out manually. > There > > > were async writes on files that were errored like this > > > > > ... > > > > > > And XFS hit metadata & Log IO errors that it decides to shutdown: > > > > > > Mar 16 16:03:22 host0 kernel: [ 4637.351841] XFS (dm-29): metadata I/O > > > error: block 0x3a27fbd0 ("xlog_iodone") error 5 numblks 64 > > > Mar 16 16:03:22 host0 kernel: [ 4637.352820] XFS(dm-29): SHUTDOWN!!! > > > old_flags=0x0 new_flags=0x2 > > > Mar 16 16:03:22 host0 kernel: [ 4637.353187] XFS (dm-29): Log I/O > Error > > > Detected. Shutting down filesystem > > ... > > > Later the drive was re-inserted back. After the drive was re-inserted, > > XFS > > > was attempted to be unmounted > > > > > > Mar 16 16:16:53 host0 controld: [2557] [ ] umount[202] > > > : umount(/sdisk/vol5b0, xfs) > > > > > > But nothing happens except for the 30-secs xfs_log_force errors that > > keeps > > > repeating > > > > > ... > > > > > > This problem doesn't happen consistently, but happens periodically > with > > a > > > drive failure/recovery followed by XFS unmount. I couldn't find this > > issue > > > fixed in later kernels. Can you please suggest how I can debug this > > issue > > > further? > > > > > > > Similar problems have been reproduced due to racy/incorrect EFI/EFD > > object tracking, which are internal data structures associated with > > freeing extents. > > > > What happens if you enable tracepoints while the fs is in this hung > > unmount state? > > > > # trace-cmd start -e "xfs:*" > > # cat /sys/kernel/debug/tracing/trace_pipe > > > > Brian > > > > > Thanks! > > > > > > --Shyam > > > > > > _______________________________________________ > > > xfs mailing list > > > xfs@oss.sgi.com > > > http://oss.sgi.com/mailman/listinfo/xfs > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Wed Mar 23 07:43:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BB84C7CB0 for ; Wed, 23 Mar 2016 07:43:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8D87C304051 for ; Wed, 23 Mar 2016 05:43:16 -0700 (PDT) X-ASG-Debug-ID: 1458736994-04cbb04da41a3810001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id qA8dnIML39Jn4ZYU (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 23 Mar 2016 05:43: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-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 80B81804E5; Wed, 23 Mar 2016 12:43:14 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-6.bos.redhat.com [10.18.41.6]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2NChE7B019702; Wed, 23 Mar 2016 08:43:14 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 2620A1205DF; Wed, 23 Mar 2016 08:43:13 -0400 (EDT) Date: Wed, 23 Mar 2016 08:43:13 -0400 From: Brian Foster To: Nikolay Borisov Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: Failing XFS memory allocation Message-ID: <20160323124312.GB43073@bfoster.bfoster> X-ASG-Orig-Subj: Re: Failing XFS memory allocation References: <56F26CCE.6010502@kyup.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56F26CCE.6010502@kyup.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458736995 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Mar 23, 2016 at 12:15:42PM +0200, Nikolay Borisov wrote: > Hello, > > So I have an XFS filesystem which houses 2 2.3T sparse files, which are > loop-mounted. Recently I migrated a server to a 4.4.6 kernel and this > morning I observed the following in my dmesg: > > XFS: loop0(15174) possible memory allocation deadlock size 107168 in > kmem_alloc (mode:0x2400240) > Is there a stack trace associated with this message? > the mode is essentially (GFP_KERNEL | GFP_NOWARN) &= ~__GFP_FS. > Here is the site of the loop file in case it matters: > > du -h --apparent-size /storage/loop/file1 > 2.3T /storage/loop/file1 > > du -h /storage/loop/file1 > 878G /storage/loop/file1 > > And this string is repeated multiple times. Looking at the output of > "echo w > /proc/sysrq-trigger" I see the following suspicious entry: > > loop0 D ffff881fe081f038 0 15174 2 0x00000000 > ffff881fe081f038 ffff883ff29fa700 ffff881fecb70d00 ffff88407fffae00 > 0000000000000000 0000000502404240 ffffffff81e30d60 0000000000000000 > 0000000000000000 ffff881f00000003 0000000000000282 ffff883f00000000 > Call Trace: > [] ? _raw_spin_lock_irqsave+0x21/0x60 > [] schedule+0x47/0x90 > [] schedule_timeout+0x113/0x1e0 > [] ? lock_timer_base+0x80/0x80 > [] io_schedule_timeout+0xa4/0x110 > [] congestion_wait+0x7f/0x130 > [] ? woken_wake_function+0x20/0x20 > [] kmem_alloc+0x8c/0x120 [xfs] > [] ? __kmalloc+0x121/0x250 > [] kmem_realloc+0x33/0x80 [xfs] > [] xfs_iext_realloc_indirect+0x3d/0x60 [xfs] > [] xfs_iext_irec_new+0x3f/0xf0 [xfs] > [] xfs_iext_add_indirect_multi+0x14d/0x210 [xfs] > [] xfs_iext_add+0xc5/0x230 [xfs] It looks like it's working to add a new extent to the in-core extent list. If this is the stack associated with the warning message (combined with the large alloc size), I wonder if there's a fragmentation issue on the file leading to an excessive number of extents. What does 'xfs_bmap -v /storage/loop/file1' show? Brian > [] ? mempool_alloc_slab+0x15/0x20 > [] xfs_iext_insert+0x59/0x110 [xfs] > [] ? xfs_bmap_add_extent_hole_delay+0xd8/0x740 [xfs] > [] xfs_bmap_add_extent_hole_delay+0xd8/0x740 [xfs] > [] ? mempool_alloc_slab+0x15/0x20 > [] ? mempool_alloc+0x65/0x180 > [] ? xfs_iext_get_ext+0x38/0x70 [xfs] > [] ? xfs_iext_bno_to_ext+0xed/0x150 [xfs] > [] xfs_bmapi_reserve_delalloc+0x225/0x250 [xfs] > [] xfs_bmapi_delay+0x13e/0x290 [xfs] > [] xfs_iomap_write_delay+0x17d/0x300 [xfs] > [] ? xfs_bmapi_read+0x114/0x330 [xfs] > [] __xfs_get_blocks+0x585/0xa90 [xfs] > [] ? __percpu_counter_add+0x63/0x80 > [] ? account_page_dirtied+0xed/0x1b0 > [] ? alloc_buffer_head+0x49/0x60 > [] ? alloc_page_buffers+0x60/0xb0 > [] ? create_empty_buffers+0x45/0xc0 > [] xfs_get_blocks+0x14/0x20 [xfs] > [] __block_write_begin+0x1c2/0x580 > [] ? xfs_get_blocks_direct+0x20/0x20 [xfs] > [] xfs_vm_write_begin+0x61/0xf0 [xfs] > [] generic_perform_write+0xd0/0x1f0 > [] xfs_file_buffered_aio_write+0xe1/0x240 [xfs] > [] ? bt_clear_tag+0xb2/0xd0 > [] xfs_file_write_iter+0x167/0x170 [xfs] > [] vfs_iter_write+0x76/0xa0 > [] lo_write_bvec+0x65/0x100 [loop] > [] loop_queue_work+0x689/0x924 [loop] > [] ? retint_kernel+0x10/0x10 > [] kthread_worker_fn+0x61/0x1c0 > [] ? flush_kthread_work+0x120/0x120 > [] ? flush_kthread_work+0x120/0x120 > [] kthread+0xd7/0xf0 > [] ? schedule_tail+0x1e/0xd0 > [] ? kthread_freezable_should_stop+0x80/0x80 > [] ret_from_fork+0x3f/0x70 > [] ? kthread_freezable_should_stop+0x80/0x80 > > So this seems that there are writes to the loop device being queued and > while being served XFS has to do some internal memory allocation to fit > the new data, however due to some *uknown* reason it fails and starts > looping in kmem_alloc. I didn't see any OOM reports so presumably the > server was not out of memory, but unfortunately I didn't check the > memory fragmentation, though I collected a crash dump in case you need > further info. > > The one thing which bugs me is that XFS tried to allocate 107 contiguous > kb which is page-order-26 isn't this waaaaay too big and almost never > satisfiable, despite direct/bg reclaim to be enabled? For now I've > reverted to using 3.12.52 kernel, where this issue hasn't been observed > (yet) any ideas would be much appreciated. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From n.borisov@siteground.com Wed Mar 23 07:56:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 28BDF7CB5 for ; Wed, 23 Mar 2016 07: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 DF942304059 for ; Wed, 23 Mar 2016 05:56:39 -0700 (PDT) X-ASG-Debug-ID: 1458737796-04cb6c059d17f620001-NocioJ Received: from mail-wm0-f52.google.com (mail-wm0-f52.google.com [74.125.82.52]) by cuda.sgi.com with ESMTP id 4TOSfk00bvPTf5Ua (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 23 Mar 2016 05:56:37 -0700 (PDT) X-Barracuda-Envelope-From: n.borisov@siteground.com X-Barracuda-Apparent-Source-IP: 74.125.82.52 Received: by mail-wm0-f52.google.com with SMTP id p65so22913571wmp.0 for ; Wed, 23 Mar 2016 05:56:37 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:subject:to:references:cc:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=B3Iw7qItfESVBsl6EdMAKTw7OQ3e4Z8KMtPUz9Owvf4=; b=IsPDRUGJtjG2ytq/xk5FTHQ9VFgo3d7FPA9drqh2z1ArStwp/k6g2B1FbSgDc8k4HO eWNtZ6bjGC+gpPm2dePs4rFFAAyqL+VdMieEHzvRPCVYZQZrbj1YWfQiyeh1D3yZFHTa 0aKnLz8+ZJJHOWlapfe6qXtz+qgsIsEbeYnMUBjag33go+xr5jBa2GrvtFlicVUGYwey l0pYwsmZs1skwJ6o09WL1vj72dnb9tZPd62Jco888APKfNicgR3gTE+/MNYL/OLUBZ41 EvFPIGlVVSKh2S7VRY5F3Ek90xubo4nJGePijtvpwKY06VegGdelaEpbaZsg77UHR/hJ ptNA== X-Gm-Message-State: AD7BkJIYgp+rBJsjq4yoYlJfR4B1NkMnHwceMFFwUG+YMM2iUjGQjTutjV8CsDt6kDcWpmkS X-Received: by 10.194.115.132 with SMTP id jo4mr3208758wjb.156.1458737787167; Wed, 23 Mar 2016 05:56:27 -0700 (PDT) Received: from localhost.localdomain (admins.1h.com. [82.118.240.130]) by smtp.gmail.com with ESMTPSA id z127sm22100480wme.5.2016.03.23.05.56.26 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 23 Mar 2016 05:56:26 -0700 (PDT) Subject: Re: Failing XFS memory allocation To: Brian Foster X-ASG-Orig-Subj: Re: Failing XFS memory allocation References: <56F26CCE.6010502@kyup.com> <20160323124312.GB43073@bfoster.bfoster> Cc: Dave Chinner , xfs@oss.sgi.com From: Nikolay Borisov Message-ID: <56F29279.70600@kyup.com> Date: Wed, 23 Mar 2016 14:56:25 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.1.0 MIME-Version: 1.0 In-Reply-To: <20160323124312.GB43073@bfoster.bfoster> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-wm0-f52.google.com[74.125.82.52] X-Barracuda-Start-Time: 1458737796 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28084 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 03/23/2016 02:43 PM, Brian Foster wrote: > On Wed, Mar 23, 2016 at 12:15:42PM +0200, Nikolay Borisov wrote: >> Hello, >> >> So I have an XFS filesystem which houses 2 2.3T sparse files, which are >> loop-mounted. Recently I migrated a server to a 4.4.6 kernel and this >> morning I observed the following in my dmesg: >> >> XFS: loop0(15174) possible memory allocation deadlock size 107168 in >> kmem_alloc (mode:0x2400240) >> > > Is there a stack trace associated with this message? > >> the mode is essentially (GFP_KERNEL | GFP_NOWARN) &= ~__GFP_FS. >> Here is the site of the loop file in case it matters: >> >> du -h --apparent-size /storage/loop/file1 >> 2.3T /storage/loop/file1 >> >> du -h /storage/loop/file1 >> 878G /storage/loop/file1 >> >> And this string is repeated multiple times. Looking at the output of >> "echo w > /proc/sysrq-trigger" I see the following suspicious entry: >> >> loop0 D ffff881fe081f038 0 15174 2 0x00000000 >> ffff881fe081f038 ffff883ff29fa700 ffff881fecb70d00 ffff88407fffae00 >> 0000000000000000 0000000502404240 ffffffff81e30d60 0000000000000000 >> 0000000000000000 ffff881f00000003 0000000000000282 ffff883f00000000 >> Call Trace: >> [] ? _raw_spin_lock_irqsave+0x21/0x60 >> [] schedule+0x47/0x90 >> [] schedule_timeout+0x113/0x1e0 >> [] ? lock_timer_base+0x80/0x80 >> [] io_schedule_timeout+0xa4/0x110 >> [] congestion_wait+0x7f/0x130 >> [] ? woken_wake_function+0x20/0x20 >> [] kmem_alloc+0x8c/0x120 [xfs] >> [] ? __kmalloc+0x121/0x250 >> [] kmem_realloc+0x33/0x80 [xfs] >> [] xfs_iext_realloc_indirect+0x3d/0x60 [xfs] >> [] xfs_iext_irec_new+0x3f/0xf0 [xfs] >> [] xfs_iext_add_indirect_multi+0x14d/0x210 [xfs] >> [] xfs_iext_add+0xc5/0x230 [xfs] > > It looks like it's working to add a new extent to the in-core extent > list. If this is the stack associated with the warning message (combined > with the large alloc size), I wonder if there's a fragmentation issue on > the file leading to an excessive number of extents. Yes this is the stack trace associated. > > What does 'xfs_bmap -v /storage/loop/file1' show? It spews a lot of stuff but here is a summary, more detailed info can be provided if you need it: xfs_bmap -v /storage/loop/file1 | wc -l 900908 xfs_bmap -v /storage/loop/file1 | grep -c hole 94568 Also, what would constitute an "excessive number of extents"? > > Brian > >> [] ? mempool_alloc_slab+0x15/0x20 >> [] xfs_iext_insert+0x59/0x110 [xfs] >> [] ? xfs_bmap_add_extent_hole_delay+0xd8/0x740 [xfs] >> [] xfs_bmap_add_extent_hole_delay+0xd8/0x740 [xfs] >> [] ? mempool_alloc_slab+0x15/0x20 >> [] ? mempool_alloc+0x65/0x180 >> [] ? xfs_iext_get_ext+0x38/0x70 [xfs] >> [] ? xfs_iext_bno_to_ext+0xed/0x150 [xfs] >> [] xfs_bmapi_reserve_delalloc+0x225/0x250 [xfs] >> [] xfs_bmapi_delay+0x13e/0x290 [xfs] >> [] xfs_iomap_write_delay+0x17d/0x300 [xfs] >> [] ? xfs_bmapi_read+0x114/0x330 [xfs] >> [] __xfs_get_blocks+0x585/0xa90 [xfs] >> [] ? __percpu_counter_add+0x63/0x80 >> [] ? account_page_dirtied+0xed/0x1b0 >> [] ? alloc_buffer_head+0x49/0x60 >> [] ? alloc_page_buffers+0x60/0xb0 >> [] ? create_empty_buffers+0x45/0xc0 >> [] xfs_get_blocks+0x14/0x20 [xfs] >> [] __block_write_begin+0x1c2/0x580 >> [] ? xfs_get_blocks_direct+0x20/0x20 [xfs] >> [] xfs_vm_write_begin+0x61/0xf0 [xfs] >> [] generic_perform_write+0xd0/0x1f0 >> [] xfs_file_buffered_aio_write+0xe1/0x240 [xfs] >> [] ? bt_clear_tag+0xb2/0xd0 >> [] xfs_file_write_iter+0x167/0x170 [xfs] >> [] vfs_iter_write+0x76/0xa0 >> [] lo_write_bvec+0x65/0x100 [loop] >> [] loop_queue_work+0x689/0x924 [loop] >> [] ? retint_kernel+0x10/0x10 >> [] kthread_worker_fn+0x61/0x1c0 >> [] ? flush_kthread_work+0x120/0x120 >> [] ? flush_kthread_work+0x120/0x120 >> [] kthread+0xd7/0xf0 >> [] ? schedule_tail+0x1e/0xd0 >> [] ? kthread_freezable_should_stop+0x80/0x80 >> [] ret_from_fork+0x3f/0x70 >> [] ? kthread_freezable_should_stop+0x80/0x80 >> >> So this seems that there are writes to the loop device being queued and >> while being served XFS has to do some internal memory allocation to fit >> the new data, however due to some *uknown* reason it fails and starts >> looping in kmem_alloc. I didn't see any OOM reports so presumably the >> server was not out of memory, but unfortunately I didn't check the >> memory fragmentation, though I collected a crash dump in case you need >> further info. >> >> The one thing which bugs me is that XFS tried to allocate 107 contiguous >> kb which is page-order-26 isn't this waaaaay too big and almost never >> satisfiable, despite direct/bg reclaim to be enabled? For now I've >> reverted to using 3.12.52 kernel, where this issue hasn't been observed >> (yet) any ideas would be much appreciated. >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Wed Mar 23 08:11:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D8A7F7CB1 for ; Wed, 23 Mar 2016 08:11:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3AB2EAC007 for ; Wed, 23 Mar 2016 06:11:06 -0700 (PDT) X-ASG-Debug-ID: 1458738661-04cb6c059e181060001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QRWf7GXHWUzJfhAx (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 23 Mar 2016 06:11:01 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id EBC5F3B709; Wed, 23 Mar 2016 13:11:00 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-6.bos.redhat.com [10.18.41.6]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2NDB0IZ014227; Wed, 23 Mar 2016 09:11:00 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 877CD1205DF; Wed, 23 Mar 2016 09:10:59 -0400 (EDT) Date: Wed, 23 Mar 2016 09:10:59 -0400 From: Brian Foster To: Nikolay Borisov Cc: xfs@oss.sgi.com Subject: Re: Failing XFS memory allocation Message-ID: <20160323131059.GC43073@bfoster.bfoster> X-ASG-Orig-Subj: Re: Failing XFS memory allocation References: <56F26CCE.6010502@kyup.com> <20160323124312.GB43073@bfoster.bfoster> <56F29279.70600@kyup.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56F29279.70600@kyup.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458738661 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Mar 23, 2016 at 02:56:25PM +0200, Nikolay Borisov wrote: > > > On 03/23/2016 02:43 PM, Brian Foster wrote: > > On Wed, Mar 23, 2016 at 12:15:42PM +0200, Nikolay Borisov wrote: ... > > It looks like it's working to add a new extent to the in-core extent > > list. If this is the stack associated with the warning message (combined > > with the large alloc size), I wonder if there's a fragmentation issue on > > the file leading to an excessive number of extents. > > Yes this is the stack trace associated. > > > > > What does 'xfs_bmap -v /storage/loop/file1' show? > > It spews a lot of stuff but here is a summary, more detailed info can be > provided if you need it: > > xfs_bmap -v /storage/loop/file1 | wc -l > 900908 > xfs_bmap -v /storage/loop/file1 | grep -c hole > 94568 > > Also, what would constitute an "excessive number of extents"? > I'm not sure where one would draw the line tbh, it's just a matter of having too many extents to the point that it causes problems in terms of performance (i.e., reading/modifying the extent list) or such as the allocation problem you're running into. As it is, XFS maintains the full extent list for an active inode in memory, so that's 800k+ extents that it's looking for memory for. It looks like that is your problem here. 800k or so extents over 878G looks to be about 1MB per extent. Are you using extent size hints? One option that might prevent this is to use a larger extent size hint value. Another might be to preallocate the entire file up front with fallocate. You'd probably have to experiment with what option or value works best for your workload. Brian > > > > Brian > > > >> [] ? mempool_alloc_slab+0x15/0x20 > >> [] xfs_iext_insert+0x59/0x110 [xfs] > >> [] ? xfs_bmap_add_extent_hole_delay+0xd8/0x740 [xfs] > >> [] xfs_bmap_add_extent_hole_delay+0xd8/0x740 [xfs] > >> [] ? mempool_alloc_slab+0x15/0x20 > >> [] ? mempool_alloc+0x65/0x180 > >> [] ? xfs_iext_get_ext+0x38/0x70 [xfs] > >> [] ? xfs_iext_bno_to_ext+0xed/0x150 [xfs] > >> [] xfs_bmapi_reserve_delalloc+0x225/0x250 [xfs] > >> [] xfs_bmapi_delay+0x13e/0x290 [xfs] > >> [] xfs_iomap_write_delay+0x17d/0x300 [xfs] > >> [] ? xfs_bmapi_read+0x114/0x330 [xfs] > >> [] __xfs_get_blocks+0x585/0xa90 [xfs] > >> [] ? __percpu_counter_add+0x63/0x80 > >> [] ? account_page_dirtied+0xed/0x1b0 > >> [] ? alloc_buffer_head+0x49/0x60 > >> [] ? alloc_page_buffers+0x60/0xb0 > >> [] ? create_empty_buffers+0x45/0xc0 > >> [] xfs_get_blocks+0x14/0x20 [xfs] > >> [] __block_write_begin+0x1c2/0x580 > >> [] ? xfs_get_blocks_direct+0x20/0x20 [xfs] > >> [] xfs_vm_write_begin+0x61/0xf0 [xfs] > >> [] generic_perform_write+0xd0/0x1f0 > >> [] xfs_file_buffered_aio_write+0xe1/0x240 [xfs] > >> [] ? bt_clear_tag+0xb2/0xd0 > >> [] xfs_file_write_iter+0x167/0x170 [xfs] > >> [] vfs_iter_write+0x76/0xa0 > >> [] lo_write_bvec+0x65/0x100 [loop] > >> [] loop_queue_work+0x689/0x924 [loop] > >> [] ? retint_kernel+0x10/0x10 > >> [] kthread_worker_fn+0x61/0x1c0 > >> [] ? flush_kthread_work+0x120/0x120 > >> [] ? flush_kthread_work+0x120/0x120 > >> [] kthread+0xd7/0xf0 > >> [] ? schedule_tail+0x1e/0xd0 > >> [] ? kthread_freezable_should_stop+0x80/0x80 > >> [] ret_from_fork+0x3f/0x70 > >> [] ? kthread_freezable_should_stop+0x80/0x80 > >> > >> So this seems that there are writes to the loop device being queued and > >> while being served XFS has to do some internal memory allocation to fit > >> the new data, however due to some *uknown* reason it fails and starts > >> looping in kmem_alloc. I didn't see any OOM reports so presumably the > >> server was not out of memory, but unfortunately I didn't check the > >> memory fragmentation, though I collected a crash dump in case you need > >> further info. > >> > >> The one thing which bugs me is that XFS tried to allocate 107 contiguous > >> kb which is page-order-26 isn't this waaaaay too big and almost never > >> satisfiable, despite direct/bg reclaim to be enabled? For now I've > >> reverted to using 3.12.52 kernel, where this issue hasn't been observed > >> (yet) any ideas would be much appreciated. > >> > >> _______________________________________________ > >> 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 s.priebe@profihost.ag Wed Mar 23 08:26:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3C77D7CB4 for ; Wed, 23 Mar 2016 08:26:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E7DD18F8035 for ; Wed, 23 Mar 2016 06:26:40 -0700 (PDT) X-ASG-Debug-ID: 1458739595-04bdf07eac215a60001-NocioJ Received: from mail-ph.de-nserver.de (mail-ph.de-nserver.de [85.158.179.214]) by cuda.sgi.com with ESMTP id gbjTalBxi1NFmWHq (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 23 Mar 2016 06:26:36 -0700 (PDT) X-Barracuda-Envelope-From: s.priebe@profihost.ag X-Barracuda-Apparent-Source-IP: 85.158.179.214 Received: (qmail 30049 invoked from network); 23 Mar 2016 14:26:35 +0100 X-Fcrdns: No Received: from phoffice.de-nserver.de (HELO [10.11.11.93]) (185.39.223.5) (smtp-auth username hostmaster@profihost.com, mechanism plain) by mail-ph.de-nserver.de (qpsmtpd/0.92) with (ECDHE-RSA-AES256-SHA encrypted) ESMTPSA; Wed, 23 Mar 2016 14:26:35 +0100 Subject: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage To: Dave Chinner , Brian Foster X-ASG-Orig-Subj: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage References: <56C81D94.7090603@profihost.ag> <20160220144533.GA36182@bfoster.bfoster> <56D9D834.2000303@profihost.ag> <20160304191329.GC3758@bfoster.bfoster> <56D9E9BE.40101@profihost.ag> <20160304210341.GA8035@bfoster.bfoster> <20160305224845.GR30721@dastard> Cc: linux-fsdevel@vger.kernel.org, "xfs-masters@oss.sgi.com" , "xfs@oss.sgi.com" From: Stefan Priebe - Profihost AG Message-ID: <56F2998A.30005@profihost.ag> Date: Wed, 23 Mar 2016 14:26:34 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 MIME-Version: 1.0 In-Reply-To: <20160305224845.GR30721@dastard> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-User-Auth: Auth by hostmaster@profihost.com through 185.39.223.5 X-Barracuda-Connect: mail-ph.de-nserver.de[85.158.179.214] X-Barracuda-Start-Time: 1458739596 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28085 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Am 05.03.2016 um 23:48 schrieb Dave Chinner: > On Fri, Mar 04, 2016 at 04:03:42PM -0500, Brian Foster wrote: >> On Fri, Mar 04, 2016 at 09:02:06PM +0100, Stefan Priebe wrote: >>> Am 04.03.2016 um 20:13 schrieb Brian Foster: >>>> On Fri, Mar 04, 2016 at 07:47:16PM +0100, Stefan Priebe wrote: >>>>> Am 20.02.2016 um 19:02 schrieb Stefan Priebe - Profihost AG: >>>>>> >>>>>>> Am 20.02.2016 um 15:45 schrieb Brian Foster : >>>>>>> >>>>>>>> On Sat, Feb 20, 2016 at 09:02:28AM +0100, Stefan Priebe wrote: >>>>>>>> Hi, >>>>>>>> >>>>>>>> got this one today. Not sure if this is a bug. >>>>>>> >>>>>>> That looks like the releasepage() delayed allocation block warning. I'm >>>>>>> not sure we've had any fixes for (or reports of) that issue since the >>>>>>> v4.2 timeframe. >>>>>>> >>>>>>> What is the xfs_info of the associated filesystem? Also, do you have any >>>>>>> insight as to the possible reproducer application or workload? Is this >>>>>>> reproducible at all? Note that this is a WARN_ON_ONCE(), so the warning >>>>>>> won't fire again regardless until after a reboot. >>>>> >>>>> Toda i got this one running 4.3.3. >>>>> >>>>> [154152.949610] ------------[ cut here ]------------ >>>>> [154152.950704] WARNING: CPU: 0 PID: 79 at fs/xfs/xfs_aops.c:1232 >>>>> xfs_vm_releasepage+0xc3/0xf0() >>>>> [154152.952596] Modules linked in: netconsole mpt3sas raid_class >>>>> nf_conntrack_ipv4 nf_defrag_ipv4 xt_state nf_conntrack xt_tcpudp ipt_REJECT >>>>> nf_reject_ipv4 xt_owner xt_multiport iptable_filter ip_tables x_tables 8021q >>>>> garp coretemp k8temp ehci_pci ehci_hcd sb_edac ipmi_si usbcore edac_core >>>>> ipmi_msghandler i2c_i801 usb_common button btrfs xor raid6_pq sg igb sd_mod >>>>> i2c_algo_bit isci i2c_core libsas ahci ptp libahci scsi_transport_sas >>>>> megaraid_sas pps_core >>>>> [154152.963240] CPU: 0 PID: 79 Comm: kswapd0 Not tainted 4.4.3+3-ph #1 >>>>> [154152.964625] Hardware name: Supermicro >>>>> X9SRE/X9SRE-3F/X9SRi/X9SRi-3F/X9SRE/X9SRE-3F/X9SRi/X9SRi-3F, BIOS 1.0a >>>>> 03/06/2012 >>>>> [154152.967029] 0000000000000000 ffff88103dd67a98 ffffffffa73c3b5f >>>>> 0000000000000000 >>>>> [154152.968836] ffffffffa7a5063b ffff88103dd67ad8 ffffffffa7083757 >>>>> 0000000000000000 >>>>> [154152.970641] 0000000000000001 ffffea0001e7bfc0 ffff88071ef72dd0 >>>>> ffffea0001e7bfe0 >>>>> [154152.972447] Call Trace: >>>>> [154152.973011] [] dump_stack+0x63/0x84 >>>>> [154152.974167] [] warn_slowpath_common+0x97/0xe0 >>>>> [154152.975515] [] warn_slowpath_null+0x1a/0x20 >>>>> [154152.976826] [] xfs_vm_releasepage+0xc3/0xf0 >>>>> [154152.978137] [] try_to_release_page+0x32/0x50 >>>>> [154152.979467] [] shrink_active_list+0x3ce/0x3e0 >>>>> [154152.980816] [] shrink_lruvec+0x687/0x7d0 >>>>> [154152.982068] [] shrink_zone+0xdc/0x2c0 >>>>> [154152.983262] [] kswapd+0x4f9/0x970 >>>>> [154152.984380] [] ? Mit freundlichen Grüßen Stefan Priebe Bachelor of Science in Computer Science (BSCS) Vorstand (CTO) ------------------------------- Profihost AG Expo Plaza 1 30539 Hannover Deutschland Tel.: +49 (511) 5151 8181 | Fax.: +49 (511) 5151 8282 URL: http://www.profihost.com | E-Mail: info@profihost.com Sitz der Gesellschaft: Hannover, USt-IdNr. DE813460827 Registergericht: Amtsgericht Hannover, Register-Nr.: HRB 202350 Vorstand: Cristoph Bluhm, Sebastian Bluhm, Stefan Priebe Aufsichtsrat: Prof. Dr. iur. Winfried Huck (Vorsitzender) >>>>> mem_cgroup_shrink_node_zone+0x1a0/0x1a0 >>>>> [154152.985942] [] kthread+0xc9/0xe0 >>>>> [154152.987040] [] ? kthread_stop+0x100/0x100 >>>>> [154152.988313] [] ret_from_fork+0x3f/0x70 >>>>> [154152.989527] [] ? kthread_stop+0x100/0x100 >>>>> [154152.990818] ---[ end trace 3fac2515e92c7cb1 ]--- >>>>> >>>>> This time with an xfs info: >>>>> # xfs_info / >>>>> meta-data=/dev/disk/by-uuid/9befe321-e9cc-4e31-82df-efabb3211bac isize=256 >>>>> agcount=4, agsize=58224256 blks >>>>> = sectsz=512 attr=2, projid32bit=0 >>>>> = crc=0 finobt=0 >>>>> data = bsize=4096 blocks=232897024, imaxpct=25 >>>>> = sunit=64 swidth=384 blks >>>>> naming =version 2 bsize=4096 ascii-ci=0 ftype=0 >>>>> log =internal bsize=4096 blocks=113728, version=2 >>>>> = sectsz=512 sunit=64 blks, lazy-count=1 >>>>> realtime =none extsz=4096 blocks=0, rtextents=0 >>>>> >>>> >>>> Can you describe the workload to the filesystem? >>> >>> At the time of this trace the rsync backup of the fs has started. So the >>> workload was going from nearly idle to 4000 iop/s read at 60 MB/s peak. >>> >> >> Interesting. The warning is associated with releasing a page that has a >> delayed allocation when it shouldn't. That means something had written >> to a file to cause the delalloc in the first place. Any idea what could >> have been writing at the time or shortly before the rsync read workload >> had kicked in? > > It's memory reclaim that tripped over it, so the cause is long gone > - couple have been anything in the previous 24 hours that caused the > issue. i.e. rsync has triggered memory reclaim which triggered the > warning, but I don't think rsync has anything to do with causing the > page to be in a state that caused the warning. > > I'd be interested to know if there are any other warnings in the > logs - stuff like IO errors, page discards, ENOSPC issues, etc that > could trigger less travelled write error paths... This has happened again on 8 different hosts in the last 24 hours running 4.4.6. All of those are KVM / Qemu hosts and are doing NO I/O except the normal OS stuff as the VMs have remote storage. So no database, no rsync on those hosts - just the OS doing nearly nothing. All those show: [153360.287040] WARNING: CPU: 0 PID: 109 at fs/xfs/xfs_aops.c:1234 xfs_vm_releasepage+0xe2/0xf0() Stefan > > -Dave. > From s.priebe@profihost.ag Wed Mar 23 08:28:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1D02B7CC7 for ; Wed, 23 Mar 2016 08:28:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A327BAC007 for ; Wed, 23 Mar 2016 06:28:08 -0700 (PDT) X-ASG-Debug-ID: 1458739684-04bdf07eaa215e20001-NocioJ Received: from mail-ph.de-nserver.de (mail-ph.de-nserver.de [85.158.179.214]) by cuda.sgi.com with ESMTP id YprHEV0BtDHwgn9l (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 23 Mar 2016 06:28:05 -0700 (PDT) X-Barracuda-Envelope-From: s.priebe@profihost.ag X-Barracuda-Apparent-Source-IP: 85.158.179.214 Received: (qmail 30303 invoked from network); 23 Mar 2016 14:28:04 +0100 X-Fcrdns: No Received: from phoffice.de-nserver.de (HELO [10.11.11.93]) (185.39.223.5) (smtp-auth username hostmaster@profihost.com, mechanism plain) by mail-ph.de-nserver.de (qpsmtpd/0.92) with (ECDHE-RSA-AES256-SHA encrypted) ESMTPSA; Wed, 23 Mar 2016 14:28:04 +0100 From: Stefan Priebe - Profihost AG Subject: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage To: Dave Chinner , Brian Foster X-ASG-Orig-Subj: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage References: <56C81D94.7090603@profihost.ag> <20160220144533.GA36182@bfoster.bfoster> <56D9D834.2000303@profihost.ag> <20160304191329.GC3758@bfoster.bfoster> <56D9E9BE.40101@profihost.ag> <20160304210341.GA8035@bfoster.bfoster> <20160305224845.GR30721@dastard> Cc: linux-fsdevel@vger.kernel.org, "xfs-masters@oss.sgi.com" , "xfs@oss.sgi.com" Message-ID: <56F299E3.4020703@profihost.ag> Date: Wed, 23 Mar 2016 14:28:03 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 MIME-Version: 1.0 In-Reply-To: <20160305224845.GR30721@dastard> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-User-Auth: Auth by hostmaster@profihost.com through 185.39.223.5 X-Barracuda-Connect: mail-ph.de-nserver.de[85.158.179.214] X-Barracuda-Start-Time: 1458739685 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28085 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header sorry new one the last one got mangled. Comments inside. Am 05.03.2016 um 23:48 schrieb Dave Chinner: > On Fri, Mar 04, 2016 at 04:03:42PM -0500, Brian Foster wrote: >> On Fri, Mar 04, 2016 at 09:02:06PM +0100, Stefan Priebe wrote: >>> Am 04.03.2016 um 20:13 schrieb Brian Foster: >>>> On Fri, Mar 04, 2016 at 07:47:16PM +0100, Stefan Priebe wrote: >>>>> Am 20.02.2016 um 19:02 schrieb Stefan Priebe - Profihost AG: >>>>>> >>>>>>> Am 20.02.2016 um 15:45 schrieb Brian Foster : >>>>>>> >>>>>>>> On Sat, Feb 20, 2016 at 09:02:28AM +0100, Stefan Priebe wrote: >>>>>>>> Hi, >>>>>>>> >>>>>>>> got this one today. Not sure if this is a bug. >>>>>>> >>>>>>> That looks like the releasepage() delayed allocation block warning. I'm >>>>>>> not sure we've had any fixes for (or reports of) that issue since the >>>>>>> v4.2 timeframe. >>>>>>> >>>>>>> What is the xfs_info of the associated filesystem? Also, do you have any >>>>>>> insight as to the possible reproducer application or workload? Is this >>>>>>> reproducible at all? Note that this is a WARN_ON_ONCE(), so the warning >>>>>>> won't fire again regardless until after a reboot. >>>>> >>>>> Toda i got this one running 4.3.3. >>>>> >>>>> [154152.949610] ------------[ cut here ]------------ >>>>> [154152.950704] WARNING: CPU: 0 PID: 79 at fs/xfs/xfs_aops.c:1232 >>>>> xfs_vm_releasepage+0xc3/0xf0() >>>>> [154152.952596] Modules linked in: netconsole mpt3sas raid_class >>>>> nf_conntrack_ipv4 nf_defrag_ipv4 xt_state nf_conntrack xt_tcpudp ipt_REJECT >>>>> nf_reject_ipv4 xt_owner xt_multiport iptable_filter ip_tables x_tables 8021q >>>>> garp coretemp k8temp ehci_pci ehci_hcd sb_edac ipmi_si usbcore edac_core >>>>> ipmi_msghandler i2c_i801 usb_common button btrfs xor raid6_pq sg igb sd_mod >>>>> i2c_algo_bit isci i2c_core libsas ahci ptp libahci scsi_transport_sas >>>>> megaraid_sas pps_core >>>>> [154152.963240] CPU: 0 PID: 79 Comm: kswapd0 Not tainted 4.4.3+3-ph #1 >>>>> [154152.964625] Hardware name: Supermicro >>>>> X9SRE/X9SRE-3F/X9SRi/X9SRi-3F/X9SRE/X9SRE-3F/X9SRi/X9SRi-3F, BIOS 1.0a >>>>> 03/06/2012 >>>>> [154152.967029] 0000000000000000 ffff88103dd67a98 ffffffffa73c3b5f >>>>> 0000000000000000 >>>>> [154152.968836] ffffffffa7a5063b ffff88103dd67ad8 ffffffffa7083757 >>>>> 0000000000000000 >>>>> [154152.970641] 0000000000000001 ffffea0001e7bfc0 ffff88071ef72dd0 >>>>> ffffea0001e7bfe0 >>>>> [154152.972447] Call Trace: >>>>> [154152.973011] [] dump_stack+0x63/0x84 >>>>> [154152.974167] [] warn_slowpath_common+0x97/0xe0 >>>>> [154152.975515] [] warn_slowpath_null+0x1a/0x20 >>>>> [154152.976826] [] xfs_vm_releasepage+0xc3/0xf0 >>>>> [154152.978137] [] try_to_release_page+0x32/0x50 >>>>> [154152.979467] [] shrink_active_list+0x3ce/0x3e0 >>>>> [154152.980816] [] shrink_lruvec+0x687/0x7d0 >>>>> [154152.982068] [] shrink_zone+0xdc/0x2c0 >>>>> [154152.983262] [] kswapd+0x4f9/0x970 >>>>> [154152.984380] [] ? >>>>> mem_cgroup_shrink_node_zone+0x1a0/0x1a0 >>>>> [154152.985942] [] kthread+0xc9/0xe0 >>>>> [154152.987040] [] ? kthread_stop+0x100/0x100 >>>>> [154152.988313] [] ret_from_fork+0x3f/0x70 >>>>> [154152.989527] [] ? kthread_stop+0x100/0x100 >>>>> [154152.990818] ---[ end trace 3fac2515e92c7cb1 ]--- >>>>> >>>>> This time with an xfs info: >>>>> # xfs_info / >>>>> meta-data=/dev/disk/by-uuid/9befe321-e9cc-4e31-82df-efabb3211bac isize=256 >>>>> agcount=4, agsize=58224256 blks >>>>> = sectsz=512 attr=2, projid32bit=0 >>>>> = crc=0 finobt=0 >>>>> data = bsize=4096 blocks=232897024, imaxpct=25 >>>>> = sunit=64 swidth=384 blks >>>>> naming =version 2 bsize=4096 ascii-ci=0 ftype=0 >>>>> log =internal bsize=4096 blocks=113728, version=2 >>>>> = sectsz=512 sunit=64 blks, lazy-count=1 >>>>> realtime =none extsz=4096 blocks=0, rtextents=0 >>>>> >>>> >>>> Can you describe the workload to the filesystem? >>> >>> At the time of this trace the rsync backup of the fs has started. So the >>> workload was going from nearly idle to 4000 iop/s read at 60 MB/s peak. >>> >> >> Interesting. The warning is associated with releasing a page that has a >> delayed allocation when it shouldn't. That means something had written >> to a file to cause the delalloc in the first place. Any idea what could >> have been writing at the time or shortly before the rsync read workload >> had kicked in? > > It's memory reclaim that tripped over it, so the cause is long gone > - couple have been anything in the previous 24 hours that caused the > issue. i.e. rsync has triggered memory reclaim which triggered the > warning, but I don't think rsync has anything to do with causing the > page to be in a state that caused the warning. > > I'd be interested to know if there are any other warnings in the > logs - stuff like IO errors, page discards, ENOSPC issues, etc that > could trigger less travelled write error paths... This has happened again on 8 different hosts in the last 24 hours running 4.4.6. All of those are KVM / Qemu hosts and are doing NO I/O except the normal OS stuff as the VMs have remote storage. So no database, no rsync on those hosts - just the OS doing nearly nothing. All those show: [153360.287040] WARNING: CPU: 0 PID: 109 at fs/xfs/xfs_aops.c:1234 xfs_vm_releasepage+0xe2/0xf0() Stefan > > -Dave. > From BATV+84ff5ada7f8efdc46ff8+4595+infradead.org+hch@casper.srs.infradead.org Wed Mar 23 08:47:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 307A57CCC for ; Wed, 23 Mar 2016 08:47:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E8B078F8035 for ; Wed, 23 Mar 2016 06:47:48 -0700 (PDT) X-ASG-Debug-ID: 1458740838-04cb6c05a0192680001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id eMjy0FeNy2cdDlWJ (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 23 Mar 2016 06:47:19 -0700 (PDT) X-Barracuda-Envelope-From: BATV+84ff5ada7f8efdc46ff8+4595+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85 #2 (Red Hat Linux)) id 1aij81-00011U-OG for xfs@oss.sgi.com; Wed, 23 Mar 2016 13:47:17 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH] xfs: improve kmem_realloc Date: Wed, 23 Mar 2016 14:47:16 +0100 X-ASG-Orig-Subj: [PATCH] xfs: improve kmem_realloc Message-Id: <1458740836-31211-1-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1458740839 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28085 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Use krealloc to implement our realloc function. This helps to avoid new allocations if we are still in the slab bucket. At least for the bmap btree root that's actually the common case. This also allows removing the now unused oldsize argument. Signed-off-by: Christoph Hellwig --- fs/xfs/kmem.c | 26 +++++++++++++++----------- fs/xfs/kmem.h | 2 +- fs/xfs/libxfs/xfs_inode_fork.c | 10 +++------- fs/xfs/xfs_log_recover.c | 2 +- fs/xfs/xfs_mount.c | 1 - 5 files changed, 20 insertions(+), 21 deletions(-) diff --git a/fs/xfs/kmem.c b/fs/xfs/kmem.c index 686ba6f..339c696 100644 --- a/fs/xfs/kmem.c +++ b/fs/xfs/kmem.c @@ -93,19 +93,23 @@ kmem_zalloc_large(size_t size, xfs_km_flags_t flags) } void * -kmem_realloc(const void *ptr, size_t newsize, size_t oldsize, - xfs_km_flags_t flags) +kmem_realloc(const void *old, size_t newsize, xfs_km_flags_t flags) { - void *new; + int retries = 0; + gfp_t lflags = kmem_flags_convert(flags); + void *ptr; - new = kmem_alloc(newsize, flags); - if (ptr) { - if (new) - memcpy(new, ptr, - ((oldsize < newsize) ? oldsize : newsize)); - kmem_free(ptr); - } - return new; + do { + ptr = krealloc(old, newsize, lflags); + if (ptr || (flags & (KM_MAYFAIL|KM_NOSLEEP))) + return ptr; + if (!(++retries % 100)) + xfs_err(NULL, + "%s(%u) possible memory allocation deadlock size %zu in %s (mode:0x%x)", + current->comm, current->pid, + newsize, __func__, lflags); + congestion_wait(BLK_RW_ASYNC, HZ/50); + } while (1); } void * diff --git a/fs/xfs/kmem.h b/fs/xfs/kmem.h index d1c66e4..689f746 100644 --- a/fs/xfs/kmem.h +++ b/fs/xfs/kmem.h @@ -62,7 +62,7 @@ kmem_flags_convert(xfs_km_flags_t flags) extern void *kmem_alloc(size_t, xfs_km_flags_t); extern void *kmem_zalloc_large(size_t size, xfs_km_flags_t); -extern void *kmem_realloc(const void *, size_t, size_t, xfs_km_flags_t); +extern void *kmem_realloc(const void *, size_t, xfs_km_flags_t); static inline void kmem_free(const void *ptr) { kvfree(ptr); diff --git a/fs/xfs/libxfs/xfs_inode_fork.c b/fs/xfs/libxfs/xfs_inode_fork.c index 4fbe226..d3d1477 100644 --- a/fs/xfs/libxfs/xfs_inode_fork.c +++ b/fs/xfs/libxfs/xfs_inode_fork.c @@ -542,7 +542,6 @@ xfs_iroot_realloc( new_max = cur_max + rec_diff; new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, new_max); ifp->if_broot = kmem_realloc(ifp->if_broot, new_size, - XFS_BMAP_BROOT_SPACE_CALC(mp, cur_max), KM_SLEEP | KM_NOFS); op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, ifp->if_broot_bytes); @@ -686,7 +685,6 @@ xfs_idata_realloc( ifp->if_u1.if_data = kmem_realloc(ifp->if_u1.if_data, real_size, - ifp->if_real_bytes, KM_SLEEP | KM_NOFS); } } else { @@ -1402,8 +1400,7 @@ xfs_iext_realloc_direct( if (rnew_size != ifp->if_real_bytes) { ifp->if_u1.if_extents = kmem_realloc(ifp->if_u1.if_extents, - rnew_size, - ifp->if_real_bytes, KM_NOFS); + rnew_size, KM_NOFS); } if (rnew_size > ifp->if_real_bytes) { memset(&ifp->if_u1.if_extents[ifp->if_bytes / @@ -1487,9 +1484,8 @@ xfs_iext_realloc_indirect( if (new_size == 0) { xfs_iext_destroy(ifp); } else { - ifp->if_u1.if_ext_irec = (xfs_ext_irec_t *) - kmem_realloc(ifp->if_u1.if_ext_irec, - new_size, size, KM_NOFS); + ifp->if_u1.if_ext_irec = + kmem_realloc(ifp->if_u1.if_ext_irec, new_size, KM_NOFS); } } diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 396565f..bf6e807 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3843,7 +3843,7 @@ xlog_recover_add_to_cont_trans( 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); + ptr = kmem_realloc(old_ptr, 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; diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 536a0ee..654799f 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -89,7 +89,6 @@ xfs_uuid_mount( if (hole < 0) { xfs_uuid_table = kmem_realloc(xfs_uuid_table, (xfs_uuid_table_size + 1) * sizeof(*xfs_uuid_table), - xfs_uuid_table_size * sizeof(*xfs_uuid_table), KM_SLEEP); hole = xfs_uuid_table_size++; } -- 2.1.4 From BATV+84ff5ada7f8efdc46ff8+4595+infradead.org+hch@casper.srs.infradead.org Wed Mar 23 08:49:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2272F7CCC for ; Wed, 23 Mar 2016 08:49:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 98610AC005 for ; Wed, 23 Mar 2016 06:48:59 -0700 (PDT) X-ASG-Debug-ID: 1458740936-04cb6c059e192bd0001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id 4zXq6G0CYGhBkL9e (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 23 Mar 2016 06:48:57 -0700 (PDT) X-Barracuda-Envelope-From: BATV+84ff5ada7f8efdc46ff8+4595+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85 #2 (Red Hat Linux)) id 1aij9c-00013l-BA for xfs@oss.sgi.com; Wed, 23 Mar 2016 13:48:56 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: support RCU lookups for inline symlinks Date: Wed, 23 Mar 2016 14:48:51 +0100 X-ASG-Orig-Subj: support RCU lookups for inline symlinks Message-Id: <1458740935-31260-1-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1458740937 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28085 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Return the inline link body in the inode to support RCU mode lookups. From BATV+84ff5ada7f8efdc46ff8+4595+infradead.org+hch@casper.srs.infradead.org Wed Mar 23 08:49:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AC7CB7CCC for ; Wed, 23 Mar 2016 08:49:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1FB75AC007 for ; Wed, 23 Mar 2016 06:49:00 -0700 (PDT) X-ASG-Debug-ID: 1458740937-04cb6c059d192be0001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id AzNNy0AMFIFR3QTg (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 23 Mar 2016 06:48:58 -0700 (PDT) X-Barracuda-Envelope-From: BATV+84ff5ada7f8efdc46ff8+4595+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85 #2 (Red Hat Linux)) id 1aij9d-00013p-18 for xfs@oss.sgi.com; Wed, 23 Mar 2016 13:48:57 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 1/4] xfs: factor out a helper to initialize a local format inode fork Date: Wed, 23 Mar 2016 14:48:52 +0100 X-ASG-Orig-Subj: [PATCH 1/4] xfs: factor out a helper to initialize a local format inode fork Message-Id: <1458740935-31260-2-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1458740935-31260-1-git-send-email-hch@lst.de> References: <1458740935-31260-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1458740937 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28085 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Christoph Hellwig --- fs/xfs/libxfs/xfs_dir2_sf.c | 9 +++----- fs/xfs/libxfs/xfs_inode_fork.c | 48 ++++++++++++++++++++++++++---------------- fs/xfs/libxfs/xfs_inode_fork.h | 1 + fs/xfs/xfs_symlink.c | 12 ++--------- 4 files changed, 36 insertions(+), 34 deletions(-) diff --git a/fs/xfs/libxfs/xfs_dir2_sf.c b/fs/xfs/libxfs/xfs_dir2_sf.c index 974d62e..e5bb9cc 100644 --- a/fs/xfs/libxfs/xfs_dir2_sf.c +++ b/fs/xfs/libxfs/xfs_dir2_sf.c @@ -257,15 +257,12 @@ xfs_dir2_block_to_sf( * * Convert the inode to local format and copy the data in. */ - dp->i_df.if_flags &= ~XFS_IFEXTENTS; - dp->i_df.if_flags |= XFS_IFINLINE; - dp->i_d.di_format = XFS_DINODE_FMT_LOCAL; ASSERT(dp->i_df.if_bytes == 0); - xfs_idata_realloc(dp, size, XFS_DATA_FORK); + xfs_init_local_fork(dp, XFS_DATA_FORK, dst, size); + dp->i_d.di_format = XFS_DINODE_FMT_LOCAL; + dp->i_d.di_size = size; logflags |= XFS_ILOG_DDATA; - memcpy(dp->i_df.if_u1.if_data, dst, size); - dp->i_d.di_size = size; xfs_dir2_sf_check(args); out: xfs_trans_log_inode(args->trans, dp, logflags); diff --git a/fs/xfs/libxfs/xfs_inode_fork.c b/fs/xfs/libxfs/xfs_inode_fork.c index 11faf7d..86a97f8 100644 --- a/fs/xfs/libxfs/xfs_inode_fork.c +++ b/fs/xfs/libxfs/xfs_inode_fork.c @@ -231,6 +231,34 @@ xfs_iformat_fork( return error; } +void +xfs_init_local_fork( + struct xfs_inode *ip, + int whichfork, + const void *data, + int size) +{ + struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, whichfork); + int real_size = 0; + + if (size == 0) + ifp->if_u1.if_data = NULL; + else if (size <= sizeof(ifp->if_u2.if_inline_data)) + ifp->if_u1.if_data = ifp->if_u2.if_inline_data; + else { + real_size = roundup(size, 4); + ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP | KM_NOFS); + } + + if (size) + memcpy(ifp->if_u1.if_data, data, size); + + ifp->if_bytes = size; + ifp->if_real_bytes = real_size; + ifp->if_flags &= ~(XFS_IFEXTENTS | XFS_IFBROOT); + ifp->if_flags |= XFS_IFINLINE; +} + /* * The file is in-lined in the on-disk inode. * If it fits into if_inline_data, then copy @@ -248,8 +276,6 @@ xfs_iformat_local( int whichfork, int size) { - xfs_ifork_t *ifp; - int real_size; /* * If the size is unreasonable, then something @@ -265,22 +291,8 @@ xfs_iformat_local( ip->i_mount, dip); return -EFSCORRUPTED; } - ifp = XFS_IFORK_PTR(ip, whichfork); - real_size = 0; - if (size == 0) - ifp->if_u1.if_data = NULL; - else if (size <= sizeof(ifp->if_u2.if_inline_data)) - ifp->if_u1.if_data = ifp->if_u2.if_inline_data; - else { - real_size = roundup(size, 4); - ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP | KM_NOFS); - } - ifp->if_bytes = size; - ifp->if_real_bytes = real_size; - if (size) - memcpy(ifp->if_u1.if_data, XFS_DFORK_PTR(dip, whichfork), size); - ifp->if_flags &= ~XFS_IFEXTENTS; - ifp->if_flags |= XFS_IFINLINE; + + xfs_init_local_fork(ip, whichfork, XFS_DFORK_PTR(dip, whichfork), size); return 0; } diff --git a/fs/xfs/libxfs/xfs_inode_fork.h b/fs/xfs/libxfs/xfs_inode_fork.h index 7d3b1ed..f95e072 100644 --- a/fs/xfs/libxfs/xfs_inode_fork.h +++ b/fs/xfs/libxfs/xfs_inode_fork.h @@ -134,6 +134,7 @@ void xfs_iroot_realloc(struct xfs_inode *, int, int); int xfs_iread_extents(struct xfs_trans *, struct xfs_inode *, int); int xfs_iextents_copy(struct xfs_inode *, struct xfs_bmbt_rec *, int); +void xfs_init_local_fork(struct xfs_inode *, int, const void *, int); struct xfs_bmbt_rec_host * xfs_iext_get_ext(struct xfs_ifork *, xfs_extnum_t); diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index b44284c..b69f4a7 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c @@ -302,19 +302,11 @@ xfs_symlink( * If the symlink will fit into the inode, write it inline. */ if (pathlen <= XFS_IFORK_DSIZE(ip)) { - xfs_idata_realloc(ip, pathlen, XFS_DATA_FORK); - memcpy(ip->i_df.if_u1.if_data, target_path, pathlen); - ip->i_d.di_size = pathlen; - - /* - * The inode was initially created in extent format. - */ - ip->i_df.if_flags &= ~(XFS_IFEXTENTS | XFS_IFBROOT); - ip->i_df.if_flags |= XFS_IFINLINE; + xfs_init_local_fork(ip, XFS_DATA_FORK, target_path, pathlen); + ip->i_d.di_size = pathlen; ip->i_d.di_format = XFS_DINODE_FMT_LOCAL; xfs_trans_log_inode(tp, ip, XFS_ILOG_DDATA | XFS_ILOG_CORE); - } else { int offset; -- 2.1.4 From BATV+84ff5ada7f8efdc46ff8+4595+infradead.org+hch@casper.srs.infradead.org Wed Mar 23 08:49:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C8F977CD6 for ; Wed, 23 Mar 2016 08:49:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8CB008F8037 for ; Wed, 23 Mar 2016 06:49:01 -0700 (PDT) X-ASG-Debug-ID: 1458740938-04cbb04da71b5810001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id JJ8kR9isO8UvGrFF (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 23 Mar 2016 06:48:59 -0700 (PDT) X-Barracuda-Envelope-From: BATV+84ff5ada7f8efdc46ff8+4595+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85 #2 (Red Hat Linux)) id 1aij9e-00013z-B6 for xfs@oss.sgi.com; Wed, 23 Mar 2016 13:48:58 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 3/4] xfs: use ->readlink to implement the readlink_by_handle ioctl Date: Wed, 23 Mar 2016 14:48:54 +0100 X-ASG-Orig-Subj: [PATCH 3/4] xfs: use ->readlink to implement the readlink_by_handle ioctl Message-Id: <1458740935-31260-4-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1458740935-31260-1-git-send-email-hch@lst.de> References: <1458740935-31260-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1458740939 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28085 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Also drop the now unused readlink_copy export. Signed-off-by: Christoph Hellwig --- fs/namei.c | 1 - fs/xfs/xfs_ioctl.c | 18 ++---------------- 2 files changed, 2 insertions(+), 17 deletions(-) diff --git a/fs/namei.c b/fs/namei.c index f624d13..33b02dd 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -4554,7 +4554,6 @@ int readlink_copy(char __user *buffer, int buflen, const char *link) out: return len; } -EXPORT_SYMBOL(readlink_copy); /* * A helper for ->readlink(). This should be used *ONLY* for symlinks that diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index bcb6c19..68569b8 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -277,7 +277,6 @@ xfs_readlink_by_handle( { struct dentry *dentry; __u32 olen; - void *link; int error; if (!capable(CAP_SYS_ADMIN)) @@ -288,7 +287,7 @@ xfs_readlink_by_handle( return PTR_ERR(dentry); /* Restrict this handle operation to symlinks only. */ - if (!d_is_symlink(dentry)) { + if (!dentry->d_inode->i_op->readlink) { error = -EINVAL; goto out_dput; } @@ -298,21 +297,8 @@ xfs_readlink_by_handle( goto out_dput; } - link = kmalloc(MAXPATHLEN+1, GFP_KERNEL); - if (!link) { - error = -ENOMEM; - goto out_dput; - } - - error = xfs_readlink(XFS_I(d_inode(dentry)), link); - if (error) - goto out_kfree; - error = readlink_copy(hreq->ohandle, olen, link); - if (error) - goto out_kfree; + error = dentry->d_inode->i_op->readlink(dentry, hreq->ohandle, olen); - out_kfree: - kfree(link); out_dput: dput(dentry); return error; -- 2.1.4 From BATV+84ff5ada7f8efdc46ff8+4595+infradead.org+hch@casper.srs.infradead.org Wed Mar 23 08:49:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8C6F77CD6 for ; Wed, 23 Mar 2016 08:49:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 603E68F8039 for ; Wed, 23 Mar 2016 06:49:02 -0700 (PDT) X-ASG-Debug-ID: 1458740939-04cb6c059f192c00001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id Cbqq1OSRhGF5ZxNk (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 23 Mar 2016 06:49:00 -0700 (PDT) X-Barracuda-Envelope-From: BATV+84ff5ada7f8efdc46ff8+4595+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85 #2 (Red Hat Linux)) id 1aij9f-000143-1k for xfs@oss.sgi.com; Wed, 23 Mar 2016 13:48:59 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 4/4] xfs: optimize inline symlinks Date: Wed, 23 Mar 2016 14:48:55 +0100 X-ASG-Orig-Subj: [PATCH 4/4] xfs: optimize inline symlinks Message-Id: <1458740935-31260-5-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1458740935-31260-1-git-send-email-hch@lst.de> References: <1458740935-31260-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1458740940 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28085 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- By overallocating the in-core inode fork data buffer and zero terminating the link target in xfs_init_local_fork we can avoid the memory allocation in ->follow_link. Signed-off-by: Christoph Hellwig --- fs/xfs/libxfs/xfs_inode_fork.c | 22 ++++++++++++++++++---- fs/xfs/xfs_inode_item.c | 4 ++-- fs/xfs/xfs_iops.c | 29 ++++++++++++++++++++++++++--- fs/xfs/xfs_symlink.c | 9 +++------ 4 files changed, 49 insertions(+), 15 deletions(-) diff --git a/fs/xfs/libxfs/xfs_inode_fork.c b/fs/xfs/libxfs/xfs_inode_fork.c index 86a97f8..4fbe226 100644 --- a/fs/xfs/libxfs/xfs_inode_fork.c +++ b/fs/xfs/libxfs/xfs_inode_fork.c @@ -239,19 +239,33 @@ xfs_init_local_fork( int size) { struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, whichfork); - int real_size = 0; + int mem_size = size, real_size = 0; + bool zero_terminate; + + /* + * If we are using the local fork to store a symlink body we need to + * zero-terminate it so that we can pass it back to the VFS directly. + * Overallocate the in-memory fork by one for that and add a zero + * to terminate it below. + */ + zero_terminate = S_ISLNK(VFS_I(ip)->i_mode); + if (zero_terminate) + mem_size++; if (size == 0) ifp->if_u1.if_data = NULL; - else if (size <= sizeof(ifp->if_u2.if_inline_data)) + else if (mem_size <= sizeof(ifp->if_u2.if_inline_data)) ifp->if_u1.if_data = ifp->if_u2.if_inline_data; else { - real_size = roundup(size, 4); + real_size = roundup(mem_size, 4); ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP | KM_NOFS); } - if (size) + if (size) { memcpy(ifp->if_u1.if_data, data, size); + if (zero_terminate) + ifp->if_u1.if_data[size] = '\0'; + } ifp->if_bytes = size; ifp->if_real_bytes = real_size; diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index c48b5b1..37e23c7 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -210,7 +210,7 @@ xfs_inode_item_format_data_fork( */ data_bytes = roundup(ip->i_df.if_bytes, 4); ASSERT(ip->i_df.if_real_bytes == 0 || - ip->i_df.if_real_bytes == data_bytes); + ip->i_df.if_real_bytes >= data_bytes); ASSERT(ip->i_df.if_u1.if_data != NULL); ASSERT(ip->i_d.di_size > 0); xlog_copy_iovec(lv, vecp, XLOG_REG_TYPE_ILOCAL, @@ -305,7 +305,7 @@ xfs_inode_item_format_attr_fork( */ data_bytes = roundup(ip->i_afp->if_bytes, 4); ASSERT(ip->i_afp->if_real_bytes == 0 || - ip->i_afp->if_real_bytes == data_bytes); + ip->i_afp->if_real_bytes >= data_bytes); ASSERT(ip->i_afp->if_u1.if_data != NULL); xlog_copy_iovec(lv, vecp, XLOG_REG_TYPE_IATTR_LOCAL, ip->i_afp->if_u1.if_data, diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index f08d91c..aee06d9 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -446,6 +446,16 @@ xfs_vn_get_link( return ERR_PTR(error); } +STATIC const char * +xfs_vn_get_link_inline( + struct dentry *dentry, + struct inode *inode, + struct delayed_call *done) +{ + ASSERT(XFS_I(inode)->i_df.if_flags & XFS_IFINLINE); + return XFS_I(inode)->i_df.if_u1.if_data; +} + STATIC int xfs_vn_getattr( struct vfsmount *mnt, @@ -1171,6 +1181,18 @@ static const struct inode_operations xfs_symlink_inode_operations = { .update_time = xfs_vn_update_time, }; +static const struct inode_operations xfs_inline_symlink_inode_operations = { + .readlink = generic_readlink, + .get_link = xfs_vn_get_link_inline, + .getattr = xfs_vn_getattr, + .setattr = xfs_vn_setattr, + .setxattr = generic_setxattr, + .getxattr = generic_getxattr, + .removexattr = generic_removexattr, + .listxattr = xfs_vn_listxattr, + .update_time = xfs_vn_update_time, +}; + STATIC void xfs_diflags_to_iflags( struct inode *inode, @@ -1282,9 +1304,10 @@ xfs_setup_iops( inode->i_fop = &xfs_dir_file_operations; break; case S_IFLNK: - inode->i_op = &xfs_symlink_inode_operations; - if (!(ip->i_df.if_flags & XFS_IFINLINE)) - inode->i_mapping->a_ops = &xfs_address_space_operations; + if (ip->i_df.if_flags & XFS_IFINLINE) + inode->i_op = &xfs_inline_symlink_inode_operations; + else + inode->i_op = &xfs_symlink_inode_operations; break; default: inode->i_op = &xfs_inode_operations; diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index b69f4a7..5961c1e 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c @@ -131,6 +131,8 @@ xfs_readlink( trace_xfs_readlink(ip); + ASSERT(!(ip->i_df.if_flags & XFS_IFINLINE)); + if (XFS_FORCED_SHUTDOWN(mp)) return -EIO; @@ -150,12 +152,7 @@ xfs_readlink( } - if (ip->i_df.if_flags & XFS_IFINLINE) { - memcpy(link, ip->i_df.if_u1.if_data, pathlen); - link[pathlen] = '\0'; - } else { - error = xfs_readlink_bmap(ip, link); - } + error = xfs_readlink_bmap(ip, link); out: xfs_iunlock(ip, XFS_ILOCK_SHARED); -- 2.1.4 From BATV+84ff5ada7f8efdc46ff8+4595+infradead.org+hch@casper.srs.infradead.org Wed Mar 23 08:49:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 288877CDC for ; Wed, 23 Mar 2016 08:49:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id F112F30405F for ; Wed, 23 Mar 2016 06:49:00 -0700 (PDT) X-ASG-Debug-ID: 1458740937-04cb6c059f192bf0001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id HmKAP5L6VAHA8Snt (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 23 Mar 2016 06:48:58 -0700 (PDT) X-Barracuda-Envelope-From: BATV+84ff5ada7f8efdc46ff8+4595+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85 #2 (Red Hat Linux)) id 1aij9d-00013t-Mp for xfs@oss.sgi.com; Wed, 23 Mar 2016 13:48:57 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 2/4] xfs: set up inode operation vectors later Date: Wed, 23 Mar 2016 14:48:53 +0100 X-ASG-Orig-Subj: [PATCH 2/4] xfs: set up inode operation vectors later Message-Id: <1458740935-31260-3-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1458740935-31260-1-git-send-email-hch@lst.de> References: <1458740935-31260-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1458740938 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28085 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- In the next patch we'll set up different inode operations for inline vs out of line symlinks, for that we need to make sure the flags are already set up properly. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_inode.h | 5 ++++- fs/xfs/xfs_iops.c | 59 ++++++++++++++++++++++++++++++++++-------------------- 2 files changed, 41 insertions(+), 23 deletions(-) diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 43e1d51..e52d7c7 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -440,6 +440,9 @@ loff_t __xfs_seek_hole_data(struct inode *inode, loff_t start, /* from xfs_iops.c */ +extern void xfs_setup_inode(struct xfs_inode *ip); +extern void xfs_setup_iops(struct xfs_inode *ip); + /* * When setting up a newly allocated inode, we need to call * xfs_finish_inode_setup() once the inode is fully instantiated at @@ -447,7 +450,6 @@ loff_t __xfs_seek_hole_data(struct inode *inode, loff_t start, * before we've completed instantiation. Otherwise we can do it * the moment the inode lookup is complete. */ -extern void xfs_setup_inode(struct xfs_inode *ip); static inline void xfs_finish_inode_setup(struct xfs_inode *ip) { xfs_iflags_clear(ip, XFS_INEW); @@ -458,6 +460,7 @@ static inline void xfs_finish_inode_setup(struct xfs_inode *ip) static inline void xfs_setup_existing_inode(struct xfs_inode *ip) { xfs_setup_inode(ip); + xfs_setup_iops(ip); xfs_finish_inode_setup(ip); } diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index fb7dc61..f08d91c 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -181,6 +181,8 @@ xfs_generic_create( } #endif + xfs_setup_iops(ip); + if (tmpfile) d_tmpfile(dentry, inode); else @@ -368,6 +370,8 @@ xfs_vn_symlink( if (unlikely(error)) goto out_cleanup_inode; + xfs_setup_iops(cip); + d_instantiate(dentry, inode); xfs_finish_inode_setup(cip); return 0; @@ -1193,7 +1197,7 @@ xfs_diflags_to_iflags( } /* - * Initialize the Linux inode and set up the operation vectors. + * Initialize the Linux inode. * * When reading existing inodes from disk this is called directly from xfs_iget, * when creating a new inode it is called from xfs_ialloc after setting up the @@ -1232,8 +1236,38 @@ xfs_setup_inode( i_size_write(inode, ip->i_d.di_size); xfs_diflags_to_iflags(inode, ip); - ip->d_ops = ip->i_mount->m_nondir_inode_ops; - lockdep_set_class(&ip->i_lock.mr_lock, &xfs_nondir_ilock_class); + if (S_ISDIR(inode->i_mode)) { + lockdep_set_class(&ip->i_lock.mr_lock, &xfs_dir_ilock_class); + ip->d_ops = ip->i_mount->m_dir_inode_ops; + } else { + ip->d_ops = ip->i_mount->m_nondir_inode_ops; + lockdep_set_class(&ip->i_lock.mr_lock, &xfs_nondir_ilock_class); + } + + /* + * Ensure all page cache allocations are done from GFP_NOFS context to + * prevent direct reclaim recursion back into the filesystem and blowing + * stacks or deadlocking. + */ + gfp_mask = mapping_gfp_mask(inode->i_mapping); + mapping_set_gfp_mask(inode->i_mapping, (gfp_mask & ~(__GFP_FS))); + + /* + * If there is no attribute fork no ACL can exist on this inode, + * and it can't have any file capabilities attached to it either. + */ + if (!XFS_IFORK_Q(ip)) { + inode_has_no_xattr(inode); + cache_no_acl(inode); + } +} + +void +xfs_setup_iops( + struct xfs_inode *ip) +{ + struct inode *inode = &ip->i_vnode; + switch (inode->i_mode & S_IFMT) { case S_IFREG: inode->i_op = &xfs_inode_operations; @@ -1241,13 +1275,11 @@ xfs_setup_inode( inode->i_mapping->a_ops = &xfs_address_space_operations; break; case S_IFDIR: - lockdep_set_class(&ip->i_lock.mr_lock, &xfs_dir_ilock_class); if (xfs_sb_version_hasasciici(&XFS_M(inode->i_sb)->m_sb)) inode->i_op = &xfs_dir_ci_inode_operations; else inode->i_op = &xfs_dir_inode_operations; inode->i_fop = &xfs_dir_file_operations; - ip->d_ops = ip->i_mount->m_dir_inode_ops; break; case S_IFLNK: inode->i_op = &xfs_symlink_inode_operations; @@ -1259,21 +1291,4 @@ xfs_setup_inode( init_special_inode(inode, inode->i_mode, inode->i_rdev); break; } - - /* - * Ensure all page cache allocations are done from GFP_NOFS context to - * prevent direct reclaim recursion back into the filesystem and blowing - * stacks or deadlocking. - */ - gfp_mask = mapping_gfp_mask(inode->i_mapping); - mapping_set_gfp_mask(inode->i_mapping, (gfp_mask & ~(__GFP_FS))); - - /* - * If there is no attribute fork no ACL can exist on this inode, - * and it can't have any file capabilities attached to it either. - */ - if (!XFS_IFORK_Q(ip)) { - inode_has_no_xattr(inode); - cache_no_acl(inode); - } } -- 2.1.4 From bfoster@redhat.com Wed Mar 23 09:07:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8701E7CE1 for ; Wed, 23 Mar 2016 09:07:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 59EFD30405F for ; Wed, 23 Mar 2016 07:07:40 -0700 (PDT) X-ASG-Debug-ID: 1458742058-04cb6c059d194760001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id uJM1AsxkuDpLyHxn (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 23 Mar 2016 07:07: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 (Postfix) with ESMTPS id 4317C7F09D; Wed, 23 Mar 2016 14:07:38 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-6.bos.redhat.com [10.18.41.6]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2NE7bM3022180; Wed, 23 Mar 2016 10:07:38 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id C586B1205DF; Wed, 23 Mar 2016 10:07:36 -0400 (EDT) Date: Wed, 23 Mar 2016 10:07:36 -0400 From: Brian Foster To: Stefan Priebe - Profihost AG Cc: Dave Chinner , linux-fsdevel@vger.kernel.org, "xfs-masters@oss.sgi.com" , "xfs@oss.sgi.com" Subject: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage Message-ID: <20160323140736.GD43073@bfoster.bfoster> X-ASG-Orig-Subj: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage References: <56C81D94.7090603@profihost.ag> <20160220144533.GA36182@bfoster.bfoster> <56D9D834.2000303@profihost.ag> <20160304191329.GC3758@bfoster.bfoster> <56D9E9BE.40101@profihost.ag> <20160304210341.GA8035@bfoster.bfoster> <20160305224845.GR30721@dastard> <56F299E3.4020703@profihost.ag> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56F299E3.4020703@profihost.ag> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458742059 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Mar 23, 2016 at 02:28:03PM +0100, Stefan Priebe - Profihost AG wrote: > sorry new one the last one got mangled. Comments inside. > > Am 05.03.2016 um 23:48 schrieb Dave Chinner: > > On Fri, Mar 04, 2016 at 04:03:42PM -0500, Brian Foster wrote: > >> On Fri, Mar 04, 2016 at 09:02:06PM +0100, Stefan Priebe wrote: > >>> Am 04.03.2016 um 20:13 schrieb Brian Foster: > >>>> On Fri, Mar 04, 2016 at 07:47:16PM +0100, Stefan Priebe wrote: > >>>>> Am 20.02.2016 um 19:02 schrieb Stefan Priebe - Profihost AG: > >>>>>> > >>>>>>> Am 20.02.2016 um 15:45 schrieb Brian Foster : > >>>>>>> > >>>>>>>> On Sat, Feb 20, 2016 at 09:02:28AM +0100, Stefan Priebe wrote: ... > > This has happened again on 8 different hosts in the last 24 hours > running 4.4.6. > > All of those are KVM / Qemu hosts and are doing NO I/O except the normal > OS stuff as the VMs have remote storage. So no database, no rsync on > those hosts - just the OS doing nearly nothing. > > All those show: > [153360.287040] WARNING: CPU: 0 PID: 109 at fs/xfs/xfs_aops.c:1234 > xfs_vm_releasepage+0xe2/0xf0() > Ok, well at this point the warning isn't telling us anything beyond you're reproducing the problem. We can't really make progress without more information. We don't necessarily know what application or operations caused this by the time it occurs, but perhaps knowing what file is affected could give us a hint. We have the xfs_releasepage tracepoint, but that's unconditional and so might generate a lot of noise by default. Could you enable the xfs_releasepage tracepoint and hunt for instances where delalloc != 0? E.g., we could leave a long running 'trace-cmd record -e "xfs:xfs_releasepage" ' command on several boxes and wait for the problem to occur. Alternatively (and maybe easier), run 'trace-cmd start -e "xfs:xfs_releasepage"' and leave something like 'cat /sys/kernel/debug/tracing/trace_pipe | grep -v "delalloc 0" > ~/trace.out' running to capture instances. If we can get a tracepoint hit, it will include the inode number and something like 'find / -inum ' can point us at the file. Brian > Stefan > > > > > -Dave. > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From n.borisov@siteground.com Wed Mar 23 10:03:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8F9387CB1 for ; Wed, 23 Mar 2016 10:03:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 609038F8035 for ; Wed, 23 Mar 2016 08:03:23 -0700 (PDT) X-ASG-Debug-ID: 1458745400-04cbb05f3802320001-NocioJ Received: from mail-wm0-f46.google.com (mail-wm0-f46.google.com [74.125.82.46]) by cuda.sgi.com with ESMTP id zj0ddH70vWHh3wW1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 23 Mar 2016 08:03:20 -0700 (PDT) X-Barracuda-Envelope-From: n.borisov@siteground.com X-Barracuda-Apparent-Source-IP: 74.125.82.46 Received: by mail-wm0-f46.google.com with SMTP id l68so200097968wml.0 for ; Wed, 23 Mar 2016 08:03: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:subject:to:references:cc:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=Qs1mVKJ5gu0MEi/vdacxsljkUTB+j6TL4k9qCRjlyo0=; b=YZmFv+Qil+n1o1Hr+szXNTH2NuE8myNDjehDKQt/8lDO9IUxkDrRq1ezoka/lulscg P8MQn8WQjctI22s4H8XTLTE04r/Un1MWTRS0xTjoYZBbsrRFTEK5uAhpKRrvilYpZ52k s8FcoTQ4nP5j3W6eXoA/7GV81LKpisEl0pS0iy0gFzSMYfsW5gvnTeOd/SqFwNf7wxeJ xhkJdb1jGxiVMJypYGA+9rE2RWnfM3Q6ISjGVLdKQAIo7Avcs3dh5A27APD7V9yaputw KHE444Kut/JFeO1+u33CtQ9Fx9FqYlzIwm3DVZrYuTkZarbMAsK8ulf1kK9AIL2zkmL1 eP+Q== X-Gm-Message-State: AD7BkJKJq/2vHc3JzQNTfN14ND02aFOYgn5iNWxEZuN9i46NSLsJYUse2HMdZlZIK2/tgQ// X-Received: by 10.194.6.234 with SMTP id e10mr3988189wja.118.1458745399829; Wed, 23 Mar 2016 08:03:19 -0700 (PDT) Received: from localhost.localdomain (admins.1h.com. [82.118.240.130]) by smtp.gmail.com with ESMTPSA id g3sm3008125wjw.31.2016.03.23.08.03.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 23 Mar 2016 08:03:19 -0700 (PDT) Subject: Re: Failing XFS memory allocation To: Brian Foster X-ASG-Orig-Subj: Re: Failing XFS memory allocation References: <56F26CCE.6010502@kyup.com> <20160323124312.GB43073@bfoster.bfoster> <56F29279.70600@kyup.com> <20160323131059.GC43073@bfoster.bfoster> Cc: xfs@oss.sgi.com From: Nikolay Borisov Message-ID: <56F2B036.4090306@kyup.com> Date: Wed, 23 Mar 2016 17:03:18 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.1.0 MIME-Version: 1.0 In-Reply-To: <20160323131059.GC43073@bfoster.bfoster> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-wm0-f46.google.com[74.125.82.46] X-Barracuda-Start-Time: 1458745400 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28086 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 03/23/2016 03:10 PM, Brian Foster wrote: > On Wed, Mar 23, 2016 at 02:56:25PM +0200, Nikolay Borisov wrote: >> >> >> On 03/23/2016 02:43 PM, Brian Foster wrote: >>> On Wed, Mar 23, 2016 at 12:15:42PM +0200, Nikolay Borisov wrote: > ... >>> It looks like it's working to add a new extent to the in-core extent >>> list. If this is the stack associated with the warning message (combined >>> with the large alloc size), I wonder if there's a fragmentation issue on >>> the file leading to an excessive number of extents. >> >> Yes this is the stack trace associated. >> >>> >>> What does 'xfs_bmap -v /storage/loop/file1' show? >> >> It spews a lot of stuff but here is a summary, more detailed info can be >> provided if you need it: >> >> xfs_bmap -v /storage/loop/file1 | wc -l >> 900908 >> xfs_bmap -v /storage/loop/file1 | grep -c hole >> 94568 >> >> Also, what would constitute an "excessive number of extents"? >> > > I'm not sure where one would draw the line tbh, it's just a matter of > having too many extents to the point that it causes problems in terms of > performance (i.e., reading/modifying the extent list) or such as the > allocation problem you're running into. As it is, XFS maintains the full > extent list for an active inode in memory, so that's 800k+ extents that > it's looking for memory for. I saw in the comments that this problem has already been identified and a possible solution would be to add another level of indirection. Also, can you confirm that my understanding of the operation of the indirection array is correct in that each entry in the indirection array xfs_ext_irec is responsible for 256 extents. (the er_extbuf is PAGE_SIZE/4kb and an extent is 16 bytes which results in 256 extents) > > It looks like that is your problem here. 800k or so extents over 878G > looks to be about 1MB per extent. Are you using extent size hints? One > option that might prevent this is to use a larger extent size hint > value. Another might be to preallocate the entire file up front with > fallocate. You'd probably have to experiment with what option or value > works best for your workload. By preallocating with fallocate you mean using fallocate with FALLOC_FL_ZERO_RANGE and not FALLOC_FL_PUNCH_HOLE, right? Because as it stands now the file does have holes, which presumably are being filled and in order to be filled an extent has to be allocated which caused the issue? Am I right in this reasoning? Currently I'm not using extents size hint but will look into that, also if the extent size hint is say 4mb, wouldn't that cause a fairly serious loss of space, provided that the writes are smaller than 4mb. Would XFS try to perform some sort of extent coalescing or something else? I'm not an FS developer but my understanding is that with a 4mb extent size, whenever a new write occurs even if it's 256kb a new 4mb extent would be allocated, no? And a final question - when i printed the contents of the inode with xfs_db I get core.nextents = 972564 whereas invoking the xfs_bmap | wc -l on the file always gives varying numbers? Thanks a lot for taking the time to reply. From cmaiolino@redhat.com Wed Mar 23 10:32:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5034A7CBC for ; Wed, 23 Mar 2016 10:32:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C231EAC005 for ; Wed, 23 Mar 2016 08:32:26 -0700 (PDT) X-ASG-Debug-ID: 1458747144-04bdf03cfc04e80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ICzXzXMnFBgBCiSn (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 23 Mar 2016 08:32:25 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 86E02AA0D8 for ; Wed, 23 Mar 2016 15:32:24 +0000 (UTC) Received: from redhat.com (dhcp-26-103.brq.redhat.com [10.34.26.103]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2NFWLMO006415 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 23 Mar 2016 11:32:23 -0400 Date: Wed, 23 Mar 2016 16:32:21 +0100 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Message-ID: <20160323153221.GA19456@redhat.com> X-ASG-Orig-Subj: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Mail-Followup-To: xfs@oss.sgi.com References: <20160322121922.GA53693@bfoster.bfoster> <6457b1d9de271ec6cca6bc2626aac161@mail.gmail.com> <20160322140345.GA54245@bfoster.bfoster> <0f3832c45509f444f55fda2aaf9c9deb@mail.gmail.com> <20160323123010.GA43073@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160323123010.GA43073@bfoster.bfoster> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458747145 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 I'm still trying to get a reliable reproducer, at least exactly with what I have seen a few days ago. Shyam, could you try to reproduce it with a recent/upstream kernel? That would be great to make sure we have been seen the same issue. AFAICT, it happens in the following situation: 1 - Something is written to the filesystem 2 - log checkpoint is done for the previous write 3 - Disk failure 4 - XFS tries to writeback metadata logged in [2] When [4] happens, I can't trigger xfs_log_force messages all the time, most of time I just get an infinite loop in these messages: [12694.318109] XFS (dm-0): Failing async write on buffer block 0xffffffffffffffff. Retrying async write. Sometimes I can trigger the xfs_log_force() loop. I should have something new around tomorrow. I'm building a kernel from xfs/for-next tree, to ensure I'm using the last code, and then will try to reproduce it from there too. On Wed, Mar 23, 2016 at 08:30:12AM -0400, Brian Foster wrote: > On Wed, Mar 23, 2016 at 03:13:57PM +0530, Shyam Kaushik wrote: > > Hi Brian, > > > > Here are two inodes on which the xfsaild is looping over & over during > > unmount. This captures right from the cp that I started with copying some > > files to xfs while the drive was pulled out, later drive was pushed back & > > unmount was attempted. Does this give you better picture on the issue? > > Please let me know if you prefer to do some other steps in the reproducer. > > > ... > > kworker/0:1H-257 [000] ...1 7477.849984: xfs_inode_unpin: dev > > 253:11 ino 0x103c84a count 1 pincount 1 caller xfs_trans_committed_bulk > > [xfs] > > So it looks like the transaction is committed to the log. We don't > necessarily know whether the I/O completed or this was aborted, though I > suppose we can infer the former since the inode ends up on the AIL. > There's not much else that I can go on here, however. It looks like this > trace output is redacted and/or some events were lost. For example, I > don't see any xfs_ail_insert/move events at all, etc. > > I'd suggest to use trace-record to collect and send (or post somewhere) > the full, raw trace dump. Something like 'trace-record -e xfs:* sleep > 999' should dump everything to a file while you try and reproduce. > > Alternatively, it sounds like Carlos is working towards a reproducer on > a recent kernel and might be closer to tracking this down. One random > thought/guess from skimming through the code: I wonder if there's some > kind of race going on between a failed metadata write retry and the fs > shutdown. It looks like we retry once in xfs_buf_iodone_callbacks(). If > the fs is shutdown, we invoke the callbacks which look like it should > ultimately release the flush lock (in xfs_iflush_done()), but I'm not > sure that happens if the shutdown occurs after a failed retry. > > ... > > It will be hard for me to shift to a newer kernel. But if you say we are > > left with no options to root cause this issue, I can attempt at this > > direction. Pls let me know. Thanks. > > > > I ask mainly for informational and debugging purposes. If the problem > doesn't occur on a recent kernel, we might have a fix that could be > identified via a bisect. If it does, then it's still preferable to debug > on something more recent. As mentioned above, it sounds like Carlos has > been working on tracking this down on recent kernels already. > > Brian > > > --Shyam > > -----Original Message----- > > From: Brian Foster [mailto:bfoster@redhat.com] > > Sent: 22 March 2016 19:34 > > To: Shyam Kaushik > > Cc: Alex Lyakas; xfs@oss.sgi.com > > Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > > after disk failure/recovery > > > > On Tue, Mar 22, 2016 at 06:31:48PM +0530, Shyam Kaushik wrote: > > > Hi Brian, > > > > > > Thanks for your quick reply. I repeated the test & trace-pipe is > > > constantly filled with this: > > > > > > xfsaild/dm-10-3335 [003] ...2 24890.546491: xfs_ilock_nowait: dev > > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 24890.546492: xfs_iunlock: dev 253:10 > > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 24890.546493: xfs_ail_flushing: dev > > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > > xfsaild/dm-10-3335 [003] ...2 24890.596491: xfs_ilock_nowait: dev > > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 24890.596492: xfs_iunlock: dev 253:10 > > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 24890.596494: xfs_ail_flushing: dev > > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > > xfsaild/dm-10-3335 [003] ...2 24890.646497: xfs_ilock_nowait: dev > > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 24890.646498: xfs_iunlock: dev 253:10 > > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 24890.646500: xfs_ail_flushing: dev > > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > > xfsaild/dm-10-3335 [003] ...2 24890.696467: xfs_ilock_nowait: dev > > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_iunlock: dev 253:10 > > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_ail_flushing: dev > > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > > xfsaild/dm-10-3335 [003] ...2 24890.746548: xfs_ilock_nowait: dev > > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_iunlock: dev 253:10 > > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_ail_flushing: dev > > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > > xfsaild/dm-10-3335 [003] ...2 24890.796479: xfs_ilock_nowait: dev > > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_iunlock: dev 253:10 > > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_ail_flushing: dev > > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > > xfsaild/dm-10-3335 [003] ...2 24890.846467: xfs_ilock_nowait: dev > > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 24890.846468: xfs_iunlock: dev 253:10 > > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > > > > > So xfsaild is spinning on this inode. It was presumably modified, logged > > and flushed to the log, hence it's sitting in the AIL waiting to be > > flushed to disk. xfsaild wants to push it to get it flushed to disk and > > off the AIL, but it sees it is already in the flushing state as the > > flush lock is held. > > > > It's not clear to me why the inode is not removed from the AIL, or > > whether that I/O was actually submitted or aborted with an error. The > > shutdown involved here most likely affects this one way or the other. > > IIUC, the I/O completion should eventually release the flush lock and > > remove the inode from the AIL. A complete trace log of the entire > > reproducer might shed more light as to what's going on. > > > > Also, it sounds like you have a reliable reproducer. Does this reproduce > > on a recent kernel? > > > > Brian > > > > > > > > while regular activity seems to happen on other inodes/kworker threads > > > > > > kworker/u8:4-27691 [001] ...1 24895.811474: xfs_writepage: dev > > 253:10 > > > ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > > > unwritten 0 > > > kworker/u8:4-27691 [001] ...1 24895.811477: xfs_invalidatepage: dev > > > 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > > > delalloc 1 unwritten 0 > > > kworker/u8:4-27691 [001] ...1 24895.811478: xfs_releasepage: dev > > > 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 > > > delalloc 0 unwritten 0 > > > kworker/u8:4-27691 [001] ...1 24895.811482: xfs_writepage: dev > > 253:10 > > > ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > > > unwritten 0 > > > kworker/u8:4-27691 [001] ...1 24895.811482: xfs_invalidatepage: dev > > > 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > > > delalloc 1 unwritten 0 > > > kworker/u8:4-27691 [001] ...1 24895.811483: xfs_releasepage: dev > > > 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 > > > delalloc 0 unwritten 0 > > > kworker/u8:4-27691 [001] ...1 24895.811485: xfs_writepage: dev > > 253:10 > > > ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > > > unwritten 0 > > > kworker/u8:4-27691 [001] ...1 24895.811486: xfs_invalidatepage: dev > > > 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > > > delalloc 1 unwritten 0 > > > kworker/u8:4-27691 [001] ...1 24895.811486: xfs_releasepage: dev > > > 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 > > > delalloc 0 unwritten 0 > > > kworker/u8:4-27691 [001] ...1 24895.812381: xfs_writepage: dev > > 253:10 > > > ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 > > > unwritten 0 > > > kworker/u8:4-27691 [001] ...1 24895.812382: xfs_invalidatepage: dev > > > 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 1000 > > > delalloc 1 unwritten 0 > > > kworker/u8:4-27691 [001] ...1 24895.812382: xfs_releasepage: dev > > > 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 > > delalloc > > > 0 unwritten 0 > > > kworker/u8:4-27691 [001] ...1 24895.812385: xfs_writepage: dev > > 253:10 > > > ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 > > > unwritten 0 > > > kworker/u8:4-27691 [001] ...1 24895.812385: xfs_invalidatepage: dev > > > 253:10 ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 1000 > > > delalloc 1 unwritten 0 > > > > > > > > > looks like xfsaild is not able to take lock until hung-task timeout > > kicks > > > in > > > > > > xfsaild/dm-10-3335 [003] ...2 25247.649468: xfs_ilock_nowait: dev > > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_iunlock: dev 253:10 > > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_ail_flushing: dev > > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > > xfsaild/dm-10-3335 [003] ...2 25247.699478: xfs_ilock_nowait: dev > > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 25247.699516: xfs_iunlock: dev 253:10 > > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 25247.699517: xfs_ail_flushing: dev > > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > > xfsaild/dm-10-3335 [003] ...2 25247.749471: xfs_ilock_nowait: dev > > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 25247.749478: xfs_iunlock: dev 253:10 > > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > xfsaild/dm-10-3335 [003] ...2 25247.749479: xfs_ail_flushing: dev > > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > > > > > Please let me know how to debug this further. Thanks. > > > > > > --Shyam > > > -----Original Message----- > > > From: Brian Foster [mailto:bfoster@redhat.com] > > > Sent: 22 March 2016 17:49 > > > To: Shyam Kaushik > > > Cc: xfs@oss.sgi.com; Alex Lyakas > > > Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > > > after disk failure/recovery > > > > > > On Tue, Mar 22, 2016 at 04:51:39PM +0530, Shyam Kaushik wrote: > > > > Hi XFS developers, > > > > > > > > We are seeing the following issue with XFS on kernel 3.18.19. > > > > > > > > We have XFS mounted over a raw disk. Disk was pulled out manually. > > There > > > > were async writes on files that were errored like this > > > > > > > ... > > > > > > > > And XFS hit metadata & Log IO errors that it decides to shutdown: > > > > > > > > Mar 16 16:03:22 host0 kernel: [ 4637.351841] XFS (dm-29): metadata I/O > > > > error: block 0x3a27fbd0 ("xlog_iodone") error 5 numblks 64 > > > > Mar 16 16:03:22 host0 kernel: [ 4637.352820] XFS(dm-29): SHUTDOWN!!! > > > > old_flags=0x0 new_flags=0x2 > > > > Mar 16 16:03:22 host0 kernel: [ 4637.353187] XFS (dm-29): Log I/O > > Error > > > > Detected. Shutting down filesystem > > > ... > > > > Later the drive was re-inserted back. After the drive was re-inserted, > > > XFS > > > > was attempted to be unmounted > > > > > > > > Mar 16 16:16:53 host0 controld: [2557] [ ] umount[202] > > > > : umount(/sdisk/vol5b0, xfs) > > > > > > > > But nothing happens except for the 30-secs xfs_log_force errors that > > > keeps > > > > repeating > > > > > > > ... > > > > > > > > This problem doesn't happen consistently, but happens periodically > > with > > > a > > > > drive failure/recovery followed by XFS unmount. I couldn't find this > > > issue > > > > fixed in later kernels. Can you please suggest how I can debug this > > > issue > > > > further? > > > > > > > > > > Similar problems have been reproduced due to racy/incorrect EFI/EFD > > > object tracking, which are internal data structures associated with > > > freeing extents. > > > > > > What happens if you enable tracepoints while the fs is in this hung > > > unmount state? > > > > > > # trace-cmd start -e "xfs:*" > > > # cat /sys/kernel/debug/tracing/trace_pipe > > > > > > Brian > > > > > > > Thanks! > > > > > > > > --Shyam > > > > > > > > _______________________________________________ > > > > xfs mailing list > > > > xfs@oss.sgi.com > > > > http://oss.sgi.com/mailman/listinfo/xfs > > > > > > _______________________________________________ > > > xfs mailing list > > > xfs@oss.sgi.com > > > http://oss.sgi.com/mailman/listinfo/xfs > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From bfoster@redhat.com Wed Mar 23 11:59:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 88B087CCC for ; Wed, 23 Mar 2016 11:59:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id F1827AC007 for ; Wed, 23 Mar 2016 09:58:56 -0700 (PDT) X-ASG-Debug-ID: 1458752335-04bdf03cfa0a4c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id o47amFCyXzc37zDa (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 23 Mar 2016 09:58:55 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 907778F4E5; Wed, 23 Mar 2016 16:58:55 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-6.bos.redhat.com [10.18.41.6]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2NGwt7p028858; Wed, 23 Mar 2016 12:58:55 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id E6D3D1205DF; Wed, 23 Mar 2016 12:58:53 -0400 (EDT) Date: Wed, 23 Mar 2016 12:58:53 -0400 From: Brian Foster To: Nikolay Borisov Cc: xfs@oss.sgi.com Subject: Re: Failing XFS memory allocation Message-ID: <20160323165853.GE43073@bfoster.bfoster> X-ASG-Orig-Subj: Re: Failing XFS memory allocation References: <56F26CCE.6010502@kyup.com> <20160323124312.GB43073@bfoster.bfoster> <56F29279.70600@kyup.com> <20160323131059.GC43073@bfoster.bfoster> <56F2B036.4090306@kyup.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56F2B036.4090306@kyup.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458752335 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Mar 23, 2016 at 05:03:18PM +0200, Nikolay Borisov wrote: ... > > I'm not sure where one would draw the line tbh, it's just a matter of > > having too many extents to the point that it causes problems in terms of > > performance (i.e., reading/modifying the extent list) or such as the > > allocation problem you're running into. As it is, XFS maintains the full > > extent list for an active inode in memory, so that's 800k+ extents that > > it's looking for memory for. > > I saw in the comments that this problem has already been identified and > a possible solution would be to add another level of indirection. Also, > can you confirm that my understanding of the operation of the > indirection array is correct in that each entry in the indirection array > xfs_ext_irec is responsible for 256 extents. (the er_extbuf is > PAGE_SIZE/4kb and an extent is 16 bytes which results in 256 extents) > That looks about right from the XFS_LINEAR_EXTS #define. I see the comment but I've yet to really dig into the in-core extent list data structures too deep to have any intuition or insight on a potential solution (and don't really have time to atm). Dave or others might already have an understanding of a limitation here. > > > > It looks like that is your problem here. 800k or so extents over 878G > > looks to be about 1MB per extent. Are you using extent size hints? One > > option that might prevent this is to use a larger extent size hint > > value. Another might be to preallocate the entire file up front with > > fallocate. You'd probably have to experiment with what option or value > > works best for your workload. > > By preallocating with fallocate you mean using fallocate with > FALLOC_FL_ZERO_RANGE and not FALLOC_FL_PUNCH_HOLE, right? Because as it > stands now the file does have holes, which presumably are being filled > and in order to be filled an extent has to be allocated which caused the > issue? Am I right in this reasoning? > You don't need either, but definitely not hole punch. ;) See 'man 2 fallocate' for the default behavior (mode == 0). The idea is that the allocation will occur with as large extents as possible, rather than small, fragmented extents as writes occur. This is more reasonable if you ultimately expect to use the entire file. > Currently I'm not using extents size hint but will look into that, also > if the extent size hint is say 4mb, wouldn't that cause a fairly serious > loss of space, provided that the writes are smaller than 4mb. Would XFS > try to perform some sort of extent coalescing or something else? I'm not > an FS developer but my understanding is that with a 4mb extent size, > whenever a new write occurs even if it's 256kb a new 4mb extent would be > allocated, no? > Yes, the extent size hint will "widen" allocations due to smaller writes to the full hint size and alignment. This results in extra space usage at first but reduces fragmentation over time as more of the file is used. E.g., subsequent writes within that 4m range of your previous 256k write will already have blocks allocated (as part of a larger, contiguous extent). The best bet is probably to experiment with your workload or look into your current file layout and try to choose a value that reduces fragmentation without sacrificing too much space efficiency. > And a final question - when i printed the contents of the inode with > xfs_db I get core.nextents = 972564 whereas invoking the xfs_bmap | wc > -l on the file always gives varying numbers? > I'd assume that the file is being actively modified..? I believe xfs_db will read values from disk, which might not be coherent with the latest in memory state, whereas bmap returns the latest layout of the file at the time (which could also change again by the time bmap returns). Brian > Thanks a lot for taking the time to reply. > > > > From david@fromorbit.com Wed Mar 23 17:38:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E63EA7CCD for ; Wed, 23 Mar 2016 17:37:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6BD1EAC001 for ; Wed, 23 Mar 2016 15:37:56 -0700 (PDT) X-ASG-Debug-ID: 1458772668-04cbb05f371a5b0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id hWK9G6j2KOvggpz9 for ; Wed, 23 Mar 2016 15:37:49 -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: A2A/CAB2GfNWNTGaLHlegzOBTYJug3mfegaMCoNJhiOGBwQCAoFBTQEBAQEBAQcBAQEBQUCEQgEBBDocMwgDGAklDwUlAwctiCbBNioZhT2FDIUIhQoFl1qNeo8URI5DgxKBSSguigsBAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Mar 2016 09:07:48 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1airPP-0007YT-B6 for xfs@oss.sgi.com; Thu, 24 Mar 2016 09:37:47 +1100 Date: Thu, 24 Mar 2016 09:37:47 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Message-ID: <20160323223747.GX30721@dastard> X-ASG-Orig-Subj: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery References: <20160322121922.GA53693@bfoster.bfoster> <6457b1d9de271ec6cca6bc2626aac161@mail.gmail.com> <20160322140345.GA54245@bfoster.bfoster> <0f3832c45509f444f55fda2aaf9c9deb@mail.gmail.com> <20160323123010.GA43073@bfoster.bfoster> <20160323153221.GA19456@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160323153221.GA19456@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: 1458772669 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28102 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Mar 23, 2016 at 04:32:21PM +0100, Carlos Maiolino wrote: > I'm still trying to get a reliable reproducer, at least exactly with what I have > seen a few days ago. > > Shyam, could you try to reproduce it with a recent/upstream kernel? That would > be great to make sure we have been seen the same issue. > > AFAICT, it happens in the following situation: > > 1 - Something is written to the filesystem > 2 - log checkpoint is done for the previous write > 3 - Disk failure > 4 - XFS tries to writeback metadata logged in [2] > > When [4] happens, I can't trigger xfs_log_force messages all the time, most of > time I just get an infinite loop in these messages: > > [12694.318109] XFS (dm-0): Failing async write on buffer block > 0xffffffffffffffff. Retrying async write. > > Sometimes I can trigger the xfs_log_force() loop. This all smells like the filesystem is getting IO errors but it not in a shutdown state. What happens when you run 'xfs_io -x -c "shutdown" /mnt/pt' on a filesystem in this state? Can you then unmount it? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Mar 23 18:00:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 986CB7CA6 for ; Wed, 23 Mar 2016 18:00:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 26139AC006 for ; Wed, 23 Mar 2016 16:00:12 -0700 (PDT) X-ASG-Debug-ID: 1458774007-04bdf03cfa1c100001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 0AOe7XYHZiMjZnn9 for ; Wed, 23 Mar 2016 16:00:07 -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: A2A+CABPH/NWNTGaLHlegzOBTYJug3mfegaMColshgcEAgKBQU0BAQEBAQEHAQEBAUFAhEIBAQQ6HCMQCAMOCgklDwUlAwcaE4gmwS8BAQEHAh4ZhT2FDIQLG4VsBZdajXqPFI8HhFsoLohRgToBAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Mar 2016 09:30:03 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1airkw-0007ab-Lk; Thu, 24 Mar 2016 10:00:02 +1100 Date: Thu, 24 Mar 2016 10:00:02 +1100 From: Dave Chinner To: Brian Foster Cc: Nikolay Borisov , xfs@oss.sgi.com Subject: Re: Failing XFS memory allocation Message-ID: <20160323230002.GY30721@dastard> X-ASG-Orig-Subj: Re: Failing XFS memory allocation References: <56F26CCE.6010502@kyup.com> <20160323124312.GB43073@bfoster.bfoster> <56F29279.70600@kyup.com> <20160323131059.GC43073@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160323131059.GC43073@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: 1458774007 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28104 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Mar 23, 2016 at 09:10:59AM -0400, Brian Foster wrote: > On Wed, Mar 23, 2016 at 02:56:25PM +0200, Nikolay Borisov wrote: > > On 03/23/2016 02:43 PM, Brian Foster wrote: > > > On Wed, Mar 23, 2016 at 12:15:42PM +0200, Nikolay Borisov wrote: > ... > > > It looks like it's working to add a new extent to the in-core extent > > > list. If this is the stack associated with the warning message (combined > > > with the large alloc size), I wonder if there's a fragmentation issue on > > > the file leading to an excessive number of extents. > > > > Yes this is the stack trace associated. > > > > > > > > What does 'xfs_bmap -v /storage/loop/file1' show? > > > > It spews a lot of stuff but here is a summary, more detailed info can be > > provided if you need it: > > > > xfs_bmap -v /storage/loop/file1 | wc -l > > 900908 > > xfs_bmap -v /storage/loop/file1 | grep -c hole > > 94568 > > > > Also, what would constitute an "excessive number of extents"? > > > > I'm not sure where one would draw the line tbh, it's just a matter of > having too many extents to the point that it causes problems in terms of > performance (i.e., reading/modifying the extent list) or such as the > allocation problem you're running into. As it is, XFS maintains the full > extent list for an active inode in memory, so that's 800k+ extents that > it's looking for memory for. > > It looks like that is your problem here. 800k or so extents over 878G > looks to be about 1MB per extent. Which I wouldn't call excessive. I use a 1MB extent size hint on all my VM images as this allows the underlying device to do IOs large enough to maintain clear to full bandwidth when reading and writing regions of the underlying image file that are non-contiguous w.r.t. sequential IO from the guest. Mind you, it's not until I use ext4 or btrfs in the guests that I actually see significant increases in extent size. Rule of thumb in my testing is that if XFs creates 100k extents in the image file, ext4 will create 500k, and btrfs will create somewhere between 1m and 5m extents.... i.e. XFS as a guest filesystem gives results in much lower image file fragmentation that the other options.... As it is, yes, the memory allocation problem is with the in-core extent tree, and we've known about it for some time. The issue is that as memory gets fragmented, the top level indirection array grows too large to be allocated as a contiguous chunk. When this happens really depends on memory load, uptime and the way the extent tree is being modified. I'm working on prototype patches to convert it to an in-memory btree but they are far from ready at this point. This isn't straight forward because all the extent management code assumes extents are kept in a linear array and can be directly indexed by array offset rather than file offset. I also want to make sure we can demand page the extent list if necessary, and that also complicates things like locking, as we currently assume the extent list is either completely in memory or not in memory at all. Fundamentally, I don't want to repeat the mistakes ext4 and btrfs have made with their fine-grained in memory extent trees that are based on rb-trees (e.g. global locks, shrinkers that don't scale or consume way too much CPU, excessive memory consumption, etc) and so solving all aspects of the problem in one go is somewhat complex. And, of course, there's so much other stuff that needs to be done at the same time, I cannot find much time to work on it at the moment... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Mar 23 18:11:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2B5AF7CD4 for ; Wed, 23 Mar 2016 18:11:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id ECECB8F8035 for ; Wed, 23 Mar 2016 16:10:57 -0700 (PDT) X-ASG-Debug-ID: 1458774651-04cb6c39191df20001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id PBAKujCHFb73HUzE for ; Wed, 23 Mar 2016 16:10:52 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BACACSIfNWNTGaLHlegzOBTYJug3mfegaMCoVfhA2GBwQCAoFBTQEBAQEBAQcBAQEBQUCEQgEBBDocIxAIAw4KCSUPBSUDBxoTiCbBOgEBCAIeGYU9hQyKEgWXWo16jxSPB4RbKC6KCwEBAQ Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Mar 2016 09:35:00 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1airpk-0007bc-Eu; Thu, 24 Mar 2016 10:05:00 +1100 Date: Thu, 24 Mar 2016 10:05:00 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/4] xfs: set up inode operation vectors later Message-ID: <20160323230500.GZ30721@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/4] xfs: set up inode operation vectors later References: <1458740935-31260-1-git-send-email-hch@lst.de> <1458740935-31260-3-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1458740935-31260-3-git-send-email-hch@lst.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: 1458774651 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28104 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Mar 23, 2016 at 02:48:53PM +0100, Christoph Hellwig wrote: > In the next patch we'll set up different inode operations for inline vs > out of line symlinks, for that we need to make sure the flags are already > set up properly. .... > diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c > index fb7dc61..f08d91c 100644 > --- a/fs/xfs/xfs_iops.c > +++ b/fs/xfs/xfs_iops.c > @@ -181,6 +181,8 @@ xfs_generic_create( > } > #endif > > + xfs_setup_iops(ip); > + > if (tmpfile) > d_tmpfile(dentry, inode); > else > @@ -368,6 +370,8 @@ xfs_vn_symlink( > if (unlikely(error)) > goto out_cleanup_inode; > > + xfs_setup_iops(cip); > + > d_instantiate(dentry, inode); > xfs_finish_inode_setup(cip); I think there are more places than this that need xfs_setup_iops() calls - a quick look around makes me think they need to be paired with every path that calls xfs_finish_inode_setup(). Cheers, Dave. -- Dave Chinner david@fromorbit.com From hch@lst.de Wed Mar 23 18:26:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8D1F37CB8 for ; Wed, 23 Mar 2016 18:26:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5B2D38F8040 for ; Wed, 23 Mar 2016 16:26:35 -0700 (PDT) X-ASG-Debug-ID: 1458775591-04bdf03cfb1d320001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id Rnprakud2fzXkBAu (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 23 Mar 2016 16:26:32 -0700 (PDT) X-Barracuda-Envelope-From: hch@lst.de X-Barracuda-Apparent-Source-IP: 213.95.11.211 Received: by newverein.lst.de (Postfix, from userid 2407) id 8F32C68C3B; Thu, 24 Mar 2016 00:26:30 +0100 (CET) Date: Thu, 24 Mar 2016 00:26:30 +0100 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 2/4] xfs: set up inode operation vectors later Message-ID: <20160323232630.GA5646@lst.de> X-ASG-Orig-Subj: Re: [PATCH 2/4] xfs: set up inode operation vectors later References: <1458740935-31260-1-git-send-email-hch@lst.de> <1458740935-31260-3-git-send-email-hch@lst.de> <20160323230500.GZ30721@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160323230500.GZ30721@dastard> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1458775592 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28105 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Mar 24, 2016 at 10:05:00AM +1100, Dave Chinner wrote: > > d_instantiate(dentry, inode); > > xfs_finish_inode_setup(cip); > > I think there are more places than this that need xfs_setup_iops() > calls - a quick look around makes me think they need to be paired > with every path that calls xfs_finish_inode_setup(). Most calls to xfs_finish_inode_setup are for error cases that just drop the inode instantly and don't need it. The other cases are: - xfs_generic_create, xfs_vn_symlink and xfs_setup_existing_inode, which are handled in this patch - xfs_qm_qino_alloc, which is for the quota inode that doesn't have inode operations - xfs_rename_alloc_whiteout which probably needs it. This seems to be recent and has no apparent test coverage, so I'm not sure how to verify it, though. From david@fromorbit.com Wed Mar 23 18:46:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B13037CB6 for ; Wed, 23 Mar 2016 18:46:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 911FE304051 for ; Wed, 23 Mar 2016 16:46:31 -0700 (PDT) X-ASG-Debug-ID: 1458776787-04cbb05f381ea40001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id wqMiBFrOUCkDAQd4 for ; Wed, 23 Mar 2016 16:46:28 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BACADcKfNWNTGaLHlegzOBTYJug3mfegaMCoVfhA2GBwQCAoFBTQEBAQEBAQcBAQEBQUCEQQEBAQMBOhwjBQsIAw4KCSUPBSUDBxoTiB8HwTYBAQEBBgIBHRmFPYUMhCGDRoIrBZMEhFaNeo8UjweEWyguiFGBOgEBAQ Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Mar 2016 10:15:55 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aisTK-0007fC-SZ; Thu, 24 Mar 2016 10:45:54 +1100 Date: Thu, 24 Mar 2016 10:45:54 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/4] xfs: set up inode operation vectors later Message-ID: <20160323234554.GA30721@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/4] xfs: set up inode operation vectors later References: <1458740935-31260-1-git-send-email-hch@lst.de> <1458740935-31260-3-git-send-email-hch@lst.de> <20160323230500.GZ30721@dastard> <20160323232630.GA5646@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160323232630.GA5646@lst.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: 1458776787 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28104 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Mar 24, 2016 at 12:26:30AM +0100, Christoph Hellwig wrote: > On Thu, Mar 24, 2016 at 10:05:00AM +1100, Dave Chinner wrote: > > > d_instantiate(dentry, inode); > > > xfs_finish_inode_setup(cip); > > > > I think there are more places than this that need xfs_setup_iops() > > calls - a quick look around makes me think they need to be paired > > with every path that calls xfs_finish_inode_setup(). > > Most calls to xfs_finish_inode_setup are for error cases that > just drop the inode instantly and don't need it. Fair enough. > The other > cases are: > > - xfs_generic_create, xfs_vn_symlink and xfs_setup_existing_inode, > which are handled in this patch > - xfs_qm_qino_alloc, which is for the quota inode that doesn't have > inode operations *nod* > - xfs_rename_alloc_whiteout which probably needs it. This seems > to be recent and has no apparent test coverage, so I'm not sure > how to verify it, though. Yup, that's the one I first noticed. generic/078 tests RENAME_WHITEOUT functionality through renameat2() and it includes operations on symlinks, so there is some coverage in xfstests for it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From Debra.smith@mrpwashtech.com Wed Mar 23 19:24:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,T_DKIM_INVALID, T_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 A41487CA0 for ; Wed, 23 Mar 2016 19:24:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 41FD930406A for ; Wed, 23 Mar 2016 17:23:56 -0700 (PDT) X-ASG-Debug-ID: 1458779029-04bdf03cfb1f1a0001-NocioJ Received: from 142-4-3-131.webhostbox.net (142-4-3-131.unifiedlayer.com [142.4.3.131]) by cuda.sgi.com with ESMTP id 790Yl2FPSbJLlzxI (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 23 Mar 2016 17:23:49 -0700 (PDT) X-Barracuda-Envelope-From: Debra.smith@mrpwashtech.com X-Barracuda-Apparent-Source-IP: 142.4.3.131 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mrpwashtech.com; s=default; h=Content-Type:MIME-Version:Message-ID:Date: Subject:To:From; bh=DCNpk7xcIZ8mRvaJmEJYRqfOUzCH8okwGWkqR0Nqd9k=; b=XeHmGtVMR kgxwJTo3ZQttQFd8OtP81FR6GtLKu8jrwfOBLIbON8brxRTDh3VufEtjRxho97BpQzTX+CTs2twTC URZAT6If6Qo9MnyqknHQCK0UPa4Yk4gPA09xS/pWiN3cx9ujOkGOuYSbVNPXArx9o9QQiMVyvV7UB XwvngUbi4yWvZfabbft3pkggLJx5SPosa3uJBhr1q2Hf/3quKBUfUaA1fCm0ZCAdTaSdJDq0S7+H2 GOLCaN2vHNGA4V0NmVPkkHpml88SpgtbFnfpsVL3WLWALCA8iWjgxXXWlK+sjNHCHjDpvKCkh0jZy wrL8q2/bB1XnHF6yFjD5X/95A==; Received: from [106.51.136.235] (port=1394 helo=md8PC) by 142-4-3-131.webhostbox.net with esmtpa (Exim 4.86_1) (envelope-from ) id 1aioC6-0000pv-PX for xfs@oss.sgi.com; Wed, 23 Mar 2016 19:11:51 +0000 Return-Receipt-To: "Debra Smith" From: "Debra Smith" To: Subject: =?us-ascii?Q?Cloudera_user's_mailing_list_?= Date: Thu, 24 Mar 2016 00:40:51 +0530 X-ASG-Orig-Subj: =?us-ascii?Q?Cloudera_user's_mailing_list_?= Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_2CD0_01D18565.FA9FE8F0" X-Mailer: Microsoft Outlook 15.0 Thread-Index: AdGFN6YyY9EfeaFWT2a+gCWcnOUc1w== Content-Language: en-us Disposition-Notification-To: "Debra Smith" X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - 142-4-3-131.webhostbox.net X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - mrpwashtech.com X-Get-Message-Sender-Via: 142-4-3-131.webhostbox.net: authenticated_id: debra.smith@mrpwashtech.com X-Authenticated-Sender: 142-4-3-131.webhostbox.net: debra.smith@mrpwashtech.com X-Source: X-Source-Args: X-Source-Dir: X-Barracuda-Connect: 142-4-3-131.unifiedlayer.com[142.4.3.131] X-Barracuda-Start-Time: 1458779029 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.11 X-Barracuda-Spam-Status: No, SCORE=1.11 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, DKIM_SIGNED, FH_HELO_EQ_D_D_D_D, HTML_MESSAGE, RDNS_DYNAMIC, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28107 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.50 FH_HELO_EQ_D_D_D_D Helo is d-d-d-d 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 This is a multipart message in MIME format. ------=_NextPart_000_2CD0_01D18565.FA9FE8F0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hi, We have an interesting offering for you called Cloudera user's mailing list for your email campaigns? We provide the best Database across North America, EMEA, APAC and Latin America. List Contains: Name, Company's Name, Phone Number, Fax Number, Job Title, Email address, Complete Mailing Address, SIC code, Company revenue, size, Web address etc. We also have other technology users like: - * Hortonworks * Aws * Splunk * Emr * And many more... Please review and let me know what technology users you are interested in and I will get back to you with more and more information and I can send some samples for you free once you reply. You can also let me know if you have a different target audience. We hope to provide the best customer service as per your needs. Regards, Debra To opt out response Remove in the subject line ------=_NextPart_000_2CD0_01D18565.FA9FE8F0 Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

Hi,=

 

We have an = interesting offering for you called Cloudera user’s = mailing list for your = email campaigns? We provide the best Database across North America, = EMEA, APAC and Latin America.

 

List = Contains: Name, Company's = Name, Phone Number, Fax Number, Job Title, Email address, Complete = Mailing Address, SIC code, Company revenue, size, Web address = etc.

 

We also have = other technology users like: = -

 

Ø  Hortonworks

Ø  Aws

Ø  Splunk

Ø  Emr

Ø  And many = more…..

Please review = and let me know what technology users you are interested in and I will = get back to you with more and more information and I can send some = samples for you free once you reply.

 

You can also = let me know if you have a different target audience.

We hope to = provide the best customer service as per your = needs.

 

Regards,

Debra

  &n= bsp;           &nb= sp;           &nbs= p;         To opt out response Remove in the subject = line

------=_NextPart_000_2CD0_01D18565.FA9FE8F0-- From s.priebe@profihost.ag Thu Mar 24 03:10:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A0EE17CA0 for ; Thu, 24 Mar 2016 03:10:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 54001304053 for ; Thu, 24 Mar 2016 01:10:46 -0700 (PDT) X-ASG-Debug-ID: 1458807042-04bdf03cfa44020001-NocioJ Received: from mail-ph.de-nserver.de (mail-ph.de-nserver.de [85.158.179.214]) by cuda.sgi.com with ESMTP id oI3xrBl6pkyfqkom (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 24 Mar 2016 01:10:43 -0700 (PDT) X-Barracuda-Envelope-From: s.priebe@profihost.ag X-Barracuda-Apparent-Source-IP: 85.158.179.214 Received: (qmail 7896 invoked from network); 24 Mar 2016 09:10:41 +0100 X-Fcrdns: No Received: from phoffice.de-nserver.de (HELO [10.11.11.93]) (185.39.223.5) (smtp-auth username hostmaster@profihost.com, mechanism plain) by mail-ph.de-nserver.de (qpsmtpd/0.92) with (ECDHE-RSA-AES256-SHA encrypted) ESMTPSA; Thu, 24 Mar 2016 09:10:41 +0100 Subject: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage To: Brian Foster X-ASG-Orig-Subj: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage References: <56C81D94.7090603@profihost.ag> <20160220144533.GA36182@bfoster.bfoster> <56D9D834.2000303@profihost.ag> <20160304191329.GC3758@bfoster.bfoster> <56D9E9BE.40101@profihost.ag> <20160304210341.GA8035@bfoster.bfoster> <20160305224845.GR30721@dastard> <56F299E3.4020703@profihost.ag> <20160323140736.GD43073@bfoster.bfoster> Cc: Dave Chinner , linux-fsdevel@vger.kernel.org, "xfs-masters@oss.sgi.com" , "xfs@oss.sgi.com" From: Stefan Priebe - Profihost AG Message-ID: <56F3A101.1020300@profihost.ag> Date: Thu, 24 Mar 2016 09:10:41 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 MIME-Version: 1.0 In-Reply-To: <20160323140736.GD43073@bfoster.bfoster> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-User-Auth: Auth by hostmaster@profihost.com through 185.39.223.5 X-Barracuda-Connect: mail-ph.de-nserver.de[85.158.179.214] X-Barracuda-Start-Time: 1458807043 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28114 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Am 23.03.2016 um 15:07 schrieb Brian Foster: > On Wed, Mar 23, 2016 at 02:28:03PM +0100, Stefan Priebe - Profihost AG wrote: >> sorry new one the last one got mangled. Comments inside. >> >> Am 05.03.2016 um 23:48 schrieb Dave Chinner: >>> On Fri, Mar 04, 2016 at 04:03:42PM -0500, Brian Foster wrote: >>>> On Fri, Mar 04, 2016 at 09:02:06PM +0100, Stefan Priebe wrote: >>>>> Am 04.03.2016 um 20:13 schrieb Brian Foster: >>>>>> On Fri, Mar 04, 2016 at 07:47:16PM +0100, Stefan Priebe wrote: >>>>>>> Am 20.02.2016 um 19:02 schrieb Stefan Priebe - Profihost AG: >>>>>>>> >>>>>>>>> Am 20.02.2016 um 15:45 schrieb Brian Foster : >>>>>>>>> >>>>>>>>>> On Sat, Feb 20, 2016 at 09:02:28AM +0100, Stefan Priebe wrote: > ... >> >> This has happened again on 8 different hosts in the last 24 hours >> running 4.4.6. >> >> All of those are KVM / Qemu hosts and are doing NO I/O except the normal >> OS stuff as the VMs have remote storage. So no database, no rsync on >> those hosts - just the OS doing nearly nothing. >> >> All those show: >> [153360.287040] WARNING: CPU: 0 PID: 109 at fs/xfs/xfs_aops.c:1234 >> xfs_vm_releasepage+0xe2/0xf0() >> > > Ok, well at this point the warning isn't telling us anything beyond > you're reproducing the problem. We can't really make progress without > more information. We don't necessarily know what application or > operations caused this by the time it occurs, but perhaps knowing what > file is affected could give us a hint. > > We have the xfs_releasepage tracepoint, but that's unconditional and so > might generate a lot of noise by default. Could you enable the > xfs_releasepage tracepoint and hunt for instances where delalloc != 0? > E.g., we could leave a long running 'trace-cmd record -e > "xfs:xfs_releasepage" ' command on several boxes and wait for the > problem to occur. Alternatively (and maybe easier), run 'trace-cmd start > -e "xfs:xfs_releasepage"' and leave something like 'cat > /sys/kernel/debug/tracing/trace_pipe | grep -v "delalloc 0" > > ~/trace.out' running to capture instances. > > If we can get a tracepoint hit, it will include the inode number and > something like 'find / -inum ' can point us at the file. thanks - need to compile trace-cmd first. Do you know if and how it influences performance? Stefan > > Brian > >> Stefan >> >>> >>> -Dave. >>> >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs From s.priebe@profihost.ag Thu Mar 24 03:15:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=unavailable version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 23B207CA1 for ; Thu, 24 Mar 2016 03:15:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E73883040FE for ; Thu, 24 Mar 2016 01:15:31 -0700 (PDT) X-ASG-Debug-ID: 1458807316-04cbb05f36439b0001-NocioJ Received: from mail-ph.de-nserver.de (mail-ph.de-nserver.de [85.158.179.214]) by cuda.sgi.com with ESMTP id sqp7Ah0KzmftSBny (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 24 Mar 2016 01:15:17 -0700 (PDT) X-Barracuda-Envelope-From: s.priebe@profihost.ag X-Barracuda-Apparent-Source-IP: 85.158.179.214 Received: (qmail 8979 invoked from network); 24 Mar 2016 09:15:15 +0100 X-Fcrdns: No Received: from phoffice.de-nserver.de (HELO [10.11.11.93]) (185.39.223.5) (smtp-auth username hostmaster@profihost.com, mechanism plain) by mail-ph.de-nserver.de (qpsmtpd/0.92) with (ECDHE-RSA-AES256-SHA encrypted) ESMTPSA; Thu, 24 Mar 2016 09:15:15 +0100 Subject: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage To: Brian Foster X-ASG-Orig-Subj: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage References: <56C81D94.7090603@profihost.ag> <20160220144533.GA36182@bfoster.bfoster> <56D9D834.2000303@profihost.ag> <20160304191329.GC3758@bfoster.bfoster> <56D9E9BE.40101@profihost.ag> <20160304210341.GA8035@bfoster.bfoster> <20160305224845.GR30721@dastard> <56F299E3.4020703@profihost.ag> <20160323140736.GD43073@bfoster.bfoster> <56F3A101.1020300@profihost.ag> Cc: Dave Chinner , linux-fsdevel@vger.kernel.org, "xfs-masters@oss.sgi.com" , "xfs@oss.sgi.com" From: Stefan Priebe - Profihost AG Message-ID: <56F3A213.2020908@profihost.ag> Date: Thu, 24 Mar 2016 09:15:15 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 MIME-Version: 1.0 In-Reply-To: <56F3A101.1020300@profihost.ag> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-User-Auth: Auth by hostmaster@profihost.com through 185.39.223.5 X-Barracuda-Connect: mail-ph.de-nserver.de[85.158.179.214] X-Barracuda-Start-Time: 1458807316 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28114 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Am 24.03.2016 um 09:10 schrieb Stefan Priebe - Profihost AG: > > Am 23.03.2016 um 15:07 schrieb Brian Foster: >> On Wed, Mar 23, 2016 at 02:28:03PM +0100, Stefan Priebe - Profihost AG wrote: >>> sorry new one the last one got mangled. Comments inside. >>> >>> Am 05.03.2016 um 23:48 schrieb Dave Chinner: >>>> On Fri, Mar 04, 2016 at 04:03:42PM -0500, Brian Foster wrote: >>>>> On Fri, Mar 04, 2016 at 09:02:06PM +0100, Stefan Priebe wrote: >>>>>> Am 04.03.2016 um 20:13 schrieb Brian Foster: >>>>>>> On Fri, Mar 04, 2016 at 07:47:16PM +0100, Stefan Priebe wrote: >>>>>>>> Am 20.02.2016 um 19:02 schrieb Stefan Priebe - Profihost AG: >>>>>>>>> >>>>>>>>>> Am 20.02.2016 um 15:45 schrieb Brian Foster : >>>>>>>>>> >>>>>>>>>>> On Sat, Feb 20, 2016 at 09:02:28AM +0100, Stefan Priebe wrote: >> ... >>> >>> This has happened again on 8 different hosts in the last 24 hours >>> running 4.4.6. >>> >>> All of those are KVM / Qemu hosts and are doing NO I/O except the normal >>> OS stuff as the VMs have remote storage. So no database, no rsync on >>> those hosts - just the OS doing nearly nothing. >>> >>> All those show: >>> [153360.287040] WARNING: CPU: 0 PID: 109 at fs/xfs/xfs_aops.c:1234 >>> xfs_vm_releasepage+0xe2/0xf0() >>> >> >> Ok, well at this point the warning isn't telling us anything beyond >> you're reproducing the problem. We can't really make progress without >> more information. We don't necessarily know what application or >> operations caused this by the time it occurs, but perhaps knowing what >> file is affected could give us a hint. >> >> We have the xfs_releasepage tracepoint, but that's unconditional and so >> might generate a lot of noise by default. Could you enable the >> xfs_releasepage tracepoint and hunt for instances where delalloc != 0? >> E.g., we could leave a long running 'trace-cmd record -e >> "xfs:xfs_releasepage" ' command on several boxes and wait for the >> problem to occur. Alternatively (and maybe easier), run 'trace-cmd start >> -e "xfs:xfs_releasepage"' and leave something like 'cat >> /sys/kernel/debug/tracing/trace_pipe | grep -v "delalloc 0" > >> ~/trace.out' running to capture instances. Isn't the trace a WARN_ONCE? So it does not reoccur or can i check the it in the trace.out even the WARN_ONCE was already triggered? Stefan > > Stefan > >> >> Brian >> >>> Stefan >>> >>>> >>>> -Dave. >>>> >>> >>> _______________________________________________ >>> xfs mailing list >>> xfs@oss.sgi.com >>> http://oss.sgi.com/mailman/listinfo/xfs From n.borisov@siteground.com Thu Mar 24 04:20:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0A4577CA0 for ; Thu, 24 Mar 2016 04:20:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7B2FCAC006 for ; Thu, 24 Mar 2016 02:20:30 -0700 (PDT) X-ASG-Debug-ID: 1458811225-04bdf03cf945b70001-NocioJ Received: from mail-wm0-f50.google.com (mail-wm0-f50.google.com [74.125.82.50]) by cuda.sgi.com with ESMTP id JjmVRCBJRfwA5Dn2 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 24 Mar 2016 02:20:26 -0700 (PDT) X-Barracuda-Envelope-From: n.borisov@siteground.com X-Barracuda-Apparent-Source-IP: 74.125.82.50 Received: by mail-wm0-f50.google.com with SMTP id l68so228485079wml.0 for ; Thu, 24 Mar 2016 02:20:26 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:subject:to:references:cc:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=a+pZ32KYNnySIrUS2JMt6lm+54s0CWrV3x1RD/Be5wM=; b=XOxUzwOVpDjsDvMueRCjpgItrsuQ7YBP+oBq0rwFepooT7MeWektgwX8pRykgE+k2Z kr2Y4GkYB8Am7urNvqPDK9Z1dVB08o1HFY56awc+KFOsrdCL993NWQzYZhSoCQPlMyI5 XCoLnsKYhif1iEmcsWQn13r9xCUZS43PVnouz8M+mvvmn8sMVENTQ1IyGExvqwlHEZY+ 5D+/kkcb2oKn1yciTHqAZwuvZnSlA+ncR9vVg8/0aCnmDOT2v4eX9L3Vz3jyGEjiz/1w 1Qw7QcBJQGEGDlSXFZpj4VtHd2KVS4H2BgwqSKkyd6sY64SpWZbP9CNB42A8sla9I/sa uWHw== X-Gm-Message-State: AD7BkJInBPyS6piI4e1CO7byIQoceBvngB70Otx+9a3N2BZS348ElqwCEIG7AFYk1Nvqq+fQ X-Received: by 10.194.3.110 with SMTP id b14mr8626104wjb.116.1458811225457; Thu, 24 Mar 2016 02:20:25 -0700 (PDT) Received: from localhost.localdomain (admins.1h.com. [82.118.240.130]) by smtp.gmail.com with ESMTPSA id c144sm26039524wmd.12.2016.03.24.02.20.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 24 Mar 2016 02:20:24 -0700 (PDT) Subject: Re: Failing XFS memory allocation To: Dave Chinner , Brian Foster X-ASG-Orig-Subj: Re: Failing XFS memory allocation References: <56F26CCE.6010502@kyup.com> <20160323124312.GB43073@bfoster.bfoster> <56F29279.70600@kyup.com> <20160323131059.GC43073@bfoster.bfoster> <20160323230002.GY30721@dastard> Cc: xfs@oss.sgi.com From: Nikolay Borisov Message-ID: <56F3B157.2060505@kyup.com> Date: Thu, 24 Mar 2016 11:20:23 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.1.0 MIME-Version: 1.0 In-Reply-To: <20160323230002.GY30721@dastard> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-wm0-f50.google.com[74.125.82.50] X-Barracuda-Start-Time: 1458811226 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28116 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 03/24/2016 01:00 AM, Dave Chinner wrote: > On Wed, Mar 23, 2016 at 09:10:59AM -0400, Brian Foster wrote: >> On Wed, Mar 23, 2016 at 02:56:25PM +0200, Nikolay Borisov wrote: >>> On 03/23/2016 02:43 PM, Brian Foster wrote: >>>> On Wed, Mar 23, 2016 at 12:15:42PM +0200, Nikolay Borisov wrote: >> ... >>>> It looks like it's working to add a new extent to the in-core extent >>>> list. If this is the stack associated with the warning message (combined >>>> with the large alloc size), I wonder if there's a fragmentation issue on >>>> the file leading to an excessive number of extents. >>> >>> Yes this is the stack trace associated. >>> >>>> >>>> What does 'xfs_bmap -v /storage/loop/file1' show? >>> >>> It spews a lot of stuff but here is a summary, more detailed info can be >>> provided if you need it: >>> >>> xfs_bmap -v /storage/loop/file1 | wc -l >>> 900908 >>> xfs_bmap -v /storage/loop/file1 | grep -c hole >>> 94568 >>> >>> Also, what would constitute an "excessive number of extents"? >>> >> >> I'm not sure where one would draw the line tbh, it's just a matter of >> having too many extents to the point that it causes problems in terms of >> performance (i.e., reading/modifying the extent list) or such as the >> allocation problem you're running into. As it is, XFS maintains the full >> extent list for an active inode in memory, so that's 800k+ extents that >> it's looking for memory for. >> >> It looks like that is your problem here. 800k or so extents over 878G >> looks to be about 1MB per extent. > > Which I wouldn't call excessive. I use a 1MB extent size hint on all > my VM images as this allows the underlying device to do IOs large > enough to maintain clear to full bandwidth when reading and writing > regions of the underlying image file that are non-contiguous w.r.t. > sequential IO from the guest. > > Mind you, it's not until I use ext4 or btrfs in the guests that I > actually see significant increases in extent size. Rule of thumb in > my testing is that if XFs creates 100k extents in the image file, > ext4 will create 500k, and btrfs will create somewhere between 1m > and 5m extents.... > > i.e. XFS as a guest filesystem gives results in much lower image > file fragmentation that the other options.... > > As it is, yes, the memory allocation problem is with the in-core > extent tree, and we've known about it for some time. The issue is > that as memory gets fragmented, the top level indirection array > grows too large to be allocated as a contiguous chunk. When this > happens really depends on memory load, uptime and the way the extent > tree is being modified. And what about the following completely crazy idea of switching order > 3 allocations to using vmalloc? I know this would incur heavy performance hit, but other than that would it cause correctness issues? Of course I'm not saying this should be implemented in upstream rather whether it's worth it having a go for experimenting with this idea. > > I'm working on prototype patches to convert it to an in-memory btree > but they are far from ready at this point. This isn't straight > forward because all the extent management code assumes extents are > kept in a linear array and can be directly indexed by array offset > rather than file offset. I also want to make sure we can demand page > the extent list if necessary, and that also complicates things like > locking, as we currently assume the extent list is either completely > in memory or not in memory at all. > > Fundamentally, I don't want to repeat the mistakes ext4 and btrfs > have made with their fine-grained in memory extent trees that are > based on rb-trees (e.g. global locks, shrinkers that don't scale or > consume way too much CPU, excessive memory consumption, etc) and so > solving all aspects of the problem in one go is somewhat complex. > And, of course, there's so much other stuff that needs to be done at > the same time, I cannot find much time to work on it at the > moment... > > Cheers, > > Dave. > From BATV+f6ec2c75e7a4e500224e+4596+infradead.org+hch@bombadil.srs.infradead.org Thu Mar 24 04:31:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 06DA37CA1 for ; Thu, 24 Mar 2016 04:31:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id CC2C9304053 for ; Thu, 24 Mar 2016 02:31:31 -0700 (PDT) X-ASG-Debug-ID: 1458811889-04cb6c39173d040001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id IrbOyjkjgmKUadtH (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 24 Mar 2016 02:31:29 -0700 (PDT) X-Barracuda-Envelope-From: BATV+f6ec2c75e7a4e500224e+4596+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 1aj1bz-0003Wc-LI; Thu, 24 Mar 2016 09:31:27 +0000 Date: Thu, 24 Mar 2016 02:31:27 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Brian Foster , Nikolay Borisov , xfs@oss.sgi.com Subject: Re: Failing XFS memory allocation Message-ID: <20160324093127.GA4204@infradead.org> X-ASG-Orig-Subj: Re: Failing XFS memory allocation References: <56F26CCE.6010502@kyup.com> <20160323124312.GB43073@bfoster.bfoster> <56F29279.70600@kyup.com> <20160323131059.GC43073@bfoster.bfoster> <20160323230002.GY30721@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160323230002.GY30721@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458811889 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28115 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Mar 24, 2016 at 10:00:02AM +1100, Dave Chinner wrote: > I'm working on prototype patches to convert it to an in-memory btree > but they are far from ready at this point. This isn't straight > forward because all the extent management code assumes extents are > kept in a linear array and can be directly indexed by array offset > rather than file offset. I also want to make sure we can demand page > the extent list if necessary, and that also complicates things like > locking, as we currently assume the extent list is either completely > in memory or not in memory at all. FYI, I did patches to get rid almost all direct extent array access a while ago, but I never bothered to post it as it seemed to much churn. Have you started that work yet or would it be useful to dust those up again? From BATV+f6ec2c75e7a4e500224e+4596+infradead.org+hch@bombadil.srs.infradead.org Thu Mar 24 04:33:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8C9237CA0 for ; Thu, 24 Mar 2016 04:33:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 556A7304053 for ; Thu, 24 Mar 2016 02:33:49 -0700 (PDT) X-ASG-Debug-ID: 1458812026-04cb6c39193d3c0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id NLGd1D76drnJ8Mwv (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 24 Mar 2016 02:33:46 -0700 (PDT) X-Barracuda-Envelope-From: BATV+f6ec2c75e7a4e500224e+4596+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 1aj1eD-0003tV-Gu; Thu, 24 Mar 2016 09:33:45 +0000 Date: Thu, 24 Mar 2016 02:33:45 -0700 From: Christoph Hellwig To: Nikolay Borisov Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: Failing XFS memory allocation Message-ID: <20160324093345.GA13569@infradead.org> X-ASG-Orig-Subj: Re: Failing XFS memory allocation References: <56F26CCE.6010502@kyup.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="8t9RHnE3ZwKMSgU+" Content-Disposition: inline In-Reply-To: <56F26CCE.6010502@kyup.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458812026 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28115 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS --8t9RHnE3ZwKMSgU+ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi Nikolay, can you give the patch below a spin? While it doesn't solve the root cause it makes many typical uses of kmem_realloc behave less badly, so it should help with at least some of the less dramatic cases of very fragmented files: --8t9RHnE3ZwKMSgU+ Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="0001-xfs-improve-kmem_realloc.patch" >From 4cfef0d21729704c79dc26621a254e507ea372a7 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Thu, 17 Mar 2016 11:15:59 +0100 Subject: xfs: improve kmem_realloc Use krealloc to implement our realloc function. This helps to avoid new allocations if we are still in the slab bucket. At least for the bmap btree root that's actually the common case. This also allows removing the now unused oldsize argument. Signed-off-by: Christoph Hellwig --- fs/xfs/kmem.c | 26 +++++++++++++++----------- fs/xfs/kmem.h | 2 +- fs/xfs/libxfs/xfs_inode_fork.c | 10 +++------- fs/xfs/xfs_log_recover.c | 2 +- fs/xfs/xfs_mount.c | 1 - 5 files changed, 20 insertions(+), 21 deletions(-) diff --git a/fs/xfs/kmem.c b/fs/xfs/kmem.c index 686ba6f..339c696 100644 --- a/fs/xfs/kmem.c +++ b/fs/xfs/kmem.c @@ -93,19 +93,23 @@ kmem_zalloc_large(size_t size, xfs_km_flags_t flags) } void * -kmem_realloc(const void *ptr, size_t newsize, size_t oldsize, - xfs_km_flags_t flags) +kmem_realloc(const void *old, size_t newsize, xfs_km_flags_t flags) { - void *new; + int retries = 0; + gfp_t lflags = kmem_flags_convert(flags); + void *ptr; - new = kmem_alloc(newsize, flags); - if (ptr) { - if (new) - memcpy(new, ptr, - ((oldsize < newsize) ? oldsize : newsize)); - kmem_free(ptr); - } - return new; + do { + ptr = krealloc(old, newsize, lflags); + if (ptr || (flags & (KM_MAYFAIL|KM_NOSLEEP))) + return ptr; + if (!(++retries % 100)) + xfs_err(NULL, + "%s(%u) possible memory allocation deadlock size %zu in %s (mode:0x%x)", + current->comm, current->pid, + newsize, __func__, lflags); + congestion_wait(BLK_RW_ASYNC, HZ/50); + } while (1); } void * diff --git a/fs/xfs/kmem.h b/fs/xfs/kmem.h index d1c66e4..689f746 100644 --- a/fs/xfs/kmem.h +++ b/fs/xfs/kmem.h @@ -62,7 +62,7 @@ kmem_flags_convert(xfs_km_flags_t flags) extern void *kmem_alloc(size_t, xfs_km_flags_t); extern void *kmem_zalloc_large(size_t size, xfs_km_flags_t); -extern void *kmem_realloc(const void *, size_t, size_t, xfs_km_flags_t); +extern void *kmem_realloc(const void *, size_t, xfs_km_flags_t); static inline void kmem_free(const void *ptr) { kvfree(ptr); diff --git a/fs/xfs/libxfs/xfs_inode_fork.c b/fs/xfs/libxfs/xfs_inode_fork.c index 4fbe226..d3d1477 100644 --- a/fs/xfs/libxfs/xfs_inode_fork.c +++ b/fs/xfs/libxfs/xfs_inode_fork.c @@ -542,7 +542,6 @@ xfs_iroot_realloc( new_max = cur_max + rec_diff; new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, new_max); ifp->if_broot = kmem_realloc(ifp->if_broot, new_size, - XFS_BMAP_BROOT_SPACE_CALC(mp, cur_max), KM_SLEEP | KM_NOFS); op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, ifp->if_broot_bytes); @@ -686,7 +685,6 @@ xfs_idata_realloc( ifp->if_u1.if_data = kmem_realloc(ifp->if_u1.if_data, real_size, - ifp->if_real_bytes, KM_SLEEP | KM_NOFS); } } else { @@ -1402,8 +1400,7 @@ xfs_iext_realloc_direct( if (rnew_size != ifp->if_real_bytes) { ifp->if_u1.if_extents = kmem_realloc(ifp->if_u1.if_extents, - rnew_size, - ifp->if_real_bytes, KM_NOFS); + rnew_size, KM_NOFS); } if (rnew_size > ifp->if_real_bytes) { memset(&ifp->if_u1.if_extents[ifp->if_bytes / @@ -1487,9 +1484,8 @@ xfs_iext_realloc_indirect( if (new_size == 0) { xfs_iext_destroy(ifp); } else { - ifp->if_u1.if_ext_irec = (xfs_ext_irec_t *) - kmem_realloc(ifp->if_u1.if_ext_irec, - new_size, size, KM_NOFS); + ifp->if_u1.if_ext_irec = + kmem_realloc(ifp->if_u1.if_ext_irec, new_size, KM_NOFS); } } diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 396565f..bf6e807 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3843,7 +3843,7 @@ xlog_recover_add_to_cont_trans( 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); + ptr = kmem_realloc(old_ptr, 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; diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 536a0ee..654799f 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -89,7 +89,6 @@ xfs_uuid_mount( if (hole < 0) { xfs_uuid_table = kmem_realloc(xfs_uuid_table, (xfs_uuid_table_size + 1) * sizeof(*xfs_uuid_table), - xfs_uuid_table_size * sizeof(*xfs_uuid_table), KM_SLEEP); hole = xfs_uuid_table_size++; } -- 2.1.4 --8t9RHnE3ZwKMSgU+-- From n.borisov@siteground.com Thu Mar 24 04:43:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AD2447CA0 for ; Thu, 24 Mar 2016 04:43:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 693F68F8037 for ; Thu, 24 Mar 2016 02:43:04 -0700 (PDT) X-ASG-Debug-ID: 1458812581-04cbb05f3946180001-NocioJ Received: from mail-wm0-f48.google.com (mail-wm0-f48.google.com [74.125.82.48]) by cuda.sgi.com with ESMTP id jkMOjQh4EWhenlW4 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 24 Mar 2016 02:43:02 -0700 (PDT) X-Barracuda-Envelope-From: n.borisov@siteground.com X-Barracuda-Apparent-Source-IP: 74.125.82.48 Received: by mail-wm0-f48.google.com with SMTP id l68so266473026wml.0 for ; Thu, 24 Mar 2016 02:43: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:subject:to:references:cc:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=+7j60EX1jPwx6Iv6A8yHKO9OXEcZA+tu5ul9WYYf2bc=; b=YfORUamzYNZzaJreldqS5BSwOGEf1c6AIALSfiFjkrvJkqvpIp/A2UmLX9y0Gb788C RelMrDJb7pGHJQSS/XLIaQtCxmTUNudkmM870pGXHj0ARZ/lanupYvxOqrcX8GGmCdJw s1xzkKMSgpzzlQZztJveSjgm4x2b2QbtZuoxpWnpUd6QZI/ieqcvkQIt/Byu5m216eX4 Qntyl03MBCcxvmWaED54m2cJxhYCZmHXkQWrkMHpHoylbuQ6nnSeMcjq6vxA7z6bp+GK MxN/lpiNiPOEB7KBCbi+6uZ0E13oegkW+mhfCWlLUPctg2kmoCiCq+g4rzy6hKSrFMc6 RJUg== X-Gm-Message-State: AD7BkJK1JNPHJYH+FtZzypQ2KUt7pqxZhK6TOEXU1wh96Iu37IqXZydgPoANapnYwcuaypJa X-Received: by 10.194.236.198 with SMTP id uw6mr8755636wjc.42.1458812581412; Thu, 24 Mar 2016 02:43:01 -0700 (PDT) Received: from localhost.localdomain (admins.1h.com. [82.118.240.130]) by smtp.gmail.com with ESMTPSA id w188sm26189633wmw.19.2016.03.24.02.42.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 24 Mar 2016 02:42:58 -0700 (PDT) Subject: Re: Failing XFS memory allocation To: Christoph Hellwig X-ASG-Orig-Subj: Re: Failing XFS memory allocation References: <56F26CCE.6010502@kyup.com> <20160324093345.GA13569@infradead.org> Cc: Dave Chinner , xfs@oss.sgi.com From: Nikolay Borisov Message-ID: <56F3B6A1.4020400@kyup.com> Date: Thu, 24 Mar 2016 11:42:57 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.1.0 MIME-Version: 1.0 In-Reply-To: <20160324093345.GA13569@infradead.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-wm0-f48.google.com[74.125.82.48] X-Barracuda-Start-Time: 1458812582 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28115 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 03/24/2016 11:33 AM, Christoph Hellwig wrote: > Hi Nikolay, > > can you give the patch below a spin? While it doesn't solve the root > cause it makes many typical uses of kmem_realloc behave less badly, > so it should help with at least some of the less dramatic cases of very > fragmented files: > Sure, however I just checked some other servers with analogical setup and there are files which even larger extents (the largest I saw was 2 millions) so I guess in this particular case the memory was fragmented and compaction as invoked from the page allocator couldn't satisfy it. So I don't know if it will help in my particular case but in any case I will give it a go. Thanks From cmaiolino@redhat.com Thu Mar 24 06:09:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 085EE7CA0 for ; Thu, 24 Mar 2016 06:09:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B884E8F804B for ; Thu, 24 Mar 2016 04:09:03 -0700 (PDT) X-ASG-Debug-ID: 1458817742-04bdf03cf948ef0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id K8NaFD4FB6Drtr0X (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 24 Mar 2016 04:09:02 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 1F7C95714 for ; Thu, 24 Mar 2016 11:09:02 +0000 (UTC) Received: from redhat.com (dhcp-26-103.brq.redhat.com [10.34.26.103]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2OB8xrX005538 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 24 Mar 2016 07:09:01 -0400 Date: Thu, 24 Mar 2016 12:08:59 +0100 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Message-ID: <20160324110859.GA20072@redhat.com> X-ASG-Orig-Subj: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Mail-Followup-To: xfs@oss.sgi.com References: <20160322121922.GA53693@bfoster.bfoster> <6457b1d9de271ec6cca6bc2626aac161@mail.gmail.com> <20160322140345.GA54245@bfoster.bfoster> <0f3832c45509f444f55fda2aaf9c9deb@mail.gmail.com> <20160323123010.GA43073@bfoster.bfoster> <20160323153221.GA19456@redhat.com> <20160323223747.GX30721@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160323223747.GX30721@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458817742 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Mar 24, 2016 at 09:37:47AM +1100, Dave Chinner wrote: > On Wed, Mar 23, 2016 at 04:32:21PM +0100, Carlos Maiolino wrote: > > I'm still trying to get a reliable reproducer, at least exactly with what I have > > seen a few days ago. > > > > Shyam, could you try to reproduce it with a recent/upstream kernel? That would > > be great to make sure we have been seen the same issue. > > > > AFAICT, it happens in the following situation: > > > > 1 - Something is written to the filesystem > > 2 - log checkpoint is done for the previous write > > 3 - Disk failure > > 4 - XFS tries to writeback metadata logged in [2] > > > > When [4] happens, I can't trigger xfs_log_force messages all the time, most of > > time I just get an infinite loop in these messages: > > > > [12694.318109] XFS (dm-0): Failing async write on buffer block > > 0xffffffffffffffff. Retrying async write. > > > > Sometimes I can trigger the xfs_log_force() loop. > > This all smells like the filesystem is getting IO errors but it not > in a shutdown state. What happens when you run 'xfs_io -x -c > "shutdown" /mnt/pt' on a filesystem in this state? Can you then > unmount it? > I'll give it a try today, although, I can't do it while umount command is hung, since, before the command get stuck, the mount point is removed from the user namespace, so I have no access to the mountpoint from userspace while the command is 'running'. > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From jtulak@redhat.com Thu Mar 24 06:15:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F32E17CA0 for ; Thu, 24 Mar 2016 06:15:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id BE2BE30405F for ; Thu, 24 Mar 2016 04:15:41 -0700 (PDT) X-ASG-Debug-ID: 1458818140-04cbb05f3648ca0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cDuOXpJbAsrF4JBa (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 24 Mar 2016 04:15:41 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 59364C04FF86 for ; Thu, 24 Mar 2016 11:15:40 +0000 (UTC) Received: from localhost.localdomain (vpn1-7-36.ams2.redhat.com [10.36.7.36]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2OBFbL8009274 for ; Thu, 24 Mar 2016 07:15:39 -0400 From: jtulak@redhat.com To: xfs@oss.sgi.com Subject: [PATCH 02/19] mkfs: sanitise ftype parameter values. Date: Thu, 24 Mar 2016 12:15:19 +0100 X-ASG-Orig-Subj: [PATCH 02/19] mkfs: sanitise ftype parameter values. Message-Id: <1458818136-56043-3-git-send-email-jtulak@redhat.com> In-Reply-To: <1458818136-56043-1-git-send-email-jtulak@redhat.com> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458818140 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner Because passing "-n ftype=2" should fail. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak Reviewed-by: Brian Foster --- mkfs/xfs_mkfs.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 36e5b4f..979a860 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -1596,7 +1596,15 @@ main( reqval('n', nopts, N_FTYPE); if (nftype) respec('n', nopts, N_FTYPE); - dirftype = atoi(value); + c = atoi(value); + if (c < 0 || c > 1) + illegal(value, "n ftype"); + if (crcs_enabled) { + fprintf(stderr, +_("cannot specify both crc and ftype\n")); + usage(); + } + dirftype = c; nftype = 1; break; default: -- 2.6.0 From jtulak@redhat.com Thu Mar 24 06:15:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 493497CA1 for ; Thu, 24 Mar 2016 06:15:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 084F68F804C for ; Thu, 24 Mar 2016 04:15:41 -0700 (PDT) X-ASG-Debug-ID: 1458818139-04cbb05f3848ca0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id SCGhZkQ3baJ2wR9z (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 24 Mar 2016 04:15:40 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 68F026438E for ; Thu, 24 Mar 2016 11:15:39 +0000 (UTC) Received: from localhost.localdomain (vpn1-7-36.ams2.redhat.com [10.36.7.36]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2OBFbL7009274 for ; Thu, 24 Mar 2016 07:15:38 -0400 From: jtulak@redhat.com To: xfs@oss.sgi.com Subject: [PATCH 01/19] xfsprogs: use common code for multi-disk detection Date: Thu, 24 Mar 2016 12:15:18 +0100 X-ASG-Orig-Subj: [PATCH 01/19] xfsprogs: use common code for multi-disk detection Message-Id: <1458818136-56043-2-git-send-email-jtulak@redhat.com> In-Reply-To: <1458818136-56043-1-git-send-email-jtulak@redhat.com> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 24 Mar 2016 11:15:39 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458818139 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner CHANGELOG: o Remove nonexistent headers from LIBHFILES in include/Makefile o Remove a useless assignment which was immediately overwritten on the next line. o Rename include/xfs_mkfs.h global header to include/xfs_multidisk.h, because we need it just for multidisk configuration o Fix AG count for size thresholds to keep consistency Both xfs_repair and mkfs.xfs need to agree on what is a "multidisk: configuration - mkfs for determining the AG count of the filesystem, repair for determining how to automatically parallelise it's execution. This requires a bunch of common defines that both mkfs and reapir need to share. In fact, most of the defines in xfs_mkfs.h could be shared with other programs (i.e. all the defaults mkfs uses) and so it is simplest to move xfs_mkfs.h to the shared include directory and add the new defines to it directly. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak --- include/Makefile | 5 ++- include/xfs_multidisk.h | 98 +++++++++++++++++++++++++++++++++++++++++++++++++ mkfs/Makefile | 2 +- mkfs/maxtrres.c | 2 +- mkfs/proto.c | 2 +- mkfs/xfs_mkfs.c | 56 ++++++++++++++-------------- mkfs/xfs_mkfs.h | 89 -------------------------------------------- repair/xfs_repair.c | 44 +++++++++++++++++++++- 8 files changed, 176 insertions(+), 122 deletions(-) create mode 100644 include/xfs_multidisk.h delete mode 100644 mkfs/xfs_mkfs.h diff --git a/include/Makefile b/include/Makefile index 6148756..5fb443a 100644 --- a/include/Makefile +++ b/include/Makefile @@ -33,13 +33,16 @@ LIBHFILES = libxfs.h \ xfs_log_recover.h \ xfs_metadump.h \ xfs_mount.h \ + xfs_quota_defs.h \ + xfs_sb.h \ + xfs_shared.h \ xfs_trace.h \ xfs_trans.h \ command.h \ input.h \ path.h \ project.h \ - platform_defs.h \ + platform_defs.h HFILES = handle.h \ jdm.h \ diff --git a/include/xfs_multidisk.h b/include/xfs_multidisk.h new file mode 100644 index 0000000..4006a01 --- /dev/null +++ b/include/xfs_multidisk.h @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2000-2001,2004-2005 Silicon Graphics, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef __XFS_MULTIDISK_H__ +#define __XFS_MULTIDISK_H__ + +#define XFS_DFL_SB_VERSION_BITS \ + (XFS_SB_VERSION_NLINKBIT | \ + XFS_SB_VERSION_EXTFLGBIT | \ + XFS_SB_VERSION_DIRV2BIT) + +#define XFS_SB_VERSION_MKFS(crc,ia,dia,log2,attr1,sflag,ci,more) (\ + ((crc)||(ia)||(dia)||(log2)||(attr1)||(sflag)||(ci)||(more)) ? \ + (((crc) ? XFS_SB_VERSION_5 : XFS_SB_VERSION_4) | \ + ((ia) ? XFS_SB_VERSION_ALIGNBIT : 0) | \ + ((dia) ? XFS_SB_VERSION_DALIGNBIT : 0) | \ + ((log2) ? XFS_SB_VERSION_LOGV2BIT : 0) | \ + ((attr1) ? XFS_SB_VERSION_ATTRBIT : 0) | \ + ((sflag) ? XFS_SB_VERSION_SECTORBIT : 0) | \ + ((ci) ? XFS_SB_VERSION_BORGBIT : 0) | \ + ((more) ? XFS_SB_VERSION_MOREBITSBIT : 0) | \ + XFS_DFL_SB_VERSION_BITS | \ + 0 ) : XFS_SB_VERSION_1 ) + +#define XFS_SB_VERSION2_MKFS(crc, lazycount, attr2, projid32bit, parent, \ + ftype) (\ + ((lazycount) ? XFS_SB_VERSION2_LAZYSBCOUNTBIT : 0) | \ + ((attr2) ? XFS_SB_VERSION2_ATTR2BIT : 0) | \ + ((projid32bit) ? XFS_SB_VERSION2_PROJID32BIT : 0) | \ + ((parent) ? XFS_SB_VERSION2_PARENTBIT : 0) | \ + ((crc) ? XFS_SB_VERSION2_CRCBIT : 0) | \ + ((ftype) ? XFS_SB_VERSION2_FTYPE : 0) | \ + 0 ) + +#define XFS_DFL_BLOCKSIZE_LOG 12 /* 4096 byte blocks */ +#define XFS_DINODE_DFL_LOG 8 /* 256 byte inodes */ +#define XFS_DINODE_DFL_CRC_LOG 9 /* 512 byte inodes for CRCs */ +#define XFS_MIN_DATA_BLOCKS 100 +#define XFS_MIN_INODE_PERBLOCK 2 /* min inodes per block */ +#define XFS_DFL_IMAXIMUM_PCT 25 /* max % of space for inodes */ +#define XFS_IFLAG_ALIGN 1 /* -i align defaults on */ +#define XFS_MIN_REC_DIRSIZE 12 /* 4096 byte dirblocks (V2) */ +#define XFS_DFL_DIR_VERSION 2 /* default directory version */ +#define XFS_DFL_LOG_SIZE 1000 /* default log size, blocks */ +#define XFS_DFL_LOG_FACTOR 5 /* default log size, factor */ + /* with max trans reservation */ +#define XFS_MAX_INODE_SIG_BITS 32 /* most significant bits in an + * inode number that we'll + * accept w/o warnings + */ + +#define XFS_AG_BYTES(bblog) ((long long)BBSIZE << (bblog)) +#define XFS_AG_MIN_BYTES ((XFS_AG_BYTES(15))) /* 16 MB */ +#define XFS_AG_MIN_BLOCKS(blog) ((XFS_AG_BYTES(15)) >> (blog)) +#define XFS_AG_MAX_BLOCKS(blog) ((XFS_AG_BYTES(31) - 1) >> (blog)) + +#define XFS_MAX_AGNUMBER ((xfs_agnumber_t)(NULLAGNUMBER - 1)) + +/* + * These values define what we consider a "multi-disk" filesystem. That is, a + * filesystem that is likely to be made up of multiple devices, and hence have + * some level of parallelism avoid to it at the IO level. + */ +#define XFS_MULTIDISK_AGLOG 5 /* 32 AGs */ +#define XFS_NOMULTIDISK_AGLOG 2 /* 4 AGs */ +#define XFS_MULTIDISK_AGCOUNT (1 << XFS_MULTIDISK_AGLOG) + + +/* xfs_mkfs.c */ +extern int isdigits (char *str); +extern long long cvtnum (unsigned int blocksize, + unsigned int sectorsize, char *s); + +/* proto.c */ +extern char *setup_proto (char *fname); +extern void parse_proto (xfs_mount_t *mp, struct fsxattr *fsx, char **pp); +extern void res_failed (int err); + +/* maxtrres.c */ +extern int max_trans_res (int crcs_enabled, int dirversion, + int sectorlog, int blocklog, int inodelog, int dirblocklog, + int logversion, int log_sunit, int finobt); + +#endif /* __XFS_MULTIDISK_H__ */ diff --git a/mkfs/Makefile b/mkfs/Makefile index 570ab07..63ba4ec 100644 --- a/mkfs/Makefile +++ b/mkfs/Makefile @@ -7,7 +7,7 @@ include $(TOPDIR)/include/builddefs LTCOMMAND = mkfs.xfs -HFILES = xfs_mkfs.h +HFILES = CFILES = maxtrres.c proto.c xfs_mkfs.c LLDLIBS += $(LIBBLKID) $(LIBXFS) $(LIBUUID) $(LIBRT) $(LIBPTHREAD) diff --git a/mkfs/maxtrres.c b/mkfs/maxtrres.c index b97d020..f48a0f7 100644 --- a/mkfs/maxtrres.c +++ b/mkfs/maxtrres.c @@ -25,7 +25,7 @@ */ #include "libxfs.h" -#include "xfs_mkfs.h" +#include "xfs_multidisk.h" int max_trans_res( diff --git a/mkfs/proto.c b/mkfs/proto.c index 21960d5..50d5e94 100644 --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -18,7 +18,7 @@ #include "libxfs.h" #include -#include "xfs_mkfs.h" +#include "xfs_multidisk.h" /* * Prototypes for internal functions. diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 4c3a802..36e5b4f 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -21,7 +21,7 @@ #ifdef ENABLE_BLKID # include #endif /* ENABLE_BLKID */ -#include "xfs_mkfs.h" +#include "xfs_multidisk.h" /* * Device topology information. @@ -664,43 +664,45 @@ calc_default_ag_geometry( } /* - * For the remainder we choose an AG size based on the - * number of data blocks available, trying to keep the - * number of AGs relatively small (especially compared - * to the original algorithm). AG count is calculated - * based on the preferred AG size, not vice-versa - the - * count can be increased by growfs, so prefer to use - * smaller counts at mkfs time. - * - * For a single underlying storage device between 128MB - * and 4TB in size, just use 4 AGs, otherwise scale up - * smoothly between min/max AG sizes. + * For a single underlying storage device between 128MB and 4TB in size + * just use 4 AGs and scale up smoothly between min/max AG sizes. */ - - if (!multidisk && dblocks >= MEGABYTES(128, blocklog)) { + if (!multidisk) { if (dblocks >= TERABYTES(4, blocklog)) { blocks = XFS_AG_MAX_BLOCKS(blocklog); goto done; + } else if (dblocks >= MEGABYTES(128, blocklog)) { + shift = XFS_NOMULTIDISK_AGLOG; + goto calc_blocks; } - shift = 2; - } else if (dblocks > GIGABYTES(512, blocklog)) - shift = 5; - else if (dblocks > GIGABYTES(8, blocklog)) - shift = 4; - else if (dblocks >= MEGABYTES(128, blocklog)) - shift = 3; - else if (dblocks >= MEGABYTES(64, blocklog)) - shift = 2; - else if (dblocks >= MEGABYTES(32, blocklog)) - shift = 1; - else - shift = 0; + } + + /* + * For the multidisk configs we choose an AG count based on the number + * of data blocks available, trying to keep the number of AGs higher + * than the single disk configurations. This makes the assumption that + * larger filesystems have more parallelism available to them. + */ + shift = XFS_MULTIDISK_AGLOG; + if (dblocks <= GIGABYTES(512, blocklog)) + shift--; + if (dblocks <= GIGABYTES(8, blocklog)) + shift--; + if (dblocks < MEGABYTES(128, blocklog)) + shift--; + if (dblocks < MEGABYTES(64, blocklog)) + shift--; + if (dblocks < MEGABYTES(32, blocklog)) + shift--; + /* * If dblocks is not evenly divisible by the number of * desired AGs, round "blocks" up so we don't lose the * last bit of the filesystem. The same principle applies * to the AG count, so we don't lose the last AG! */ +calc_blocks: + ASSERT(shift >= 0 && shift <= XFS_MULTIDISK_AGLOG); blocks = dblocks >> shift; if (dblocks & xfs_mask32lo(shift)) { if (blocks < XFS_AG_MAX_BLOCKS(blocklog)) diff --git a/mkfs/xfs_mkfs.h b/mkfs/xfs_mkfs.h deleted file mode 100644 index 128068e..0000000 --- a/mkfs/xfs_mkfs.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2000-2001,2004-2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_MKFS_H__ -#define __XFS_MKFS_H__ - -#define XFS_DFL_SB_VERSION_BITS \ - (XFS_SB_VERSION_NLINKBIT | \ - XFS_SB_VERSION_EXTFLGBIT | \ - XFS_SB_VERSION_DIRV2BIT) - -#define XFS_SB_VERSION_MKFS(crc,ia,dia,log2,attr1,sflag,ci,more) (\ - ((crc)||(ia)||(dia)||(log2)||(attr1)||(sflag)||(ci)||(more)) ? \ - (((crc) ? XFS_SB_VERSION_5 : XFS_SB_VERSION_4) | \ - ((ia) ? XFS_SB_VERSION_ALIGNBIT : 0) | \ - ((dia) ? XFS_SB_VERSION_DALIGNBIT : 0) | \ - ((log2) ? XFS_SB_VERSION_LOGV2BIT : 0) | \ - ((attr1) ? XFS_SB_VERSION_ATTRBIT : 0) | \ - ((sflag) ? XFS_SB_VERSION_SECTORBIT : 0) | \ - ((ci) ? XFS_SB_VERSION_BORGBIT : 0) | \ - ((more) ? XFS_SB_VERSION_MOREBITSBIT : 0) | \ - XFS_DFL_SB_VERSION_BITS | \ - 0 ) : XFS_SB_VERSION_1 ) - -#define XFS_SB_VERSION2_MKFS(crc, lazycount, attr2, projid32bit, parent, \ - ftype) (\ - ((lazycount) ? XFS_SB_VERSION2_LAZYSBCOUNTBIT : 0) | \ - ((attr2) ? XFS_SB_VERSION2_ATTR2BIT : 0) | \ - ((projid32bit) ? XFS_SB_VERSION2_PROJID32BIT : 0) | \ - ((parent) ? XFS_SB_VERSION2_PARENTBIT : 0) | \ - ((crc) ? XFS_SB_VERSION2_CRCBIT : 0) | \ - ((ftype) ? XFS_SB_VERSION2_FTYPE : 0) | \ - 0 ) - -#define XFS_DFL_BLOCKSIZE_LOG 12 /* 4096 byte blocks */ -#define XFS_DINODE_DFL_LOG 8 /* 256 byte inodes */ -#define XFS_DINODE_DFL_CRC_LOG 9 /* 512 byte inodes for CRCs */ -#define XFS_MIN_DATA_BLOCKS 100 -#define XFS_MIN_INODE_PERBLOCK 2 /* min inodes per block */ -#define XFS_DFL_IMAXIMUM_PCT 25 /* max % of space for inodes */ -#define XFS_IFLAG_ALIGN 1 /* -i align defaults on */ -#define XFS_MIN_REC_DIRSIZE 12 /* 4096 byte dirblocks (V2) */ -#define XFS_DFL_DIR_VERSION 2 /* default directory version */ -#define XFS_DFL_LOG_SIZE 1000 /* default log size, blocks */ -#define XFS_DFL_LOG_FACTOR 5 /* default log size, factor */ - /* with max trans reservation */ -#define XFS_MAX_INODE_SIG_BITS 32 /* most significant bits in an - * inode number that we'll - * accept w/o warnings - */ - -#define XFS_AG_BYTES(bblog) ((long long)BBSIZE << (bblog)) -#define XFS_AG_MIN_BYTES ((XFS_AG_BYTES(15))) /* 16 MB */ -#define XFS_AG_MIN_BLOCKS(blog) ((XFS_AG_BYTES(15)) >> (blog)) -#define XFS_AG_MAX_BLOCKS(blog) ((XFS_AG_BYTES(31) - 1) >> (blog)) - -#define XFS_MAX_AGNUMBER ((xfs_agnumber_t)(NULLAGNUMBER - 1)) - - -/* xfs_mkfs.c */ -extern int isdigits (char *str); -extern long long cvtnum (unsigned int blocksize, - unsigned int sectorsize, char *s); - -/* proto.c */ -extern char *setup_proto (char *fname); -extern void parse_proto (xfs_mount_t *mp, struct fsxattr *fsx, char **pp); -extern void res_failed (int err); - -/* maxtrres.c */ -extern int max_trans_res (int crcs_enabled, int dirversion, - int sectorlog, int blocklog, int inodelog, int dirblocklog, - int logversion, int log_sunit, int finobt); - -#endif /* __XFS_MKFS_H__ */ diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index 5d5f3aa..9d91f2d 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -19,6 +19,7 @@ #include "libxfs.h" #include "libxlog.h" #include +#include "xfs_multidisk.h" #include "avl.h" #include "avl64.h" #include "globals.h" @@ -589,6 +590,33 @@ format_log_max_lsn( XLOG_FMT, new_cycle, true); } +/* + * mkfs increases the AG count for "multidisk" configurations, we want + * to target these for an increase in thread count. Hence check the superlock + * geometry information to determine if mkfs considered this a multidisk + * configuration. + */ +static bool +is_multidisk_filesystem( + struct xfs_mount *mp) +{ + struct xfs_sb *sbp = &mp->m_sb; + + /* High agcount filesystems are always considered "multidisk" */ + if (sbp->sb_agcount >= XFS_MULTIDISK_AGCOUNT) + return true; + + /* + * If it doesn't have a sunit/swidth, mkfs didn't consider it a + * multi-disk array, so we don't either. + */ + if (!sbp->sb_unit) + return false; + + ASSERT(sbp->sb_width); + return true; +} + int main(int argc, char **argv) { @@ -729,9 +757,21 @@ main(int argc, char **argv) * threads/CPU as this is enough threads to saturate a CPU on fast * devices, yet few enough that it will saturate but won't overload slow * devices. + * + * Multidisk filesystems can handle more IO parallelism so we should try + * to process multiple AGs at a time in such a configuration to try to + * saturate the underlying storage and speed the repair process. Only do + * this if prefetching is enabled. */ - if (!ag_stride && glob_agcount >= 16 && do_prefetch) - ag_stride = 15; + if (!ag_stride && do_prefetch && is_multidisk_filesystem(mp)) { + /* + * For small agcount multidisk systems, just double the + * parallelism. For larger AG count filesystems (32 and above) + * use more parallelism, and linearly increase the parallelism + * with the number of AGs. + */ + ag_stride = min(glob_agcount, XFS_MULTIDISK_AGCOUNT / 2) - 1; + } if (ag_stride) { int max_threads = platform_nproc() * 8; -- 2.6.0 From jtulak@redhat.com Thu Mar 24 06:15:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 705797CA6 for ; Thu, 24 Mar 2016 06:15:43 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4202130405F for ; Thu, 24 Mar 2016 04:15:40 -0700 (PDT) X-ASG-Debug-ID: 1458818138-04cbb05f3948ca0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id s7k7vHhIxkrL8pyw (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 24 Mar 2016 04:15:39 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 79EDF64373 for ; Thu, 24 Mar 2016 11:15:38 +0000 (UTC) Received: from localhost.localdomain (vpn1-7-36.ams2.redhat.com [10.36.7.36]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2OBFbL6009274 for ; Thu, 24 Mar 2016 07:15:37 -0400 From: jtulak@redhat.com To: xfs@oss.sgi.com Subject: [PATCH 00/19] mkfs cleaning Date: Thu, 24 Mar 2016 12:15:17 +0100 X-ASG-Orig-Subj: [PATCH 00/19] mkfs cleaning Message-Id: <1458818136-56043-1-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 24 Mar 2016 11:15:38 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458818139 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Jan Tulak Hi guys, a new iteration of this patchset after a long time. (Jump down to the quote of the original post from Dave who started this set.) I tried to solve all the issues you mentioned the last time (thanks for them!) and I went also through more intense testing. As far as I'm aware, the only few occassions where xfstests currently fails with this patchset is because I fixed some wrong/not ideal behaviour in the original code. It should be clean also from Coverity's point of view. Some tests which now fails and will need a change are xfs/078, 206, 216 and 217. See "[PATCH 15/19] mkfs: don't treat files as though they are block devices" for more details Each specific patch has a changelog of the things chaged in it since the last version. I hope that this patchset is getting into a reasonable form. While it doesn't clean everything, it greately cleans some parts of mkfs and fixes some issues. And to remind what this patchset is about, here is the original Dave's email. > Hi folks, >⣠> This is still a work in progress, but is compelte enough to get > feedback on the general structure. The problem being solved here is > that mkfs does a terrible job of input validation from the command > line, has huge amounts of repeated code in the sub options > processing loops and has many, many unnecessary variable for > tracking simply things like whether a parameter was specified. >⣠> This patchset introduces a parameter table structure that is used to > define the parameters and their constraints. Things like minimum and > maximum valid values, default values, conflicting options, etc are > all contained within the table, so all the "policy" is found in a > single place. >⣠> This greatly reduces the complexity of the option parsing loop. It > doesn't remove all the complexity (yet) because many of the options > have special cases or more complex conflicts than I've yet added > support for. The idea is, however, that all of the sub-option > parameter setup will eventually end up being implemented as a > generic loop as the parameter structure will hold all the > information about in the input parameters. >⣠> To get there, the parameter table still needs more work - it needs > to hold the value/string for the parameter, and we need to reference > those in the code. >⣠> The flow on effect of this is that we can remove the many, many > individual variables and start passing the option structures to > functions rather than avoiding using functions because passing so > many variables is messy and nasty. IOWs, it lays the groundwork for > factoring xfs_mkfs.c into something more than a bunch of spagetti... >⣠> Anyway, have a look and see what you think about progress so far. >⣠> FWIW, the first patch is following up on the multi-disk discussion > Christoph and I had, and the last patch in the series covers all the > issues that arose with "-d file" and treating files like block > devices.... >⣠> Cheers, >⣠> Dave. Dave Chinner (15): xfsprogs: use common code for multi-disk detection mkfs: sanitise ftype parameter values. mkfs: Sanitise the superblock feature macros mkfs: validate all input values mkfs: factor boolean option parsing mkfs: validate logarithmic parameters sanely mkfs: structify input parameter passing mkfs: getbool is redundant mkfs: use getnum_checked for all ranged parameters mkfs: add respecification detection to generic parsing mkfs: table based parsing for converted parameters mkfs: merge getnum mkfs: encode conflicts into parsing table mkfs: add string options to generic parsing mkfs: don't treat files as though they are block devices Jan Tulak (4): mkfs: move spinodes crc check xfsprogs: disable truncating of files mkfs: unit conversions are case insensitive mkfs: add optional 'reason' for illegal_option include/Makefile | 5 +- include/xfs_multidisk.h | 73 ++ libxfs/init.c | 14 +- libxfs/linux.c | 12 +- man/man8/mkfs.xfs.8 | 37 +- mkfs/Makefile | 2 +- mkfs/maxtrres.c | 2 +- mkfs/proto.c | 58 +- mkfs/xfs_mkfs.c | 2003 +++++++++++++++++++++++++++++------------------ mkfs/xfs_mkfs.h | 89 --- repair/xfs_repair.c | 44 +- 11 files changed, 1437 insertions(+), 902 deletions(-) create mode 100644 include/xfs_multidisk.h delete mode 100644 mkfs/xfs_mkfs.h -- 2.6.0 From jtulak@redhat.com Thu Mar 24 06:15:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9F7547CA6 for ; Thu, 24 Mar 2016 06:15:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 67272304062 for ; Thu, 24 Mar 2016 04:15:45 -0700 (PDT) X-ASG-Debug-ID: 1458818143-04cbb05f3648cb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id bIQ9S2b0gpewNSPS (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 24 Mar 2016 04:15:43 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 386B68E231 for ; Thu, 24 Mar 2016 11:15:43 +0000 (UTC) Received: from localhost.localdomain (vpn1-7-36.ams2.redhat.com [10.36.7.36]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2OBFbLB009274 for ; Thu, 24 Mar 2016 07:15:42 -0400 From: jtulak@redhat.com To: xfs@oss.sgi.com Subject: [PATCH 05/19] mkfs: factor boolean option parsing Date: Thu, 24 Mar 2016 12:15:22 +0100 X-ASG-Orig-Subj: [PATCH 05/19] mkfs: factor boolean option parsing Message-Id: <1458818136-56043-6-git-send-email-jtulak@redhat.com> In-Reply-To: <1458818136-56043-1-git-send-email-jtulak@redhat.com> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458818143 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner UPDATE: - add a forgotten getbool update to FINOBT - change -m crc and ftype to enable by specifying (instead of toggle off) Many of the options passed to mkfs have boolean options (0 or 1) and all hand roll the same code and validity checks. Factor these out into a common function. Note that the lazy-count option is now changed to match other booleans in that if you don't specify a value, it reverts to the default value (on) rather than throwing an error. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak --- mkfs/xfs_mkfs.c | 109 +++++++++++++++++++++++--------------------------------- 1 file changed, 44 insertions(+), 65 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 4811d77..9394bd3 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -38,7 +38,7 @@ struct fs_topology { * Prototypes for internal functions. */ static void conflict(char opt, char *tab[], int oldidx, int newidx); -static void illegal(char *value, char *opt); +static void illegal(const char *value, const char *opt); static __attribute__((noreturn)) void usage (void); static __attribute__((noreturn)) void reqval(char opt, char *tab[], int idx); static void respec(char opt, char *tab[], int idx); @@ -1006,6 +1006,21 @@ getnum( return i; } +static bool +getbool( + const char *str, + const char *illegal_str, + bool default_val) +{ + long long c; + + if (!str || *str == '\0') + return default_val; + c = getnum(str, 0, 0, false); + if (c < 0 || c > 1) + illegal(str, illegal_str); + return c ? true : false; +} int main( @@ -1226,11 +1241,8 @@ main( dasize = 1; break; case D_FILE: - if (!value || *value == '\0') - value = "1"; - xi.disfile = getnum(value, 0, 0, false); - if (xi.disfile < 0 || xi.disfile > 1) - illegal(value, "d file"); + xi.disfile = getbool(value, "d file", + true); if (xi.disfile && !Nflag) xi.dcreat = 1; break; @@ -1373,12 +1385,8 @@ main( switch (getsubopt(&p, (constpp)iopts, &value)) { case I_ALIGN: - if (!value || *value == '\0') - reqval('i', iopts, I_ALIGN); - c = getnum(value, 0, 0, false); - if (c < 0 || c > 1) - illegal(value, "i align"); - sb_feat.inode_align = c ? true : false; + sb_feat.inode_align = getbool( + value, "i align", true); break; case I_LOG: if (!value || *value == '\0') @@ -1451,12 +1459,8 @@ main( sb_feat.attr_version = c; break; case I_PROJID32BIT: - if (!value || *value == '\0') - value = "0"; - c = getnum(value, 0, 0, false); - if (c < 0 || c > 1) - illegal(value, "i projid32bit"); - sb_feat.projid16bit = c ? false : true; + sb_feat.projid16bit = !getbool(value, + "i projid32bit", false); break; case I_SPINODES: if (!value || *value == '\0') @@ -1492,20 +1496,15 @@ main( laflag = 1; break; case L_FILE: - if (!value || *value == '\0') - value = "1"; if (loginternal) conflict('l', lopts, L_INTERNAL, L_FILE); - xi.lisfile = getnum(value, 0, 0, false); - if (xi.lisfile < 0 || xi.lisfile > 1) - illegal(value, "l file"); + xi.lisfile = getbool(value, "l file", + true); if (xi.lisfile) xi.lcreat = 1; break; case L_INTERNAL: - if (!value || *value == '\0') - value = "1"; if (ldflag) conflict('l', lopts, L_INTERNAL, L_DEV); if (xi.lisfile) @@ -1513,9 +1512,9 @@ main( L_INTERNAL); if (liflag) respec('l', lopts, L_INTERNAL); - loginternal = getnum(value, 0, 0, false); - if (loginternal < 0 || loginternal > 1) - illegal(value, "l internal"); + + loginternal = getbool(value, + "l internal", true); liflag = 1; break; case L_SU: @@ -1605,14 +1604,9 @@ main( lssflag = 1; break; case L_LAZYSBCNTR: - if (!value || *value == '\0') - reqval('l', lopts, - L_LAZYSBCNTR); - c = getnum(value, 0, 0, false); - if (c < 0 || c > 1) - illegal(value, "l lazy-count"); - sb_feat.lazy_sb_counters = c ? true - : false; + sb_feat.lazy_sb_counters = getbool( + value, "l lazy-count", + true); break; default: unknown('l', value); @@ -1631,28 +1625,20 @@ main( switch (getsubopt(&p, (constpp)mopts, &value)) { case M_CRC: - if (!value || *value == '\0') - reqval('m', mopts, M_CRC); - c = getnum(value, 0, 0, false); - if (c < 0 || c > 1) - illegal(value, "m crc"); - if (c && nftype) { + sb_feat.crcs_enabled = getbool( + value, "m crc", true); + if (sb_feat.crcs_enabled && nftype) { fprintf(stderr, -_("cannot specify both crc and ftype\n")); +_("cannot specify both -m crc=1 and -n ftype\n")); usage(); } - sb_feat.crcs_enabled = c ? true : false; - if (c) + if (sb_feat.crcs_enabled) sb_feat.dirftype = true; break; case M_FINOBT: - if (!value || *value == '\0') - reqval('m', mopts, M_CRC); - c = atoi(value); - if (c < 0 || c > 1) - illegal(value, "m finobt"); sb_feat.finobtflag = true; - sb_feat.finobt = c; + sb_feat.finobt = getbool( + value, "m finobt", true); break; case M_UUID: if (!value || *value == '\0') @@ -1720,19 +1706,15 @@ _("cannot specify both crc and ftype\n")); nvflag = 1; break; case N_FTYPE: - if (!value || *value == '\0') - reqval('n', nopts, N_FTYPE); if (nftype) respec('n', nopts, N_FTYPE); - c = getnum(value, 0, 0, false); - if (c < 0 || c > 1) - illegal(value, "n ftype"); if (sb_feat.crcs_enabled) { fprintf(stderr, -_("cannot specify both crc and ftype\n")); +_("cannot specify both -m crc=1 and -n ftype\n")); usage(); } - sb_feat.dirftype = c ? true : false; + sb_feat.dirftype = getbool(value, + "n ftype", true); nftype = 1; break; default: @@ -1768,11 +1750,8 @@ _("cannot specify both crc and ftype\n")); rtextsize = value; break; case R_FILE: - if (!value || *value == '\0') - value = "1"; - xi.risfile = getnum(value, 0, 0, false); - if (xi.risfile < 0 || xi.risfile > 1) - illegal(value, "r file"); + xi.risfile = getbool(value, + "r file", true); if (xi.risfile) xi.rcreat = 1; break; @@ -3220,8 +3199,8 @@ conflict( static void illegal( - char *value, - char *opt) + const char *value, + const char *opt) { fprintf(stderr, _("Illegal value %s for -%s option\n"), value, opt); usage(); -- 2.6.0 From jtulak@redhat.com Thu Mar 24 06:15:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 653D47CA1 for ; Thu, 24 Mar 2016 06:15:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3744C30405F for ; Thu, 24 Mar 2016 04:15:45 -0700 (PDT) X-ASG-Debug-ID: 1458818141-04cbb05f3948cb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id C1R6EPbaIekooRmR (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 24 Mar 2016 04:15:41 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 4DE5C78222 for ; Thu, 24 Mar 2016 11:15:41 +0000 (UTC) Received: from localhost.localdomain (vpn1-7-36.ams2.redhat.com [10.36.7.36]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2OBFbL9009274 for ; Thu, 24 Mar 2016 07:15:40 -0400 From: jtulak@redhat.com To: xfs@oss.sgi.com Subject: [PATCH 03/19] mkfs: Sanitise the superblock feature macros Date: Thu, 24 Mar 2016 12:15:20 +0100 X-ASG-Orig-Subj: [PATCH 03/19] mkfs: Sanitise the superblock feature macros Message-Id: <1458818136-56043-4-git-send-email-jtulak@redhat.com> In-Reply-To: <1458818136-56043-1-git-send-email-jtulak@redhat.com> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458818141 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner UPDATE o disable finobt when crc=0 no matter if user used -m finobt=X o split line > 80 chars o remove unused variable o add omitted finobtflag o change variables in spinodes case to look like surrounding code o add I_ALIGN reqval They are horrible macros that simply obfuscate the code, so let's factor the code and make them nice functions. To do this, add a sb_feat_args structure that carries around the variables rather than a strange assortment of variables. This means all the default can be clearly defined in a structure initialisation, and dependent feature bits are easy to check. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak --- include/xfs_multidisk.h | 25 +--- mkfs/xfs_mkfs.c | 320 ++++++++++++++++++++++++++++++------------------ 2 files changed, 199 insertions(+), 146 deletions(-) diff --git a/include/xfs_multidisk.h b/include/xfs_multidisk.h index 4006a01..64d80e1 100644 --- a/include/xfs_multidisk.h +++ b/include/xfs_multidisk.h @@ -23,36 +23,13 @@ XFS_SB_VERSION_EXTFLGBIT | \ XFS_SB_VERSION_DIRV2BIT) -#define XFS_SB_VERSION_MKFS(crc,ia,dia,log2,attr1,sflag,ci,more) (\ - ((crc)||(ia)||(dia)||(log2)||(attr1)||(sflag)||(ci)||(more)) ? \ - (((crc) ? XFS_SB_VERSION_5 : XFS_SB_VERSION_4) | \ - ((ia) ? XFS_SB_VERSION_ALIGNBIT : 0) | \ - ((dia) ? XFS_SB_VERSION_DALIGNBIT : 0) | \ - ((log2) ? XFS_SB_VERSION_LOGV2BIT : 0) | \ - ((attr1) ? XFS_SB_VERSION_ATTRBIT : 0) | \ - ((sflag) ? XFS_SB_VERSION_SECTORBIT : 0) | \ - ((ci) ? XFS_SB_VERSION_BORGBIT : 0) | \ - ((more) ? XFS_SB_VERSION_MOREBITSBIT : 0) | \ - XFS_DFL_SB_VERSION_BITS | \ - 0 ) : XFS_SB_VERSION_1 ) - -#define XFS_SB_VERSION2_MKFS(crc, lazycount, attr2, projid32bit, parent, \ - ftype) (\ - ((lazycount) ? XFS_SB_VERSION2_LAZYSBCOUNTBIT : 0) | \ - ((attr2) ? XFS_SB_VERSION2_ATTR2BIT : 0) | \ - ((projid32bit) ? XFS_SB_VERSION2_PROJID32BIT : 0) | \ - ((parent) ? XFS_SB_VERSION2_PARENTBIT : 0) | \ - ((crc) ? XFS_SB_VERSION2_CRCBIT : 0) | \ - ((ftype) ? XFS_SB_VERSION2_FTYPE : 0) | \ - 0 ) - #define XFS_DFL_BLOCKSIZE_LOG 12 /* 4096 byte blocks */ #define XFS_DINODE_DFL_LOG 8 /* 256 byte inodes */ #define XFS_DINODE_DFL_CRC_LOG 9 /* 512 byte inodes for CRCs */ #define XFS_MIN_DATA_BLOCKS 100 #define XFS_MIN_INODE_PERBLOCK 2 /* min inodes per block */ #define XFS_DFL_IMAXIMUM_PCT 25 /* max % of space for inodes */ -#define XFS_IFLAG_ALIGN 1 /* -i align defaults on */ +#define XFS_IFLAG_ALIGN true /* -i align defaults on */ #define XFS_MIN_REC_DIRSIZE 12 /* 4096 byte dirblocks (V2) */ #define XFS_DFL_DIR_VERSION 2 /* default directory version */ #define XFS_DFL_LOG_SIZE 1000 /* default log size, blocks */ diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 979a860..36bcb9f 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -879,6 +879,109 @@ discard_blocks(dev_t dev, __uint64_t nsectors) platform_discard_blocks(fd, 0, nsectors << 9); } +struct sb_feat_args { + int log_version; + int attr_version; + int dir_version; + int spinodes; + int finobt; + bool finobtflag; + bool inode_align; + bool nci; + bool lazy_sb_counters; + bool projid16bit; + bool crcs_enabled; + bool dirftype; + bool parent_pointers; +}; + +static void +sb_set_features( + struct xfs_sb *sbp, + struct sb_feat_args *fp, + int sectsize, + int lsectsize, + int dsunit) +{ + + sbp->sb_versionnum = XFS_DFL_SB_VERSION_BITS; + if (fp->crcs_enabled) + sbp->sb_versionnum |= XFS_SB_VERSION_5; + else + sbp->sb_versionnum |= XFS_SB_VERSION_4; + + if (fp->inode_align) + sbp->sb_versionnum |= XFS_SB_VERSION_ALIGNBIT; + if (dsunit) + sbp->sb_versionnum |= XFS_SB_VERSION_DALIGNBIT; + if (fp->log_version == 2) + sbp->sb_versionnum |= XFS_SB_VERSION_LOGV2BIT; + if (fp->attr_version == 1) + sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT; + if (sectsize > BBSIZE || lsectsize > BBSIZE) + sbp->sb_versionnum |= XFS_SB_VERSION_SECTORBIT; + if (fp->nci) + sbp->sb_versionnum |= XFS_SB_VERSION_BORGBIT; + + + sbp->sb_features2 = 0; + if (fp->lazy_sb_counters) + sbp->sb_features2 |= XFS_SB_VERSION2_LAZYSBCOUNTBIT; + if (!fp->projid16bit) + sbp->sb_features2 |= XFS_SB_VERSION2_PROJID32BIT; + if (fp->parent_pointers) + sbp->sb_features2 |= XFS_SB_VERSION2_PARENTBIT; + if (fp->crcs_enabled) + sbp->sb_features2 |= XFS_SB_VERSION2_CRCBIT; + if (fp->attr_version == 2) + sbp->sb_features2 |= XFS_SB_VERSION2_ATTR2BIT; + + /* v5 superblocks have their own feature bit for dirftype */ + if (fp->dirftype && !fp->crcs_enabled) + sbp->sb_features2 |= XFS_SB_VERSION2_FTYPE; + + /* update whether extended features are in use */ + if (sbp->sb_features2 != 0) + sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT; + + /* + * Due to a structure alignment issue, sb_features2 ended up in one + * of two locations, the second "incorrect" location represented by + * the sb_bad_features2 field. To avoid older kernels mounting + * filesystems they shouldn't, set both field to the same value. + */ + sbp->sb_bad_features2 = sbp->sb_features2; + + if (!fp->crcs_enabled) + return; + + /* default features for v5 filesystems */ + sbp->sb_features_compat = 0; + sbp->sb_features_ro_compat = 0; + sbp->sb_features_incompat = XFS_SB_FEAT_INCOMPAT_FTYPE; + sbp->sb_features_log_incompat = 0; + + if (fp->finobt) + sbp->sb_features_ro_compat = XFS_SB_FEAT_RO_COMPAT_FINOBT; + + /* + * Sparse inode chunk support has two main inode alignment requirements. + * First, sparse chunk alignment must match the cluster size. Second, + * full chunk alignment must match the inode chunk size. + * + * Copy the already calculated/scaled inoalignmt to spino_align and + * update the former to the full inode chunk size. + */ + if (fp->spinodes) { + sbp->sb_spino_align = sbp->sb_inoalignmt; + sbp->sb_inoalignmt = \ + XFS_INODES_PER_CHUNK * \ + sbp->sb_inodesize >> sbp->sb_blocklog; + sbp->sb_features_incompat |= XFS_SB_FEAT_INCOMPAT_SPINODES; + } + +} + int main( int argc, @@ -890,8 +993,6 @@ main( xfs_agnumber_t agno; __uint64_t agsize; xfs_alloc_rec_t *arec; - int attrversion; - int projid16bit; struct xfs_btree_block *block; int blflag; int blocklog; @@ -906,8 +1007,6 @@ main( char *dfile; int dirblocklog; int dirblocksize; - int dirftype; - int dirversion; char *dsize; int dsu; int dsw; @@ -915,7 +1014,6 @@ main( int dswidth; int force_overwrite; struct fsxattr fsx; - int iaflag; int ilflag; int imaxpct; int imflag; @@ -935,7 +1033,6 @@ main( int loginternal; char *logsize; xfs_fsblock_t logstart; - int logversion; int lvflag; int lsflag; int lsuflag; @@ -957,7 +1054,6 @@ main( int nftype; int nsflag; int nvflag; - int nci; int Nflag; int discard = 1; char *p; @@ -981,11 +1077,21 @@ main( int worst_freelist; libxfs_init_t xi; struct fs_topology ft; - int lazy_sb_counters; - int crcs_enabled; - int finobt; - bool finobtflag; - int spinodes; + struct sb_feat_args sb_feat = { + .finobt = 1, + .finobtflag = false, + .spinodes = 0, + .log_version = 2, + .attr_version = 2, + .dir_version = XFS_DFL_DIR_VERSION, + .inode_align = XFS_IFLAG_ALIGN, + .nci = false, + .lazy_sb_counters = true, + .projid16bit = false, + .crcs_enabled = true, + .dirftype = false, + .parent_pointers = false, + }; platform_uuid_generate(&uuid); progname = basename(argv[0]); @@ -993,8 +1099,6 @@ main( bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); - attrversion = 2; - projid16bit = 0; blflag = bsflag = slflag = ssflag = lslflag = lssflag = 0; blocklog = blocksize = 0; sectorlog = lsectorlog = XFS_MIN_SECTORSIZE_LOG; @@ -1003,27 +1107,19 @@ main( ilflag = imflag = ipflag = isflag = 0; liflag = laflag = lsflag = lsuflag = lsunitflag = ldflag = lvflag = 0; loginternal = 1; - logversion = 2; logagno = logblocks = rtblocks = rtextblocks = 0; - Nflag = nlflag = nsflag = nvflag = nci = 0; - dirftype = 1; /* inode type information in the dir */ + sb_feat.dirftype = 1; /* inode type information in the dir */ + Nflag = nlflag = nsflag = nvflag = 0; nftype = 0; dirblocklog = dirblocksize = 0; - dirversion = XFS_DFL_DIR_VERSION; qflag = 0; imaxpct = inodelog = inopblock = isize = 0; - iaflag = XFS_IFLAG_ALIGN; dfile = logfile = rtfile = NULL; dsize = logsize = rtsize = rtextsize = protofile = NULL; dsu = dsw = dsunit = dswidth = lalign = lsu = lsunit = 0; nodsflag = norsflag = 0; force_overwrite = 0; worst_freelist = 0; - lazy_sb_counters = 1; - crcs_enabled = 1; - finobt = 1; - finobtflag = false; - spinodes = 0; memset(&fsx, 0, sizeof(fsx)); memset(&xi, 0, sizeof(xi)); @@ -1262,10 +1358,11 @@ main( switch (getsubopt(&p, (constpp)iopts, &value)) { case I_ALIGN: if (!value || *value == '\0') - value = "1"; - iaflag = atoi(value); - if (iaflag < 0 || iaflag > 1) + reqval('i', iopts, I_ALIGN); + c = atoi(value); + if (c < 0 || c > 1) illegal(value, "i align"); + sb_feat.inode_align = c ? true : false; break; case I_LOG: if (!value || *value == '\0') @@ -1335,7 +1432,7 @@ main( c = atoi(value); if (c < 0 || c > 2) illegal(value, "i attr"); - attrversion = c; + sb_feat.attr_version = c; break; case I_PROJID32BIT: if (!value || *value == '\0') @@ -1343,14 +1440,15 @@ main( c = atoi(value); if (c < 0 || c > 1) illegal(value, "i projid32bit"); - projid16bit = c ? 0 : 1; + sb_feat.projid16bit = c ? false : true; break; case I_SPINODES: if (!value || *value == '\0') value = "1"; - spinodes = atoi(value); - if (spinodes < 0 || spinodes > 1) + c = atoi(value); + if (c < 0 || c > 1) illegal(value, "i spinodes"); + sb_feat.spinodes = c; break; default: unknown('i', value); @@ -1442,9 +1540,10 @@ main( reqval('l', lopts, L_VERSION); if (lvflag) respec('l', lopts, L_VERSION); - logversion = atoi(value); - if (logversion < 1 || logversion > 2) + c = atoi(value); + if (c < 1 || c > 2) illegal(value, "l version"); + sb_feat.log_version = c; lvflag = 1; break; case L_SIZE: @@ -1493,7 +1592,8 @@ main( c = atoi(value); if (c < 0 || c > 1) illegal(value, "l lazy-count"); - lazy_sb_counters = c; + sb_feat.lazy_sb_counters = c ? true + : false; break; default: unknown('l', value); @@ -1517,7 +1617,14 @@ main( c = atoi(value); if (c < 0 || c > 1) illegal(value, "m crc"); - crcs_enabled = c; + if (c && nftype) { + fprintf(stderr, +_("cannot specify both crc and ftype\n")); + usage(); + } + sb_feat.crcs_enabled = c ? true : false; + if (c) + sb_feat.dirftype = true; break; case M_FINOBT: if (!value || *value == '\0') @@ -1525,8 +1632,8 @@ main( c = atoi(value); if (c < 0 || c > 1) illegal(value, "m finobt"); - finobt = c; - finobtflag = true; + sb_feat.finobtflag = true; + sb_feat.finobt = c; break; case M_UUID: if (!value || *value == '\0') @@ -1582,12 +1689,14 @@ main( if (nvflag) respec('n', nopts, N_VERSION); if (!strcasecmp(value, "ci")) { - nci = 1; /* ASCII CI mode */ + /* ASCII CI mode */ + sb_feat.nci = true; } else { - dirversion = atoi(value); - if (dirversion != 2) + c = atoi(value); + if (c != 2) illegal(value, "n version"); + sb_feat.dir_version = c; } nvflag = 1; break; @@ -1599,12 +1708,12 @@ main( c = atoi(value); if (c < 0 || c > 1) illegal(value, "n ftype"); - if (crcs_enabled) { + if (sb_feat.crcs_enabled) { fprintf(stderr, _("cannot specify both crc and ftype\n")); usage(); } - dirftype = c; + sb_feat.dirftype = c ? true : false; nftype = 1; break; default: @@ -1753,13 +1862,13 @@ _("cannot specify both crc and ftype\n")); fprintf(stderr, _("illegal block size %d\n"), blocksize); usage(); } - if (crcs_enabled && blocksize < XFS_MIN_CRC_BLOCKSIZE) { + if (sb_feat.crcs_enabled && blocksize < XFS_MIN_CRC_BLOCKSIZE) { fprintf(stderr, _("Minimum block size for CRC enabled filesystems is %d bytes.\n"), XFS_MIN_CRC_BLOCKSIZE); usage(); } - if (crcs_enabled && !dirftype) { + if (sb_feat.crcs_enabled && !sb_feat.dirftype) { fprintf(stderr, _("cannot disable ftype with crcs enabled\n")); usage(); } @@ -1824,7 +1933,7 @@ _("block size %d cannot be smaller than logical sector size %d\n"), usage(); } else if (lsectorsize > XFS_MIN_SECTORSIZE && !lsu && !lsunit) { lsu = blocksize; - logversion = 2; + sb_feat.log_version = 2; } /* @@ -1832,7 +1941,7 @@ _("block size %d cannot be smaller than logical sector size %d\n"), * no longer optional for CRC enabled filesystems. Catch them up front * here before doing anything else. */ - if (crcs_enabled) { + if (sb_feat.crcs_enabled) { /* minimum inode size is 512 bytes, ipflag checked later */ if ((isflag || ilflag) && inodelog < XFS_DINODE_DFL_CRC_LOG) { fprintf(stderr, @@ -1842,28 +1951,28 @@ _("Minimum inode size for CRCs is %d bytes\n"), } /* inodes always aligned */ - if (iaflag != 1) { + if (!sb_feat.inode_align) { fprintf(stderr, _("Inodes always aligned for CRC enabled filesytems\n")); usage(); } /* lazy sb counters always on */ - if (lazy_sb_counters != 1) { + if (!sb_feat.lazy_sb_counters) { fprintf(stderr, _("Lazy superblock counted always enabled for CRC enabled filesytems\n")); usage(); } /* version 2 logs always on */ - if (logversion != 2) { + if (sb_feat.log_version != 2) { fprintf(stderr, _("V2 logs always enabled for CRC enabled filesytems\n")); usage(); } /* attr2 always on */ - if (attrversion != 2) { + if (sb_feat.attr_version != 2) { fprintf(stderr, _("V2 attribute format always enabled on CRC enabled filesytems\n")); usage(); @@ -1871,7 +1980,7 @@ _("V2 attribute format always enabled on CRC enabled filesytems\n")); /* 32 bit project quota always on */ /* attr2 always on */ - if (projid16bit == 1) { + if (sb_feat.projid16bit) { fprintf(stderr, _("32 bit Project IDs always enabled on CRC enabled filesytems\n")); usage(); @@ -1879,23 +1988,25 @@ _("32 bit Project IDs always enabled on CRC enabled filesytems\n")); } else { /* * The kernel doesn't currently support crc=0,finobt=1 - * filesystems. If crcs are not enabled and the user has - * explicitly turned them off then silently turn them off - * to avoid an unnecessary warning. If the user explicitly - * tried to use crc=0,finobt=1, then issue a warning before - * turning them off. + * filesystems. If crcs are not enabled and the user has not + * explicitly turned finobt on, then silently turn it off to + * avoid an unnecessary warning. If the user explicitly tried + * to use crc=0,finobt=1, then issue a warning before turning + * them off. */ - if (finobt && finobtflag) { - fprintf(stderr, -_("warning: finobt not supported without CRC support, disabled.\n")); + if (sb_feat.finobt){ + if (sb_feat.finobtflag) { + fprintf(stderr, + _("warning: finobt not supported without CRC support, disabled.\n")); + } + sb_feat.finobt = 0; } - finobt = 0; } - if (spinodes && !crcs_enabled) { + if (sb_feat.spinodes && !sb_feat.crcs_enabled) { fprintf(stderr, _("warning: sparse inodes not supported without CRC support, disabled.\n")); - spinodes = 0; + sb_feat.spinodes = 0; } if (nsflag || nlflag) { @@ -1945,11 +2056,11 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); inodelog = blocklog - libxfs_highbit32(inopblock); isize = 1 << inodelog; } else if (!ilflag && !isflag) { - inodelog = crcs_enabled ? XFS_DINODE_DFL_CRC_LOG - : XFS_DINODE_DFL_LOG; + inodelog = sb_feat.crcs_enabled ? XFS_DINODE_DFL_CRC_LOG + : XFS_DINODE_DFL_LOG; isize = 1 << inodelog; } - if (crcs_enabled && inodelog < XFS_DINODE_DFL_CRC_LOG) { + if (sb_feat.crcs_enabled && inodelog < XFS_DINODE_DFL_CRC_LOG) { fprintf(stderr, _("Minimum inode size for CRCs is %d bytes\n"), 1 << XFS_DINODE_DFL_CRC_LOG); @@ -2079,10 +2190,10 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); } /* if lsu or lsunit was specified, automatically use v2 logs */ - if ((lsu || lsunit) && logversion == 1) { + if ((lsu || lsunit) && sb_feat.log_version == 1) { fprintf(stderr, _("log stripe unit specified, using v2 logs\n")); - logversion = 2; + sb_feat.log_version = 2; } calc_stripe_factors(dsu, dsw, sectorsize, lsu, lsectorsize, @@ -2397,12 +2508,12 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), } /* convert from 512 byte blocks to fs blocks */ lsunit = DTOBT(lsunit); - } else if (logversion == 2 && loginternal && dsunit) { + } else if (sb_feat.log_version == 2 && loginternal && dsunit) { /* lsunit and dsunit now in fs blocks */ lsunit = dsunit; } - if (logversion == 2 && (lsunit * blocksize) > 256 * 1024) { + if (sb_feat.log_version == 2 && (lsunit * blocksize) > 256 * 1024) { /* Warn only if specified on commandline */ if (lsuflag || lsunitflag) { fprintf(stderr, @@ -2414,9 +2525,9 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), lsunit = (32 * 1024) >> blocklog; } - min_logblocks = max_trans_res(crcs_enabled, dirversion, + min_logblocks = max_trans_res(sb_feat.crcs_enabled, sb_feat.dir_version, sectorlog, blocklog, inodelog, dirblocklog, - logversion, lsunit, finobt); + sb_feat.log_version, lsunit, sb_feat.finobt); ASSERT(min_logblocks); min_logblocks = MAX(XFS_MIN_LOG_BLOCKS, min_logblocks); if (!logsize && dblocks >= (1024*1024*1024) >> blocklog) @@ -2494,25 +2605,8 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), * sb_versionnum and finobt flags must be set before we use * XFS_PREALLOC_BLOCKS(). */ - sbp->sb_features2 = XFS_SB_VERSION2_MKFS(crcs_enabled, lazy_sb_counters, - attrversion == 2, !projid16bit, 0, - (!crcs_enabled && dirftype)); - sbp->sb_versionnum = XFS_SB_VERSION_MKFS(crcs_enabled, iaflag, - dsunit != 0, - logversion == 2, attrversion == 1, - (sectorsize != BBSIZE || - lsectorsize != BBSIZE), - nci, sbp->sb_features2 != 0); - /* - * Due to a structure alignment issue, sb_features2 ended up in one - * of two locations, the second "incorrect" location represented by - * the sb_bad_features2 field. To avoid older kernels mounting - * filesystems they shouldn't, set both field to the same value. - */ - sbp->sb_bad_features2 = sbp->sb_features2; + sb_set_features(&mp->m_sb, &sb_feat, sectorsize, lsectorsize, dsunit); - if (finobt) - sbp->sb_features_ro_compat = XFS_SB_FEAT_RO_COMPAT_FINOBT; if (loginternal) { /* @@ -2564,14 +2658,6 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), } validate_log_size(logblocks, blocklog, min_logblocks); - /* - * dirent filetype field always enabled on v5 superblocks - */ - if (crcs_enabled) { - sbp->sb_features_incompat = XFS_SB_FEAT_INCOMPAT_FTYPE; - dirftype = 1; - } - if (!qflag || Nflag) { printf(_( "meta-data=%-22s isize=%-6d agcount=%lld, agsize=%lld blks\n" @@ -2584,13 +2670,16 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), " =%-22s sectsz=%-5u sunit=%d blks, lazy-count=%d\n" "realtime =%-22s extsz=%-6d blocks=%lld, rtextents=%lld\n"), dfile, isize, (long long)agcount, (long long)agsize, - "", sectorsize, attrversion, !projid16bit, - "", crcs_enabled, finobt, spinodes, + "", sectorsize, sb_feat.attr_version, + !sb_feat.projid16bit, + "", sb_feat.crcs_enabled, sb_feat.finobt, sb_feat.spinodes, "", blocksize, (long long)dblocks, imaxpct, "", dsunit, dswidth, - dirversion, dirblocksize, nci, dirftype, + sb_feat.dir_version, dirblocksize, sb_feat.nci, + sb_feat.dirftype, logfile, 1 << blocklog, (long long)logblocks, - logversion, "", lsectorsize, lsunit, lazy_sb_counters, + sb_feat.log_version, "", lsectorsize, lsunit, + sb_feat.lazy_sb_counters, rtfile, rtextblocks << blocklog, (long long)rtblocks, (long long)rtextents); if (Nflag) @@ -2634,17 +2723,17 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), sbp->sb_unit = dsunit; sbp->sb_width = dswidth; sbp->sb_dirblklog = dirblocklog - blocklog; - if (logversion == 2) { /* This is stored in bytes */ + if (sb_feat.log_version == 2) { /* This is stored in bytes */ lsunit = (lsunit == 0) ? 1 : XFS_FSB_TO_B(mp, lsunit); sbp->sb_logsunit = lsunit; } else sbp->sb_logsunit = 0; - if (iaflag) { + if (sb_feat.inode_align) { int cluster_size = XFS_INODE_BIG_CLUSTER_SIZE; - if (crcs_enabled) + if (sb_feat.crcs_enabled) cluster_size *= isize / XFS_DINODE_MIN_SIZE; sbp->sb_inoalignmt = cluster_size >> blocklog; - iaflag = sbp->sb_inoalignmt != 0; + sb_feat.inode_align = sbp->sb_inoalignmt != 0; } else sbp->sb_inoalignmt = 0; if (lsectorsize != BBSIZE || sectorsize != BBSIZE) { @@ -2655,19 +2744,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), sbp->sb_logsectsize = 0; } - /* - * Sparse inode chunk support has two main inode alignment requirements. - * First, sparse chunk alignment must match the cluster size. Second, - * full chunk alignment must match the inode chunk size. - * - * Copy the already calculated/scaled inoalignmt to spino_align and - * update the former to the full inode chunk size. - */ - if (spinodes) { - sbp->sb_spino_align = sbp->sb_inoalignmt; - sbp->sb_inoalignmt = XFS_INODES_PER_CHUNK * isize >> blocklog; - sbp->sb_features_incompat |= XFS_SB_FEAT_INCOMPAT_SPINODES; - } + sb_set_features(&mp->m_sb, &sb_feat, sectorsize, lsectorsize, dsunit); if (force_overwrite) zero_old_xfs_structures(&xi, sbp); @@ -2723,8 +2800,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), libxfs_log_clear(mp->m_logdev_targp, NULL, XFS_FSB_TO_DADDR(mp, logstart), (xfs_extlen_t)XFS_FSB_TO_BB(mp, logblocks), - &sbp->sb_uuid, logversion, lsunit, XLOG_FMT, XLOG_INIT_CYCLE, - false); + &sbp->sb_uuid, sb_feat.log_version, lsunit, XLOG_FMT, XLOG_INIT_CYCLE, false); mp = libxfs_mount(mp, sbp, xi.ddev, xi.logdev, xi.rtdev, 0); if (mp == NULL) { @@ -2829,7 +2905,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), agi->agi_count = 0; agi->agi_root = cpu_to_be32(XFS_IBT_BLOCK(mp)); agi->agi_level = cpu_to_be32(1); - if (finobt) { + if (sb_feat.finobt) { agi->agi_free_root = cpu_to_be32(XFS_FIBT_BLOCK(mp)); agi->agi_free_level = cpu_to_be32(1); } @@ -2962,7 +3038,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), /* * Free INO btree root block */ - if (!finobt) { + if (!sb_feat.finobt){ xfs_perag_put(pag); continue; } -- 2.6.0 From jtulak@redhat.com Thu Mar 24 06:15:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5EC1B7CA0 for ; Thu, 24 Mar 2016 06:15:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 20F028F8050 for ; Thu, 24 Mar 2016 04:15:47 -0700 (PDT) X-ASG-Debug-ID: 1458818144-04cbb05f3948cc0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id EtDChSHbVGxAbJTm (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 24 Mar 2016 04:15:44 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 235FF78233 for ; Thu, 24 Mar 2016 11:15:44 +0000 (UTC) Received: from localhost.localdomain (vpn1-7-36.ams2.redhat.com [10.36.7.36]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2OBFbLC009274 for ; Thu, 24 Mar 2016 07:15:43 -0400 From: jtulak@redhat.com To: xfs@oss.sgi.com Subject: [PATCH 06/19] mkfs: validate logarithmic parameters sanely Date: Thu, 24 Mar 2016 12:15:23 +0100 X-ASG-Orig-Subj: [PATCH 06/19] mkfs: validate logarithmic parameters sanely Message-Id: <1458818136-56043-7-git-send-email-jtulak@redhat.com> In-Reply-To: <1458818136-56043-1-git-send-email-jtulak@redhat.com> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458818144 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner Testing logarithmic paramters like "-n log=" shows that we do a terrible job of validating such input. e.g.: ..... naming =version 2 bsize=65536 ascii-ci=0 ftype=0 .... Yeah, I just asked for a block size of 2^456858480, and it didn't get rejected. Great, isn't it? So, factor out the parsing of logarithmic parameters, and pass in the maximum valid value that they can take. These maximum values might not be completely accurate (e.g. block/sector sizes will affect the eventual valid maximum) but we can get rid of all the overflows and stupidities before we get to fine-grained validity checking later in mkfs once things like block and sector sizes have been finalised. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak Reviewed-by: Brian Foster --- mkfs/xfs_mkfs.c | 79 +++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 51 insertions(+), 28 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 9394bd3..dda076d 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -1022,6 +1022,27 @@ getbool( return c ? true : false; } +static int +getnum_checked( + const char *str, + long long min_val, + long long max_val, + const char *illegal_str, + char reqval_char, + char *reqval_opts[], + int reqval_optind) +{ + long long c; + + if (!str || *str == '\0') + reqval(reqval_char, reqval_opts, reqval_optind); + + c = getnum(str, 0, 0, false); + if (c < min_val || c > max_val) + illegal(str, illegal_str); + return c; +} + int main( int argc, @@ -1179,16 +1200,16 @@ main( switch (getsubopt(&p, (constpp)bopts, &value)) { case B_LOG: - if (!value || *value == '\0') - reqval('b', bopts, B_LOG); if (blflag) respec('b', bopts, B_LOG); if (bsflag) conflict('b', bopts, B_SIZE, B_LOG); - blocklog = getnum(value, 0, 0, false); - if (blocklog <= 0) - illegal(value, "b log"); + blocklog = getnum_checked(value, + XFS_MIN_BLOCKSIZE_LOG, + XFS_MAX_BLOCKSIZE_LOG, + "b log", 'b', bopts, + B_LOG); blocksize = 1 << blocklog; blflag = 1; break; @@ -1325,16 +1346,16 @@ main( nodsflag = 1; break; case D_SECTLOG: - if (!value || *value == '\0') - reqval('d', dopts, D_SECTLOG); if (slflag) respec('d', dopts, D_SECTLOG); if (ssflag) conflict('d', dopts, D_SECTSIZE, D_SECTLOG); - sectorlog = getnum(value, 0, 0, false); - if (sectorlog <= 0) - illegal(value, "d sectlog"); + sectorlog = getnum_checked(value, + XFS_MIN_SECTORSIZE_LOG, + XFS_MAX_SECTORSIZE_LOG, + "d sectlog", 'd', dopts, + D_SECTLOG); sectorsize = 1 << sectorlog; slflag = 1; break; @@ -1399,9 +1420,11 @@ main( if (isflag) conflict('i', iopts, I_SIZE, I_LOG); - inodelog = getnum(value, 0, 0, false); - if (inodelog <= 0) - illegal(value, "i log"); + inodelog = getnum_checked(value, + XFS_DINODE_MIN_LOG, + XFS_DINODE_MAX_LOG, + "i log", 'i', iopts, + I_LOG); isize = 1 << inodelog; ilflag = 1; break; @@ -1573,16 +1596,16 @@ main( lsflag = 1; break; case L_SECTLOG: - if (!value || *value == '\0') - reqval('l', lopts, L_SECTLOG); if (lslflag) respec('l', lopts, L_SECTLOG); if (lssflag) conflict('l', lopts, L_SECTSIZE, L_SECTLOG); - lsectorlog = getnum(value, 0, 0, false); - if (lsectorlog <= 0) - illegal(value, "l sectlog"); + lsectorlog = getnum_checked(value, + XFS_MIN_SECTORSIZE_LOG, + XFS_MAX_SECTORSIZE_LOG, + "l sectlog", 'l', lopts, + L_SECTLOG); lsectorsize = 1 << lsectorlog; lslflag = 1; break; @@ -1658,16 +1681,16 @@ _("cannot specify both -m crc=1 and -n ftype\n")); switch (getsubopt(&p, (constpp)nopts, &value)) { case N_LOG: - if (!value || *value == '\0') - reqval('n', nopts, N_LOG); if (nlflag) respec('n', nopts, N_LOG); if (nsflag) conflict('n', nopts, N_SIZE, N_LOG); - dirblocklog = getnum(value, 0, 0, false); - if (dirblocklog <= 0) - illegal(value, "n log"); + dirblocklog = getnum_checked(value, + XFS_MIN_REC_DIRSIZE, + XFS_MAX_BLOCKSIZE_LOG, + "n log", 'n', nopts, + N_LOG); dirblocksize = 1 << dirblocklog; nlflag = 1; break; @@ -1786,16 +1809,16 @@ _("cannot specify both -m crc=1 and -n ftype\n")); switch (getsubopt(&p, (constpp)sopts, &value)) { case S_LOG: case S_SECTLOG: - if (!value || *value == '\0') - reqval('s', sopts, S_SECTLOG); if (slflag || lslflag) respec('s', sopts, S_SECTLOG); if (ssflag || lssflag) conflict('s', sopts, S_SECTSIZE, S_SECTLOG); - sectorlog = getnum(value, 0, 0, false); - if (sectorlog <= 0) - illegal(value, "s sectlog"); + sectorlog = getnum_checked(value, + XFS_MIN_SECTORSIZE_LOG, + XFS_MAX_SECTORSIZE_LOG, + "s sectlog", 's', sopts, + S_SECTLOG); lsectorlog = sectorlog; sectorsize = 1 << sectorlog; lsectorsize = sectorsize; -- 2.6.0 From jtulak@redhat.com Thu Mar 24 06:15:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4A4837CBC for ; Thu, 24 Mar 2016 06:15:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D297D8F804C for ; Thu, 24 Mar 2016 04:15:48 -0700 (PDT) X-ASG-Debug-ID: 1458818146-04bdf03cfb49720001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id akbnyNpb3aEEgzRe (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 24 Mar 2016 04:15:46 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 17FC17AEA7 for ; Thu, 24 Mar 2016 11:15:46 +0000 (UTC) Received: from localhost.localdomain (vpn1-7-36.ams2.redhat.com [10.36.7.36]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2OBFbLE009274 for ; Thu, 24 Mar 2016 07:15:45 -0400 From: jtulak@redhat.com To: xfs@oss.sgi.com Subject: [PATCH 08/19] mkfs: getbool is redundant Date: Thu, 24 Mar 2016 12:15:25 +0100 X-ASG-Orig-Subj: [PATCH 08/19] mkfs: getbool is redundant Message-Id: <1458818136-56043-9-git-send-email-jtulak@redhat.com> In-Reply-To: <1458818136-56043-1-git-send-email-jtulak@redhat.com> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458818146 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner CHANGELOG: o Add description of a new member of opt_params o Fix in the subopts tables o All boolean subopts should use getnum_checked o Edit man8 page where it missed the information about optional value of a flag getbool() can be replaced with getnum_checked with appropriate min/max values set for the boolean variables. Make boolean arguments consistent - all accept 0 or 1 value now. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak --- man/man8/mkfs.xfs.8 | 11 ++- mkfs/xfs_mkfs.c | 223 ++++++++++++++++++++++++++++++++++++---------------- 2 files changed, 164 insertions(+), 70 deletions(-) diff --git a/man/man8/mkfs.xfs.8 b/man/man8/mkfs.xfs.8 index 8b068ef..5a2a20a 100644 --- a/man/man8/mkfs.xfs.8 +++ b/man/man8/mkfs.xfs.8 @@ -118,6 +118,9 @@ option or the option first needs to be added to the command line. Failure to specify the size of the units will result in illegal value errors when parameters are quantified in those units. +.PP +Many options allows for optional argument of value 0 or 1, to explicitly +disable or enable the functionality, in a forward-compatible syntax. .SH OPTIONS .TP .BI \-b " block_size_options" @@ -312,10 +315,12 @@ and .B swidth values. .TP -.BI noalign -This option disables automatic geometry detection and creates the filesystem +.BI noalign[= value ] +If the +.I value +is 1, this option disables automatic geometry detection and creates the filesystem without stripe geometry alignment even if the underlying storage device provides -this information. +this information. 0 disables this option, that is, enables automatic detection. .RE .TP .B \-f diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 6e29848..0e2cfac 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -49,6 +49,7 @@ static long long cvtnum(unsigned int blocksize, unsigned int sectorsize, const char *s); #define MAX_SUBOPTS 16 +#define SUBOPT_NEEDS_VAL (-1LL) /* * Table for parsing mkfs parameters. * @@ -83,6 +84,13 @@ static long long cvtnum(unsigned int blocksize, * (Said in another way, you can't have minval and maxval both equal * to zero. But if one value is different: minval=0 and maxval=1, * then it is OK.) + * + * defaultval MANDATORY + * The value used if user specifies the subopt, but no value. + * If the subopt accepts some values (-d file=[1|0]), then this + * sets what is used with simple specifying the subopt (-d file). + * A special SUBOPT_NEEDS_VAL can be used to require a user-given + * value in any case. */ struct opt_params { const char name; @@ -91,6 +99,7 @@ struct opt_params { int index; long long minval; long long maxval; + long long defaultval; } subopt_params[MAX_SUBOPTS]; }; @@ -107,10 +116,12 @@ struct opt_params bopts = { { .index = B_LOG, .minval = XFS_MIN_BLOCKSIZE_LOG, .maxval = XFS_MAX_BLOCKSIZE_LOG, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = B_SIZE, .minval = XFS_MIN_BLOCKSIZE, .maxval = XFS_MAX_BLOCKSIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, }, }; @@ -152,38 +163,57 @@ struct opt_params dopts = { }, .subopt_params = { { .index = D_AGCOUNT, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_FILE, + .minval = 0, + .maxval = 1, + .defaultval = 1, }, { .index = D_NAME, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SUNIT, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SWIDTH, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_AGSIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SU, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SW, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SECTLOG, .minval = XFS_MIN_SECTORSIZE_LOG, .maxval = XFS_MAX_SECTORSIZE_LOG, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SECTSIZE, .minval = XFS_MIN_SECTORSIZE, .maxval = XFS_MAX_SECTORSIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_NOALIGN, + .minval = 0, + .maxval = 1, + .defaultval = 1, }, { .index = D_RTINHERIT, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_PROJINHERIT, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_EXTSZINHERIT, + .defaultval = SUBOPT_NEEDS_VAL, }, }, }; @@ -212,22 +242,36 @@ struct opt_params iopts = { }, .subopt_params = { { .index = I_ALIGN, + .minval = 0, + .maxval = 1, + .defaultval = 1, }, { .index = I_LOG, .minval = XFS_DINODE_MIN_LOG, .maxval = XFS_DINODE_MAX_LOG, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_MAXPCT, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_PERBLOCK, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_SIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_ATTR, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_PROJID32BIT, + .minval = 0, + .maxval = 1, + .defaultval = 1, }, { .index = I_SPINODES, + .minval = 0, + .maxval = 1, + .defaultval = 1, }, }, }; @@ -263,32 +307,50 @@ struct opt_params lopts = { }, .subopt_params = { { .index = L_AGNUM, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_INTERNAL, + .minval = 0, + .maxval = 1, + .defaultval = 1, }, { .index = L_SIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_VERSION, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SUNIT, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SU, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_DEV, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SECTLOG, .minval = XFS_MIN_SECTORSIZE_LOG, .maxval = XFS_MAX_SECTORSIZE_LOG, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SECTSIZE, .minval = XFS_MIN_SECTORSIZE, .maxval = XFS_MAX_SECTORSIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_FILE, + .minval = 0, + .maxval = 1, + .defaultval = 1, }, { .index = L_NAME, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_LAZYSBCNTR, + .minval = 0, + .maxval = 1, + .defaultval = 1, }, }, }; @@ -310,14 +372,20 @@ struct opt_params nopts = { { .index = N_LOG, .minval = XFS_MIN_REC_DIRSIZE, .maxval = XFS_MAX_BLOCKSIZE_LOG, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = N_SIZE, .minval = 1 << XFS_MIN_REC_DIRSIZE, .maxval = XFS_MAX_BLOCKSIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = N_VERSION, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = N_FTYPE, + .minval = 0, + .maxval = 1, + .defaultval = 1, }, }, }; @@ -341,16 +409,26 @@ struct opt_params ropts = { }, .subopt_params = { { .index = R_EXTSIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_SIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_DEV, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_FILE, + .minval = 0, + .maxval = 1, + .defaultval = 1, }, { .index = R_NAME, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_NOALIGN, + .minval = 0, + .maxval = 1, + .defaultval = 1, }, }, }; @@ -372,18 +450,22 @@ struct opt_params sopts = { { .index = S_LOG, .minval = XFS_MIN_SECTORSIZE_LOG, .maxval = XFS_MAX_SECTORSIZE_LOG, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = S_SECTLOG, .minval = XFS_MIN_SECTORSIZE_LOG, .maxval = XFS_MAX_SECTORSIZE_LOG, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = S_SIZE, .minval = XFS_MIN_SECTORSIZE, .maxval = XFS_MAX_SECTORSIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = S_SECTSIZE, .minval = XFS_MIN_SECTORSIZE, .maxval = XFS_MAX_SECTORSIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, }, }; @@ -394,13 +476,24 @@ struct opt_params mopts = { #define M_CRC 0 "crc", #define M_FINOBT 1 - "finobt", + "finobt", #define M_UUID 2 "uuid", NULL }, .subopt_params = { { .index = M_CRC, + .minval = 0, + .maxval = 1, + .defaultval = 1, + }, + { .index = M_FINOBT, + .minval = 0, + .maxval = 1, + .defaultval = 1, + }, + { .index = M_UUID, + .defaultval = SUBOPT_NEEDS_VAL, }, }, }; @@ -1220,22 +1313,6 @@ getnum( return i; } -static bool -getbool( - const char *str, - const char *illegal_str, - bool default_val) -{ - long long c; - - if (!str || *str == '\0') - return default_val; - c = getnum(str, 0, 0, false); - if (c < 0 || c > 1) - illegal(str, illegal_str); - return c ? true : false; -} - static __attribute__((noreturn)) void illegal_option( const char *value, @@ -1250,17 +1327,27 @@ illegal_option( static int getnum_checked( - const char *str, + const char *str, struct opt_params *opts, - int index) + int index) { - long long c; + const struct subopt_param *sp = &opts->subopt_params[index]; + long long c; - if (!str || *str == '\0') + if (sp->index != index) { + fprintf(stderr, + ("Developer screwed up option parsing (%d/%d)! Please report!\n"), + sp->index, index); reqval(opts->name, (char **)opts->subopts, index); + } - if (opts->subopt_params[index].minval == 0 && - opts->subopt_params[index].maxval == 0) { + if (!str || *str == '\0') { + if (sp->defaultval == SUBOPT_NEEDS_VAL) + reqval(opts->name, (char **)opts->subopts, index); + return sp->defaultval; + } + + if (sp->minval == 0 && sp->maxval == 0) { fprintf(stderr, _("Option -%c %s has undefined minval/maxval." "Can't verify value range. This is a bug.\n"), @@ -1269,8 +1356,7 @@ getnum_checked( } c = getnum(str, 0, 0, false); - if (c < opts->subopt_params[index].minval || - c > opts->subopt_params[index].maxval) + if (c < sp->minval || c > sp->maxval) illegal_option(str, opts, index); return c; } @@ -1495,8 +1581,8 @@ main( dasize = 1; break; case D_FILE: - xi.disfile = getbool(value, "d file", - true); + xi.disfile = getnum_checked(value, + &dopts, D_FILE); if (xi.disfile && !Nflag) xi.dcreat = 1; break; @@ -1564,19 +1650,22 @@ main( illegal(value, "d sw"); break; case D_NOALIGN: - if (dsu) - conflict('d', subopts, D_SU, - D_NOALIGN); - if (dsunit) - conflict('d', subopts, D_SUNIT, - D_NOALIGN); - if (dsw) - conflict('d', subopts, D_SW, - D_NOALIGN); - if (dswidth) - conflict('d', subopts, D_SWIDTH, - D_NOALIGN); - nodsflag = 1; + nodsflag = getnum_checked(value, + &dopts, D_NOALIGN); + if (nodsflag) { + if (dsu) + conflict('d', subopts, D_SU, + D_NOALIGN); + if (dsunit) + conflict('d', subopts, D_SUNIT, + D_NOALIGN); + if (dsw) + conflict('d', subopts, D_SW, + D_NOALIGN); + if (dswidth) + conflict('d', subopts, D_SWIDTH, + D_NOALIGN); + } break; case D_SECTLOG: if (slflag) @@ -1638,8 +1727,8 @@ main( switch (getsubopt(&p, (constpp)subopts, &value)) { case I_ALIGN: - sb_feat.inode_align = getbool( - value, "i align", true); + sb_feat.inode_align = getnum_checked( + value, &iopts, I_ALIGN); break; case I_LOG: if (ilflag) @@ -1709,16 +1798,14 @@ main( sb_feat.attr_version = c; break; case I_PROJID32BIT: - sb_feat.projid16bit = !getbool(value, - "i projid32bit", false); + sb_feat.projid16bit = + !getnum_checked(value, &iopts, + I_PROJID32BIT); break; case I_SPINODES: - if (!value || *value == '\0') - value = "1"; - c = atoi(value); - if (c < 0 || c > 1) - illegal(value, "i spinodes"); - sb_feat.spinodes = c; + sb_feat.spinodes = + getnum_checked(value, &iopts, + I_SPINODES); break; default: unknown('i', value); @@ -1748,11 +1835,11 @@ main( laflag = 1; break; case L_FILE: - if (loginternal) + xi.lisfile = getnum_checked(value, + &lopts, L_FILE); + if (xi.lisfile && loginternal) conflict('l', subopts, L_INTERNAL, L_FILE); - xi.lisfile = getbool(value, "l file", - true); if (xi.lisfile) xi.lcreat = 1; break; @@ -1765,8 +1852,8 @@ main( if (liflag) respec('l', subopts, L_INTERNAL); - loginternal = getbool(value, - "l internal", true); + loginternal = getnum_checked(value, + &lopts, L_INTERNAL); liflag = 1; break; case L_SU: @@ -1853,9 +1940,9 @@ main( lssflag = 1; break; case L_LAZYSBCNTR: - sb_feat.lazy_sb_counters = getbool( - value, "l lazy-count", - true); + sb_feat.lazy_sb_counters = + getnum_checked(value, &lopts, + L_LAZYSBCNTR); break; default: unknown('l', value); @@ -1876,8 +1963,9 @@ main( switch (getsubopt(&p, (constpp)subopts, &value)) { case M_CRC: - sb_feat.crcs_enabled = getbool( - value, "m crc", true); + sb_feat.crcs_enabled = + getnum_checked(value, &mopts, + M_CRC); if (sb_feat.crcs_enabled && nftype) { fprintf(stderr, _("cannot specify both -m crc=1 and -n ftype\n")); @@ -1888,8 +1976,8 @@ _("cannot specify both -m crc=1 and -n ftype\n")); break; case M_FINOBT: sb_feat.finobtflag = true; - sb_feat.finobt = getbool( - value, "m finobt", true); + sb_feat.finobt = getnum_checked( + value, &mopts, M_FINOBT); break; case M_UUID: if (!value || *value == '\0') @@ -1963,8 +2051,8 @@ _("cannot specify both -m crc=1 and -n ftype\n")); _("cannot specify both -m crc=1 and -n ftype\n")); usage(); } - sb_feat.dirftype = getbool(value, - "n ftype", true); + sb_feat.dirftype = getnum_checked(value, + &nopts, N_FTYPE); nftype = 1; break; default: @@ -2002,8 +2090,8 @@ _("cannot specify both -m crc=1 and -n ftype\n")); rtextsize = value; break; case R_FILE: - xi.risfile = getbool(value, - "r file", true); + xi.risfile = getnum_checked(value, + &ropts, R_FILE); if (xi.risfile) xi.rcreat = 1; break; @@ -2023,7 +2111,8 @@ _("cannot specify both -m crc=1 and -n ftype\n")); rtsize = value; break; case R_NOALIGN: - norsflag = 1; + norsflag = getnum_checked(value, + &ropts, R_NOALIGN); break; default: unknown('r', value); -- 2.6.0 From jtulak@redhat.com Thu Mar 24 06:15:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CB43E7CCA for ; Thu, 24 Mar 2016 06:15:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7688F8F804C for ; Thu, 24 Mar 2016 04:15:49 -0700 (PDT) X-ASG-Debug-ID: 1458818147-04bdf03cf949720001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id wLOFmoVYaPdg9Orc (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 24 Mar 2016 04:15:47 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 05791C00EB1C for ; Thu, 24 Mar 2016 11:15:47 +0000 (UTC) Received: from localhost.localdomain (vpn1-7-36.ams2.redhat.com [10.36.7.36]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2OBFbLF009274 for ; Thu, 24 Mar 2016 07:15:46 -0400 From: jtulak@redhat.com To: xfs@oss.sgi.com Subject: [PATCH 09/19] mkfs: use getnum_checked for all ranged parameters Date: Thu, 24 Mar 2016 12:15:26 +0100 X-ASG-Orig-Subj: [PATCH 09/19] mkfs: use getnum_checked for all ranged parameters Message-Id: <1458818136-56043-10-git-send-email-jtulak@redhat.com> In-Reply-To: <1458818136-56043-1-git-send-email-jtulak@redhat.com> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458818147 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner Now that getnum_checked can handle min/max checking, use this for all parameters that take straight numbers and don't require unit conversions. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak --- include/xfs_multidisk.h | 5 +- mkfs/xfs_mkfs.c | 148 ++++++++++++++++++++++++------------------------ 2 files changed, 76 insertions(+), 77 deletions(-) diff --git a/include/xfs_multidisk.h b/include/xfs_multidisk.h index af35100..8e81d90 100644 --- a/include/xfs_multidisk.h +++ b/include/xfs_multidisk.h @@ -42,8 +42,9 @@ #define XFS_AG_BYTES(bblog) ((long long)BBSIZE << (bblog)) #define XFS_AG_MIN_BYTES ((XFS_AG_BYTES(15))) /* 16 MB */ -#define XFS_AG_MIN_BLOCKS(blog) ((XFS_AG_BYTES(15)) >> (blog)) -#define XFS_AG_MAX_BLOCKS(blog) ((XFS_AG_BYTES(31) - 1) >> (blog)) +#define XFS_AG_MAX_BYTES ((XFS_AG_BYTES(31))) /* 1 TB */ +#define XFS_AG_MIN_BLOCKS(blog) (XFS_AG_MIN_BYTES >> (blog)) +#define XFS_AG_MAX_BLOCKS(blog) ((XFS_AG_MAX_BYTES - 1) >> (blog)) #define XFS_MAX_AGNUMBER ((xfs_agnumber_t)(NULLAGNUMBER - 1)) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 0e2cfac..021d682 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -163,6 +163,8 @@ struct opt_params dopts = { }, .subopt_params = { { .index = D_AGCOUNT, + .minval = 1, + .maxval = XFS_MAX_AGNUMBER, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_FILE, @@ -177,18 +179,26 @@ struct opt_params dopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SUNIT, + .minval = 0, + .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SWIDTH, + .minval = 0, + .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_AGSIZE, + .minval = XFS_AG_MIN_BYTES, + .maxval = XFS_AG_MAX_BYTES, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SU, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SW, + .minval = 0, + .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SECTLOG, @@ -207,12 +217,18 @@ struct opt_params dopts = { .defaultval = 1, }, { .index = D_RTINHERIT, - .defaultval = SUBOPT_NEEDS_VAL, + .minval = 1, + .maxval = 1, + .defaultval = 1, }, { .index = D_PROJINHERIT, + .minval = 0, + .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_EXTSZINHERIT, + .minval = 0, + .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, }, @@ -252,15 +268,23 @@ struct opt_params iopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_MAXPCT, + .minval = 0, + .maxval = 100, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_PERBLOCK, + .minval = XFS_MIN_INODE_PERBLOCK, + .maxval = XFS_MAX_BLOCKSIZE / XFS_DINODE_MIN_SIZE, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_SIZE, + .minval = XFS_DINODE_MIN_SIZE, + .maxval = XFS_DINODE_MAX_SIZE, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_ATTR, + .minval = 0, + .maxval = 2, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_PROJID32BIT, @@ -307,6 +331,8 @@ struct opt_params lopts = { }, .subopt_params = { { .index = L_AGNUM, + .minval = 0, + .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_INTERNAL, @@ -318,9 +344,13 @@ struct opt_params lopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_VERSION, + .minval = 1, + .maxval = 2, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SUNIT, + .minval = BTOBB(XLOG_MIN_RECORD_BSIZE), + .maxval = BTOBB(XLOG_MAX_RECORD_BSIZE), .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SU, @@ -380,6 +410,8 @@ struct opt_params nopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = N_VERSION, + .minval = 2, + .maxval = 2, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = N_FTYPE, @@ -1560,13 +1592,11 @@ main( switch (getsubopt(&p, (constpp)subopts, &value)) { case D_AGCOUNT: - if (!value || *value == '\0') - reqval('d', subopts, D_AGCOUNT); if (daflag) respec('d', subopts, D_AGCOUNT); - agcount = getnum(value, 0, 0, false); - if ((__int64_t)agcount <= 0) - illegal(value, "d agcount"); + + agcount = getnum_checked(value, &dopts, + D_AGCOUNT); daflag = 1; break; case D_AGSIZE: @@ -1601,28 +1631,22 @@ main( dsize = value; break; case D_SUNIT: - if (!value || *value == '\0') - reqval('d', subopts, D_SUNIT); if (dsunit) respec('d', subopts, D_SUNIT); if (nodsflag) conflict('d', subopts, D_NOALIGN, D_SUNIT); - dsunit = getnum(value, 0, 0, false); - if (dsunit < 0) - illegal(value, "d sunit"); + dsunit = getnum_checked(value, &dopts, + D_SUNIT); break; case D_SWIDTH: - if (!value || *value == '\0') - reqval('d', subopts, D_SWIDTH); if (dswidth) respec('d', subopts, D_SWIDTH); if (nodsflag) conflict('d', subopts, D_NOALIGN, D_SWIDTH); - dswidth = getnum(value, 0, 0, false); - if (dswidth < 0) - illegal(value, "d swidth"); + dswidth = getnum_checked(value, &dopts, + D_SWIDTH); break; case D_SU: if (!value || *value == '\0') @@ -1638,16 +1662,13 @@ main( illegal(value, "d su"); break; case D_SW: - if (!value || *value == '\0') - reqval('d', subopts, D_SW); if (dsw) respec('d', subopts, D_SW); if (nodsflag) conflict('d', subopts, D_NOALIGN, D_SW); - dsw = getnum(value, 0, 0, false); - if (dsw < 0) - illegal(value, "d sw"); + dsw = getnum_checked(value, &dopts, + D_SW); break; case D_NOALIGN: nodsflag = getnum_checked(value, @@ -1696,21 +1717,22 @@ main( ssflag = 1; break; case D_RTINHERIT: - fsx.fsx_xflags |= \ - XFS_DIFLAG_RTINHERIT; + c = getnum_checked(value, &dopts, + D_RTINHERIT); + if (c) + fsx.fsx_xflags |= + XFS_DIFLAG_RTINHERIT; break; case D_PROJINHERIT: - if (!value || *value == '\0') - reqval('d', subopts, D_PROJINHERIT); - fsx.fsx_projid = atoi(value); - fsx.fsx_xflags |= \ + fsx.fsx_projid = getnum_checked(value, + &dopts, D_PROJINHERIT); + fsx.fsx_xflags |= XFS_DIFLAG_PROJINHERIT; break; case D_EXTSZINHERIT: - if (!value || *value == '\0') - reqval('d', subopts, D_EXTSZINHERIT); - fsx.fsx_extsize = atoi(value); - fsx.fsx_xflags |= \ + fsx.fsx_extsize = getnum_checked(value, + &dopts, D_EXTSZINHERIT); + fsx.fsx_xflags |= XFS_DIFLAG_EXTSZINHERIT; break; default: @@ -1745,18 +1767,13 @@ main( ilflag = 1; break; case I_MAXPCT: - if (!value || *value == '\0') - reqval('i', subopts, I_MAXPCT); if (imflag) respec('i', subopts, I_MAXPCT); - imaxpct = getnum(value, 0, 0, false); - if (imaxpct < 0 || imaxpct > 100) - illegal(value, "i maxpct"); + imaxpct = getnum_checked( + value, &iopts, I_MAXPCT); imflag = 1; break; case I_PERBLOCK: - if (!value || *value == '\0') - reqval('i', subopts, I_PERBLOCK); if (ilflag) conflict('i', subopts, I_LOG, I_PERBLOCK); @@ -1765,16 +1782,13 @@ main( if (isflag) conflict('i', subopts, I_SIZE, I_PERBLOCK); - inopblock = getnum(value, 0, 0, false); - if (inopblock < - XFS_MIN_INODE_PERBLOCK || - !ispow2(inopblock)) + inopblock = getnum_checked(value, &iopts, + I_PERBLOCK); + if (!ispow2(inopblock)) illegal(value, "i perblock"); ipflag = 1; break; case I_SIZE: - if (!value || *value == '\0') - reqval('i', subopts, I_SIZE); if (ilflag) conflict('i', subopts, I_LOG, I_SIZE); @@ -1783,19 +1797,16 @@ main( I_SIZE); if (isflag) respec('i', subopts, I_SIZE); - isize = getnum(value, 0, 0, true); - if (isize <= 0 || !ispow2(isize)) + isize = getnum_checked(value, &iopts, + I_SIZE); + if (!ispow2(isize)) illegal(value, "i size"); inodelog = libxfs_highbit32(isize); isflag = 1; break; case I_ATTR: - if (!value || *value == '\0') - reqval('i', subopts, I_ATTR); - c = getnum(value, 0, 0, false); - if (c < 0 || c > 2) - illegal(value, "i attr"); - sb_feat.attr_version = c; + sb_feat.attr_version = getnum_checked( + value, &iopts, I_ATTR); break; case I_PROJID32BIT: sb_feat.projid16bit = @@ -1817,21 +1828,16 @@ main( while (*p != '\0') { char **subopts = (char **)lopts.subopts; char *value; - long long tmp_num; switch (getsubopt(&p, (constpp)subopts, &value)) { case L_AGNUM: - if (!value || *value == '\0') - reqval('l', subopts, L_AGNUM); if (laflag) respec('l', subopts, L_AGNUM); if (ldflag) conflict('l', subopts, L_AGNUM, L_DEV); - tmp_num = getnum(value, 0, 0, false); - if (tmp_num < 0) - illegal(value, "l agno"); - logagno = (xfs_agnumber_t)tmp_num; + logagno = getnum_checked(value, &lopts, + L_AGNUM); laflag = 1; break; case L_FILE: @@ -1868,13 +1874,10 @@ main( lsuflag = 1; break; case L_SUNIT: - if (!value || *value == '\0') - reqval('l', subopts, L_SUNIT); if (lsunit) respec('l', subopts, L_SUNIT); - lsunit = getnum(value, 0, 0, false); - if (lsunit < 0) - illegal(value, "l sunit"); + lsunit = getnum_checked(value, &lopts, + L_SUNIT); lsunitflag = 1; break; case L_NAME: @@ -1893,14 +1896,10 @@ main( xi.logname = value; break; case L_VERSION: - if (!value || *value == '\0') - reqval('l', subopts, L_VERSION); if (lvflag) respec('l', subopts, L_VERSION); - c = getnum(value, 0, 0, false); - if (c < 1 || c > 2) - illegal(value, "l version"); - sb_feat.log_version = c; + sb_feat.log_version = getnum_checked( + value, &lopts, L_VERSION); lvflag = 1; break; case L_SIZE: @@ -2035,11 +2034,10 @@ _("cannot specify both -m crc=1 and -n ftype\n")); /* ASCII CI mode */ sb_feat.nci = true; } else { - c = getnum(value, 0, 0, false); - if (c != 2) - illegal(value, - "n version"); - sb_feat.dir_version = c; + sb_feat.dir_version = + getnum_checked(value, + &nopts, + N_VERSION); } nvflag = 1; break; -- 2.6.0 From jtulak@redhat.com Thu Mar 24 06:15:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 46C337CCD for ; Thu, 24 Mar 2016 06:15:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1539330405F for ; Thu, 24 Mar 2016 04:15:50 -0700 (PDT) X-ASG-Debug-ID: 1458818148-04cbb05f3748cc0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id UoN0DcORFVa2Osdl (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 24 Mar 2016 04:15:48 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id E1ECD64394 for ; Thu, 24 Mar 2016 11:15:47 +0000 (UTC) Received: from localhost.localdomain (vpn1-7-36.ams2.redhat.com [10.36.7.36]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2OBFbLG009274 for ; Thu, 24 Mar 2016 07:15:47 -0400 From: jtulak@redhat.com To: xfs@oss.sgi.com Subject: [PATCH 10/19] mkfs: add respecification detection to generic parsing Date: Thu, 24 Mar 2016 12:15:27 +0100 X-ASG-Orig-Subj: [PATCH 10/19] mkfs: add respecification detection to generic parsing Message-Id: <1458818136-56043-11-git-send-email-jtulak@redhat.com> In-Reply-To: <1458818136-56043-1-git-send-email-jtulak@redhat.com> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 24 Mar 2016 11:15:47 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458818148 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner CHANGE: o Add description of new members in opt_params struct. o Drop "const" from struct opt_params - a previous patch was changed to not create it as const. Add flags to the generic input parameter tables so that respecification can be detected in a generic manner. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak --- mkfs/xfs_mkfs.c | 64 ++++++++++++++++----------------------------------------- 1 file changed, 18 insertions(+), 46 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 021d682..a8dd304 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -72,6 +72,10 @@ static long long cvtnum(unsigned int blocksize, * it is. The index has to be the same as is the order in subopts list, * so we can access the right item both in subopt_param and subopts. * + * seen INTERNAL + * Do not set this flag when definning a subopt. It is used to remeber that + * this subopt was already seen, for example for conflicts detection. + * * minval, maxval OPTIONAL * These options are used for automatic range check and they have to be * always used together in pair. If you don't want to limit the max value, @@ -95,8 +99,10 @@ static long long cvtnum(unsigned int blocksize, struct opt_params { const char name; const char *subopts[MAX_SUBOPTS]; + struct subopt_param { int index; + bool seen; long long minval; long long maxval; long long defaultval; @@ -1227,7 +1233,6 @@ struct sb_feat_args { int dir_version; int spinodes; int finobt; - bool finobtflag; bool inode_align; bool nci; bool lazy_sb_counters; @@ -1363,7 +1368,7 @@ getnum_checked( struct opt_params *opts, int index) { - const struct subopt_param *sp = &opts->subopt_params[index]; + struct subopt_param *sp = &opts->subopt_params[index]; long long c; if (sp->index != index) { @@ -1373,6 +1378,11 @@ getnum_checked( reqval(opts->name, (char **)opts->subopts, index); } + /* check for respecification of the option */ + if (sp->seen) + respec(opts->name, (char **)opts->subopts, index); + sp->seen = true; + if (!str || *str == '\0') { if (sp->defaultval == SUBOPT_NEEDS_VAL) reqval(opts->name, (char **)opts->subopts, index); @@ -1490,7 +1500,6 @@ main( struct fs_topology ft; struct sb_feat_args sb_feat = { .finobt = 1, - .finobtflag = false, .spinodes = 0, .log_version = 2, .attr_version = 2, @@ -1552,8 +1561,6 @@ main( switch (getsubopt(&p, (constpp)subopts, &value)) { case B_LOG: - if (blflag) - respec('b', subopts, B_LOG); if (bsflag) conflict('b', subopts, B_SIZE, B_LOG); @@ -1592,9 +1599,6 @@ main( switch (getsubopt(&p, (constpp)subopts, &value)) { case D_AGCOUNT: - if (daflag) - respec('d', subopts, D_AGCOUNT); - agcount = getnum_checked(value, &dopts, D_AGCOUNT); daflag = 1; @@ -1631,8 +1635,6 @@ main( dsize = value; break; case D_SUNIT: - if (dsunit) - respec('d', subopts, D_SUNIT); if (nodsflag) conflict('d', subopts, D_NOALIGN, D_SUNIT); @@ -1640,8 +1642,6 @@ main( D_SUNIT); break; case D_SWIDTH: - if (dswidth) - respec('d', subopts, D_SWIDTH); if (nodsflag) conflict('d', subopts, D_NOALIGN, D_SWIDTH); @@ -1662,8 +1662,6 @@ main( illegal(value, "d su"); break; case D_SW: - if (dsw) - respec('d', subopts, D_SW); if (nodsflag) conflict('d', subopts, D_NOALIGN, D_SW); @@ -1689,8 +1687,6 @@ main( } break; case D_SECTLOG: - if (slflag) - respec('d', subopts, D_SECTLOG); if (ssflag) conflict('d', subopts, D_SECTSIZE, D_SECTLOG); @@ -1753,8 +1749,6 @@ main( value, &iopts, I_ALIGN); break; case I_LOG: - if (ilflag) - respec('i', subopts, I_LOG); if (ipflag) conflict('i', subopts, I_PERBLOCK, I_LOG); @@ -1767,18 +1761,14 @@ main( ilflag = 1; break; case I_MAXPCT: - if (imflag) - respec('i', subopts, I_MAXPCT); - imaxpct = getnum_checked( - value, &iopts, I_MAXPCT); + imaxpct = getnum_checked(value, &iopts, + I_MAXPCT); imflag = 1; break; case I_PERBLOCK: if (ilflag) conflict('i', subopts, I_LOG, I_PERBLOCK); - if (ipflag) - respec('i', subopts, I_PERBLOCK); if (isflag) conflict('i', subopts, I_SIZE, I_PERBLOCK); @@ -1795,8 +1785,6 @@ main( if (ipflag) conflict('i', subopts, I_PERBLOCK, I_SIZE); - if (isflag) - respec('i', subopts, I_SIZE); isize = getnum_checked(value, &iopts, I_SIZE); if (!ispow2(isize)) @@ -1832,8 +1820,6 @@ main( switch (getsubopt(&p, (constpp)subopts, &value)) { case L_AGNUM: - if (laflag) - respec('l', subopts, L_AGNUM); if (ldflag) conflict('l', subopts, L_AGNUM, L_DEV); logagno = getnum_checked(value, &lopts, @@ -1855,8 +1841,6 @@ main( if (xi.lisfile) conflict('l', subopts, L_FILE, L_INTERNAL); - if (liflag) - respec('l', subopts, L_INTERNAL); loginternal = getnum_checked(value, &lopts, L_INTERNAL); @@ -1874,8 +1858,6 @@ main( lsuflag = 1; break; case L_SUNIT: - if (lsunit) - respec('l', subopts, L_SUNIT); lsunit = getnum_checked(value, &lopts, L_SUNIT); lsunitflag = 1; @@ -1896,10 +1878,9 @@ main( xi.logname = value; break; case L_VERSION: - if (lvflag) - respec('l', subopts, L_VERSION); - sb_feat.log_version = getnum_checked( - value, &lopts, L_VERSION); + sb_feat.log_version = + getnum_checked(value, &lopts, + L_VERSION); lvflag = 1; break; case L_SIZE: @@ -1911,8 +1892,6 @@ main( lsflag = 1; break; case L_SECTLOG: - if (lslflag) - respec('l', subopts, L_SECTLOG); if (lssflag) conflict('l', subopts, L_SECTSIZE, L_SECTLOG); @@ -1974,7 +1953,6 @@ _("cannot specify both -m crc=1 and -n ftype\n")); sb_feat.dirftype = true; break; case M_FINOBT: - sb_feat.finobtflag = true; sb_feat.finobt = getnum_checked( value, &mopts, M_FINOBT); break; @@ -1998,8 +1976,6 @@ _("cannot specify both -m crc=1 and -n ftype\n")); switch (getsubopt(&p, (constpp)subopts, &value)) { case N_LOG: - if (nlflag) - respec('n', subopts, N_LOG); if (nsflag) conflict('n', subopts, N_SIZE, N_LOG); @@ -2042,8 +2018,6 @@ _("cannot specify both -m crc=1 and -n ftype\n")); nvflag = 1; break; case N_FTYPE: - if (nftype) - respec('n', subopts, N_FTYPE); if (sb_feat.crcs_enabled) { fprintf(stderr, _("cannot specify both -m crc=1 and -n ftype\n")); @@ -2127,8 +2101,6 @@ _("cannot specify both -m crc=1 and -n ftype\n")); &value)) { case S_LOG: case S_SECTLOG: - if (slflag || lslflag) - respec('s', subopts, S_SECTLOG); if (ssflag || lssflag) conflict('s', subopts, S_SECTSIZE, S_SECTLOG); @@ -2340,7 +2312,7 @@ _("32 bit Project IDs always enabled on CRC enabled filesytems\n")); * them off. */ if (sb_feat.finobt){ - if (sb_feat.finobtflag) { + if (mopts.subopt_params[M_FINOBT].seen) { fprintf(stderr, _("warning: finobt not supported without CRC support, disabled.\n")); } -- 2.6.0 From jtulak@redhat.com Thu Mar 24 06:15:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B25F47CCA for ; Thu, 24 Mar 2016 06:15:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4381EAC002 for ; Thu, 24 Mar 2016 04:15:51 -0700 (PDT) X-ASG-Debug-ID: 1458818149-04bdf03cfb49730001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id OuQgHVrq2xVwbe2k (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 24 Mar 2016 04:15:49 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id CDAD364373 for ; Thu, 24 Mar 2016 11:15:48 +0000 (UTC) Received: from localhost.localdomain (vpn1-7-36.ams2.redhat.com [10.36.7.36]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2OBFbLH009274 for ; Thu, 24 Mar 2016 07:15:48 -0400 From: jtulak@redhat.com To: xfs@oss.sgi.com Subject: [PATCH 11/19] mkfs: table based parsing for converted parameters Date: Thu, 24 Mar 2016 12:15:28 +0100 X-ASG-Orig-Subj: [PATCH 11/19] mkfs: table based parsing for converted parameters Message-Id: <1458818136-56043-12-git-send-email-jtulak@redhat.com> In-Reply-To: <1458818136-56043-1-git-send-email-jtulak@redhat.com> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 24 Mar 2016 11:15:48 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458818149 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner CHANGE: o Change getnum_checked type to long long to prevent int overflow o Add description of new members in opt_params struct. o L_SU maxval was a wrong number, fix it All the parameters that can be passed as block or sector sizes need to be passed the block and sector sizes that they should be using for conversion. For parameter parsing, it is always the same two variables, so to make things easy just declare them as global variables so we can avoid needing to pass them to getnum_checked(). We also need to mark these parameters are requiring conversion so that we don't need to pass this information manually to getnum_checked(). Further, some of these options are required to have a power of 2 value, so add optional checking for that as well. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak --- mkfs/xfs_mkfs.c | 182 ++++++++++++++++++++++++-------------------------------- 1 file changed, 78 insertions(+), 104 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index a8dd304..acf420f 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -48,6 +48,13 @@ static int ispow2(unsigned int i); static long long cvtnum(unsigned int blocksize, unsigned int sectorsize, const char *s); +/* + * The configured block and sector sizes are defined as global variables so + * that they don't need to be passed to functions that require them. + */ +unsigned int blocksize; +unsigned int sectorsize; + #define MAX_SUBOPTS 16 #define SUBOPT_NEEDS_VAL (-1LL) /* @@ -76,6 +83,15 @@ static long long cvtnum(unsigned int blocksize, * Do not set this flag when definning a subopt. It is used to remeber that * this subopt was already seen, for example for conflicts detection. * + * convert OPTIONAL + * A flag signalling whether the user-given value can use suffixes. + * If you want to allow the use of user-friendly values like 13k, 42G, + * set it to true. + * + * is_power_2 OPTIONAL + * An optional flag for subopts where the given value has to be a power + * of two. + * * minval, maxval OPTIONAL * These options are used for automatic range check and they have to be * always used together in pair. If you don't want to limit the max value, @@ -103,6 +119,8 @@ struct opt_params { struct subopt_param { int index; bool seen; + bool convert; + bool is_power_2; long long minval; long long maxval; long long defaultval; @@ -125,6 +143,8 @@ struct opt_params bopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = B_SIZE, + .convert = true, + .is_power_2 = true, .minval = XFS_MIN_BLOCKSIZE, .maxval = XFS_MAX_BLOCKSIZE, .defaultval = SUBOPT_NEEDS_VAL, @@ -182,6 +202,9 @@ struct opt_params dopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SIZE, + .convert = true, + .minval = XFS_AG_MIN_BYTES, + .maxval = LLONG_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SUNIT, @@ -195,11 +218,15 @@ struct opt_params dopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_AGSIZE, + .convert = true, .minval = XFS_AG_MIN_BYTES, .maxval = XFS_AG_MAX_BYTES, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SU, + .convert = true, + .minval = 0, + .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SW, @@ -213,6 +240,8 @@ struct opt_params dopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SECTSIZE, + .convert = true, + .is_power_2 = true, .minval = XFS_MIN_SECTORSIZE, .maxval = XFS_MAX_SECTORSIZE, .defaultval = SUBOPT_NEEDS_VAL, @@ -279,11 +308,13 @@ struct opt_params iopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_PERBLOCK, + .is_power_2 = true, .minval = XFS_MIN_INODE_PERBLOCK, .maxval = XFS_MAX_BLOCKSIZE / XFS_DINODE_MIN_SIZE, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_SIZE, + .is_power_2 = true, .minval = XFS_DINODE_MIN_SIZE, .maxval = XFS_DINODE_MAX_SIZE, .defaultval = SUBOPT_NEEDS_VAL, @@ -347,6 +378,9 @@ struct opt_params lopts = { .defaultval = 1, }, { .index = L_SIZE, + .convert = true, + .minval = 2 * 1024 * 1024LL, /* XXX: XFS_MIN_LOG_BYTES */ + .maxval = XFS_MAX_LOG_BYTES, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_VERSION, @@ -360,6 +394,9 @@ struct opt_params lopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SU, + .convert = true, + .minval = XLOG_MIN_RECORD_BSIZE, + .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_DEV, @@ -371,6 +408,8 @@ struct opt_params lopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SECTSIZE, + .convert = true, + .is_power_2 = true, .minval = XFS_MIN_SECTORSIZE, .maxval = XFS_MAX_SECTORSIZE, .defaultval = SUBOPT_NEEDS_VAL, @@ -411,6 +450,8 @@ struct opt_params nopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = N_SIZE, + .convert = true, + .is_power_2 = true, .minval = 1 << XFS_MIN_REC_DIRSIZE, .maxval = XFS_MAX_BLOCKSIZE, .defaultval = SUBOPT_NEEDS_VAL, @@ -447,9 +488,15 @@ struct opt_params ropts = { }, .subopt_params = { { .index = R_EXTSIZE, + .convert = true, + .minval = XFS_MIN_RTEXTSIZE, + .maxval = XFS_MAX_RTEXTSIZE, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_SIZE, + .convert = true, + .minval = 0, + .maxval = LLONG_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_DEV, @@ -496,11 +543,15 @@ struct opt_params sopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = S_SIZE, + .convert = true, + .is_power_2 = true, .minval = XFS_MIN_SECTORSIZE, .maxval = XFS_MAX_SECTORSIZE, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = S_SECTSIZE, + .convert = true, + .is_power_2 = true, .minval = XFS_MIN_SECTORSIZE, .maxval = XFS_MAX_SECTORSIZE, .defaultval = SUBOPT_NEEDS_VAL, @@ -1332,15 +1383,15 @@ sb_set_features( long long getnum( const char *str, - unsigned int blocksize, - unsigned int sectorsize, + unsigned int blksize, + unsigned int sectsize, bool convert) { long long i; char *sp; if (convert) - return cvtnum(blocksize, sectorsize, str); + return cvtnum(blksize, sectsize, str); i = strtoll(str, &sp, 0); if (i == 0 && sp == str) @@ -1362,7 +1413,7 @@ illegal_option( usage(); } -static int +static long long getnum_checked( const char *str, struct opt_params *opts, @@ -1397,9 +1448,11 @@ getnum_checked( exit(1); } - c = getnum(str, 0, 0, false); + c = getnum(str, blocksize, sectorsize, sp->convert); if (c < sp->minval || c > sp->maxval) illegal_option(str, opts, index); + if (sp->is_power_2 && !ispow2(c)) + illegal_option(str, opts, index); return c; } @@ -1417,7 +1470,6 @@ main( struct xfs_btree_block *block; int blflag; int blocklog; - unsigned int blocksize; int bsflag; int bsize; xfs_buf_t *buf; @@ -1489,7 +1541,6 @@ main( char *rtsize; xfs_sb_t *sbp; int sectorlog; - unsigned int sectorsize; __uint64_t sector_mask; int slflag; int ssflag; @@ -1570,18 +1621,11 @@ main( blflag = 1; break; case B_SIZE: - if (!value || *value == '\0') - reqval('b', subopts, B_SIZE); - if (bsflag) - respec('b', subopts, B_SIZE); if (blflag) conflict('b', subopts, B_LOG, B_SIZE); - blocksize = getnum(value, blocksize, - sectorsize, true); - if (blocksize <= 0 || - !ispow2(blocksize)) - illegal(value, "b size"); + blocksize = getnum_checked(value, &bopts, + B_SIZE); blocklog = libxfs_highbit32(blocksize); bsflag = 1; break; @@ -1604,14 +1648,8 @@ main( daflag = 1; break; case D_AGSIZE: - if (!value || *value == '\0') - reqval('d', subopts, D_AGSIZE); - if (dasize) - respec('d', subopts, D_AGSIZE); - agsize = getnum(value, blocksize, - sectorsize, true); - if ((__int64_t)agsize <= 0) - illegal(value, "d agsize"); + agsize = getnum_checked(value, &dopts, + D_AGSIZE); dasize = 1; break; case D_FILE: @@ -1649,17 +1687,11 @@ main( D_SWIDTH); break; case D_SU: - if (!value || *value == '\0') - reqval('d', subopts, D_SU); - if (dsu) - respec('d', subopts, D_SU); if (nodsflag) conflict('d', subopts, D_NOALIGN, D_SU); - dsu = getnum(value, blocksize, - sectorsize, true); - if (dsu < 0) - illegal(value, "d su"); + dsu = getnum_checked(value, &dopts, + D_SU); break; case D_SW: if (nodsflag) @@ -1696,18 +1728,11 @@ main( slflag = 1; break; case D_SECTSIZE: - if (!value || *value == '\0') - reqval('d', subopts, D_SECTSIZE); - if (ssflag) - respec('d', subopts, D_SECTSIZE); if (slflag) conflict('d', subopts, D_SECTLOG, D_SECTSIZE); - sectorsize = getnum(value, blocksize, - sectorsize, true); - if (sectorsize <= 0 || - !ispow2(sectorsize)) - illegal(value, "d sectsize"); + sectorsize = getnum_checked(value, + &dopts, D_SECTSIZE); sectorlog = libxfs_highbit32(sectorsize); ssflag = 1; @@ -1774,8 +1799,6 @@ main( I_PERBLOCK); inopblock = getnum_checked(value, &iopts, I_PERBLOCK); - if (!ispow2(inopblock)) - illegal(value, "i perblock"); ipflag = 1; break; case I_SIZE: @@ -1787,8 +1810,6 @@ main( I_SIZE); isize = getnum_checked(value, &iopts, I_SIZE); - if (!ispow2(isize)) - illegal(value, "i size"); inodelog = libxfs_highbit32(isize); isflag = 1; break; @@ -1847,14 +1868,8 @@ main( liflag = 1; break; case L_SU: - if (!value || *value == '\0') - reqval('l', subopts, L_SU); - if (lsu) - respec('l', subopts, L_SU); - lsu = getnum(value, blocksize, - sectorsize, true); - if (lsu < 0) - illegal(value, "l su"); + lsu = getnum_checked(value, &lopts, + L_SU); lsuflag = 1; break; case L_SUNIT: @@ -1901,18 +1916,11 @@ main( lslflag = 1; break; case L_SECTSIZE: - if (!value || *value == '\0') - reqval('l', subopts, L_SECTSIZE); - if (lssflag) - respec('l', subopts, L_SECTSIZE); if (lslflag) conflict('l', subopts, L_SECTLOG, L_SECTSIZE); - lsectorsize = getnum(value, blocksize, - sectorsize, true); - if (lsectorsize <= 0 || - !ispow2(lsectorsize)) - illegal(value, "l sectsize"); + lsectorsize = getnum_checked(value, + &lopts, L_SECTSIZE); lsectorlog = libxfs_highbit32(lsectorsize); lssflag = 1; @@ -1985,18 +1993,11 @@ _("cannot specify both -m crc=1 and -n ftype\n")); nlflag = 1; break; case N_SIZE: - if (!value || *value == '\0') - reqval('n', subopts, N_SIZE); - if (nsflag) - respec('n', subopts, N_SIZE); if (nlflag) conflict('n', subopts, N_LOG, N_SIZE); - dirblocksize = getnum(value, blocksize, - sectorsize, true); - if (dirblocksize <= 0 || - !ispow2(dirblocksize)) - illegal(value, "n size"); + dirblocksize = getnum_checked(value, + &nopts, N_SIZE); dirblocklog = libxfs_highbit32(dirblocksize); nsflag = 1; @@ -2113,18 +2114,11 @@ _("cannot specify both -m crc=1 and -n ftype\n")); break; case S_SIZE: case S_SECTSIZE: - if (!value || *value == '\0') - reqval('s', subopts, S_SECTSIZE); - if (ssflag || lssflag) - respec('s', subopts, S_SECTSIZE); if (slflag || lslflag) conflict('s', subopts, S_SECTLOG, S_SECTSIZE); - sectorsize = getnum(value, blocksize, - sectorsize, true); - if (sectorsize <= 0 || - !ispow2(sectorsize)) - illegal(value, "s sectsize"); + sectorsize = getnum_checked(value, + &sopts, S_SECTSIZE); lsectorsize = sectorsize; sectorlog = libxfs_highbit32(sectorsize); @@ -2355,9 +2349,7 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); if (dsize) { __uint64_t dbytes; - dbytes = getnum(dsize, blocksize, sectorsize, true); - if ((__int64_t)dbytes < 0) - illegal(dsize, "d size"); + dbytes = getnum_checked(dsize, &dopts, D_SIZE); if (dbytes % XFS_MIN_BLOCKSIZE) { fprintf(stderr, _("illegal data length %lld, not a multiple of %d\n"), @@ -2394,9 +2386,7 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); if (logsize) { __uint64_t logbytes; - logbytes = getnum(logsize, blocksize, sectorsize, true); - if ((__int64_t)logbytes < 0) - illegal(logsize, "l size"); + logbytes = getnum_checked(logsize, &lopts, L_SIZE); if (logbytes % XFS_MIN_BLOCKSIZE) { fprintf(stderr, _("illegal log length %lld, not a multiple of %d\n"), @@ -2418,9 +2408,7 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); if (rtsize) { __uint64_t rtbytes; - rtbytes = getnum(rtsize, blocksize, sectorsize, true); - if ((__int64_t)rtbytes < 0) - illegal(rtsize, "r size"); + rtbytes = getnum_checked(rtsize, &ropts, R_SIZE); if (rtbytes % XFS_MIN_BLOCKSIZE) { fprintf(stderr, _("illegal rt length %lld, not a multiple of %d\n"), @@ -2440,27 +2428,13 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); if (rtextsize) { __uint64_t rtextbytes; - rtextbytes = getnum(rtextsize, blocksize, sectorsize, true); - if ((__int64_t)rtextbytes < 0) - illegal(rtsize, "r extsize"); + rtextbytes = getnum_checked(rtextsize, &ropts, R_EXTSIZE); if (rtextbytes % blocksize) { fprintf(stderr, _("illegal rt extent size %lld, not a multiple of %d\n"), (long long)rtextbytes, blocksize); usage(); } - if (rtextbytes > XFS_MAX_RTEXTSIZE) { - fprintf(stderr, - _("rt extent size %s too large, maximum %d\n"), - rtextsize, XFS_MAX_RTEXTSIZE); - usage(); - } - if (rtextbytes < XFS_MIN_RTEXTSIZE) { - fprintf(stderr, - _("rt extent size %s too small, minimum %d\n"), - rtextsize, XFS_MIN_RTEXTSIZE); - usage(); - } rtextblocks = (xfs_extlen_t)(rtextbytes >> blocklog); } else { /* -- 2.6.0 From jtulak@redhat.com Thu Mar 24 06:15:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1736F7CA7 for ; Thu, 24 Mar 2016 06:15:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4D994AC009 for ; Thu, 24 Mar 2016 04:15:46 -0700 (PDT) X-ASG-Debug-ID: 1458818142-04cbb05f3748cb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 7U7DFMzFSenBRpGj (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 24 Mar 2016 04:15:43 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 440B97AEA2 for ; Thu, 24 Mar 2016 11:15:42 +0000 (UTC) Received: from localhost.localdomain (vpn1-7-36.ams2.redhat.com [10.36.7.36]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2OBFbLA009274 for ; Thu, 24 Mar 2016 07:15:41 -0400 From: jtulak@redhat.com To: xfs@oss.sgi.com Subject: [PATCH 04/19] mkfs: validate all input values Date: Thu, 24 Mar 2016 12:15:21 +0100 X-ASG-Orig-Subj: [PATCH 04/19] mkfs: validate all input values Message-Id: <1458818136-56043-5-git-send-email-jtulak@redhat.com> In-Reply-To: <1458818136-56043-1-git-send-email-jtulak@redhat.com> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458818142 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner CHANGELOG o Fix an unsigned < 0 comparison - save getnum result to another variable and test it, before converting it to unsigned logagno. Right now, mkfs does a poor job of input validation of values. Many parameters do not check for trailing garbage and so will pass obviously invalid values as OK. Some don't even detect completely invalid values, leaving it for other checks later on to fail due to a bad value conversion - these tend to rely on atoi() implicitly returning a sane value when it is passed garbage, and atoi gives no guarantee of the return value when passed garbage. Clean all this up by passing all strings that need to be converted into values into a common function that is called regardless of whether unit conversion is needed or not. Further, make sure every conversion is checked for a valid result, and abort the moment an invalid value is detected. Get rid of the silly "isdigits(), cvtnum()" calls which don't use any of the conversion capabilities of cvtnum() because we've already ensured that there are no conversion units in the string via the isdigits() call. These can simply be replaced by a standard strtoll() call followed by checking for no trailing bytes. Finally, the block size of the filesystem is not known until all the options have been parsed and we can determine if the default is to be used. This means any parameter that relies on using conversion from filesystem block size (the "NNNb" format) requires the block size to first be specified on the command line so it is known. Similarly, we make the same rule for specifying counts in sectors. This is a change from the existing behaviour that assumes sectors are 512 bytes unless otherwise changed on the command line. This, unfortunately, leads to complete silliness where you can specify the sector size as a count of sectors. It also means that you can do some conversions with 512 byte sector sizes, and others with whatever was specified on the command line, meaning the mkfs behaviour changes depending in where in the command line the sector size is changed.... Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak --- include/xfs_multidisk.h | 7 +- man/man8/mkfs.xfs.8 | 26 +++++- mkfs/proto.c | 36 ++++---- mkfs/xfs_mkfs.c | 217 +++++++++++++++++++++++++----------------------- 4 files changed, 155 insertions(+), 131 deletions(-) diff --git a/include/xfs_multidisk.h b/include/xfs_multidisk.h index 64d80e1..af35100 100644 --- a/include/xfs_multidisk.h +++ b/include/xfs_multidisk.h @@ -56,11 +56,8 @@ #define XFS_NOMULTIDISK_AGLOG 2 /* 4 AGs */ #define XFS_MULTIDISK_AGCOUNT (1 << XFS_MULTIDISK_AGLOG) - -/* xfs_mkfs.c */ -extern int isdigits (char *str); -extern long long cvtnum (unsigned int blocksize, - unsigned int sectorsize, char *s); +extern long long getnum(const char *str, unsigned int blocksize, + unsigned int sectorsize, bool convert); /* proto.c */ extern char *setup_proto (char *fname); diff --git a/man/man8/mkfs.xfs.8 b/man/man8/mkfs.xfs.8 index 980c7bc..8b068ef 100644 --- a/man/man8/mkfs.xfs.8 +++ b/man/man8/mkfs.xfs.8 @@ -64,11 +64,11 @@ SCSI disk, use: .PP The metadata log can be placed on another device to reduce the number of disk seeks. To create a filesystem on the first partition on the -first SCSI disk with a 10000 block log located on the first partition +first SCSI disk with a 10MiB log located on the first partition on the second SCSI disk, use: .RS .HP -.B mkfs.xfs\ \-l\ logdev=/dev/sdb1,size=10000b /dev/sda1 +.B mkfs.xfs\ \-l\ logdev=/dev/sdb1,size=10m /dev/sda1 .RE .PP Each of the @@ -78,9 +78,9 @@ suboptions if multiple suboptions apply to the same option. Equivalently, each main option can be given multiple times with different suboptions. For example, -.B \-l internal,size=10000b +.B \-l internal,size=10m and -.B \-l internal \-l size=10000b +.B \-l internal \-l size=10m are equivalent. .PP In the descriptions below, sizes are given in sectors, bytes, blocks, @@ -109,6 +109,15 @@ option below). .HP .BR e "\ \-\ multiply by one exabyte (1,048,576 terabytes)." .PD +.RE +.PP +When specifying parameters in units of sectors or filesystem blocks, the +.B \-s +option or the +.B \-b +option first needs to be added to the command line. +Failure to specify the size of the units will result in illegal value errors +when parameters are quantified in those units. .SH OPTIONS .TP .BI \-b " block_size_options" @@ -126,6 +135,11 @@ or in bytes with .BR size= . The default value is 4096 bytes (4 KiB), the minimum is 512, and the maximum is 65536 (64 KiB). +.IP +To specify any options on the command line in units of filesystem blocks, this +option must be specified first so that the filesystem block size is +applied consistently to all options. +.IP Although .B mkfs.xfs will accept any of these values and create a valid filesystem, @@ -811,6 +825,10 @@ is 512 bytes. The minimum value for sector size is .I sector_size must be a power of 2 size and cannot be made larger than the filesystem block size. +.IP +To specify any options on the command line in units of sectors, this +option must be specified first so that the sector size is +applied consistently to all options. .TP .BI \-L " label" Set the filesystem diff --git a/mkfs/proto.c b/mkfs/proto.c index 50d5e94..5930af8 100644 --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -23,7 +23,6 @@ /* * Prototypes for internal functions. */ -static long getnum(char **pp); static char *getstr(char **pp); static void fail(char *msg, int i); static void getres(xfs_trans_t *tp, uint blocks); @@ -78,8 +77,8 @@ setup_proto( * Skip past the stuff there for compatibility, a string and 2 numbers. */ (void)getstr(&buf); /* boot image name */ - (void)getnum(&buf); /* block count */ - (void)getnum(&buf); /* inode count */ + (void)getnum(getstr(&buf), 0, 0, false); /* block count */ + (void)getnum(getstr(&buf), 0, 0, false); /* inode count */ close(fd); return buf; @@ -90,16 +89,6 @@ out_fail: exit(1); } -static long -getnum( - char **pp) -{ - char *s; - - s = getstr(pp); - return atol(s); -} - static void fail( char *msg, @@ -440,8 +429,8 @@ parseproto( val = val * 8 + mstr[i] - '0'; } mode |= val; - creds.cr_uid = (int)getnum(pp); - creds.cr_gid = (int)getnum(pp); + creds.cr_uid = (int)getnum(getstr(pp), 0, 0, false); + creds.cr_gid = (int)getnum(getstr(pp), 0, 0, false); xname.name = (unsigned char *)name; xname.len = name ? strlen(name) : 0; xname.type = 0; @@ -466,7 +455,14 @@ parseproto( case IF_RESERVED: /* pre-allocated space only */ value = getstr(pp); - llen = cvtnum(mp->m_sb.sb_blocksize, mp->m_sb.sb_sectsize, value); + llen = getnum(value, mp->m_sb.sb_blocksize, + mp->m_sb.sb_sectsize, true); + if (llen < 0) { + fprintf(stderr, + _("%s: Bad value %s for proto file %s\n"), + progname, value, name); + exit(1); + } getres(tp, XFS_B_TO_FSB(mp, llen)); error = -libxfs_inode_alloc(&tp, pip, mode|S_IFREG, 1, 0, @@ -490,8 +486,8 @@ parseproto( case IF_BLOCK: getres(tp, 0); - majdev = (int)getnum(pp); - mindev = (int)getnum(pp); + majdev = getnum(getstr(pp), 0, 0, false); + mindev = getnum(getstr(pp), 0, 0, false); error = -libxfs_inode_alloc(&tp, pip, mode|S_IFBLK, 1, IRIX_MKDEV(majdev, mindev), &creds, fsxp, &ip); if (error) { @@ -505,8 +501,8 @@ parseproto( case IF_CHAR: getres(tp, 0); - majdev = (int)getnum(pp); - mindev = (int)getnum(pp); + majdev = getnum(getstr(pp), 0, 0, false); + mindev = getnum(getstr(pp), 0, 0, false); error = -libxfs_inode_alloc(&tp, pip, mode|S_IFCHR, 1, IRIX_MKDEV(majdev, mindev), &creds, fsxp, &ip); if (error) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 36bcb9f..4811d77 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -45,6 +45,9 @@ static void respec(char opt, char *tab[], int idx); static void unknown(char opt, char *s); static int ispow2(unsigned int i); +static long long cvtnum(unsigned int blocksize, + unsigned int sectorsize, const char *s); + /* * option tables for getsubopt calls */ @@ -982,6 +985,28 @@ sb_set_features( } +long long +getnum( + const char *str, + unsigned int blocksize, + unsigned int sectorsize, + bool convert) +{ + long long i; + char *sp; + + if (convert) + return cvtnum(blocksize, sectorsize, str); + + i = strtoll(str, &sp, 0); + if (i == 0 && sp == str) + return -1LL; + if (*sp != '\0') + return -1LL; /* trailing garbage */ + return i; +} + + int main( int argc, @@ -1101,8 +1126,8 @@ main( blflag = bsflag = slflag = ssflag = lslflag = lssflag = 0; blocklog = blocksize = 0; - sectorlog = lsectorlog = XFS_MIN_SECTORSIZE_LOG; - sectorsize = lsectorsize = XFS_MIN_SECTORSIZE; + sectorlog = lsectorlog = 0; + sectorsize = lsectorsize = 0; agsize = daflag = dasize = dblocks = 0; ilflag = imflag = ipflag = isflag = 0; liflag = laflag = lsflag = lsuflag = lsunitflag = ldflag = lvflag = 0; @@ -1146,7 +1171,7 @@ main( if (bsflag) conflict('b', bopts, B_SIZE, B_LOG); - blocklog = atoi(value); + blocklog = getnum(value, 0, 0, false); if (blocklog <= 0) illegal(value, "b log"); blocksize = 1 << blocklog; @@ -1160,8 +1185,8 @@ main( if (blflag) conflict('b', bopts, B_LOG, B_SIZE); - blocksize = cvtnum( - blocksize, sectorsize, value); + blocksize = getnum(value, blocksize, + sectorsize, true); if (blocksize <= 0 || !ispow2(blocksize)) illegal(value, "b size"); @@ -1184,8 +1209,7 @@ main( reqval('d', dopts, D_AGCOUNT); if (daflag) respec('d', dopts, D_AGCOUNT); - agcount = (__uint64_t) - strtoul(value, NULL, 10); + agcount = getnum(value, 0, 0, false); if ((__int64_t)agcount <= 0) illegal(value, "d agcount"); daflag = 1; @@ -1195,14 +1219,16 @@ main( reqval('d', dopts, D_AGSIZE); if (dasize) respec('d', dopts, D_AGSIZE); - agsize = cvtnum( - blocksize, sectorsize, value); + agsize = getnum(value, blocksize, + sectorsize, true); + if ((__int64_t)agsize <= 0) + illegal(value, "d agsize"); dasize = 1; break; case D_FILE: if (!value || *value == '\0') value = "1"; - xi.disfile = atoi(value); + xi.disfile = getnum(value, 0, 0, false); if (xi.disfile < 0 || xi.disfile > 1) illegal(value, "d file"); if (xi.disfile && !Nflag) @@ -1230,13 +1256,9 @@ main( if (nodsflag) conflict('d', dopts, D_NOALIGN, D_SUNIT); - if (!isdigits(value)) { - fprintf(stderr, - _("%s: Specify data sunit in 512-byte blocks, no unit suffix\n"), - progname); - exit(1); - } - dsunit = cvtnum(0, 0, value); + dsunit = getnum(value, 0, 0, false); + if (dsunit < 0) + illegal(value, "d sunit"); break; case D_SWIDTH: if (!value || *value == '\0') @@ -1246,13 +1268,9 @@ main( if (nodsflag) conflict('d', dopts, D_NOALIGN, D_SWIDTH); - if (!isdigits(value)) { - fprintf(stderr, - _("%s: Specify data swidth in 512-byte blocks, no unit suffix\n"), - progname); - exit(1); - } - dswidth = cvtnum(0, 0, value); + dswidth = getnum(value, 0, 0, false); + if (dswidth < 0) + illegal(value, "d swidth"); break; case D_SU: if (!value || *value == '\0') @@ -1262,8 +1280,10 @@ main( if (nodsflag) conflict('d', dopts, D_NOALIGN, D_SU); - dsu = cvtnum( - blocksize, sectorsize, value); + dsu = getnum(value, blocksize, + sectorsize, true); + if (dsu < 0) + illegal(value, "d su"); break; case D_SW: if (!value || *value == '\0') @@ -1273,13 +1293,9 @@ main( if (nodsflag) conflict('d', dopts, D_NOALIGN, D_SW); - if (!isdigits(value)) { - fprintf(stderr, - _("%s: Specify data sw as multiple of su, no unit suffix\n"), - progname); - exit(1); - } - dsw = cvtnum(0, 0, value); + dsw = getnum(value, 0, 0, false); + if (dsw < 0) + illegal(value, "d sw"); break; case D_NOALIGN: if (dsu) @@ -1304,7 +1320,7 @@ main( if (ssflag) conflict('d', dopts, D_SECTSIZE, D_SECTLOG); - sectorlog = atoi(value); + sectorlog = getnum(value, 0, 0, false); if (sectorlog <= 0) illegal(value, "d sectlog"); sectorsize = 1 << sectorlog; @@ -1318,8 +1334,8 @@ main( if (slflag) conflict('d', dopts, D_SECTLOG, D_SECTSIZE); - sectorsize = cvtnum( - blocksize, sectorsize, value); + sectorsize = getnum(value, blocksize, + sectorsize, true); if (sectorsize <= 0 || !ispow2(sectorsize)) illegal(value, "d sectsize"); @@ -1359,7 +1375,7 @@ main( case I_ALIGN: if (!value || *value == '\0') reqval('i', iopts, I_ALIGN); - c = atoi(value); + c = getnum(value, 0, 0, false); if (c < 0 || c > 1) illegal(value, "i align"); sb_feat.inode_align = c ? true : false; @@ -1375,7 +1391,7 @@ main( if (isflag) conflict('i', iopts, I_SIZE, I_LOG); - inodelog = atoi(value); + inodelog = getnum(value, 0, 0, false); if (inodelog <= 0) illegal(value, "i log"); isize = 1 << inodelog; @@ -1386,7 +1402,7 @@ main( reqval('i', iopts, I_MAXPCT); if (imflag) respec('i', iopts, I_MAXPCT); - imaxpct = atoi(value); + imaxpct = getnum(value, 0, 0, false); if (imaxpct < 0 || imaxpct > 100) illegal(value, "i maxpct"); imflag = 1; @@ -1402,7 +1418,7 @@ main( if (isflag) conflict('i', iopts, I_SIZE, I_PERBLOCK); - inopblock = atoi(value); + inopblock = getnum(value, 0, 0, false); if (inopblock < XFS_MIN_INODE_PERBLOCK || !ispow2(inopblock)) @@ -1420,7 +1436,7 @@ main( I_SIZE); if (isflag) respec('i', iopts, I_SIZE); - isize = cvtnum(0, 0, value); + isize = getnum(value, 0, 0, true); if (isize <= 0 || !ispow2(isize)) illegal(value, "i size"); inodelog = libxfs_highbit32(isize); @@ -1429,7 +1445,7 @@ main( case I_ATTR: if (!value || *value == '\0') reqval('i', iopts, I_ATTR); - c = atoi(value); + c = getnum(value, 0, 0, false); if (c < 0 || c > 2) illegal(value, "i attr"); sb_feat.attr_version = c; @@ -1437,7 +1453,7 @@ main( case I_PROJID32BIT: if (!value || *value == '\0') value = "0"; - c = atoi(value); + c = getnum(value, 0, 0, false); if (c < 0 || c > 1) illegal(value, "i projid32bit"); sb_feat.projid16bit = c ? false : true; @@ -1459,6 +1475,7 @@ main( p = optarg; while (*p != '\0') { char *value; + long long tmp_num; switch (getsubopt(&p, (constpp)lopts, &value)) { case L_AGNUM: @@ -1468,7 +1485,10 @@ main( respec('l', lopts, L_AGNUM); if (ldflag) conflict('l', lopts, L_AGNUM, L_DEV); - logagno = atoi(value); + tmp_num = getnum(value, 0, 0, false); + if (tmp_num < 0) + illegal(value, "l agno"); + logagno = (xfs_agnumber_t)tmp_num; laflag = 1; break; case L_FILE: @@ -1477,7 +1497,7 @@ main( if (loginternal) conflict('l', lopts, L_INTERNAL, L_FILE); - xi.lisfile = atoi(value); + xi.lisfile = getnum(value, 0, 0, false); if (xi.lisfile < 0 || xi.lisfile > 1) illegal(value, "l file"); if (xi.lisfile) @@ -1493,7 +1513,7 @@ main( L_INTERNAL); if (liflag) respec('l', lopts, L_INTERNAL); - loginternal = atoi(value); + loginternal = getnum(value, 0, 0, false); if (loginternal < 0 || loginternal > 1) illegal(value, "l internal"); liflag = 1; @@ -1503,8 +1523,10 @@ main( reqval('l', lopts, L_SU); if (lsu) respec('l', lopts, L_SU); - lsu = cvtnum( - blocksize, sectorsize, value); + lsu = getnum(value, blocksize, + sectorsize, true); + if (lsu < 0) + illegal(value, "l su"); lsuflag = 1; break; case L_SUNIT: @@ -1512,12 +1534,9 @@ main( reqval('l', lopts, L_SUNIT); if (lsunit) respec('l', lopts, L_SUNIT); - if (!isdigits(value)) { - fprintf(stderr, - _("Specify log sunit in 512-byte blocks, no size suffix\n")); - usage(); - } - lsunit = cvtnum(0, 0, value); + lsunit = getnum(value, 0, 0, false); + if (lsunit < 0) + illegal(value, "l sunit"); lsunitflag = 1; break; case L_NAME: @@ -1540,7 +1559,7 @@ main( reqval('l', lopts, L_VERSION); if (lvflag) respec('l', lopts, L_VERSION); - c = atoi(value); + c = getnum(value, 0, 0, false); if (c < 1 || c > 2) illegal(value, "l version"); sb_feat.log_version = c; @@ -1562,7 +1581,7 @@ main( if (lssflag) conflict('l', lopts, L_SECTSIZE, L_SECTLOG); - lsectorlog = atoi(value); + lsectorlog = getnum(value, 0, 0, false); if (lsectorlog <= 0) illegal(value, "l sectlog"); lsectorsize = 1 << lsectorlog; @@ -1576,8 +1595,8 @@ main( if (lslflag) conflict('l', lopts, L_SECTLOG, L_SECTSIZE); - lsectorsize = cvtnum( - blocksize, sectorsize, value); + lsectorsize = getnum(value, blocksize, + sectorsize, true); if (lsectorsize <= 0 || !ispow2(lsectorsize)) illegal(value, "l sectsize"); @@ -1589,7 +1608,7 @@ main( if (!value || *value == '\0') reqval('l', lopts, L_LAZYSBCNTR); - c = atoi(value); + c = getnum(value, 0, 0, false); if (c < 0 || c > 1) illegal(value, "l lazy-count"); sb_feat.lazy_sb_counters = c ? true @@ -1614,7 +1633,7 @@ main( case M_CRC: if (!value || *value == '\0') reqval('m', mopts, M_CRC); - c = atoi(value); + c = getnum(value, 0, 0, false); if (c < 0 || c > 1) illegal(value, "m crc"); if (c && nftype) { @@ -1660,7 +1679,7 @@ _("cannot specify both crc and ftype\n")); if (nsflag) conflict('n', nopts, N_SIZE, N_LOG); - dirblocklog = atoi(value); + dirblocklog = getnum(value, 0, 0, false); if (dirblocklog <= 0) illegal(value, "n log"); dirblocksize = 1 << dirblocklog; @@ -1674,8 +1693,8 @@ _("cannot specify both crc and ftype\n")); if (nlflag) conflict('n', nopts, N_LOG, N_SIZE); - dirblocksize = cvtnum( - blocksize, sectorsize, value); + dirblocksize = getnum(value, blocksize, + sectorsize, true); if (dirblocksize <= 0 || !ispow2(dirblocksize)) illegal(value, "n size"); @@ -1692,7 +1711,7 @@ _("cannot specify both crc and ftype\n")); /* ASCII CI mode */ sb_feat.nci = true; } else { - c = atoi(value); + c = getnum(value, 0, 0, false); if (c != 2) illegal(value, "n version"); @@ -1705,7 +1724,7 @@ _("cannot specify both crc and ftype\n")); reqval('n', nopts, N_FTYPE); if (nftype) respec('n', nopts, N_FTYPE); - c = atoi(value); + c = getnum(value, 0, 0, false); if (c < 0 || c > 1) illegal(value, "n ftype"); if (sb_feat.crcs_enabled) { @@ -1751,7 +1770,7 @@ _("cannot specify both crc and ftype\n")); case R_FILE: if (!value || *value == '\0') value = "1"; - xi.risfile = atoi(value); + xi.risfile = getnum(value, 0, 0, false); if (xi.risfile < 0 || xi.risfile > 1) illegal(value, "r file"); if (xi.risfile) @@ -1795,7 +1814,7 @@ _("cannot specify both crc and ftype\n")); if (ssflag || lssflag) conflict('s', sopts, S_SECTSIZE, S_SECTLOG); - sectorlog = atoi(value); + sectorlog = getnum(value, 0, 0, false); if (sectorlog <= 0) illegal(value, "s sectlog"); lsectorlog = sectorlog; @@ -1812,8 +1831,8 @@ _("cannot specify both crc and ftype\n")); if (slflag || lslflag) conflict('s', sopts, S_SECTLOG, S_SECTSIZE); - sectorsize = cvtnum( - blocksize, sectorsize, value); + sectorsize = getnum(value, blocksize, + sectorsize, true); if (sectorsize <= 0 || !ispow2(sectorsize)) illegal(value, "s sectsize"); @@ -1873,6 +1892,15 @@ _("Minimum block size for CRC enabled filesystems is %d bytes.\n"), usage(); } + if (!slflag && !ssflag) { + sectorlog = XFS_MIN_SECTORSIZE_LOG; + sectorsize = XFS_MIN_SECTORSIZE; + } + if (!lslflag && !lssflag) { + lsectorlog = sectorlog; + lsectorsize = sectorsize; + } + memset(&ft, 0, sizeof(ft)); get_topology(&xi, &ft, force_overwrite); @@ -2038,7 +2066,9 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); if (dsize) { __uint64_t dbytes; - dbytes = cvtnum(blocksize, sectorsize, dsize); + dbytes = getnum(dsize, blocksize, sectorsize, true); + if ((__int64_t)dbytes < 0) + illegal(dsize, "d size"); if (dbytes % XFS_MIN_BLOCKSIZE) { fprintf(stderr, _("illegal data length %lld, not a multiple of %d\n"), @@ -2075,7 +2105,9 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); if (logsize) { __uint64_t logbytes; - logbytes = cvtnum(blocksize, sectorsize, logsize); + logbytes = getnum(logsize, blocksize, sectorsize, true); + if ((__int64_t)logbytes < 0) + illegal(logsize, "l size"); if (logbytes % XFS_MIN_BLOCKSIZE) { fprintf(stderr, _("illegal log length %lld, not a multiple of %d\n"), @@ -2097,7 +2129,9 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); if (rtsize) { __uint64_t rtbytes; - rtbytes = cvtnum(blocksize, sectorsize, rtsize); + rtbytes = getnum(rtsize, blocksize, sectorsize, true); + if ((__int64_t)rtbytes < 0) + illegal(rtsize, "r size"); if (rtbytes % XFS_MIN_BLOCKSIZE) { fprintf(stderr, _("illegal rt length %lld, not a multiple of %d\n"), @@ -2117,7 +2151,9 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); if (rtextsize) { __uint64_t rtextbytes; - rtextbytes = cvtnum(blocksize, sectorsize, rtextsize); + rtextbytes = getnum(rtextsize, blocksize, sectorsize, true); + if ((__int64_t)rtextbytes < 0) + illegal(rtsize, "r extsize"); if (rtextbytes % blocksize) { fprintf(stderr, _("illegal rt extent size %lld, not a multiple of %d\n"), @@ -3230,28 +3266,11 @@ unknown( usage(); } -/* - * isdigits -- returns 1 if string contains nothing but [0-9], 0 otherwise - */ -int -isdigits( - char *str) -{ - int i; - int n = strlen(str); - - for (i = 0; i < n; i++) { - if (!isdigit((int)str[i])) - return 0; - } - return 1; -} - long long cvtnum( unsigned int blocksize, unsigned int sectorsize, - char *s) + const char *s) { long long i; char *sp; @@ -3262,17 +3281,11 @@ cvtnum( if (*sp == '\0') return i; - if (*sp == 'b' && sp[1] == '\0') { - if (blocksize) - return i * blocksize; - fprintf(stderr, _("blocksize not available yet.\n")); - usage(); - } - if (*sp == 's' && sp[1] == '\0') { - if (sectorsize) - return i * sectorsize; - return i * BBSIZE; - } + if (*sp == 'b' && sp[1] == '\0') + return i * blocksize; + if (*sp == 's' && sp[1] == '\0') + return i * sectorsize; + if (*sp == 'k' && sp[1] == '\0') return 1024LL * i; if (*sp == 'm' && sp[1] == '\0') -- 2.6.0 From jtulak@redhat.com Thu Mar 24 06:15:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A466E7CA6 for ; Thu, 24 Mar 2016 06:15:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 759938F804C for ; Thu, 24 Mar 2016 04:15:54 -0700 (PDT) X-ASG-Debug-ID: 1458818149-04cb6c391742380001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 4Y6wNcOf9xnN9ELv (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 24 Mar 2016 04:15:50 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id C134B8E36A for ; Thu, 24 Mar 2016 11:15:49 +0000 (UTC) Received: from localhost.localdomain (vpn1-7-36.ams2.redhat.com [10.36.7.36]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2OBFbLI009274 for ; Thu, 24 Mar 2016 07:15:49 -0400 From: jtulak@redhat.com To: xfs@oss.sgi.com Subject: [PATCH 12/19] mkfs: merge getnum Date: Thu, 24 Mar 2016 12:15:29 +0100 X-ASG-Orig-Subj: [PATCH 12/19] mkfs: merge getnum Message-Id: <1458818136-56043-13-git-send-email-jtulak@redhat.com> In-Reply-To: <1458818136-56043-1-git-send-email-jtulak@redhat.com> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458818150 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner CHANGELOG o rename a variable to don't collide with existing local variable (and to have a better meaning: sp -> str_end for detecting trailing garbage) getnum() is now only called by getnum_checked(). Move the two together into a single getnum() function and change all the callers back to getnum(). Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak --- include/xfs_multidisk.h | 4 +- mkfs/proto.c | 20 +++++ mkfs/xfs_mkfs.c | 213 ++++++++++++++++++++++-------------------------- 3 files changed, 119 insertions(+), 118 deletions(-) diff --git a/include/xfs_multidisk.h b/include/xfs_multidisk.h index 8e81d90..850a322 100644 --- a/include/xfs_multidisk.h +++ b/include/xfs_multidisk.h @@ -57,8 +57,8 @@ #define XFS_NOMULTIDISK_AGLOG 2 /* 4 AGs */ #define XFS_MULTIDISK_AGCOUNT (1 << XFS_MULTIDISK_AGLOG) -extern long long getnum(const char *str, unsigned int blocksize, - unsigned int sectorsize, bool convert); +extern long long cvtnum(unsigned int blksize, unsigned int sectsize, + const char *str); /* proto.c */ extern char *setup_proto (char *fname); diff --git a/mkfs/proto.c b/mkfs/proto.c index 5930af8..3d3a8dc 100644 --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -43,6 +43,26 @@ static long filesize(int fd); ((uint)(MKFS_BLOCKRES_INODE + XFS_DA_NODE_MAXDEPTH + \ (XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) - 1) + (rb))) +static long long +getnum( + const char *str, + unsigned int blksize, + unsigned int sectsize, + bool convert) +{ + long long i; + char *sp; + + if (convert) + return cvtnum(blksize, sectsize, str); + + i = strtoll(str, &sp, 0); + if (i == 0 && sp == str) + return -1LL; + if (*sp != '\0') + return -1LL; /* trailing garbage */ + return i; +} char * setup_proto( diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index acf420f..1f06110 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -45,9 +45,6 @@ static void respec(char opt, char *tab[], int idx); static void unknown(char opt, char *s); static int ispow2(unsigned int i); -static long long cvtnum(unsigned int blocksize, - unsigned int sectorsize, const char *s); - /* * The configured block and sector sizes are defined as global variables so * that they don't need to be passed to functions that require them. @@ -1380,27 +1377,6 @@ sb_set_features( } -long long -getnum( - const char *str, - unsigned int blksize, - unsigned int sectsize, - bool convert) -{ - long long i; - char *sp; - - if (convert) - return cvtnum(blksize, sectsize, str); - - i = strtoll(str, &sp, 0); - if (i == 0 && sp == str) - return -1LL; - if (*sp != '\0') - return -1LL; /* trailing garbage */ - return i; -} - static __attribute__((noreturn)) void illegal_option( const char *value, @@ -1414,7 +1390,7 @@ illegal_option( } static long long -getnum_checked( +getnum( const char *str, struct opt_params *opts, int index) @@ -1434,6 +1410,7 @@ getnum_checked( respec(opts->name, (char **)opts->subopts, index); sp->seen = true; + /* empty strings might just return a default value */ if (!str || *str == '\0') { if (sp->defaultval == SUBOPT_NEEDS_VAL) reqval(opts->name, (char **)opts->subopts, index); @@ -1448,7 +1425,25 @@ getnum_checked( exit(1); } - c = getnum(str, blocksize, sectorsize, sp->convert); + /* + * Some values are pure numbers, others can have suffixes that define + * the units of the number. Those get passed to cvtnum(), otherwise we + * convert it ourselves to guarantee there is no trailing garbage in the + * number. + */ + if (sp->convert) + c = cvtnum(blocksize, sectorsize, str); + else { + char *str_end; + + c = strtoll(str, &str_end, 0); + if (c == 0 && str_end == str) + illegal_option(str, opts, index); + if (*str_end != '\0') + illegal_option(str, opts, index); + } + + /* Validity check the result. */ if (c < sp->minval || c > sp->maxval) illegal_option(str, opts, index); if (sp->is_power_2 && !ispow2(c)) @@ -1615,8 +1610,7 @@ main( if (bsflag) conflict('b', subopts, B_SIZE, B_LOG); - blocklog = getnum_checked(value, &bopts, - B_LOG); + blocklog = getnum(value, &bopts, B_LOG); blocksize = 1 << blocklog; blflag = 1; break; @@ -1624,8 +1618,8 @@ main( if (blflag) conflict('b', subopts, B_LOG, B_SIZE); - blocksize = getnum_checked(value, &bopts, - B_SIZE); + blocksize = getnum(value, &bopts, + B_SIZE); blocklog = libxfs_highbit32(blocksize); bsflag = 1; break; @@ -1643,18 +1637,17 @@ main( switch (getsubopt(&p, (constpp)subopts, &value)) { case D_AGCOUNT: - agcount = getnum_checked(value, &dopts, - D_AGCOUNT); + agcount = getnum(value, &dopts, + D_AGCOUNT); daflag = 1; break; case D_AGSIZE: - agsize = getnum_checked(value, &dopts, - D_AGSIZE); + agsize = getnum(value, &dopts, D_AGSIZE); dasize = 1; break; case D_FILE: - xi.disfile = getnum_checked(value, - &dopts, D_FILE); + xi.disfile = getnum(value, &dopts, + D_FILE); if (xi.disfile && !Nflag) xi.dcreat = 1; break; @@ -1676,33 +1669,30 @@ main( if (nodsflag) conflict('d', subopts, D_NOALIGN, D_SUNIT); - dsunit = getnum_checked(value, &dopts, - D_SUNIT); + dsunit = getnum(value, &dopts, D_SUNIT); break; case D_SWIDTH: if (nodsflag) conflict('d', subopts, D_NOALIGN, D_SWIDTH); - dswidth = getnum_checked(value, &dopts, - D_SWIDTH); + dswidth = getnum(value, &dopts, + D_SWIDTH); break; case D_SU: if (nodsflag) conflict('d', subopts, D_NOALIGN, D_SU); - dsu = getnum_checked(value, &dopts, - D_SU); + dsu = getnum(value, &dopts, D_SU); break; case D_SW: if (nodsflag) conflict('d', subopts, D_NOALIGN, D_SW); - dsw = getnum_checked(value, &dopts, - D_SW); + dsw = getnum(value, &dopts, D_SW); break; case D_NOALIGN: - nodsflag = getnum_checked(value, - &dopts, D_NOALIGN); + nodsflag = getnum(value, &dopts, + D_NOALIGN); if (nodsflag) { if (dsu) conflict('d', subopts, D_SU, @@ -1722,8 +1712,8 @@ main( if (ssflag) conflict('d', subopts, D_SECTSIZE, D_SECTLOG); - sectorlog = getnum_checked(value, &dopts, - D_SECTLOG); + sectorlog = getnum(value, &dopts, + D_SECTLOG); sectorsize = 1 << sectorlog; slflag = 1; break; @@ -1731,28 +1721,27 @@ main( if (slflag) conflict('d', subopts, D_SECTLOG, D_SECTSIZE); - sectorsize = getnum_checked(value, - &dopts, D_SECTSIZE); + sectorsize = getnum(value, &dopts, + D_SECTSIZE); sectorlog = libxfs_highbit32(sectorsize); ssflag = 1; break; case D_RTINHERIT: - c = getnum_checked(value, &dopts, - D_RTINHERIT); + c = getnum(value, &dopts, D_RTINHERIT); if (c) fsx.fsx_xflags |= XFS_DIFLAG_RTINHERIT; break; case D_PROJINHERIT: - fsx.fsx_projid = getnum_checked(value, - &dopts, D_PROJINHERIT); + fsx.fsx_projid = getnum(value, &dopts, + D_PROJINHERIT); fsx.fsx_xflags |= XFS_DIFLAG_PROJINHERIT; break; case D_EXTSZINHERIT: - fsx.fsx_extsize = getnum_checked(value, - &dopts, D_EXTSZINHERIT); + fsx.fsx_extsize = getnum(value, &dopts, + D_EXTSZINHERIT); fsx.fsx_xflags |= XFS_DIFLAG_EXTSZINHERIT; break; @@ -1770,8 +1759,8 @@ main( switch (getsubopt(&p, (constpp)subopts, &value)) { case I_ALIGN: - sb_feat.inode_align = getnum_checked( - value, &iopts, I_ALIGN); + sb_feat.inode_align = getnum(value, + &iopts, I_ALIGN); break; case I_LOG: if (ipflag) @@ -1780,14 +1769,13 @@ main( if (isflag) conflict('i', subopts, I_SIZE, I_LOG); - inodelog = getnum_checked(value, &iopts, - I_LOG); + inodelog = getnum(value, &iopts, I_LOG); isize = 1 << inodelog; ilflag = 1; break; case I_MAXPCT: - imaxpct = getnum_checked(value, &iopts, - I_MAXPCT); + imaxpct = getnum(value, &iopts, + I_MAXPCT); imflag = 1; break; case I_PERBLOCK: @@ -1797,8 +1785,8 @@ main( if (isflag) conflict('i', subopts, I_SIZE, I_PERBLOCK); - inopblock = getnum_checked(value, &iopts, - I_PERBLOCK); + inopblock = getnum(value, &iopts, + I_PERBLOCK); ipflag = 1; break; case I_SIZE: @@ -1808,23 +1796,22 @@ main( if (ipflag) conflict('i', subopts, I_PERBLOCK, I_SIZE); - isize = getnum_checked(value, &iopts, - I_SIZE); + isize = getnum(value, &iopts, I_SIZE); inodelog = libxfs_highbit32(isize); isflag = 1; break; case I_ATTR: - sb_feat.attr_version = getnum_checked( - value, &iopts, I_ATTR); + sb_feat.attr_version = + getnum(value, &iopts, I_ATTR); break; case I_PROJID32BIT: sb_feat.projid16bit = - !getnum_checked(value, &iopts, - I_PROJID32BIT); + !getnum(value, &iopts, + I_PROJID32BIT); break; case I_SPINODES: sb_feat.spinodes = - getnum_checked(value, &iopts, + getnum(value, &iopts, I_SPINODES); break; default: @@ -1843,13 +1830,12 @@ main( case L_AGNUM: if (ldflag) conflict('l', subopts, L_AGNUM, L_DEV); - logagno = getnum_checked(value, &lopts, - L_AGNUM); + logagno = getnum(value, &lopts, L_AGNUM); laflag = 1; break; case L_FILE: - xi.lisfile = getnum_checked(value, - &lopts, L_FILE); + xi.lisfile = getnum(value, &lopts, + L_FILE); if (xi.lisfile && loginternal) conflict('l', subopts, L_INTERNAL, L_FILE); @@ -1863,18 +1849,16 @@ main( conflict('l', subopts, L_FILE, L_INTERNAL); - loginternal = getnum_checked(value, - &lopts, L_INTERNAL); + loginternal = getnum(value, &lopts, + L_INTERNAL); liflag = 1; break; case L_SU: - lsu = getnum_checked(value, &lopts, - L_SU); + lsu = getnum(value, &lopts, L_SU); lsuflag = 1; break; case L_SUNIT: - lsunit = getnum_checked(value, &lopts, - L_SUNIT); + lsunit = getnum(value, &lopts, L_SUNIT); lsunitflag = 1; break; case L_NAME: @@ -1894,8 +1878,7 @@ main( break; case L_VERSION: sb_feat.log_version = - getnum_checked(value, &lopts, - L_VERSION); + getnum(value, &lopts, L_VERSION); lvflag = 1; break; case L_SIZE: @@ -1910,8 +1893,8 @@ main( if (lssflag) conflict('l', subopts, L_SECTSIZE, L_SECTLOG); - lsectorlog = getnum_checked(value, - &lopts, L_SECTLOG); + lsectorlog = getnum(value, &lopts, + L_SECTLOG); lsectorsize = 1 << lsectorlog; lslflag = 1; break; @@ -1919,15 +1902,15 @@ main( if (lslflag) conflict('l', subopts, L_SECTLOG, L_SECTSIZE); - lsectorsize = getnum_checked(value, - &lopts, L_SECTSIZE); + lsectorsize = getnum(value, &lopts, + L_SECTSIZE); lsectorlog = libxfs_highbit32(lsectorsize); lssflag = 1; break; case L_LAZYSBCNTR: sb_feat.lazy_sb_counters = - getnum_checked(value, &lopts, + getnum(value, &lopts, L_LAZYSBCNTR); break; default: @@ -1950,8 +1933,7 @@ main( &value)) { case M_CRC: sb_feat.crcs_enabled = - getnum_checked(value, &mopts, - M_CRC); + getnum(value, &mopts, M_CRC); if (sb_feat.crcs_enabled && nftype) { fprintf(stderr, _("cannot specify both -m crc=1 and -n ftype\n")); @@ -1961,7 +1943,7 @@ _("cannot specify both -m crc=1 and -n ftype\n")); sb_feat.dirftype = true; break; case M_FINOBT: - sb_feat.finobt = getnum_checked( + sb_feat.finobt = getnum( value, &mopts, M_FINOBT); break; case M_UUID: @@ -1987,8 +1969,8 @@ _("cannot specify both -m crc=1 and -n ftype\n")); if (nsflag) conflict('n', subopts, N_SIZE, N_LOG); - dirblocklog = getnum_checked(value, - &nopts, N_LOG); + dirblocklog = getnum(value, &nopts, + N_LOG); dirblocksize = 1 << dirblocklog; nlflag = 1; break; @@ -1996,8 +1978,8 @@ _("cannot specify both -m crc=1 and -n ftype\n")); if (nlflag) conflict('n', subopts, N_LOG, N_SIZE); - dirblocksize = getnum_checked(value, - &nopts, N_SIZE); + dirblocksize = getnum(value, &nopts, + N_SIZE); dirblocklog = libxfs_highbit32(dirblocksize); nsflag = 1; @@ -2012,9 +1994,8 @@ _("cannot specify both -m crc=1 and -n ftype\n")); sb_feat.nci = true; } else { sb_feat.dir_version = - getnum_checked(value, - &nopts, - N_VERSION); + getnum(value, &nopts, + N_VERSION); } nvflag = 1; break; @@ -2024,8 +2005,8 @@ _("cannot specify both -m crc=1 and -n ftype\n")); _("cannot specify both -m crc=1 and -n ftype\n")); usage(); } - sb_feat.dirftype = getnum_checked(value, - &nopts, N_FTYPE); + sb_feat.dirftype = getnum(value, &nopts, + N_FTYPE); nftype = 1; break; default: @@ -2063,8 +2044,8 @@ _("cannot specify both -m crc=1 and -n ftype\n")); rtextsize = value; break; case R_FILE: - xi.risfile = getnum_checked(value, - &ropts, R_FILE); + xi.risfile = getnum(value, &ropts, + R_FILE); if (xi.risfile) xi.rcreat = 1; break; @@ -2084,8 +2065,8 @@ _("cannot specify both -m crc=1 and -n ftype\n")); rtsize = value; break; case R_NOALIGN: - norsflag = getnum_checked(value, - &ropts, R_NOALIGN); + norsflag = getnum(value, &ropts, + R_NOALIGN); break; default: unknown('r', value); @@ -2105,8 +2086,8 @@ _("cannot specify both -m crc=1 and -n ftype\n")); if (ssflag || lssflag) conflict('s', subopts, S_SECTSIZE, S_SECTLOG); - sectorlog = getnum_checked(value, &sopts, - S_SECTLOG); + sectorlog = getnum(value, &sopts, + S_SECTLOG); lsectorlog = sectorlog; sectorsize = 1 << sectorlog; lsectorsize = sectorsize; @@ -2117,8 +2098,8 @@ _("cannot specify both -m crc=1 and -n ftype\n")); if (slflag || lslflag) conflict('s', subopts, S_SECTLOG, S_SECTSIZE); - sectorsize = getnum_checked(value, - &sopts, S_SECTSIZE); + sectorsize = getnum(value, &sopts, + S_SECTSIZE); lsectorsize = sectorsize; sectorlog = libxfs_highbit32(sectorsize); @@ -2349,7 +2330,7 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); if (dsize) { __uint64_t dbytes; - dbytes = getnum_checked(dsize, &dopts, D_SIZE); + dbytes = getnum(dsize, &dopts, D_SIZE); if (dbytes % XFS_MIN_BLOCKSIZE) { fprintf(stderr, _("illegal data length %lld, not a multiple of %d\n"), @@ -2386,7 +2367,7 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); if (logsize) { __uint64_t logbytes; - logbytes = getnum_checked(logsize, &lopts, L_SIZE); + logbytes = getnum(logsize, &lopts, L_SIZE); if (logbytes % XFS_MIN_BLOCKSIZE) { fprintf(stderr, _("illegal log length %lld, not a multiple of %d\n"), @@ -2408,7 +2389,7 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); if (rtsize) { __uint64_t rtbytes; - rtbytes = getnum_checked(rtsize, &ropts, R_SIZE); + rtbytes = getnum(rtsize, &ropts, R_SIZE); if (rtbytes % XFS_MIN_BLOCKSIZE) { fprintf(stderr, _("illegal rt length %lld, not a multiple of %d\n"), @@ -2428,7 +2409,7 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); if (rtextsize) { __uint64_t rtextbytes; - rtextbytes = getnum_checked(rtextsize, &ropts, R_EXTSIZE); + rtextbytes = getnum(rtextsize, &ropts, R_EXTSIZE); if (rtextbytes % blocksize) { fprintf(stderr, _("illegal rt extent size %lld, not a multiple of %d\n"), @@ -3531,8 +3512,8 @@ unknown( long long cvtnum( - unsigned int blocksize, - unsigned int sectorsize, + unsigned int blksize, + unsigned int sectsize, const char *s) { long long i; @@ -3545,9 +3526,9 @@ cvtnum( return i; if (*sp == 'b' && sp[1] == '\0') - return i * blocksize; + return i * blksize; if (*sp == 's' && sp[1] == '\0') - return i * sectorsize; + return i * sectsize; if (*sp == 'k' && sp[1] == '\0') return 1024LL * i; -- 2.6.0 From jtulak@redhat.com Thu Mar 24 06:15:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D41457CD7 for ; Thu, 24 Mar 2016 06:15:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 97C8D8F8050 for ; Thu, 24 Mar 2016 04:15:54 -0700 (PDT) X-ASG-Debug-ID: 1458818145-04cb6c391742370001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id IXKDhDZLCd2nMi6w (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 24 Mar 2016 04:15:45 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 1FD2878244 for ; Thu, 24 Mar 2016 11:15:45 +0000 (UTC) Received: from localhost.localdomain (vpn1-7-36.ams2.redhat.com [10.36.7.36]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2OBFbLD009274 for ; Thu, 24 Mar 2016 07:15:44 -0400 From: jtulak@redhat.com To: xfs@oss.sgi.com Subject: [PATCH 07/19] mkfs: structify input parameter passing Date: Thu, 24 Mar 2016 12:15:24 +0100 X-ASG-Orig-Subj: [PATCH 07/19] mkfs: structify input parameter passing Message-Id: <1458818136-56043-8-git-send-email-jtulak@redhat.com> In-Reply-To: <1458818136-56043-1-git-send-email-jtulak@redhat.com> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458818145 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner CHANGELOG: o Add a description of the new opt_params structure. o Fix indenting o Add missing I_SPINODES to subopt_params o Add a check for undefined minval/maxval into getnum_checked o Drop "const" from struct opt_params - it would be removed in a later patch anyway Passing large number of parameters around to number conversion functions is painful. Add a structure to encapsulate the constant parameters that are passed, and convert getnum_checked to use it. This is the first real step towards a table driven option parser. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak --- mkfs/xfs_mkfs.c | 650 ++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 439 insertions(+), 211 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index dda076d..6e29848 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -48,147 +48,361 @@ static int ispow2(unsigned int i); static long long cvtnum(unsigned int blocksize, unsigned int sectorsize, const char *s); +#define MAX_SUBOPTS 16 /* - * option tables for getsubopt calls + * Table for parsing mkfs parameters. + * + * Description of the structure members follows: + * + * name MANDATORY + * Name is a single char, e.g., for '-d file', name is 'd'. + * + * subopts MANDATORY + * Subopts is a list of strings naming suboptions. In the example above, + * it would contain "file". The last entry of this list has to be NULL. + * + * subopt_params MANDATORY + * This is a list of structs tied with subopts. For each entry in subopts, + * a coresponding entry has to be defined: + * + * subopt_params struct: + * index MANDATORY + * This number, starting from zero, denotes which item in subopt_params + * it is. The index has to be the same as is the order in subopts list, + * so we can access the right item both in subopt_param and subopts. + * + * minval, maxval OPTIONAL + * These options are used for automatic range check and they have to be + * always used together in pair. If you don't want to limit the max value, + * use something like UINT_MAX. If no value is given, then you either has + * to supply your own validation, or refuse any value in the 'case + * X_SOMETHING' block. If you forget to pass a min or max value here, but + * call a standard function for validating user's value, it will cause an + * error message notifying you about this issue. + * + * (Said in another way, you can't have minval and maxval both equal + * to zero. But if one value is different: minval=0 and maxval=1, + * then it is OK.) */ -char *bopts[] = { +struct opt_params { + const char name; + const char *subopts[MAX_SUBOPTS]; + struct subopt_param { + int index; + long long minval; + long long maxval; + } subopt_params[MAX_SUBOPTS]; +}; + +struct opt_params bopts = { + .name = 'b', + .subopts = { #define B_LOG 0 - "log", + "log", #define B_SIZE 1 - "size", - NULL + "size", + NULL + }, + .subopt_params = { + { .index = B_LOG, + .minval = XFS_MIN_BLOCKSIZE_LOG, + .maxval = XFS_MAX_BLOCKSIZE_LOG, + }, + { .index = B_SIZE, + .minval = XFS_MIN_BLOCKSIZE, + .maxval = XFS_MAX_BLOCKSIZE, + }, + }, }; -char *dopts[] = { +struct opt_params dopts = { + .name = 'd', + .subopts = { #define D_AGCOUNT 0 - "agcount", + "agcount", #define D_FILE 1 - "file", + "file", #define D_NAME 2 - "name", + "name", #define D_SIZE 3 - "size", + "size", #define D_SUNIT 4 - "sunit", + "sunit", #define D_SWIDTH 5 - "swidth", + "swidth", #define D_AGSIZE 6 - "agsize", + "agsize", #define D_SU 7 - "su", + "su", #define D_SW 8 - "sw", + "sw", #define D_SECTLOG 9 - "sectlog", + "sectlog", #define D_SECTSIZE 10 - "sectsize", + "sectsize", #define D_NOALIGN 11 - "noalign", + "noalign", #define D_RTINHERIT 12 - "rtinherit", + "rtinherit", #define D_PROJINHERIT 13 - "projinherit", + "projinherit", #define D_EXTSZINHERIT 14 - "extszinherit", - NULL + "extszinherit", + NULL + }, + .subopt_params = { + { .index = D_AGCOUNT, + }, + { .index = D_FILE, + }, + { .index = D_NAME, + }, + { .index = D_SIZE, + }, + { .index = D_SUNIT, + }, + { .index = D_SWIDTH, + }, + { .index = D_AGSIZE, + }, + { .index = D_SU, + }, + { .index = D_SW, + }, + { .index = D_SECTLOG, + .minval = XFS_MIN_SECTORSIZE_LOG, + .maxval = XFS_MAX_SECTORSIZE_LOG, + }, + { .index = D_SECTSIZE, + .minval = XFS_MIN_SECTORSIZE, + .maxval = XFS_MAX_SECTORSIZE, + }, + { .index = D_NOALIGN, + }, + { .index = D_RTINHERIT, + }, + { .index = D_PROJINHERIT, + }, + { .index = D_EXTSZINHERIT, + }, + }, }; -char *iopts[] = { + +struct opt_params iopts = { + .name = 'i', + .subopts = { #define I_ALIGN 0 - "align", + "align", #define I_LOG 1 - "log", + "log", #define I_MAXPCT 2 - "maxpct", + "maxpct", #define I_PERBLOCK 3 - "perblock", + "perblock", #define I_SIZE 4 - "size", + "size", #define I_ATTR 5 - "attr", + "attr", #define I_PROJID32BIT 6 - "projid32bit", + "projid32bit", #define I_SPINODES 7 - "sparse", - NULL + "sparse", + NULL + }, + .subopt_params = { + { .index = I_ALIGN, + }, + { .index = I_LOG, + .minval = XFS_DINODE_MIN_LOG, + .maxval = XFS_DINODE_MAX_LOG, + }, + { .index = I_MAXPCT, + }, + { .index = I_PERBLOCK, + }, + { .index = I_SIZE, + }, + { .index = I_ATTR, + }, + { .index = I_PROJID32BIT, + }, + { .index = I_SPINODES, + }, + }, }; -char *lopts[] = { +struct opt_params lopts = { + .name = 'l', + .subopts = { #define L_AGNUM 0 - "agnum", + "agnum", #define L_INTERNAL 1 - "internal", + "internal", #define L_SIZE 2 - "size", + "size", #define L_VERSION 3 - "version", + "version", #define L_SUNIT 4 - "sunit", + "sunit", #define L_SU 5 - "su", + "su", #define L_DEV 6 - "logdev", + "logdev", #define L_SECTLOG 7 - "sectlog", + "sectlog", #define L_SECTSIZE 8 - "sectsize", + "sectsize", #define L_FILE 9 - "file", + "file", #define L_NAME 10 - "name", + "name", #define L_LAZYSBCNTR 11 - "lazy-count", - NULL + "lazy-count", + NULL + }, + .subopt_params = { + { .index = L_AGNUM, + }, + { .index = L_INTERNAL, + }, + { .index = L_SIZE, + }, + { .index = L_VERSION, + }, + { .index = L_SUNIT, + }, + { .index = L_SU, + }, + { .index = L_DEV, + }, + { .index = L_SECTLOG, + .minval = XFS_MIN_SECTORSIZE_LOG, + .maxval = XFS_MAX_SECTORSIZE_LOG, + }, + { .index = L_SECTSIZE, + .minval = XFS_MIN_SECTORSIZE, + .maxval = XFS_MAX_SECTORSIZE, + }, + { .index = L_FILE, + }, + { .index = L_NAME, + }, + { .index = L_LAZYSBCNTR, + }, + }, }; -char *nopts[] = { +struct opt_params nopts = { + .name = 'n', + .subopts = { #define N_LOG 0 - "log", + "log", #define N_SIZE 1 - "size", + "size", #define N_VERSION 2 - "version", + "version", #define N_FTYPE 3 - "ftype", + "ftype", NULL, + }, + .subopt_params = { + { .index = N_LOG, + .minval = XFS_MIN_REC_DIRSIZE, + .maxval = XFS_MAX_BLOCKSIZE_LOG, + }, + { .index = N_SIZE, + .minval = 1 << XFS_MIN_REC_DIRSIZE, + .maxval = XFS_MAX_BLOCKSIZE, + }, + { .index = N_VERSION, + }, + { .index = N_FTYPE, + }, + }, }; -char *ropts[] = { +struct opt_params ropts = { + .name = 'r', + .subopts = { #define R_EXTSIZE 0 - "extsize", + "extsize", #define R_SIZE 1 - "size", + "size", #define R_DEV 2 - "rtdev", + "rtdev", #define R_FILE 3 - "file", + "file", #define R_NAME 4 - "name", + "name", #define R_NOALIGN 5 - "noalign", - NULL + "noalign", + NULL + }, + .subopt_params = { + { .index = R_EXTSIZE, + }, + { .index = R_SIZE, + }, + { .index = R_DEV, + }, + { .index = R_FILE, + }, + { .index = R_NAME, + }, + { .index = R_NOALIGN, + }, + }, }; -char *sopts[] = { +struct opt_params sopts = { + .name = 's', + .subopts = { #define S_LOG 0 - "log", + "log", #define S_SECTLOG 1 - "sectlog", + "sectlog", #define S_SIZE 2 - "size", + "size", #define S_SECTSIZE 3 - "sectsize", - NULL + "sectsize", + NULL + }, + .subopt_params = { + { .index = S_LOG, + .minval = XFS_MIN_SECTORSIZE_LOG, + .maxval = XFS_MAX_SECTORSIZE_LOG, + }, + { .index = S_SECTLOG, + .minval = XFS_MIN_SECTORSIZE_LOG, + .maxval = XFS_MAX_SECTORSIZE_LOG, + }, + { .index = S_SIZE, + .minval = XFS_MIN_SECTORSIZE, + .maxval = XFS_MAX_SECTORSIZE, + }, + { .index = S_SECTSIZE, + .minval = XFS_MIN_SECTORSIZE, + .maxval = XFS_MAX_SECTORSIZE, + }, + }, }; -char *mopts[] = { +struct opt_params mopts = { + .name = 'm', + .subopts = { #define M_CRC 0 - "crc", + "crc", #define M_FINOBT 1 "finobt", #define M_UUID 2 - "uuid", - NULL + "uuid", + NULL + }, + .subopt_params = { + { .index = M_CRC, + }, + }, }; #define TERABYTES(count, blog) ((__uint64_t)(count) << (40 - (blog))) @@ -1022,24 +1236,42 @@ getbool( return c ? true : false; } +static __attribute__((noreturn)) void +illegal_option( + const char *value, + struct opt_params *opts, + int index) +{ + fprintf(stderr, + _("Illegal value %s for -%c %s option\n"), + value, opts->name, opts->subopts[index]); + usage(); +} + static int getnum_checked( const char *str, - long long min_val, - long long max_val, - const char *illegal_str, - char reqval_char, - char *reqval_opts[], - int reqval_optind) + struct opt_params *opts, + int index) { long long c; if (!str || *str == '\0') - reqval(reqval_char, reqval_opts, reqval_optind); + reqval(opts->name, (char **)opts->subopts, index); + + if (opts->subopt_params[index].minval == 0 && + opts->subopt_params[index].maxval == 0) { + fprintf(stderr, + _("Option -%c %s has undefined minval/maxval." + "Can't verify value range. This is a bug.\n"), + opts->name, opts->subopts[index]); + exit(1); + } c = getnum(str, 0, 0, false); - if (c < min_val || c > max_val) - illegal(str, illegal_str); + if (c < opts->subopt_params[index].minval || + c > opts->subopt_params[index].maxval) + illegal_option(str, opts, index); return c; } @@ -1196,30 +1428,29 @@ main( case 'b': p = optarg; while (*p != '\0') { + char **subopts = (char **)bopts.subopts; char *value; - switch (getsubopt(&p, (constpp)bopts, &value)) { + switch (getsubopt(&p, (constpp)subopts, + &value)) { case B_LOG: if (blflag) - respec('b', bopts, B_LOG); + respec('b', subopts, B_LOG); if (bsflag) - conflict('b', bopts, B_SIZE, + conflict('b', subopts, B_SIZE, B_LOG); - blocklog = getnum_checked(value, - XFS_MIN_BLOCKSIZE_LOG, - XFS_MAX_BLOCKSIZE_LOG, - "b log", 'b', bopts, - B_LOG); + blocklog = getnum_checked(value, &bopts, + B_LOG); blocksize = 1 << blocklog; blflag = 1; break; case B_SIZE: if (!value || *value == '\0') - reqval('b', bopts, B_SIZE); + reqval('b', subopts, B_SIZE); if (bsflag) - respec('b', bopts, B_SIZE); + respec('b', subopts, B_SIZE); if (blflag) - conflict('b', bopts, B_LOG, + conflict('b', subopts, B_LOG, B_SIZE); blocksize = getnum(value, blocksize, sectorsize, true); @@ -1237,14 +1468,16 @@ main( case 'd': p = optarg; while (*p != '\0') { + char **subopts = (char **)dopts.subopts; char *value; - switch (getsubopt(&p, (constpp)dopts, &value)) { + switch (getsubopt(&p, (constpp)subopts, + &value)) { case D_AGCOUNT: if (!value || *value == '\0') - reqval('d', dopts, D_AGCOUNT); + reqval('d', subopts, D_AGCOUNT); if (daflag) - respec('d', dopts, D_AGCOUNT); + respec('d', subopts, D_AGCOUNT); agcount = getnum(value, 0, 0, false); if ((__int64_t)agcount <= 0) illegal(value, "d agcount"); @@ -1252,9 +1485,9 @@ main( break; case D_AGSIZE: if (!value || *value == '\0') - reqval('d', dopts, D_AGSIZE); + reqval('d', subopts, D_AGSIZE); if (dasize) - respec('d', dopts, D_AGSIZE); + respec('d', subopts, D_AGSIZE); agsize = getnum(value, blocksize, sectorsize, true); if ((__int64_t)agsize <= 0) @@ -1269,25 +1502,25 @@ main( break; case D_NAME: if (!value || *value == '\0') - reqval('d', dopts, D_NAME); + reqval('d', subopts, D_NAME); if (xi.dname) - respec('d', dopts, D_NAME); + respec('d', subopts, D_NAME); xi.dname = value; break; case D_SIZE: if (!value || *value == '\0') - reqval('d', dopts, D_SIZE); + reqval('d', subopts, D_SIZE); if (dsize) - respec('d', dopts, D_SIZE); + respec('d', subopts, D_SIZE); dsize = value; break; case D_SUNIT: if (!value || *value == '\0') - reqval('d', dopts, D_SUNIT); + reqval('d', subopts, D_SUNIT); if (dsunit) - respec('d', dopts, D_SUNIT); + respec('d', subopts, D_SUNIT); if (nodsflag) - conflict('d', dopts, D_NOALIGN, + conflict('d', subopts, D_NOALIGN, D_SUNIT); dsunit = getnum(value, 0, 0, false); if (dsunit < 0) @@ -1295,11 +1528,11 @@ main( break; case D_SWIDTH: if (!value || *value == '\0') - reqval('d', dopts, D_SWIDTH); + reqval('d', subopts, D_SWIDTH); if (dswidth) - respec('d', dopts, D_SWIDTH); + respec('d', subopts, D_SWIDTH); if (nodsflag) - conflict('d', dopts, D_NOALIGN, + conflict('d', subopts, D_NOALIGN, D_SWIDTH); dswidth = getnum(value, 0, 0, false); if (dswidth < 0) @@ -1307,11 +1540,11 @@ main( break; case D_SU: if (!value || *value == '\0') - reqval('d', dopts, D_SU); + reqval('d', subopts, D_SU); if (dsu) - respec('d', dopts, D_SU); + respec('d', subopts, D_SU); if (nodsflag) - conflict('d', dopts, D_NOALIGN, + conflict('d', subopts, D_NOALIGN, D_SU); dsu = getnum(value, blocksize, sectorsize, true); @@ -1320,11 +1553,11 @@ main( break; case D_SW: if (!value || *value == '\0') - reqval('d', dopts, D_SW); + reqval('d', subopts, D_SW); if (dsw) - respec('d', dopts, D_SW); + respec('d', subopts, D_SW); if (nodsflag) - conflict('d', dopts, D_NOALIGN, + conflict('d', subopts, D_NOALIGN, D_SW); dsw = getnum(value, 0, 0, false); if (dsw < 0) @@ -1332,40 +1565,37 @@ main( break; case D_NOALIGN: if (dsu) - conflict('d', dopts, D_SU, + conflict('d', subopts, D_SU, D_NOALIGN); if (dsunit) - conflict('d', dopts, D_SUNIT, + conflict('d', subopts, D_SUNIT, D_NOALIGN); if (dsw) - conflict('d', dopts, D_SW, + conflict('d', subopts, D_SW, D_NOALIGN); if (dswidth) - conflict('d', dopts, D_SWIDTH, + conflict('d', subopts, D_SWIDTH, D_NOALIGN); nodsflag = 1; break; case D_SECTLOG: if (slflag) - respec('d', dopts, D_SECTLOG); + respec('d', subopts, D_SECTLOG); if (ssflag) - conflict('d', dopts, D_SECTSIZE, + conflict('d', subopts, D_SECTSIZE, D_SECTLOG); - sectorlog = getnum_checked(value, - XFS_MIN_SECTORSIZE_LOG, - XFS_MAX_SECTORSIZE_LOG, - "d sectlog", 'd', dopts, - D_SECTLOG); + sectorlog = getnum_checked(value, &dopts, + D_SECTLOG); sectorsize = 1 << sectorlog; slflag = 1; break; case D_SECTSIZE: if (!value || *value == '\0') - reqval('d', dopts, D_SECTSIZE); + reqval('d', subopts, D_SECTSIZE); if (ssflag) - respec('d', dopts, D_SECTSIZE); + respec('d', subopts, D_SECTSIZE); if (slflag) - conflict('d', dopts, D_SECTLOG, + conflict('d', subopts, D_SECTLOG, D_SECTSIZE); sectorsize = getnum(value, blocksize, sectorsize, true); @@ -1382,14 +1612,14 @@ main( break; case D_PROJINHERIT: if (!value || *value == '\0') - reqval('d', dopts, D_PROJINHERIT); + reqval('d', subopts, D_PROJINHERIT); fsx.fsx_projid = atoi(value); fsx.fsx_xflags |= \ XFS_DIFLAG_PROJINHERIT; break; case D_EXTSZINHERIT: if (!value || *value == '\0') - reqval('d', dopts, D_EXTSZINHERIT); + reqval('d', subopts, D_EXTSZINHERIT); fsx.fsx_extsize = atoi(value); fsx.fsx_xflags |= \ XFS_DIFLAG_EXTSZINHERIT; @@ -1402,37 +1632,34 @@ main( case 'i': p = optarg; while (*p != '\0') { + char **subopts = (char **)iopts.subopts; char *value; - switch (getsubopt(&p, (constpp)iopts, &value)) { + switch (getsubopt(&p, (constpp)subopts, + &value)) { case I_ALIGN: sb_feat.inode_align = getbool( value, "i align", true); break; case I_LOG: - if (!value || *value == '\0') - reqval('i', iopts, I_LOG); if (ilflag) - respec('i', iopts, I_LOG); + respec('i', subopts, I_LOG); if (ipflag) - conflict('i', iopts, I_PERBLOCK, + conflict('i', subopts, I_PERBLOCK, I_LOG); if (isflag) - conflict('i', iopts, I_SIZE, + conflict('i', subopts, I_SIZE, I_LOG); - inodelog = getnum_checked(value, - XFS_DINODE_MIN_LOG, - XFS_DINODE_MAX_LOG, - "i log", 'i', iopts, - I_LOG); + inodelog = getnum_checked(value, &iopts, + I_LOG); isize = 1 << inodelog; ilflag = 1; break; case I_MAXPCT: if (!value || *value == '\0') - reqval('i', iopts, I_MAXPCT); + reqval('i', subopts, I_MAXPCT); if (imflag) - respec('i', iopts, I_MAXPCT); + respec('i', subopts, I_MAXPCT); imaxpct = getnum(value, 0, 0, false); if (imaxpct < 0 || imaxpct > 100) illegal(value, "i maxpct"); @@ -1440,14 +1667,14 @@ main( break; case I_PERBLOCK: if (!value || *value == '\0') - reqval('i', iopts, I_PERBLOCK); + reqval('i', subopts, I_PERBLOCK); if (ilflag) - conflict('i', iopts, I_LOG, + conflict('i', subopts, I_LOG, I_PERBLOCK); if (ipflag) - respec('i', iopts, I_PERBLOCK); + respec('i', subopts, I_PERBLOCK); if (isflag) - conflict('i', iopts, I_SIZE, + conflict('i', subopts, I_SIZE, I_PERBLOCK); inopblock = getnum(value, 0, 0, false); if (inopblock < @@ -1458,15 +1685,15 @@ main( break; case I_SIZE: if (!value || *value == '\0') - reqval('i', iopts, I_SIZE); + reqval('i', subopts, I_SIZE); if (ilflag) - conflict('i', iopts, I_LOG, + conflict('i', subopts, I_LOG, I_SIZE); if (ipflag) - conflict('i', iopts, I_PERBLOCK, + conflict('i', subopts, I_PERBLOCK, I_SIZE); if (isflag) - respec('i', iopts, I_SIZE); + respec('i', subopts, I_SIZE); isize = getnum(value, 0, 0, true); if (isize <= 0 || !ispow2(isize)) illegal(value, "i size"); @@ -1475,7 +1702,7 @@ main( break; case I_ATTR: if (!value || *value == '\0') - reqval('i', iopts, I_ATTR); + reqval('i', subopts, I_ATTR); c = getnum(value, 0, 0, false); if (c < 0 || c > 2) illegal(value, "i attr"); @@ -1501,17 +1728,19 @@ main( case 'l': p = optarg; while (*p != '\0') { + char **subopts = (char **)lopts.subopts; char *value; long long tmp_num; - switch (getsubopt(&p, (constpp)lopts, &value)) { + switch (getsubopt(&p, (constpp)subopts, + &value)) { case L_AGNUM: if (!value || *value == '\0') - reqval('l', lopts, L_AGNUM); + reqval('l', subopts, L_AGNUM); if (laflag) - respec('l', lopts, L_AGNUM); + respec('l', subopts, L_AGNUM); if (ldflag) - conflict('l', lopts, L_AGNUM, L_DEV); + conflict('l', subopts, L_AGNUM, L_DEV); tmp_num = getnum(value, 0, 0, false); if (tmp_num < 0) illegal(value, "l agno"); @@ -1520,7 +1749,7 @@ main( break; case L_FILE: if (loginternal) - conflict('l', lopts, L_INTERNAL, + conflict('l', subopts, L_INTERNAL, L_FILE); xi.lisfile = getbool(value, "l file", true); @@ -1529,12 +1758,12 @@ main( break; case L_INTERNAL: if (ldflag) - conflict('l', lopts, L_INTERNAL, L_DEV); + conflict('l', subopts, L_INTERNAL, L_DEV); if (xi.lisfile) - conflict('l', lopts, L_FILE, + conflict('l', subopts, L_FILE, L_INTERNAL); if (liflag) - respec('l', lopts, L_INTERNAL); + respec('l', subopts, L_INTERNAL); loginternal = getbool(value, "l internal", true); @@ -1542,9 +1771,9 @@ main( break; case L_SU: if (!value || *value == '\0') - reqval('l', lopts, L_SU); + reqval('l', subopts, L_SU); if (lsu) - respec('l', lopts, L_SU); + respec('l', subopts, L_SU); lsu = getnum(value, blocksize, sectorsize, true); if (lsu < 0) @@ -1553,9 +1782,9 @@ main( break; case L_SUNIT: if (!value || *value == '\0') - reqval('l', lopts, L_SUNIT); + reqval('l', subopts, L_SUNIT); if (lsunit) - respec('l', lopts, L_SUNIT); + respec('l', subopts, L_SUNIT); lsunit = getnum(value, 0, 0, false); if (lsunit < 0) illegal(value, "l sunit"); @@ -1564,13 +1793,13 @@ main( case L_NAME: case L_DEV: if (laflag) - conflict('l', lopts, L_AGNUM, L_DEV); + conflict('l', subopts, L_AGNUM, L_DEV); if (liflag) - conflict('l', lopts, L_INTERNAL, L_DEV); + conflict('l', subopts, L_INTERNAL, L_DEV); if (!value || *value == '\0') - reqval('l', lopts, L_NAME); + reqval('l', subopts, L_NAME); if (xi.logname) - respec('l', lopts, L_NAME); + respec('l', subopts, L_NAME); ldflag = 1; loginternal = 0; logfile = value; @@ -1578,9 +1807,9 @@ main( break; case L_VERSION: if (!value || *value == '\0') - reqval('l', lopts, L_VERSION); + reqval('l', subopts, L_VERSION); if (lvflag) - respec('l', lopts, L_VERSION); + respec('l', subopts, L_VERSION); c = getnum(value, 0, 0, false); if (c < 1 || c > 2) illegal(value, "l version"); @@ -1589,33 +1818,30 @@ main( break; case L_SIZE: if (!value || *value == '\0') - reqval('l', lopts, L_SIZE); + reqval('l', subopts, L_SIZE); if (logsize) - respec('l', lopts, L_SIZE); + respec('l', subopts, L_SIZE); logsize = value; lsflag = 1; break; case L_SECTLOG: if (lslflag) - respec('l', lopts, L_SECTLOG); + respec('l', subopts, L_SECTLOG); if (lssflag) - conflict('l', lopts, L_SECTSIZE, + conflict('l', subopts, L_SECTSIZE, L_SECTLOG); lsectorlog = getnum_checked(value, - XFS_MIN_SECTORSIZE_LOG, - XFS_MAX_SECTORSIZE_LOG, - "l sectlog", 'l', lopts, - L_SECTLOG); + &lopts, L_SECTLOG); lsectorsize = 1 << lsectorlog; lslflag = 1; break; case L_SECTSIZE: if (!value || *value == '\0') - reqval('l', lopts, L_SECTSIZE); + reqval('l', subopts, L_SECTSIZE); if (lssflag) - respec('l', lopts, L_SECTSIZE); + respec('l', subopts, L_SECTSIZE); if (lslflag) - conflict('l', lopts, L_SECTLOG, + conflict('l', subopts, L_SECTLOG, L_SECTSIZE); lsectorsize = getnum(value, blocksize, sectorsize, true); @@ -1644,9 +1870,11 @@ main( case 'm': p = optarg; while (*p != '\0') { + char **subopts = (char **)mopts.subopts; char *value; - switch (getsubopt(&p, (constpp)mopts, &value)) { + switch (getsubopt(&p, (constpp)subopts, + &value)) { case M_CRC: sb_feat.crcs_enabled = getbool( value, "m crc", true); @@ -1665,7 +1893,7 @@ _("cannot specify both -m crc=1 and -n ftype\n")); break; case M_UUID: if (!value || *value == '\0') - reqval('m', mopts, M_UUID); + reqval('m', subopts, M_UUID); if (platform_uuid_parse(value, &uuid)) illegal(optarg, "m uuid"); break; @@ -1677,30 +1905,29 @@ _("cannot specify both -m crc=1 and -n ftype\n")); case 'n': p = optarg; while (*p != '\0') { + char **subopts = (char **)nopts.subopts; char *value; - switch (getsubopt(&p, (constpp)nopts, &value)) { + switch (getsubopt(&p, (constpp)subopts, + &value)) { case N_LOG: if (nlflag) - respec('n', nopts, N_LOG); + respec('n', subopts, N_LOG); if (nsflag) - conflict('n', nopts, N_SIZE, + conflict('n', subopts, N_SIZE, N_LOG); dirblocklog = getnum_checked(value, - XFS_MIN_REC_DIRSIZE, - XFS_MAX_BLOCKSIZE_LOG, - "n log", 'n', nopts, - N_LOG); + &nopts, N_LOG); dirblocksize = 1 << dirblocklog; nlflag = 1; break; case N_SIZE: if (!value || *value == '\0') - reqval('n', nopts, N_SIZE); + reqval('n', subopts, N_SIZE); if (nsflag) - respec('n', nopts, N_SIZE); + respec('n', subopts, N_SIZE); if (nlflag) - conflict('n', nopts, N_LOG, + conflict('n', subopts, N_LOG, N_SIZE); dirblocksize = getnum(value, blocksize, sectorsize, true); @@ -1713,9 +1940,9 @@ _("cannot specify both -m crc=1 and -n ftype\n")); break; case N_VERSION: if (!value || *value == '\0') - reqval('n', nopts, N_VERSION); + reqval('n', subopts, N_VERSION); if (nvflag) - respec('n', nopts, N_VERSION); + respec('n', subopts, N_VERSION); if (!strcasecmp(value, "ci")) { /* ASCII CI mode */ sb_feat.nci = true; @@ -1730,7 +1957,7 @@ _("cannot specify both -m crc=1 and -n ftype\n")); break; case N_FTYPE: if (nftype) - respec('n', nopts, N_FTYPE); + respec('n', subopts, N_FTYPE); if (sb_feat.crcs_enabled) { fprintf(stderr, _("cannot specify both -m crc=1 and -n ftype\n")); @@ -1762,14 +1989,16 @@ _("cannot specify both -m crc=1 and -n ftype\n")); case 'r': p = optarg; while (*p != '\0') { + char **subopts = (char **)ropts.subopts; char *value; - switch (getsubopt(&p, (constpp)ropts, &value)) { + switch (getsubopt(&p, (constpp)subopts, + &value)) { case R_EXTSIZE: if (!value || *value == '\0') - reqval('r', ropts, R_EXTSIZE); + reqval('r', subopts, R_EXTSIZE); if (rtextsize) - respec('r', ropts, R_EXTSIZE); + respec('r', subopts, R_EXTSIZE); rtextsize = value; break; case R_FILE: @@ -1781,16 +2010,16 @@ _("cannot specify both -m crc=1 and -n ftype\n")); case R_NAME: case R_DEV: if (!value || *value == '\0') - reqval('r', ropts, R_NAME); + reqval('r', subopts, R_NAME); if (xi.rtname) - respec('r', ropts, R_NAME); + respec('r', subopts, R_NAME); xi.rtname = value; break; case R_SIZE: if (!value || *value == '\0') - reqval('r', ropts, R_SIZE); + reqval('r', subopts, R_SIZE); if (rtsize) - respec('r', ropts, R_SIZE); + respec('r', subopts, R_SIZE); rtsize = value; break; case R_NOALIGN: @@ -1804,21 +2033,20 @@ _("cannot specify both -m crc=1 and -n ftype\n")); case 's': p = optarg; while (*p != '\0') { + char **subopts = (char **)sopts.subopts; char *value; - switch (getsubopt(&p, (constpp)sopts, &value)) { + switch (getsubopt(&p, (constpp)subopts, + &value)) { case S_LOG: case S_SECTLOG: if (slflag || lslflag) - respec('s', sopts, S_SECTLOG); + respec('s', subopts, S_SECTLOG); if (ssflag || lssflag) - conflict('s', sopts, S_SECTSIZE, - S_SECTLOG); - sectorlog = getnum_checked(value, - XFS_MIN_SECTORSIZE_LOG, - XFS_MAX_SECTORSIZE_LOG, - "s sectlog", 's', sopts, - S_SECTLOG); + conflict('s', subopts, + S_SECTSIZE, S_SECTLOG); + sectorlog = getnum_checked(value, &sopts, + S_SECTLOG); lsectorlog = sectorlog; sectorsize = 1 << sectorlog; lsectorsize = sectorsize; @@ -1827,11 +2055,11 @@ _("cannot specify both -m crc=1 and -n ftype\n")); case S_SIZE: case S_SECTSIZE: if (!value || *value == '\0') - reqval('s', sopts, S_SECTSIZE); + reqval('s', subopts, S_SECTSIZE); if (ssflag || lssflag) - respec('s', sopts, S_SECTSIZE); + respec('s', subopts, S_SECTSIZE); if (slflag || lslflag) - conflict('s', sopts, S_SECTLOG, + conflict('s', subopts, S_SECTLOG, S_SECTSIZE); sectorsize = getnum(value, blocksize, sectorsize, true); -- 2.6.0 From jtulak@redhat.com Thu Mar 24 06:15:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C722D7CDC for ; Thu, 24 Mar 2016 06:15:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4DBDDAC00A for ; Thu, 24 Mar 2016 04:15:55 -0700 (PDT) X-ASG-Debug-ID: 1458818153-04cbb05f3648cd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id CgGwmqwaB8vXwFnG (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 24 Mar 2016 04:15:54 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 99909804F3 for ; Thu, 24 Mar 2016 11:15:53 +0000 (UTC) Received: from localhost.localdomain (vpn1-7-36.ams2.redhat.com [10.36.7.36]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2OBFbLM009274 for ; Thu, 24 Mar 2016 07:15:53 -0400 From: jtulak@redhat.com To: xfs@oss.sgi.com Subject: [PATCH 16/19] mkfs: move spinodes crc check Date: Thu, 24 Mar 2016 12:15:33 +0100 X-ASG-Orig-Subj: [PATCH 16/19] mkfs: move spinodes crc check Message-Id: <1458818136-56043-17-git-send-email-jtulak@redhat.com> In-Reply-To: <1458818136-56043-1-git-send-email-jtulak@redhat.com> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458818154 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Jan Tulak Spinodes crc check is now moved to be in the same way as finobt. Signed-off-by: Jan Tulak Reviewed-by: Brian Foster --- mkfs/xfs_mkfs.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 7bd9fd5..9a6ae2c 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -2411,12 +2411,13 @@ _("32 bit Project IDs always enabled on CRC enabled filesytems\n")); } sb_feat.finobt = 0; } - } - if (sb_feat.spinodes && !sb_feat.crcs_enabled) { - fprintf(stderr, -_("warning: sparse inodes not supported without CRC support, disabled.\n")); - sb_feat.spinodes = 0; + if (sb_feat.spinodes) { + fprintf(stderr, + _("warning: sparse inodes not supported without CRC support, disabled.\n")); + sb_feat.spinodes = 0; + } + } if (nsflag || nlflag) { -- 2.6.0 From jtulak@redhat.com Thu Mar 24 06:15:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 721477CDA for ; Thu, 24 Mar 2016 06:15:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A8091AC002 for ; Thu, 24 Mar 2016 04:15:54 -0700 (PDT) X-ASG-Debug-ID: 1458818150-04cbb05f3848cd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id d7Jas5GFRWgkVjni (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 24 Mar 2016 04:15:51 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id C244078222 for ; Thu, 24 Mar 2016 11:15:50 +0000 (UTC) Received: from localhost.localdomain (vpn1-7-36.ams2.redhat.com [10.36.7.36]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2OBFbLJ009274 for ; Thu, 24 Mar 2016 07:15:50 -0400 From: jtulak@redhat.com To: xfs@oss.sgi.com Subject: [PATCH 13/19] mkfs: encode conflicts into parsing table Date: Thu, 24 Mar 2016 12:15:30 +0100 X-ASG-Orig-Subj: [PATCH 13/19] mkfs: encode conflicts into parsing table Message-Id: <1458818136-56043-14-git-send-email-jtulak@redhat.com> In-Reply-To: <1458818136-56043-1-git-send-email-jtulak@redhat.com> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458818151 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner CHANGELOG: o Add .conflicts init where it was missing o Add explanation of a new member of opt_params struct. o A long line fix. Many options conflict, so we need to specify which options conflict with each other in a generic manner. We already have a "seen" variable used for respecification detection, so we can also use this code conflict detection. Hence add a "conflicts" array to the sub options parameter definition. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak --- mkfs/xfs_mkfs.c | 258 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 134 insertions(+), 124 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 1f06110..d119580 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -54,6 +54,9 @@ unsigned int sectorsize; #define MAX_SUBOPTS 16 #define SUBOPT_NEEDS_VAL (-1LL) +#define MAX_CONFLICTS 8 +#define LAST_CONFLICT (-1) + /* * Table for parsing mkfs parameters. * @@ -89,6 +92,11 @@ unsigned int sectorsize; * An optional flag for subopts where the given value has to be a power * of two. * + * conflicts MANDATORY + * If your subopt is in a conflict with some other option, specify it. + * Accepts the .index values of the conflicting subopts and the last + * member of this list has to be LAST_CONFLICT. + * * minval, maxval OPTIONAL * These options are used for automatic range check and they have to be * always used together in pair. If you don't want to limit the max value, @@ -118,6 +126,7 @@ struct opt_params { bool seen; bool convert; bool is_power_2; + int conflicts[MAX_CONFLICTS]; long long minval; long long maxval; long long defaultval; @@ -135,6 +144,8 @@ struct opt_params bopts = { }, .subopt_params = { { .index = B_LOG, + .conflicts = { B_SIZE, + LAST_CONFLICT }, .minval = XFS_MIN_BLOCKSIZE_LOG, .maxval = XFS_MAX_BLOCKSIZE_LOG, .defaultval = SUBOPT_NEEDS_VAL, @@ -142,6 +153,8 @@ struct opt_params bopts = { { .index = B_SIZE, .convert = true, .is_power_2 = true, + .conflicts = { B_LOG, + LAST_CONFLICT }, .minval = XFS_MIN_BLOCKSIZE, .maxval = XFS_MAX_BLOCKSIZE, .defaultval = SUBOPT_NEEDS_VAL, @@ -186,57 +199,84 @@ struct opt_params dopts = { }, .subopt_params = { { .index = D_AGCOUNT, + .conflicts = { D_AGSIZE, + LAST_CONFLICT }, .minval = 1, .maxval = XFS_MAX_AGNUMBER, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_FILE, + .conflicts = { LAST_CONFLICT }, .minval = 0, .maxval = 1, .defaultval = 1, }, { .index = D_NAME, + .conflicts = { LAST_CONFLICT }, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SIZE, + .conflicts = { LAST_CONFLICT }, .convert = true, .minval = XFS_AG_MIN_BYTES, .maxval = LLONG_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SUNIT, + .conflicts = { D_NOALIGN, + D_SU, + D_SW, + LAST_CONFLICT }, .minval = 0, .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SWIDTH, + .conflicts = { D_NOALIGN, + D_SU, + D_SW, + LAST_CONFLICT }, .minval = 0, .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_AGSIZE, + .conflicts = { D_AGCOUNT, + LAST_CONFLICT }, .convert = true, .minval = XFS_AG_MIN_BYTES, .maxval = XFS_AG_MAX_BYTES, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SU, + .conflicts = { D_NOALIGN, + D_SUNIT, + D_SWIDTH, + LAST_CONFLICT }, .convert = true, .minval = 0, .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SW, + .conflicts = { D_NOALIGN, + D_SUNIT, + D_SWIDTH, + LAST_CONFLICT }, .minval = 0, .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SECTLOG, + .conflicts = { D_SECTSIZE, + LAST_CONFLICT }, .minval = XFS_MIN_SECTORSIZE_LOG, .maxval = XFS_MAX_SECTORSIZE_LOG, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SECTSIZE, + .conflicts = { D_SECTLOG, + LAST_CONFLICT }, .convert = true, .is_power_2 = true, .minval = XFS_MIN_SECTORSIZE, @@ -244,21 +284,29 @@ struct opt_params dopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_NOALIGN, + .conflicts = { D_SU, + D_SW, + D_SUNIT, + D_SWIDTH, + LAST_CONFLICT }, .minval = 0, .maxval = 1, .defaultval = 1, }, { .index = D_RTINHERIT, + .conflicts = { LAST_CONFLICT }, .minval = 1, .maxval = 1, .defaultval = 1, }, { .index = D_PROJINHERIT, + .conflicts = { LAST_CONFLICT }, .minval = 0, .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_EXTSZINHERIT, + .conflicts = { LAST_CONFLICT }, .minval = 0, .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, @@ -290,43 +338,57 @@ struct opt_params iopts = { }, .subopt_params = { { .index = I_ALIGN, + .conflicts = { LAST_CONFLICT }, .minval = 0, .maxval = 1, .defaultval = 1, }, { .index = I_LOG, + .conflicts = { I_PERBLOCK, + I_SIZE, + LAST_CONFLICT }, .minval = XFS_DINODE_MIN_LOG, .maxval = XFS_DINODE_MAX_LOG, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_MAXPCT, + .conflicts = { LAST_CONFLICT }, .minval = 0, .maxval = 100, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_PERBLOCK, + .conflicts = { I_LOG, + I_SIZE, + LAST_CONFLICT }, .is_power_2 = true, .minval = XFS_MIN_INODE_PERBLOCK, .maxval = XFS_MAX_BLOCKSIZE / XFS_DINODE_MIN_SIZE, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_SIZE, + .conflicts = { I_PERBLOCK, + I_LOG, + LAST_CONFLICT }, .is_power_2 = true, .minval = XFS_DINODE_MIN_SIZE, .maxval = XFS_DINODE_MAX_SIZE, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_ATTR, + .conflicts = { LAST_CONFLICT }, .minval = 0, .maxval = 2, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_PROJID32BIT, + .conflicts = { LAST_CONFLICT }, .minval = 0, .maxval = 1, .defaultval = 1, }, { .index = I_SPINODES, + .conflicts = { LAST_CONFLICT }, .minval = 0, .maxval = 1, .defaultval = 1, @@ -365,46 +427,64 @@ struct opt_params lopts = { }, .subopt_params = { { .index = L_AGNUM, + .conflicts = { L_DEV, + LAST_CONFLICT }, .minval = 0, .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_INTERNAL, + .conflicts = { L_FILE, + L_DEV, + LAST_CONFLICT }, .minval = 0, .maxval = 1, .defaultval = 1, }, { .index = L_SIZE, + .conflicts = { LAST_CONFLICT }, .convert = true, .minval = 2 * 1024 * 1024LL, /* XXX: XFS_MIN_LOG_BYTES */ .maxval = XFS_MAX_LOG_BYTES, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_VERSION, + .conflicts = { LAST_CONFLICT }, .minval = 1, .maxval = 2, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SUNIT, + .conflicts = { L_SU, + LAST_CONFLICT }, .minval = BTOBB(XLOG_MIN_RECORD_BSIZE), .maxval = BTOBB(XLOG_MAX_RECORD_BSIZE), .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SU, + .conflicts = { L_SUNIT, + LAST_CONFLICT }, .convert = true, .minval = XLOG_MIN_RECORD_BSIZE, .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_DEV, + .conflicts = { L_AGNUM, + L_INTERNAL, + LAST_CONFLICT }, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SECTLOG, + .conflicts = { L_SECTSIZE, + LAST_CONFLICT }, .minval = XFS_MIN_SECTORSIZE_LOG, .maxval = XFS_MAX_SECTORSIZE_LOG, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SECTSIZE, + .conflicts = { L_SECTLOG, + LAST_CONFLICT }, .convert = true, .is_power_2 = true, .minval = XFS_MIN_SECTORSIZE, @@ -412,14 +492,20 @@ struct opt_params lopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_FILE, + .conflicts = { L_INTERNAL, + LAST_CONFLICT }, .minval = 0, .maxval = 1, .defaultval = 1, }, { .index = L_NAME, + .conflicts = { L_AGNUM, + L_INTERNAL, + LAST_CONFLICT }, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_LAZYSBCNTR, + .conflicts = { LAST_CONFLICT }, .minval = 0, .maxval = 1, .defaultval = 1, @@ -442,11 +528,15 @@ struct opt_params nopts = { }, .subopt_params = { { .index = N_LOG, + .conflicts = { N_SIZE, + LAST_CONFLICT }, .minval = XFS_MIN_REC_DIRSIZE, .maxval = XFS_MAX_BLOCKSIZE_LOG, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = N_SIZE, + .conflicts = { N_LOG, + LAST_CONFLICT }, .convert = true, .is_power_2 = true, .minval = 1 << XFS_MIN_REC_DIRSIZE, @@ -454,11 +544,13 @@ struct opt_params nopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = N_VERSION, + .conflicts = { LAST_CONFLICT }, .minval = 2, .maxval = 2, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = N_FTYPE, + .conflicts = { LAST_CONFLICT }, .minval = 0, .maxval = 1, .defaultval = 1, @@ -485,32 +577,38 @@ struct opt_params ropts = { }, .subopt_params = { { .index = R_EXTSIZE, + .conflicts = { LAST_CONFLICT }, .convert = true, .minval = XFS_MIN_RTEXTSIZE, .maxval = XFS_MAX_RTEXTSIZE, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_SIZE, + .conflicts = { LAST_CONFLICT }, .convert = true, .minval = 0, .maxval = LLONG_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_DEV, + .conflicts = { LAST_CONFLICT }, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_FILE, .minval = 0, .maxval = 1, .defaultval = 1, + .conflicts = { LAST_CONFLICT }, }, { .index = R_NAME, + .conflicts = { LAST_CONFLICT }, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_NOALIGN, .minval = 0, .maxval = 1, .defaultval = 1, + .conflicts = { LAST_CONFLICT }, }, }, }; @@ -530,16 +628,25 @@ struct opt_params sopts = { }, .subopt_params = { { .index = S_LOG, + .conflicts = { S_SIZE, + S_SECTSIZE, + LAST_CONFLICT }, .minval = XFS_MIN_SECTORSIZE_LOG, .maxval = XFS_MAX_SECTORSIZE_LOG, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = S_SECTLOG, + .conflicts = { S_SIZE, + S_SECTSIZE, + LAST_CONFLICT }, .minval = XFS_MIN_SECTORSIZE_LOG, .maxval = XFS_MAX_SECTORSIZE_LOG, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = S_SIZE, + .conflicts = { S_LOG, + S_SECTLOG, + LAST_CONFLICT }, .convert = true, .is_power_2 = true, .minval = XFS_MIN_SECTORSIZE, @@ -547,6 +654,9 @@ struct opt_params sopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = S_SECTSIZE, + .conflicts = { S_LOG, + S_SECTLOG, + LAST_CONFLICT }, .convert = true, .is_power_2 = true, .minval = XFS_MIN_SECTORSIZE, @@ -569,16 +679,19 @@ struct opt_params mopts = { }, .subopt_params = { { .index = M_CRC, + .conflicts = { LAST_CONFLICT }, .minval = 0, .maxval = 1, .defaultval = 1, }, { .index = M_FINOBT, + .conflicts = { LAST_CONFLICT }, .minval = 0, .maxval = 1, .defaultval = 1, }, { .index = M_UUID, + .conflicts = { LAST_CONFLICT }, .defaultval = SUBOPT_NEEDS_VAL, }, }, @@ -620,30 +733,14 @@ calc_stripe_factors( int *lsunit) { /* Handle data sunit/swidth options */ - if (*dsunit || *dswidth) { - if (dsu || dsw) { - fprintf(stderr, - _("data su/sw must not be used in " - "conjunction with data sunit/swidth\n")); - usage(); - } - - if ((*dsunit && !*dswidth) || (!*dsunit && *dswidth)) { - fprintf(stderr, - _("both data sunit and data swidth options " - "must be specified\n")); - usage(); - } + if ((*dsunit && !*dswidth) || (!*dsunit && *dswidth)) { + fprintf(stderr, + _("both data sunit and data swidth options " + "must be specified\n")); + usage(); } if (dsu || dsw) { - if (*dsunit || *dswidth) { - fprintf(stderr, - _("data sunit/swidth must not be used in " - "conjunction with data su/sw\n")); - usage(); - } - if ((dsu && !dsw) || (!dsu && dsw)) { fprintf(stderr, _("both data su and data sw options " @@ -671,24 +768,8 @@ calc_stripe_factors( /* Handle log sunit options */ - if (*lsunit) { - if (lsu) { - fprintf(stderr, - _("log su should not be used in " - "conjunction with log sunit\n")); - usage(); - } - } - - if (lsu) { - if (*lsunit) { - fprintf(stderr, - _("log sunit should not be used in " - "conjunction with log su\n")); - usage(); - } + if (lsu) *lsunit = (int)BTOBBT(lsu); - } } /* @@ -1410,6 +1491,17 @@ getnum( respec(opts->name, (char **)opts->subopts, index); sp->seen = true; + /* check for conflicts with the option */ + for (c = 0; c < MAX_CONFLICTS; c++) { + int conflict_opt = sp->conflicts[c]; + + if (conflict_opt == LAST_CONFLICT) + break; + if (opts->subopt_params[conflict_opt].seen) + conflict(opts->name, (char **)opts->subopts, + conflict_opt, index); + } + /* empty strings might just return a default value */ if (!str || *str == '\0') { if (sp->defaultval == SUBOPT_NEEDS_VAL) @@ -1607,17 +1699,11 @@ main( switch (getsubopt(&p, (constpp)subopts, &value)) { case B_LOG: - if (bsflag) - conflict('b', subopts, B_SIZE, - B_LOG); blocklog = getnum(value, &bopts, B_LOG); blocksize = 1 << blocklog; blflag = 1; break; case B_SIZE: - if (blflag) - conflict('b', subopts, B_LOG, - B_SIZE); blocksize = getnum(value, &bopts, B_SIZE); blocklog = libxfs_highbit32(blocksize); @@ -1666,61 +1752,29 @@ main( dsize = value; break; case D_SUNIT: - if (nodsflag) - conflict('d', subopts, D_NOALIGN, - D_SUNIT); dsunit = getnum(value, &dopts, D_SUNIT); break; case D_SWIDTH: - if (nodsflag) - conflict('d', subopts, D_NOALIGN, - D_SWIDTH); dswidth = getnum(value, &dopts, D_SWIDTH); break; case D_SU: - if (nodsflag) - conflict('d', subopts, D_NOALIGN, - D_SU); dsu = getnum(value, &dopts, D_SU); break; case D_SW: - if (nodsflag) - conflict('d', subopts, D_NOALIGN, - D_SW); dsw = getnum(value, &dopts, D_SW); break; case D_NOALIGN: nodsflag = getnum(value, &dopts, - D_NOALIGN); - if (nodsflag) { - if (dsu) - conflict('d', subopts, D_SU, - D_NOALIGN); - if (dsunit) - conflict('d', subopts, D_SUNIT, - D_NOALIGN); - if (dsw) - conflict('d', subopts, D_SW, D_NOALIGN); - if (dswidth) - conflict('d', subopts, D_SWIDTH, - D_NOALIGN); - } break; case D_SECTLOG: - if (ssflag) - conflict('d', subopts, D_SECTSIZE, - D_SECTLOG); sectorlog = getnum(value, &dopts, D_SECTLOG); sectorsize = 1 << sectorlog; slflag = 1; break; case D_SECTSIZE: - if (slflag) - conflict('d', subopts, D_SECTLOG, - D_SECTSIZE); sectorsize = getnum(value, &dopts, D_SECTSIZE); sectorlog = @@ -1763,12 +1817,6 @@ main( &iopts, I_ALIGN); break; case I_LOG: - if (ipflag) - conflict('i', subopts, I_PERBLOCK, - I_LOG); - if (isflag) - conflict('i', subopts, I_SIZE, - I_LOG); inodelog = getnum(value, &iopts, I_LOG); isize = 1 << inodelog; ilflag = 1; @@ -1779,23 +1827,11 @@ main( imflag = 1; break; case I_PERBLOCK: - if (ilflag) - conflict('i', subopts, I_LOG, - I_PERBLOCK); - if (isflag) - conflict('i', subopts, I_SIZE, - I_PERBLOCK); inopblock = getnum(value, &iopts, I_PERBLOCK); ipflag = 1; break; case I_SIZE: - if (ilflag) - conflict('i', subopts, I_LOG, - I_SIZE); - if (ipflag) - conflict('i', subopts, I_PERBLOCK, - I_SIZE); isize = getnum(value, &iopts, I_SIZE); inodelog = libxfs_highbit32(isize); isflag = 1; @@ -1810,9 +1846,8 @@ main( I_PROJID32BIT); break; case I_SPINODES: - sb_feat.spinodes = - getnum(value, &iopts, - I_SPINODES); + sb_feat.spinodes = getnum(value, + &iopts, I_SPINODES); break; default: unknown('i', value); @@ -1828,8 +1863,6 @@ main( switch (getsubopt(&p, (constpp)subopts, &value)) { case L_AGNUM: - if (ldflag) - conflict('l', subopts, L_AGNUM, L_DEV); logagno = getnum(value, &lopts, L_AGNUM); laflag = 1; break; @@ -1843,12 +1876,6 @@ main( xi.lcreat = 1; break; case L_INTERNAL: - if (ldflag) - conflict('l', subopts, L_INTERNAL, L_DEV); - if (xi.lisfile) - conflict('l', subopts, L_FILE, - L_INTERNAL); - loginternal = getnum(value, &lopts, L_INTERNAL); liflag = 1; @@ -1890,18 +1917,12 @@ main( lsflag = 1; break; case L_SECTLOG: - if (lssflag) - conflict('l', subopts, L_SECTSIZE, - L_SECTLOG); lsectorlog = getnum(value, &lopts, L_SECTLOG); lsectorsize = 1 << lsectorlog; lslflag = 1; break; case L_SECTSIZE: - if (lslflag) - conflict('l', subopts, L_SECTLOG, - L_SECTSIZE); lsectorsize = getnum(value, &lopts, L_SECTSIZE); lsectorlog = @@ -1966,18 +1987,12 @@ _("cannot specify both -m crc=1 and -n ftype\n")); switch (getsubopt(&p, (constpp)subopts, &value)) { case N_LOG: - if (nsflag) - conflict('n', subopts, N_SIZE, - N_LOG); dirblocklog = getnum(value, &nopts, N_LOG); dirblocksize = 1 << dirblocklog; nlflag = 1; break; case N_SIZE: - if (nlflag) - conflict('n', subopts, N_LOG, - N_SIZE); dirblocksize = getnum(value, &nopts, N_SIZE); dirblocklog = @@ -2083,7 +2098,7 @@ _("cannot specify both -m crc=1 and -n ftype\n")); &value)) { case S_LOG: case S_SECTLOG: - if (ssflag || lssflag) + if (lssflag) conflict('s', subopts, S_SECTSIZE, S_SECTLOG); sectorlog = getnum(value, &sopts, @@ -2095,7 +2110,7 @@ _("cannot specify both -m crc=1 and -n ftype\n")); break; case S_SIZE: case S_SECTSIZE: - if (slflag || lslflag) + if (lslflag) conflict('s', subopts, S_SECTLOG, S_SECTSIZE); sectorsize = getnum(value, &sopts, @@ -2316,11 +2331,6 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); dirblocksize = 1 << dirblocklog; } - if (daflag && dasize) { - fprintf(stderr, - _("both -d agcount= and agsize= specified, use one or the other\n")); - usage(); - } if (xi.disfile && (!dsize || !xi.dname)) { fprintf(stderr, -- 2.6.0 From jtulak@redhat.com Thu Mar 24 06:15:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 10D9E7CDD for ; Thu, 24 Mar 2016 06:15:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C77568F8050 for ; Thu, 24 Mar 2016 04:15:55 -0700 (PDT) X-ASG-Debug-ID: 1458818154-04bdf03cfc49740001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id JxmzOR5C7NyFWo9d (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 24 Mar 2016 04:15:54 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 82143C0467EE for ; Thu, 24 Mar 2016 11:15:54 +0000 (UTC) Received: from localhost.localdomain (vpn1-7-36.ams2.redhat.com [10.36.7.36]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2OBFbLN009274 for ; Thu, 24 Mar 2016 07:15:53 -0400 From: jtulak@redhat.com To: xfs@oss.sgi.com Subject: [PATCH 17/19] xfsprogs: disable truncating of files Date: Thu, 24 Mar 2016 12:15:34 +0100 X-ASG-Orig-Subj: [PATCH 17/19] xfsprogs: disable truncating of files Message-Id: <1458818136-56043-18-git-send-email-jtulak@redhat.com> In-Reply-To: <1458818136-56043-1-git-send-email-jtulak@redhat.com> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458818154 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Jan Tulak Unify mkfs.xfs behaviour a bit and never truncate files. If the user is trying to mkfs an existing file, we don't want to destroy anything he did with the file before (sparse file, allocations...) Signed-off-by: Jan Tulak --- libxfs/init.c | 2 +- mkfs/xfs_mkfs.c | 18 +++++++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/libxfs/init.c b/libxfs/init.c index 268136f..5f4b6c4 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -112,7 +112,7 @@ libxfs_device_open(char *path, int creat, int xflags, int setblksize) retry: flags = (readonly ? O_RDONLY : O_RDWR) | \ - (creat ? (O_CREAT|O_TRUNC) : 0) | \ + (creat ? O_CREAT : 0) | \ (dio ? O_DIRECT : 0) | \ (excl ? O_EXCL : 0); diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 9a6ae2c..2bb3b35 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -1029,15 +1029,19 @@ check_device_type( const char *optname) { struct stat64 statbuf; + int statres; - if (*isfile && (no_size || no_name)) { + statres = stat64(name, &statbuf); + + if (*isfile && statres != 0 && (no_size || no_name)) { fprintf(stderr, - _("if -%s file then -%s name and -%s size are required\n"), - optname, optname, optname); + _("if -%s file and the file does not exists, " \ + "then -%s name and -%s size are required\n"), + optname, optname, optname); usage(); } - if (stat64(name, &statbuf)) { + if (statres) { if (errno == ENOENT && *isfile) { if (create) *create = 1; @@ -1059,9 +1063,9 @@ check_device_type( } /* - * We only want to completely truncate and recreate an existing file if - * we were specifically told it was a file. Set the create flag only in - * this case to trigger that behaviour. + * We only want to create a file only if we were specifically told + * we want a file. Set the create flag only in this case to trigger + * that behaviour. */ if (S_ISREG(statbuf.st_mode)) { if (!*isfile) -- 2.6.0 From jtulak@redhat.com Thu Mar 24 06:15:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BCA4D7CA7 for ; Thu, 24 Mar 2016 06:15:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 31512AC002 for ; Thu, 24 Mar 2016 04:15:57 -0700 (PDT) X-ASG-Debug-ID: 1458818155-04cbb05f3848ce0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id UK32YIzI6vqmUNWq (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 24 Mar 2016 04:15:56 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 732B5C00F5D6 for ; Thu, 24 Mar 2016 11:15:55 +0000 (UTC) Received: from localhost.localdomain (vpn1-7-36.ams2.redhat.com [10.36.7.36]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2OBFbLO009274 for ; Thu, 24 Mar 2016 07:15:54 -0400 From: jtulak@redhat.com To: xfs@oss.sgi.com Subject: [PATCH 18/19] mkfs: unit conversions are case insensitive Date: Thu, 24 Mar 2016 12:15:35 +0100 X-ASG-Orig-Subj: [PATCH 18/19] mkfs: unit conversions are case insensitive Message-Id: <1458818136-56043-19-git-send-email-jtulak@redhat.com> In-Reply-To: <1458818136-56043-1-git-send-email-jtulak@redhat.com> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458818155 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Jan Tulak Solves the question "Should I use 10g or 10G?" Signed-off-by: Jan Tulak --- mkfs/xfs_mkfs.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 2bb3b35..680c6c4 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -3625,17 +3625,17 @@ cvtnum( if (*sp == 's' && sp[1] == '\0') return i * sectsize; - if (*sp == 'k' && sp[1] == '\0') + if ((*sp == 'k' || *sp == 'K' ) && sp[1] == '\0') return 1024LL * i; - if (*sp == 'm' && sp[1] == '\0') + if ((*sp == 'm' || *sp == 'M' ) && sp[1] == '\0') return 1024LL * 1024LL * i; - if (*sp == 'g' && sp[1] == '\0') + if ((*sp == 'g' || *sp == 'G' ) && sp[1] == '\0') return 1024LL * 1024LL * 1024LL * i; - if (*sp == 't' && sp[1] == '\0') + if ((*sp == 't' || *sp == 'T' ) && sp[1] == '\0') return 1024LL * 1024LL * 1024LL * 1024LL * i; - if (*sp == 'p' && sp[1] == '\0') + if ((*sp == 'p' || *sp == 'P' ) && sp[1] == '\0') return 1024LL * 1024LL * 1024LL * 1024LL * 1024LL * i; - if (*sp == 'e' && sp[1] == '\0') + if ((*sp == 'e' || *sp == 'E' ) && sp[1] == '\0') return 1024LL * 1024LL * 1024LL * 1024LL * 1024LL * 1024LL * i; return -1LL; } -- 2.6.0 From jtulak@redhat.com Thu Mar 24 06:16:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 83B537CBB for ; Thu, 24 Mar 2016 06:16:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 47CC3304062 for ; Thu, 24 Mar 2016 04:16:04 -0700 (PDT) X-ASG-Debug-ID: 1458818156-04cb6c3916423a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ZbS9JeMsmBwHEHhk (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 24 Mar 2016 04:15:58 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 5E4FDC00EB2E for ; Thu, 24 Mar 2016 11:15:56 +0000 (UTC) Received: from localhost.localdomain (vpn1-7-36.ams2.redhat.com [10.36.7.36]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2OBFbLP009274 for ; Thu, 24 Mar 2016 07:15:55 -0400 From: jtulak@redhat.com To: xfs@oss.sgi.com Subject: [PATCH 19/19] mkfs: add optional 'reason' for illegal_option Date: Thu, 24 Mar 2016 12:15:36 +0100 X-ASG-Orig-Subj: [PATCH 19/19] mkfs: add optional 'reason' for illegal_option Message-Id: <1458818136-56043-20-git-send-email-jtulak@redhat.com> In-Reply-To: <1458818136-56043-1-git-send-email-jtulak@redhat.com> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458818157 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Jan Tulak Allow us to tell the user what exactly is wrong with his options. For example, that the value is too small, instead of just generic "bad option." Signed-off-by: Jan Tulak --- mkfs/xfs_mkfs.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 680c6c4..76e193d 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -1550,11 +1550,18 @@ static __attribute__((noreturn)) void illegal_option( const char *value, struct opt_params *opts, - int index) + int index, + const char *reason) { - fprintf(stderr, - _("Illegal value %s for -%c %s option\n"), - value, opts->name, opts->subopts[index]); + if(reason == NULL){ + fprintf(stderr, + _("Illegal value %s for -%c %s option\n"), + value, opts->name, opts->subopts[index]); + } else { + fprintf(stderr, + _("Illegal value %s for -%c %s option: %s\n"), + value, opts->name, opts->subopts[index], reason); + } usage(); } @@ -1646,16 +1653,18 @@ getnum( c = strtoll(str, &str_end, 0); if (c == 0 && str_end == str) - illegal_option(str, opts, index); + illegal_option(str, opts, index, NULL); if (*str_end != '\0') - illegal_option(str, opts, index); + illegal_option(str, opts, index, NULL); } /* Validity check the result. */ - if (c < sp->minval || c > sp->maxval) - illegal_option(str, opts, index); + if (c < sp->minval) + illegal_option(str, opts, index, "value is too small"); + else if (c > sp->maxval) + illegal_option(str, opts, index, "value is too large"); if (sp->is_power_2 && !ispow2(c)) - illegal_option(str, opts, index); + illegal_option(str, opts, index, "value has to be power of 2"); return c; } -- 2.6.0 From jtulak@redhat.com Thu Mar 24 06:16:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CD80E7CBB for ; Thu, 24 Mar 2016 06:16:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9B7EA8F8033 for ; Thu, 24 Mar 2016 04:16:04 -0700 (PDT) X-ASG-Debug-ID: 1458818157-04cb6c3919423b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GIPxgl0Z0HPrqCSk (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 24 Mar 2016 04:15:58 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id DE066486B9 for ; Thu, 24 Mar 2016 11:15:52 +0000 (UTC) Received: from localhost.localdomain (vpn1-7-36.ams2.redhat.com [10.36.7.36]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2OBFbLL009274 for ; Thu, 24 Mar 2016 07:15:52 -0400 From: jtulak@redhat.com To: xfs@oss.sgi.com Subject: [PATCH 15/19] mkfs: don't treat files as though they are block devices Date: Thu, 24 Mar 2016 12:15:32 +0100 X-ASG-Orig-Subj: [PATCH 15/19] mkfs: don't treat files as though they are block devices Message-Id: <1458818136-56043-16-git-send-email-jtulak@redhat.com> In-Reply-To: <1458818136-56043-1-git-send-email-jtulak@redhat.com> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458818158 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner CHANGELOG o Fix where xi.dname was incorrectly used instead of dfile o Variable alignment (tabs) o Added error handling for stat/statfs in init.c o Remove a duplicate pread in zero_old_xfs_structures and for the remaining call, save the return value in a more meaningful variable. o A chunk moved to previous patch. If the device is actually a file, and "-d file" is not specified, mkfs will try to treat it as a block device and get stuff wrong. Image files don't necessarily have the same sector sizes as the block device or filesystem underlying the image file, nor should we be issuing discard ioctls on image files. To fix this sanely, only require "-d file" if the device name is invalid to trigger creation of the file. Otherwise, use stat() to determine if the device is a file or block device and deal with that appropriately by setting the "isfile" variables and turning off direct IO. Then ensure that we check the "isfile" options before doing things that are specific to block devices. Also, as direct IO is disabled for files, use statfs() for getting host FS blocksize, not platform_findsizes(). These changes, however, can cause some tests to fail when the test partition on which the file is created has blocksize bigger than 512. Before, the underlying fs was ignored. Now, an attempt to create a fs in a file with blocksize 512 on a 4096 underlying partition will fail. Other file/blockdev issues fixed: - use getstr to detect specifying the data device name twice. - check file/size/name parameters before anything else. - overwrite checks need to be done before the image file is opened and potentially truncated. - blkid_get_topology() should not be called for image files, so warn when it is called that way. - zero_old_xfs_structures() emits a spurious error: "existing superblock read failed: Success" when it is run on a truncated image file. Don't warn if we see this problem on an image file. - Don't issue discards on image files. - Use fsync() for image files, not BLKFLSBUF in platform_flush_device() for Linux. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak --- libxfs/init.c | 12 ++++ libxfs/linux.c | 12 +++- mkfs/xfs_mkfs.c | 181 ++++++++++++++++++++++++++++++++++++++------------------ 3 files changed, 147 insertions(+), 58 deletions(-) diff --git a/libxfs/init.c b/libxfs/init.c index 8d747e8..268136f 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -246,6 +246,9 @@ libxfs_init(libxfs_init_t *a) char rtpath[25]; int rval = 0; int flags; + struct stat st; + struct statfs stfs; + int statres; dpath[0] = logpath[0] = rtpath[0] = '\0'; dname = a->dname; @@ -278,6 +281,15 @@ libxfs_init(libxfs_init_t *a) a->ddev= libxfs_device_open(dname, a->dcreat, flags, a->setblksize); a->dfd = libxfs_device_to_fd(a->ddev); + statres = stat(dname, &st); + statres += statfs(dname, &stfs); + if(statres){ + fprintf(stderr, _("%s: stat failed.\n"), + progname); + goto done; + } + a->dsize = st.st_size/BBSIZE; + a->dbsize = stfs.f_bsize; } else { if (!check_open(dname, flags, &rawfile, &blockfile)) goto done; diff --git a/libxfs/linux.c b/libxfs/linux.c index f6ea1b2..adb8ff1 100644 --- a/libxfs/linux.c +++ b/libxfs/linux.c @@ -18,6 +18,7 @@ #define ustat __kernel_ustat #include +#include #include #undef ustat #include @@ -125,7 +126,16 @@ platform_set_blocksize(int fd, char *path, dev_t device, int blocksize, int fata void platform_flush_device(int fd, dev_t device) { - if (major(device) != RAMDISK_MAJOR) + struct stat64 st; + if (major(device) == RAMDISK_MAJOR) + return; + + if (fstat64(fd, &st) < 0) + return; + + if (S_ISREG(st.st_mode)) + fsync(fd); + else ioctl(fd, BLKFLSBUF, 0); } diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 9261ed5..7bd9fd5 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -787,7 +787,7 @@ calc_stripe_factors( #ifdef ENABLE_BLKID static int check_overwrite( - char *device) + const char *device) { const char *type; blkid_probe pr = NULL; @@ -804,7 +804,7 @@ check_overwrite( fd = open(device, O_RDONLY); if (fd < 0) goto out; - platform_findsizes(device, fd, &size, &bsz); + platform_findsizes((char *)device, fd, &size, &bsz); close(fd); /* nothing to overwrite on a 0-length device */ @@ -851,7 +851,6 @@ check_overwrite( "according to blkid\n"), progname, device); } ret = 1; - out: if (pr) blkid_free_probe(pr); @@ -877,8 +876,12 @@ static void blkid_get_topology( struct stat statbuf; /* can't get topology info from a file */ - if (!stat(device, &statbuf) && S_ISREG(statbuf.st_mode)) + if (!stat(device, &statbuf) && S_ISREG(statbuf.st_mode)) { + fprintf(stderr, + _("%s: Warning: trying to probe topology of a file %s!\n"), + progname, device); return; + } pr = blkid_new_probe_from_filename(device); if (!pr) @@ -976,35 +979,35 @@ static void get_topology( struct fs_topology *ft, int force_overwrite) { - struct stat statbuf; char *dfile = xi->volname ? xi->volname : xi->dname; + struct stat statbuf; + struct statfs statfsbuf; /* - * If our target is a regular file, use platform_findsizes - * to try to obtain the underlying filesystem's requirements - * for direct IO; we'll set our sector size to that if possible. + * If our target is a regular file, use statfs + * to try to obtain the underlying filesystem's blocksize. */ if (xi->disfile || - (!stat(dfile, &statbuf) && S_ISREG(statbuf.st_mode))) { + (!stat(dfile, &statbuf) && S_ISREG(statbuf.st_mode))) { int fd; int flags = O_RDONLY; - long long dummy; /* with xi->disfile we may not have the file yet! */ if (xi->disfile) flags |= O_CREAT; fd = open(dfile, flags, 0666); + if (fd >= 0) { - platform_findsizes(dfile, fd, &dummy, &ft->lsectorsize); + fstatfs(fd, &statfsbuf); + ft->lsectorsize = statfsbuf.f_bsize; close(fd); - ft->psectorsize = ft->lsectorsize; } else ft->psectorsize = ft->lsectorsize = BBSIZE; } else { blkid_get_topology(dfile, &ft->dsunit, &ft->dswidth, - &ft->lsectorsize, &ft->psectorsize, - force_overwrite); + &ft->lsectorsize, &ft->psectorsize, + force_overwrite); } if (xi->rtname && !xi->risfile) { @@ -1016,6 +1019,75 @@ static void get_topology( } static void +check_device_type( + const char *name, + int *isfile, + bool no_size, + bool no_name, + int *create, + bool force_overwrite, + const char *optname) +{ + struct stat64 statbuf; + + if (*isfile && (no_size || no_name)) { + fprintf(stderr, + _("if -%s file then -%s name and -%s size are required\n"), + optname, optname, optname); + usage(); + } + + if (stat64(name, &statbuf)) { + if (errno == ENOENT && *isfile) { + if (create) + *create = 1; + return; + } + + fprintf(stderr, + _("Error accessing specified device %s: %s\n"), + name, strerror(errno)); + usage(); + return; + } + + if (!force_overwrite && check_overwrite(name)) { + fprintf(stderr, + _("%s: Use the -f option to force overwrite.\n"), + progname); + exit(1); + } + + /* + * We only want to completely truncate and recreate an existing file if + * we were specifically told it was a file. Set the create flag only in + * this case to trigger that behaviour. + */ + if (S_ISREG(statbuf.st_mode)) { + if (!*isfile) + *isfile = 1; + else if (create) + *create = 1; + return; + } + + if (S_ISBLK(statbuf.st_mode)) { + if (*isfile) { + fprintf(stderr, + _("specified \"-%s file\" on a block device %s\n"), + optname, name); + usage(); + } + return; + } + + fprintf(stderr, + _("specified device %s not a file or block device\n"), + name); + usage(); +} + +static void fixup_log_stripe_unit( int lsflag, int sunit, @@ -1279,7 +1351,6 @@ zero_old_xfs_structures( __uint32_t bsize; int i; xfs_off_t off; - int tmp; /* * We open regular files with O_TRUNC|O_CREAT. Nothing to do here... @@ -1299,15 +1370,23 @@ zero_old_xfs_structures( } memset(buf, 0, new_sb->sb_sectsize); - tmp = pread(xi->dfd, buf, new_sb->sb_sectsize, 0); - if (tmp < 0) { + off = pread(xi->dfd, buf, new_sb->sb_sectsize, 0); + if (off < 0) { fprintf(stderr, _("existing superblock read failed: %s\n"), strerror(errno)); goto done; } - if (tmp != new_sb->sb_sectsize) { - fprintf(stderr, - _("warning: could not read existing superblock, skip zeroing\n")); + /* + * If we are creating an image file, it might be of zero length at this + * point in time. Hence reading the existing superblock is going to + * return zero bytes. It's not a failure we need to warn about in this + * case. + */ + if (off != new_sb->sb_sectsize) { + if (!xi->disfile) + fprintf(stderr, + _("error reading existing superblock: %s\n"), + strerror(errno)); goto done; } libxfs_sb_from_disk(&sb, buf); @@ -1787,8 +1866,6 @@ main( case D_FILE: xi.disfile = getnum(value, &dopts, D_FILE); - if (xi.disfile && !Nflag) - xi.dcreat = 1; break; case D_NAME: xi.dname = getstr(value, &dopts, D_NAME); @@ -1914,11 +1991,6 @@ main( case L_FILE: xi.lisfile = getnum(value, &lopts, L_FILE); - if (xi.lisfile && loginternal) - conflict('l', subopts, L_INTERNAL, - L_FILE); - if (xi.lisfile) - xi.lcreat = 1; break; case L_INTERNAL: loginternal = getnum(value, &lopts, @@ -2087,8 +2159,6 @@ _("cannot specify both -m crc=1 and -n ftype\n")); case R_FILE: xi.risfile = getnum(value, &ropts, R_FILE); - if (xi.risfile) - xi.rcreat = 1; break; case R_NAME: case R_DEV: @@ -2193,6 +2263,26 @@ _("Minimum block size for CRC enabled filesystems is %d bytes.\n"), lsectorsize = sectorsize; } + /* + * Before anything else, verify that we are correctly operating on + * files or block devices and set the control parameters correctly. + * Explicitly disable direct IO for image files so we don't error out on + * sector size mismatches between the new filesystem and the underlying + * host filesystem. + */ + check_device_type(dfile, &xi.disfile, !dsize, !dfile, + Nflag ? NULL : &xi.dcreat, force_overwrite, "d"); + if (!loginternal) + check_device_type(xi.logname, &xi.lisfile, !logsize, !xi.logname, + Nflag ? NULL : &xi.lcreat, + force_overwrite, "l"); + if (xi.rtname) + check_device_type(xi.rtname, &xi.risfile, !rtsize, !xi.rtname, + Nflag ? NULL : &xi.rcreat, + force_overwrite, "r"); + if (xi.disfile || xi.lisfile || xi.risfile) + xi.isdirect = 0; + memset(&ft, 0, sizeof(ft)); get_topology(&xi, &ft, force_overwrite); @@ -2345,11 +2435,6 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); } - if (xi.disfile && (!dsize || !xi.dname)) { - fprintf(stderr, - _("if -d file then -d name and -d size are required\n")); - usage(); - } if (dsize) { __uint64_t dbytes; @@ -2382,11 +2467,6 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); usage(); } - if (xi.lisfile && (!logsize || !xi.logname)) { - fprintf(stderr, - _("if -l file then -l name and -l size are required\n")); - usage(); - } if (logsize) { __uint64_t logbytes; @@ -2404,11 +2484,6 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); (long long)logbytes, blocksize, (long long)(logblocks << blocklog)); } - if (xi.risfile && (!rtsize || !xi.rtname)) { - fprintf(stderr, - _("if -r file then -r name and -r size are required\n")); - usage(); - } if (rtsize) { __uint64_t rtbytes; @@ -2530,22 +2605,14 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); xi.rtsize &= sector_mask; xi.logBBsize &= (__uint64_t)-1 << (MAX(lsectorlog, 10) - BBSHIFT); - if (!force_overwrite) { - if (check_overwrite(dfile) || - check_overwrite(logfile) || - check_overwrite(xi.rtname)) { - fprintf(stderr, - _("%s: Use the -f option to force overwrite.\n"), - progname); - exit(1); - } - } + /* don't do discards on print-only runs or on files */ if (discard && !Nflag) { - discard_blocks(xi.ddev, xi.dsize); - if (xi.rtdev) + if (!xi.disfile) + discard_blocks(xi.ddev, xi.dsize); + if (xi.rtdev && !xi.risfile) discard_blocks(xi.rtdev, xi.rtsize); - if (xi.logdev && xi.logdev != xi.ddev) + if (xi.logdev && xi.logdev != xi.ddev && !xi.lisfile) discard_blocks(xi.logdev, xi.logBBsize); } -- 2.6.0 From jtulak@redhat.com Thu Mar 24 06:16:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A7EBD7CA1 for ; Thu, 24 Mar 2016 06:16:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7A0178F8033 for ; Thu, 24 Mar 2016 04:16:11 -0700 (PDT) X-ASG-Debug-ID: 1458818152-04cb6c391942390001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id nRt9Q5twTAai7eAs (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 24 Mar 2016 04:16:09 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id BE1748E23F for ; Thu, 24 Mar 2016 11:15:51 +0000 (UTC) Received: from localhost.localdomain (vpn1-7-36.ams2.redhat.com [10.36.7.36]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2OBFbLK009274 for ; Thu, 24 Mar 2016 07:15:51 -0400 From: jtulak@redhat.com To: xfs@oss.sgi.com Subject: [PATCH 14/19] mkfs: add string options to generic parsing Date: Thu, 24 Mar 2016 12:15:31 +0100 X-ASG-Orig-Subj: [PATCH 14/19] mkfs: add string options to generic parsing Message-Id: <1458818136-56043-15-git-send-email-jtulak@redhat.com> In-Reply-To: <1458818136-56043-1-git-send-email-jtulak@redhat.com> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458818169 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner CHANGELOG: o Remove unused argument of check_opt. o Add a comment to explain a new member of opt_params struct. o A stray chunk moved from the following patch to this one. So that string options are correctly detected for conflicts and respecification, add a getstr() function that modifies the option tables appropriately. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak --- mkfs/xfs_mkfs.c | 143 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 78 insertions(+), 65 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index d119580..9261ed5 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -83,6 +83,10 @@ unsigned int sectorsize; * Do not set this flag when definning a subopt. It is used to remeber that * this subopt was already seen, for example for conflicts detection. * + * str_seen INTERNAL + * Do not set. It is used internally for respecification, when some options + * has to be parsed twice - at first as a string, then later as a number. + * * convert OPTIONAL * A flag signalling whether the user-given value can use suffixes. * If you want to allow the use of user-friendly values like 13k, 42G, @@ -124,6 +128,7 @@ struct opt_params { struct subopt_param { int index; bool seen; + bool str_seen; bool convert; bool is_power_2; int conflicts[MAX_CONFLICTS]; @@ -1470,14 +1475,17 @@ illegal_option( usage(); } -static long long -getnum( - const char *str, +/* + * Check for conflicts and option respecification. + */ +static void +check_opt( struct opt_params *opts, - int index) + int index, + bool str_seen) { - struct subopt_param *sp = &opts->subopt_params[index]; - long long c; + struct subopt_param *sp = &opts->subopt_params[index]; + int i; if (sp->index != index) { fprintf(stderr, @@ -1486,22 +1494,47 @@ getnum( reqval(opts->name, (char **)opts->subopts, index); } - /* check for respecification of the option */ - if (sp->seen) - respec(opts->name, (char **)opts->subopts, index); - sp->seen = true; + /* + * Check for respecification of the option. This is more complex than it + * seems because some options are parsed twice - once as a string during + * input parsing, then later the string is passed to getnum for + * conversion into a number and bounds checking. Hence the two variables + * used to track the different uses based on the @str parameter passed + * to us. + */ + if (!str_seen) { + if (sp->seen) + respec(opts->name, (char **)opts->subopts, index); + sp->seen = true; + } else { + if (sp->str_seen) + respec(opts->name, (char **)opts->subopts, index); + sp->str_seen = true; + } /* check for conflicts with the option */ - for (c = 0; c < MAX_CONFLICTS; c++) { - int conflict_opt = sp->conflicts[c]; + for (i = 0; i < MAX_CONFLICTS; i++) { + int conflict_opt = sp->conflicts[i]; if (conflict_opt == LAST_CONFLICT) break; - if (opts->subopt_params[conflict_opt].seen) + if (opts->subopt_params[conflict_opt].seen || + opts->subopt_params[conflict_opt].str_seen) conflict(opts->name, (char **)opts->subopts, conflict_opt, index); } +} +static long long +getnum( + const char *str, + struct opt_params *opts, + int index) +{ + struct subopt_param *sp = &opts->subopt_params[index]; + long long c; + + check_opt(opts, index, false); /* empty strings might just return a default value */ if (!str || *str == '\0') { if (sp->defaultval == SUBOPT_NEEDS_VAL) @@ -1543,6 +1576,26 @@ getnum( return c; } +/* + * Option is a string - do all the option table work, and check there + * is actually an option string. Otherwise we don't do anything with the string + * here - validation will be done later when the string is converted to a value + * or used as a file/device path. + */ +static char * +getstr( + char *str, + struct opt_params *opts, + int index) +{ + check_opt(opts, index, true); + + /* empty strings for string options are not valid */ + if (!str || *str == '\0') + reqval(opts->name, (char **)opts->subopts, index); + return str; +} + int main( int argc, @@ -1738,18 +1791,10 @@ main( xi.dcreat = 1; break; case D_NAME: - if (!value || *value == '\0') - reqval('d', subopts, D_NAME); - if (xi.dname) - respec('d', subopts, D_NAME); - xi.dname = value; + xi.dname = getstr(value, &dopts, D_NAME); break; case D_SIZE: - if (!value || *value == '\0') - reqval('d', subopts, D_SIZE); - if (dsize) - respec('d', subopts, D_SIZE); - dsize = value; + dsize = getstr(value, &dopts, D_SIZE); break; case D_SUNIT: dsunit = getnum(value, &dopts, D_SUNIT); @@ -1890,18 +1935,10 @@ main( break; case L_NAME: case L_DEV: - if (laflag) - conflict('l', subopts, L_AGNUM, L_DEV); - if (liflag) - conflict('l', subopts, L_INTERNAL, L_DEV); - if (!value || *value == '\0') - reqval('l', subopts, L_NAME); - if (xi.logname) - respec('l', subopts, L_NAME); + logfile = getstr(value, &lopts, L_NAME); + xi.logname = logfile; ldflag = 1; loginternal = 0; - logfile = value; - xi.logname = value; break; case L_VERSION: sb_feat.log_version = @@ -1909,12 +1946,7 @@ main( lvflag = 1; break; case L_SIZE: - if (!value || *value == '\0') - reqval('l', subopts, L_SIZE); - if (logsize) - respec('l', subopts, L_SIZE); - logsize = value; - lsflag = 1; + logsize = getstr(value, &lopts, L_SIZE); break; case L_SECTLOG: lsectorlog = getnum(value, &lopts, @@ -2000,10 +2032,7 @@ _("cannot specify both -m crc=1 and -n ftype\n")); nsflag = 1; break; case N_VERSION: - if (!value || *value == '\0') - reqval('n', subopts, N_VERSION); - if (nvflag) - respec('n', subopts, N_VERSION); + value = getstr(value, &nopts, N_VERSION); if (!strcasecmp(value, "ci")) { /* ASCII CI mode */ sb_feat.nci = true; @@ -2052,11 +2081,8 @@ _("cannot specify both -m crc=1 and -n ftype\n")); switch (getsubopt(&p, (constpp)subopts, &value)) { case R_EXTSIZE: - if (!value || *value == '\0') - reqval('r', subopts, R_EXTSIZE); - if (rtextsize) - respec('r', subopts, R_EXTSIZE); - rtextsize = value; + rtextsize = getstr(value, &ropts, + R_EXTSIZE); break; case R_FILE: xi.risfile = getnum(value, &ropts, @@ -2066,18 +2092,11 @@ _("cannot specify both -m crc=1 and -n ftype\n")); break; case R_NAME: case R_DEV: - if (!value || *value == '\0') - reqval('r', subopts, R_NAME); - if (xi.rtname) - respec('r', subopts, R_NAME); - xi.rtname = value; + xi.rtname = getstr(value, &ropts, + R_NAME); break; case R_SIZE: - if (!value || *value == '\0') - reqval('r', subopts, R_SIZE); - if (rtsize) - respec('r', subopts, R_SIZE); - rtsize = value; + rtsize = getstr(value, &ropts, R_SIZE); break; case R_NOALIGN: norsflag = getnum(value, &ropts, @@ -2137,13 +2156,7 @@ _("cannot specify both -m crc=1 and -n ftype\n")); fprintf(stderr, _("extra arguments\n")); usage(); } else if (argc - optind == 1) { - dfile = xi.volname = argv[optind]; - if (xi.dname) { - fprintf(stderr, - _("cannot specify both %s and -d name=%s\n"), - xi.volname, xi.dname); - usage(); - } + dfile = xi.volname = getstr(argv[optind], &dopts, D_NAME); } else dfile = xi.dname; -- 2.6.0 From bfoster@redhat.com Thu Mar 24 06:17:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 359E87CAF for ; Thu, 24 Mar 2016 06:17:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E9ED28F8052 for ; Thu, 24 Mar 2016 04:17:10 -0700 (PDT) X-ASG-Debug-ID: 1458818226-04cbb05f3948de0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 1GC8igfKCYga1sQY (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Thu, 24 Mar 2016 04:17:06 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id EFF55C0467F5; Thu, 24 Mar 2016 11:17:05 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-6.bos.redhat.com [10.18.41.6]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2OBH5Gv007175; Thu, 24 Mar 2016 07:17:05 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 5A1261205DF; Thu, 24 Mar 2016 07:17:04 -0400 (EDT) Date: Thu, 24 Mar 2016 07:17:04 -0400 From: Brian Foster To: Stefan Priebe - Profihost AG Cc: linux-fsdevel@vger.kernel.org, "xfs-masters@oss.sgi.com" , "xfs@oss.sgi.com" Subject: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage Message-ID: <20160324111703.GA4068@bfoster.bfoster> X-ASG-Orig-Subj: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage References: <56D9D834.2000303@profihost.ag> <20160304191329.GC3758@bfoster.bfoster> <56D9E9BE.40101@profihost.ag> <20160304210341.GA8035@bfoster.bfoster> <20160305224845.GR30721@dastard> <56F299E3.4020703@profihost.ag> <20160323140736.GD43073@bfoster.bfoster> <56F3A101.1020300@profihost.ag> <56F3A213.2020908@profihost.ag> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56F3A213.2020908@profihost.ag> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458818226 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Mar 24, 2016 at 09:15:15AM +0100, Stefan Priebe - Profihost AG wrote: > > Am 24.03.2016 um 09:10 schrieb Stefan Priebe - Profihost AG: > > > > Am 23.03.2016 um 15:07 schrieb Brian Foster: > >> On Wed, Mar 23, 2016 at 02:28:03PM +0100, Stefan Priebe - Profihost AG wrote: > >>> sorry new one the last one got mangled. Comments inside. > >>> > >>> Am 05.03.2016 um 23:48 schrieb Dave Chinner: > >>>> On Fri, Mar 04, 2016 at 04:03:42PM -0500, Brian Foster wrote: > >>>>> On Fri, Mar 04, 2016 at 09:02:06PM +0100, Stefan Priebe wrote: > >>>>>> Am 04.03.2016 um 20:13 schrieb Brian Foster: > >>>>>>> On Fri, Mar 04, 2016 at 07:47:16PM +0100, Stefan Priebe wrote: > >>>>>>>> Am 20.02.2016 um 19:02 schrieb Stefan Priebe - Profihost AG: > >>>>>>>>> > >>>>>>>>>> Am 20.02.2016 um 15:45 schrieb Brian Foster : > >>>>>>>>>> > >>>>>>>>>>> On Sat, Feb 20, 2016 at 09:02:28AM +0100, Stefan Priebe wrote: > >> ... > >>> > >>> This has happened again on 8 different hosts in the last 24 hours > >>> running 4.4.6. > >>> > >>> All of those are KVM / Qemu hosts and are doing NO I/O except the normal > >>> OS stuff as the VMs have remote storage. So no database, no rsync on > >>> those hosts - just the OS doing nearly nothing. > >>> > >>> All those show: > >>> [153360.287040] WARNING: CPU: 0 PID: 109 at fs/xfs/xfs_aops.c:1234 > >>> xfs_vm_releasepage+0xe2/0xf0() > >>> > >> > >> Ok, well at this point the warning isn't telling us anything beyond > >> you're reproducing the problem. We can't really make progress without > >> more information. We don't necessarily know what application or > >> operations caused this by the time it occurs, but perhaps knowing what > >> file is affected could give us a hint. > >> > >> We have the xfs_releasepage tracepoint, but that's unconditional and so > >> might generate a lot of noise by default. Could you enable the > >> xfs_releasepage tracepoint and hunt for instances where delalloc != 0? > >> E.g., we could leave a long running 'trace-cmd record -e > >> "xfs:xfs_releasepage" ' command on several boxes and wait for the > >> problem to occur. Alternatively (and maybe easier), run 'trace-cmd start > >> -e "xfs:xfs_releasepage"' and leave something like 'cat > >> /sys/kernel/debug/tracing/trace_pipe | grep -v "delalloc 0" > > >> ~/trace.out' running to capture instances. > > Isn't the trace a WARN_ONCE? So it does not reoccur or can i check the > it in the trace.out even the WARN_ONCE was already triggered? > The tracepoint is independent from the warning (see xfs_vm_releasepage()), so the tracepoint will fire every invocation of the function regardless of whether delalloc blocks still exist at that point. That creates the need to filter the entries. With regard to performance, I believe the tracepoints are intended to be pretty lightweight. I don't think it should hurt to try it on a box, observe for a bit and make sure there isn't a huge impact. Note that the 'trace-cmd record' approach will save everything to file, so that's something to consider I suppose. Brian > Stefan > > > > > > Stefan > > > >> > >> Brian > >> > >>> Stefan > >>> > >>>> > >>>> -Dave. > >>>> > >>> > >>> _______________________________________________ > >>> xfs mailing list > >>> xfs@oss.sgi.com > >>> http://oss.sgi.com/mailman/listinfo/xfs > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From s.priebe@profihost.ag Thu Mar 24 07:17:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9EA4C7CA6 for ; Thu, 24 Mar 2016 07:17:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6139D8F804B for ; Thu, 24 Mar 2016 05:17:21 -0700 (PDT) X-ASG-Debug-ID: 1458821836-04cb6c391944010001-NocioJ Received: from mail-ph.de-nserver.de (mail-ph.de-nserver.de [85.158.179.214]) by cuda.sgi.com with ESMTP id v84Em6b0Dzn8Wu66 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 24 Mar 2016 05:17:18 -0700 (PDT) X-Barracuda-Envelope-From: s.priebe@profihost.ag X-Barracuda-Apparent-Source-IP: 85.158.179.214 Received: (qmail 24239 invoked from network); 24 Mar 2016 13:17:16 +0100 X-Fcrdns: No Received: from phoffice.de-nserver.de (HELO [10.11.11.93]) (185.39.223.5) (smtp-auth username hostmaster@profihost.com, mechanism plain) by mail-ph.de-nserver.de (qpsmtpd/0.92) with (ECDHE-RSA-AES256-SHA encrypted) ESMTPSA; Thu, 24 Mar 2016 13:17:16 +0100 Subject: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage To: Brian Foster X-ASG-Orig-Subj: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage References: <56D9D834.2000303@profihost.ag> <20160304191329.GC3758@bfoster.bfoster> <56D9E9BE.40101@profihost.ag> <20160304210341.GA8035@bfoster.bfoster> <20160305224845.GR30721@dastard> <56F299E3.4020703@profihost.ag> <20160323140736.GD43073@bfoster.bfoster> <56F3A101.1020300@profihost.ag> <56F3A213.2020908@profihost.ag> <20160324111703.GA4068@bfoster.bfoster> Cc: linux-fsdevel@vger.kernel.org, "xfs-masters@oss.sgi.com" , "xfs@oss.sgi.com" From: Stefan Priebe - Profihost AG Message-ID: <56F3DACB.8040305@profihost.ag> Date: Thu, 24 Mar 2016 13:17:15 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 MIME-Version: 1.0 In-Reply-To: <20160324111703.GA4068@bfoster.bfoster> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-User-Auth: Auth by hostmaster@profihost.com through 185.39.223.5 X-Barracuda-Connect: mail-ph.de-nserver.de[85.158.179.214] X-Barracuda-Start-Time: 1458821837 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28118 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Am 24.03.2016 um 12:17 schrieb Brian Foster: > On Thu, Mar 24, 2016 at 09:15:15AM +0100, Stefan Priebe - Profihost AG wrote: >> >> Am 24.03.2016 um 09:10 schrieb Stefan Priebe - Profihost AG: >>> >>> Am 23.03.2016 um 15:07 schrieb Brian Foster: >>>> On Wed, Mar 23, 2016 at 02:28:03PM +0100, Stefan Priebe - Profihost AG wrote: >>>>> sorry new one the last one got mangled. Comments inside. >>>>> >>>>> Am 05.03.2016 um 23:48 schrieb Dave Chinner: >>>>>> On Fri, Mar 04, 2016 at 04:03:42PM -0500, Brian Foster wrote: >>>>>>> On Fri, Mar 04, 2016 at 09:02:06PM +0100, Stefan Priebe wrote: >>>>>>>> Am 04.03.2016 um 20:13 schrieb Brian Foster: >>>>>>>>> On Fri, Mar 04, 2016 at 07:47:16PM +0100, Stefan Priebe wrote: >>>>>>>>>> Am 20.02.2016 um 19:02 schrieb Stefan Priebe - Profihost AG: >>>>>>>>>>> >>>>>>>>>>>> Am 20.02.2016 um 15:45 schrieb Brian Foster : >>>>>>>>>>>> >>>>>>>>>>>>> On Sat, Feb 20, 2016 at 09:02:28AM +0100, Stefan Priebe wrote: >>>> ... >>>>> >>>>> This has happened again on 8 different hosts in the last 24 hours >>>>> running 4.4.6. >>>>> >>>>> All of those are KVM / Qemu hosts and are doing NO I/O except the normal >>>>> OS stuff as the VMs have remote storage. So no database, no rsync on >>>>> those hosts - just the OS doing nearly nothing. >>>>> >>>>> All those show: >>>>> [153360.287040] WARNING: CPU: 0 PID: 109 at fs/xfs/xfs_aops.c:1234 >>>>> xfs_vm_releasepage+0xe2/0xf0() >>>>> >>>> >>>> Ok, well at this point the warning isn't telling us anything beyond >>>> you're reproducing the problem. We can't really make progress without >>>> more information. We don't necessarily know what application or >>>> operations caused this by the time it occurs, but perhaps knowing what >>>> file is affected could give us a hint. >>>> >>>> We have the xfs_releasepage tracepoint, but that's unconditional and so >>>> might generate a lot of noise by default. Could you enable the >>>> xfs_releasepage tracepoint and hunt for instances where delalloc != 0? >>>> E.g., we could leave a long running 'trace-cmd record -e >>>> "xfs:xfs_releasepage" ' command on several boxes and wait for the >>>> problem to occur. Alternatively (and maybe easier), run 'trace-cmd start >>>> -e "xfs:xfs_releasepage"' and leave something like 'cat >>>> /sys/kernel/debug/tracing/trace_pipe | grep -v "delalloc 0" > >>>> ~/trace.out' running to capture instances. >> >> Isn't the trace a WARN_ONCE? So it does not reoccur or can i check the >> it in the trace.out even the WARN_ONCE was already triggered? >> > > The tracepoint is independent from the warning (see > xfs_vm_releasepage()), so the tracepoint will fire every invocation of > the function regardless of whether delalloc blocks still exist at that > point. That creates the need to filter the entries. > > With regard to performance, I believe the tracepoints are intended to be > pretty lightweight. I don't think it should hurt to try it on a box, > observe for a bit and make sure there isn't a huge impact. Note that the > 'trace-cmd record' approach will save everything to file, so that's > something to consider I suppose. Tests / cat is running. Is there any way to test if it works? Or is it enough that cat prints stuff from time to time but does not match -v delalloc 0 Stefan From bfoster@redhat.com Thu Mar 24 07:24:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=unavailable version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 544267CA6 for ; Thu, 24 Mar 2016 07:24:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 241AF304062 for ; Thu, 24 Mar 2016 05:24:21 -0700 (PDT) X-ASG-Debug-ID: 1458822259-04cb6c391744330001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id TFrJx5CndQ2VgTmG (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Thu, 24 Mar 2016 05:24:20 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 5EAA6112D38; Thu, 24 Mar 2016 12:24:19 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-6.bos.redhat.com [10.18.41.6]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2OCOICo021607; Thu, 24 Mar 2016 08:24:18 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id D3A141205DF; Thu, 24 Mar 2016 08:24:17 -0400 (EDT) Date: Thu, 24 Mar 2016 08:24:17 -0400 From: Brian Foster To: Stefan Priebe - Profihost AG Cc: linux-fsdevel@vger.kernel.org, "xfs-masters@oss.sgi.com" , "xfs@oss.sgi.com" Subject: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage Message-ID: <20160324122417.GB4068@bfoster.bfoster> X-ASG-Orig-Subj: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage References: <20160304191329.GC3758@bfoster.bfoster> <56D9E9BE.40101@profihost.ag> <20160304210341.GA8035@bfoster.bfoster> <20160305224845.GR30721@dastard> <56F299E3.4020703@profihost.ag> <20160323140736.GD43073@bfoster.bfoster> <56F3A101.1020300@profihost.ag> <56F3A213.2020908@profihost.ag> <20160324111703.GA4068@bfoster.bfoster> <56F3DACB.8040305@profihost.ag> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56F3DACB.8040305@profihost.ag> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 24 Mar 2016 12:24:19 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1458822260 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Mar 24, 2016 at 01:17:15PM +0100, Stefan Priebe - Profihost AG wrote: > > Am 24.03.2016 um 12:17 schrieb Brian Foster: > > On Thu, Mar 24, 2016 at 09:15:15AM +0100, Stefan Priebe - Profihost AG wrote: > >> > >> Am 24.03.2016 um 09:10 schrieb Stefan Priebe - Profihost AG: > >>> > >>> Am 23.03.2016 um 15:07 schrieb Brian Foster: > >>>> On Wed, Mar 23, 2016 at 02:28:03PM +0100, Stefan Priebe - Profihost AG wrote: > >>>>> sorry new one the last one got mangled. Comments inside. > >>>>> > >>>>> Am 05.03.2016 um 23:48 schrieb Dave Chinner: > >>>>>> On Fri, Mar 04, 2016 at 04:03:42PM -0500, Brian Foster wrote: > >>>>>>> On Fri, Mar 04, 2016 at 09:02:06PM +0100, Stefan Priebe wrote: > >>>>>>>> Am 04.03.2016 um 20:13 schrieb Brian Foster: > >>>>>>>>> On Fri, Mar 04, 2016 at 07:47:16PM +0100, Stefan Priebe wrote: > >>>>>>>>>> Am 20.02.2016 um 19:02 schrieb Stefan Priebe - Profihost AG: > >>>>>>>>>>> > >>>>>>>>>>>> Am 20.02.2016 um 15:45 schrieb Brian Foster : > >>>>>>>>>>>> > >>>>>>>>>>>>> On Sat, Feb 20, 2016 at 09:02:28AM +0100, Stefan Priebe wrote: > >>>> ... > >>>>> > >>>>> This has happened again on 8 different hosts in the last 24 hours > >>>>> running 4.4.6. > >>>>> > >>>>> All of those are KVM / Qemu hosts and are doing NO I/O except the normal > >>>>> OS stuff as the VMs have remote storage. So no database, no rsync on > >>>>> those hosts - just the OS doing nearly nothing. > >>>>> > >>>>> All those show: > >>>>> [153360.287040] WARNING: CPU: 0 PID: 109 at fs/xfs/xfs_aops.c:1234 > >>>>> xfs_vm_releasepage+0xe2/0xf0() > >>>>> > >>>> > >>>> Ok, well at this point the warning isn't telling us anything beyond > >>>> you're reproducing the problem. We can't really make progress without > >>>> more information. We don't necessarily know what application or > >>>> operations caused this by the time it occurs, but perhaps knowing what > >>>> file is affected could give us a hint. > >>>> > >>>> We have the xfs_releasepage tracepoint, but that's unconditional and so > >>>> might generate a lot of noise by default. Could you enable the > >>>> xfs_releasepage tracepoint and hunt for instances where delalloc != 0? > >>>> E.g., we could leave a long running 'trace-cmd record -e > >>>> "xfs:xfs_releasepage" ' command on several boxes and wait for the > >>>> problem to occur. Alternatively (and maybe easier), run 'trace-cmd start > >>>> -e "xfs:xfs_releasepage"' and leave something like 'cat > >>>> /sys/kernel/debug/tracing/trace_pipe | grep -v "delalloc 0" > > >>>> ~/trace.out' running to capture instances. > >> > >> Isn't the trace a WARN_ONCE? So it does not reoccur or can i check the > >> it in the trace.out even the WARN_ONCE was already triggered? > >> > > > > The tracepoint is independent from the warning (see > > xfs_vm_releasepage()), so the tracepoint will fire every invocation of > > the function regardless of whether delalloc blocks still exist at that > > point. That creates the need to filter the entries. > > > > With regard to performance, I believe the tracepoints are intended to be > > pretty lightweight. I don't think it should hurt to try it on a box, > > observe for a bit and make sure there isn't a huge impact. Note that the > > 'trace-cmd record' approach will save everything to file, so that's > > something to consider I suppose. > > Tests / cat is running. Is there any way to test if it works? Or is it > enough that cat prints stuff from time to time but does not match -v > delalloc 0 > What is it printing where delalloc != 0? You could always just cat trace_pipe and make sure the event is firing, it's just that I suspect most entries will have delalloc == unwritten == 0. Also, while the tracepoint fires independent of the warning, it might not be a bad idea to restart a system that has already seen the warning since boot, just to provide some correlation or additional notification when the problem occurs. Brian > Stefan > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From shyam@zadarastorage.com Thu Mar 24 08:38:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 AA0EB7CA0 for ; Thu, 24 Mar 2016 08:38:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6C9048F804C for ; Thu, 24 Mar 2016 06:38:30 -0700 (PDT) X-ASG-Debug-ID: 1458826705-04cbb05f3950e90001-NocioJ Received: from mail-oi0-f44.google.com (mail-oi0-f44.google.com [209.85.218.44]) by cuda.sgi.com with ESMTP id gfpWcskBBzd0hfvX (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 24 Mar 2016 06:38:26 -0700 (PDT) X-Barracuda-Envelope-From: shyam@zadarastorage.com X-Barracuda-Apparent-Source-IP: 209.85.218.44 Received: by mail-oi0-f44.google.com with SMTP id r187so61287936oih.3 for ; Thu, 24 Mar 2016 06:38:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zadarastorage-com.20150623.gappssmtp.com; s=20150623; h=from:references:in-reply-to:mime-version:thread-index:date :message-id:subject:to:cc; bh=006xTFfyN5qKvS3uX01okreLpVa8ONmrA3cf7JMjSmU=; b=bsDg4CwzUnvfWCktZqFKEg4bNDjDCkrYvcArCK78r7vqxJ4AwjM0A08yOkmDkhoRk+ 36wLmL3zBZrYVgUZusJ003VFnptlO6+06iCrBRZvIOSkHQoAGt0tUEOk8Pq6bBAUHZFj 8jjlWg4YaBG0KO7q9+/JcFC2ONxTGUuYOpZIvEBSt6KFj6Gtj1ebxcQfeKmeIry2Mz9T AhvwiXWNql4Ob1O+B0tHvixy32j/SnNCTzT+HFZ8UFK969seyEfD6JaGp7mG1i3s00AB L8k2OJenIOD529c0df/rkm1xLmaw55x2vQVcDXxrSGYvtfXJ/ncI8x8SnvvRDz6psxab IikQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:references:in-reply-to:mime-version :thread-index:date:message-id:subject:to:cc; bh=006xTFfyN5qKvS3uX01okreLpVa8ONmrA3cf7JMjSmU=; b=dpaMuElKMXT2CitCW043sv77kVPkOd4vyCOk2li9/J3zLTrLE0RXjmws2XTIetJBU4 I7ppMPqahucDlCcMNc5X8BjMCjO9+dE49cHkcc8uxPDrXSxWxybl+oZ0EbH32P0yqkb/ yoLoxUfZ07fjC3i8z9HrzLrT57QpI98tRIG8KRSna7AXv/klIiuxSzF1obufSityxwLa fzUbz4cz0BG+GDSWzep4LNagYJpjoemKZluBYO7BeMuIYpfRNLexFO8WVirVoKKYjjo8 HUgiNRDRUA0LGmzYzPMKHZjezEadsa4qaN78DwqLt6IM2BjAWQ0W0zaYu24Hd591oUms +P3Q== X-Gm-Message-State: AD7BkJKmDOzY2RJKJCtT2lkQS9twYpSQqnarra+WSzjJMNLGazK8iqEhw5QTYc9XO7kPZUN+pGl2JQvGt/4v9g== X-Received: by 10.202.108.140 with SMTP id h134mr3639602oic.103.1458826705112; Thu, 24 Mar 2016 06:38:25 -0700 (PDT) From: Shyam Kaushik References: <20160322121922.GA53693@bfoster.bfoster> 6457b1d9de271ec6cca6bc2626aac161@mail.gmail.com 91068979ae9a5999b4774a06b8f1d14c@mail.gmail.com In-Reply-To: 91068979ae9a5999b4774a06b8f1d14c@mail.gmail.com MIME-Version: 1.0 X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AdGENRKPygQUtyusRzyfZh8lYSPNuwABVHnwACushLAAOj8CIA== Date: Thu, 24 Mar 2016 19:08:24 +0530 Message-ID: <30cee70e36a2db759efc72755f2023de@mail.gmail.com> Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery To: Brian Foster X-ASG-Orig-Subj: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Cc: xfs@oss.sgi.com, Alex Lyakas Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-oi0-f44.google.com[209.85.218.44] X-Barracuda-Start-Time: 1458826705 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/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, DKIM_SIGNED, DKIM_VERIFIED, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28119 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi Brian, Carlos, Dave, Not sure what changed since yesterday, but with several retries I couldn't reproduce this issue today. I will continue trying to reproduce this issue & check xfs_io/shutdown setting + on latest kernel to see if I can help in getting better insights. Thanks. --Shyam -----Original Message----- From: Shyam Kaushik [mailto:shyam@zadarastorage.com] Sent: 23 March 2016 15:23 To: 'Brian Foster' Cc: 'xfs@oss.sgi.com'; Alex Lyakas Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Hi Carlos, w.r.t. your question below >>> Shyam, after you reconnected the disks, the messages about failed async metadata >>> writes stops to be logged? After I reconnect the disks, messages about failed async metadata writes stops to be logged. But the key thing is messages like XFS (dm-29): xfs_log_force: error -5 returned Keeps repeating every 30-secs which indicates that there is some buf/io error status that is being carried forward. >>> Any chance you can reliably reproduce it? Yes I have a way to reproduce it, but its not reliable. What I do is setup a dm-linear over a disk. Create XFS, mount & trigger few copy threads to copy varying sized files into the FS. At this point pull out the drive (with scsi-remove-single-device in /proc/scsi/scsi) & in a short-while convert the dm-linear to dm-ioerror. Then I bring back the underlying drive, convert back dm-ioerror to dm-linear & try to unmount XFS. This problem somehow happens on a newly created XFS. If I copy several files into XFS/delete them & then copy them again, repeat the drive failure/recovery experiment it doesn't reproduce. Thanks. --Shyam Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery From: Carlos Maiolino Date: Tue, 22 Mar 2016 16:38:25 +0100 In-reply-to: <20160322140345.GA54245@bfoster.bfoster> Mail-followup-to: xfs@xxxxxxxxxxx User-agent: Mutt/1.5.24 (2015-08-30) Hi Brian, These traces, and the stack trace presented, looks quite similar with the one we were discussing a few days ago, using a dm-thin snapshot. Looks like with the same bug I've been hunting and Shyam confirmed my hypothesis of this bug be able to be reproduced with a regular device. If it's the same bug, yes, I reproduced it using upstream kernel. The difference between both (this bug and the one I've been working on) is how xfs actually behaves when async metadata writes fail. Other than that, it pretty much looks the same. Trying to unmount the filesystem hungs in xfs_log_force(), well, basically the reason I submitted the patch to include the caller into xfs_log_force trace. I'd like to see ftrace traces from this system with that patch if possible. I didn't have time to keep working on this for the past few days, but looks like it's time to come back to it. Shyam, after you reconnected the disks, the messages about failed async metadata writes stops to be logged? Any chance you can reliably reproduce it? I'm not a xfs journal expert, but it looks like the writeback of items in AIL got stuck due the IO errors, and were never completed, but I don't know what I should expect after the disk is reconnected. In my case though, with upstream kernel, I didn't get a XFS_SHUTDOWN until I tried to unmount the filesystem, which differs from this case, where xfs looks to have shutdown the filesystem after a few tries to writeback the metadata. Anyway, I can dig more into it this week, if nobody knows what is going on before I do it :) -----Original Message----- From: Shyam Kaushik [mailto:shyam@zadarastorage.com] Sent: 22 March 2016 18:32 To: 'Brian Foster' Cc: 'xfs@oss.sgi.com'; Alex Lyakas Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Hi Brian, Thanks for your quick reply. I repeated the test & trace-pipe is constantly filled with this: xfsaild/dm-10-3335 [003] ...2 24890.546491: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.546492: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.546493: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 24890.596491: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.596492: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.596494: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 24890.646497: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.646498: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.646500: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 24890.696467: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 24890.746548: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 24890.796479: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 24890.846467: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.846468: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] while regular activity seems to happen on other inodes/kworker threads kworker/u8:4-27691 [001] ...1 24895.811474: xfs_writepage: dev 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811477: xfs_invalidatepage: dev 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811478: xfs_releasepage: dev 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 0 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811482: xfs_writepage: dev 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811482: xfs_invalidatepage: dev 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 1000 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811483: xfs_releasepage: dev 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 0 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811485: xfs_writepage: dev 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811486: xfs_invalidatepage: dev 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811486: xfs_releasepage: dev 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 0 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.812381: xfs_writepage: dev 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.812382: xfs_invalidatepage: dev 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 1000 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.812382: xfs_releasepage: dev 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 0 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.812385: xfs_writepage: dev 253:10 ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.812385: xfs_invalidatepage: dev 253:10 ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 1000 delalloc 1 unwritten 0 looks like xfsaild is not able to take lock until hung-task timeout kicks in xfsaild/dm-10-3335 [003] ...2 25247.649468: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 25247.699478: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 25247.699516: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 25247.699517: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 25247.749471: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 25247.749478: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 25247.749479: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL Please let me know how to debug this further. Thanks. --Shyam -----Original Message----- From: Brian Foster [mailto:bfoster@redhat.com] Sent: 22 March 2016 17:49 To: Shyam Kaushik Cc: xfs@oss.sgi.com; Alex Lyakas Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery On Tue, Mar 22, 2016 at 04:51:39PM +0530, Shyam Kaushik wrote: > Hi XFS developers, > > We are seeing the following issue with XFS on kernel 3.18.19. > > We have XFS mounted over a raw disk. Disk was pulled out manually. There > were async writes on files that were errored like this > ... > > And XFS hit metadata & Log IO errors that it decides to shutdown: > > Mar 16 16:03:22 host0 kernel: [ 4637.351841] XFS (dm-29): metadata I/O > error: block 0x3a27fbd0 ("xlog_iodone") error 5 numblks 64 > Mar 16 16:03:22 host0 kernel: [ 4637.352820] XFS(dm-29): SHUTDOWN!!! > old_flags=0x0 new_flags=0x2 > Mar 16 16:03:22 host0 kernel: [ 4637.353187] XFS (dm-29): Log I/O Error > Detected. Shutting down filesystem ... > Later the drive was re-inserted back. After the drive was re-inserted, XFS > was attempted to be unmounted > > Mar 16 16:16:53 host0 controld: [2557] [ ] umount[202] > : umount(/sdisk/vol5b0, xfs) > > But nothing happens except for the 30-secs xfs_log_force errors that keeps > repeating > ... > > This problem doesn't happen consistently, but happens periodically with a > drive failure/recovery followed by XFS unmount. I couldn't find this issue > fixed in later kernels. Can you please suggest how I can debug this issue > further? > Similar problems have been reproduced due to racy/incorrect EFI/EFD object tracking, which are internal data structures associated with freeing extents. What happens if you enable tracepoints while the fs is in this hung unmount state? # trace-cmd start -e "xfs:*" # cat /sys/kernel/debug/tracing/trace_pipe Brian > Thanks! > > --Shyam > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Thu Mar 24 11:33:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D75BC7CA0 for ; Thu, 24 Mar 2016 11:33:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9BB698F8037 for ; Thu, 24 Mar 2016 09:33:51 -0700 (PDT) X-ASG-Debug-ID: 1458837228-04cbb05f3757410001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id QmV5l1FgdXUpXcwF for ; Thu, 24 Mar 2016 09:33:49 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (189.214.92.185.cable.dyn.cableonline.com.mx [189.214.92.185]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 150ED569 for ; Thu, 24 Mar 2016 11:33:47 -0500 (CDT) Subject: Re: [PATCH 02/19] mkfs: sanitise ftype parameter values. To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 02/19] mkfs: sanitise ftype parameter values. References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-3-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: <56F416E8.5000704@sandeen.net> Date: Thu, 24 Mar 2016 11:33:44 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.0 MIME-Version: 1.0 In-Reply-To: <1458818136-56043-3-git-send-email-jtulak@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1458837228 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28122 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > From: Dave Chinner > > Because passing "-n ftype=2" should fail. but passing crc=1 ftype=1 shouldn't fail, should it? Seems like it will here. -Eric > Signed-off-by: Dave Chinner > Signed-off-by: Jan Tulak > Reviewed-by: Brian Foster > --- > mkfs/xfs_mkfs.c | 10 +++++++++- > 1 file changed, 9 insertions(+), 1 deletion(-) > > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > index 36e5b4f..979a860 100644 > --- a/mkfs/xfs_mkfs.c > +++ b/mkfs/xfs_mkfs.c > @@ -1596,7 +1596,15 @@ main( > reqval('n', nopts, N_FTYPE); > if (nftype) > respec('n', nopts, N_FTYPE); > - dirftype = atoi(value); > + c = atoi(value); > + if (c < 0 || c > 1) > + illegal(value, "n ftype"); > + if (crcs_enabled) { > + fprintf(stderr, > +_("cannot specify both crc and ftype\n")); > + usage(); > + } > + dirftype = c; > nftype = 1; > break; > default: > From cmaiolino@redhat.com Thu Mar 24 11:52:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BD9757CA0 for ; Thu, 24 Mar 2016 11:52:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 654D2304053 for ; Thu, 24 Mar 2016 09:52:49 -0700 (PDT) X-ASG-Debug-ID: 1458838367-04bdf03cfa57370001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ChtSRyO7iFylbpGD (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 24 Mar 2016 09:52:47 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 3E6B5804EC for ; Thu, 24 Mar 2016 16:52:47 +0000 (UTC) Received: from redhat.com (dhcp-26-103.brq.redhat.com [10.34.26.103]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2OGqior011720 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 24 Mar 2016 12:52:46 -0400 Date: Thu, 24 Mar 2016 17:52:44 +0100 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Message-ID: <20160324165244.GA17555@redhat.com> X-ASG-Orig-Subj: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Mail-Followup-To: xfs@oss.sgi.com References: <20160322121922.GA53693@bfoster.bfoster> <6457b1d9de271ec6cca6bc2626aac161@mail.gmail.com> <20160322140345.GA54245@bfoster.bfoster> <0f3832c45509f444f55fda2aaf9c9deb@mail.gmail.com> <20160323123010.GA43073@bfoster.bfoster> <20160323153221.GA19456@redhat.com> <20160323223747.GX30721@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20160323223747.GX30721@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458838367 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 I can now reproduce it, or at least part of the problem. Regarding your question Dave, yes, it can be unmounted after I issue xfs_io shutdown command. But, if a umount is issued before that, then we can't find the mountpoint anymore. I'm not sure if I'm correct, but, what it looks like to me, as you already mentioned, is that we keep getting IO errors but we never actually shutdown the filesystem while doing async metadata writes. I believe I've found the problem. So, I will try to explain it, so you guys can review and let me know if I'm right or not I was looking the code, and for me, looks like async retries are designed to keep retrying forever, and rely on some other part of the filesystem to actually shutdown it. I tested this hypothesis trying to issue some other IO after the messages below starts to be logged with trace_xfs_buf_ioerror turned on, And before actually umount the filesystem. And yes, the filesystem has been shutdown after some extra IO (IO errors returned of course). But, if we try to unmount, we can't issue any other IO, since we loose the mountpoint. I apologize if my description is confusing, I'm not the best person organizing ideas, but, feel free to ask me any question. When I reproduce the problem, I can see these two messages being written to kernel: [ 59.914938] XFS (dm-0): metadata I/O error: block 0x0 ("xfs_buf_iodone_callbacks") error 5 numblks 1 [ 59.964831] XFS (dm-0): Failing async write on buffer block 0xffffffffffffffff. Retrying async write. Looking through the code, looks like inside xfs_buf_iodone_callbacks(), we expect the filesystem to be put down somewhere else, and then stop retrying: /* ¦* If we've already decided to shutdown the filesystem because of ¦* I/O errors, there's no point in giving this a retry. ¦*/ if (XFS_FORCED_SHUTDOWN(mp)) { And so, since we are in ASYNC writes here, we fall in: if (bp->b_flags & XBF_ASYNC) { Where, we will clear bp->b_error and set XBF_WRITE_FAIL flag in the buffer, and submit the buffer for IO. xfs_buf_ioerror(bp, 0); /* errno of 0 unsets the flag */ if (!(bp->b_flags & (XBF_STALE|XBF_WRITE_FAIL))) { bp->b_flags |= XBF_WRITE | XBF_ASYNC | ¦ XBF_DONE | XBF_WRITE_FAIL; xfs_buf_submit(bp); So the buffer flag is set with XBF_WRITE_FAIL and IO submitted. In xfs_buf_submit(): We clear the io_error, if any: bp->b_io_error = 0; Then, we send buffer for IO via _xfs_buf_ioapply(): atomic_set(&bp->b_io_remaining, 1); _xfs_buf_ioapply(bp); At _xfs_buf_ioapply, we clear buffer errors: bp->b_error = 0; Then call: xfs_buf_ioapply_map() Where we actually setup the bio and send it to block layer, where such status is captured by xfs_buf_bio_end_io() --- done, buffer has been sent for IO --- Now, inside xfs_buf_bio_end_io(): Since we receive an IO error here, we set bp->b_io_error: bp->b_io_error = bio->bi_error I did no reads here, so we skip until: if (atomic_dec_and_test(&bp->b_io_remaining) == 1) xfs_buf_ioend_async(bp); Workqueue starts to handle the IO completion where we call xfS_buf_ioend(): At xfs_buf_ioend(), we catch the I/O error here, and set bp->berror accordingly: If (!bp->b_error && bp->b_io_error) xfs_buf_ioerror(bp, bp->b_io_error); and we have one of the traces being logged: kworker/1:2-1294 [001] .... 11814.953710: xfs_buf_ioerror: dev 253:0 bno 0xffffffffffffffff len 0x200 hold 3 pincount 0 lock 0 error -5 flags ASYNC|DONE|PAGES caller xfs_buf_ioend_work Since it's an inode, we have iodone set to xfs_buf_iodone_callbacks() and call it here: if (bp->b_iodone) (*(bp->b_iodone))(bp); At xfs_buf_iodone_callbacks: bp->berror is set, so we do not skip until do_callbacks label. if (likely(!bp->b_error)) goto do_callbacks; we call xfs_buf_ioerror_alert() here, and then we have logged: [15063.857999] XFS (dm-0): metadata I/O error: block 0x0 ("xfs_buf_iodone_callbacks") error 5 numblks 1 So, we reach again: if (bp->b_flags & XBF_ASYNC) { and again, we clear the error here: xfs_buf_ioerror(bp, 0); Issuing this trace: kworker/1:2-1294 [001] .... 11814.953711: xfs_buf_ioerror: dev 253:0 bno 0xffffffffffffffff len 0x200 hold 3 pincount 0 lock 0 error 0 flags ASYNC|DONE|PAGES caller xfs_buf_iodone_callbacks and submit the buffer again, restarting the process. Looks like, somebody already noticed it: /* ¦* If the write was asynchronous then no one will be looking for the ¦* error. Clear the error state and write the buffer out again. ¦* ¦* XXX: This helps against transient write errors, but we need to find ¦* a way to shut the filesystem down if the writes keep failing. ¦* ¦* In practice we'll shut the filesystem down soon as non-transient ¦* errors tend to affect the whole device and a failing log write ¦* will make us give up. But we really ought to do better here. ¦*/ So, if I'm write in how we hit this problem, and IIRC, Dave's patchset for setting limits to IO errors can be slightly modified to fix this issue too, but, the problem is that the user must set it BEFORE he tries to unmount the filesystem, otherwise it will get stuck here. IMHO, we maybe need to fix it during the umount process, so, despite how the error handler is set (using Dave's patchset), or in the current situation (try forever), unmount process does not lockup because of this. I wrote a "hacky" patch to notify buf_iodone_callback that the filesystem was being unmounted, and stop retrying. I'm not sure if it's a good solution, but, I'll send the patch to at least log it in the mailing list and keep the discussion. Sorry for the long e-mail, hope it was at least useful :) Cheers On Thu, Mar 24, 2016 at 09:37:47AM +1100, Dave Chinner wrote: > On Wed, Mar 23, 2016 at 04:32:21PM +0100, Carlos Maiolino wrote: > > I'm still trying to get a reliable reproducer, at least exactly with what I have > > seen a few days ago. > > > > Shyam, could you try to reproduce it with a recent/upstream kernel? That would > > be great to make sure we have been seen the same issue. > > > > AFAICT, it happens in the following situation: > > > > 1 - Something is written to the filesystem > > 2 - log checkpoint is done for the previous write > > 3 - Disk failure > > 4 - XFS tries to writeback metadata logged in [2] > > > > When [4] happens, I can't trigger xfs_log_force messages all the time, most of > > time I just get an infinite loop in these messages: > > > > [12694.318109] XFS (dm-0): Failing async write on buffer block > > 0xffffffffffffffff. Retrying async write. > > > > Sometimes I can trigger the xfs_log_force() loop. > > This all smells like the filesystem is getting IO errors but it not > in a shutdown state. What happens when you run 'xfs_io -x -c > "shutdown" /mnt/pt' on a filesystem in this state? Can you then > unmount it? > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From cmaiolino@redhat.com Thu Mar 24 12:34:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 101F27CA0 for ; Thu, 24 Mar 2016 12:34:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D832C304059 for ; Thu, 24 Mar 2016 10:34:06 -0700 (PDT) X-ASG-Debug-ID: 1458840842-04cbb07ad701e50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Kbxx4Jp4DKRcItVB (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 24 Mar 2016 10:34:02 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id F38727F09C for ; Thu, 24 Mar 2016 17:34:01 +0000 (UTC) Received: from zion.usersys.redhat.com (dhcp-26-103.brq.redhat.com [10.34.26.103]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2OHY1EG015983 for ; Thu, 24 Mar 2016 13:34:01 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH] Stop retrying to submit buffer IOs in case of umount Date: Thu, 24 Mar 2016 18:33:56 +0100 X-ASG-Orig-Subj: [PATCH] Stop retrying to submit buffer IOs in case of umount Message-Id: <1458840836-19808-1-git-send-email-cmaiolino@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: 1458840842 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Currently xfs_buf_iodone_callbacks() keep retrying forever to submit a buffer IO, and rely on another part of the filesystem to shutdown it in case of an IO error. But, if before some other work happens, the filesystem is unmounted, it get stuck forever, retrying to submit buffer IOs, and the umount command will stuck in D state waiting for it. Also, no extra action from the user can be taken in this situation, since here, we already removed the mount entry from the namespace, so, not even xfs_io "shutdown" command can be used. To fix this, I created a flag to notify any other filesystem task, that it is being unmounted, so it can be used to stop retrying to submit buffer IOs to a failed device, in case of the filesystem is being umounted. I'm not sure if this is a good solution, or if it's more a hack, but I do believe we need to have some solution like this, otherwise the user can hit a lockup situation. And sending the patch might be a good start to discuss about a solution for this. Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_buf_item.c | 9 +++++++++ fs/xfs/xfs_mount.c | 3 +++ fs/xfs/xfs_mount.h | 2 ++ 3 files changed, 14 insertions(+) diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 99e91a0..5cd9c6c 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -1076,6 +1076,15 @@ xfs_buf_iodone_callbacks( time_after(jiffies, (lasttime + 5*HZ))) { lasttime = jiffies; xfs_buf_ioerror_alert(bp, __func__); + + /* + * If we have a metadata error, and user tried to unmount + * the filesystem, stop retrying to submit buffers forever + * and shutdown the filesystem here, instead of rely in + * another layer to do so. + */ + if (mp->m_flags & XFS_MOUNT_FS_UNMOUNT) + xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR); } lasttarg = bp->b_target; diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 536a0ee..5b740df 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -987,6 +987,9 @@ xfs_unmountfs( __uint64_t resblks; int error; + /* filesystem is being unmounted */ + mp->m_flags |= XFS_MOUNT_FS_UNMOUNT; + cancel_delayed_work_sync(&mp->m_eofblocks_work); xfs_qm_unmount_quotas(mp); diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index bac6b34..562e5fc 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -191,6 +191,8 @@ typedef struct xfs_mount { #define XFS_MOUNT_FILESTREAMS (1ULL << 24) /* enable the filestreams allocator */ #define XFS_MOUNT_NOATTR2 (1ULL << 25) /* disable use of attr2 format */ +#define XFS_MOUNT_FS_UNMOUNT (1ULL << 26) /* Notify filesystem is being + unmounted */ #define XFS_MOUNT_DAX (1ULL << 62) /* TEST ONLY! */ -- 2.4.3 From david@fromorbit.com Thu Mar 24 16:56:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A8F8E7CA0 for ; Thu, 24 Mar 2016 16:56:09 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6AA7C8F804B for ; Thu, 24 Mar 2016 14:56:09 -0700 (PDT) X-ASG-Debug-ID: 1458856564-04cbb07ad608c90001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id wK6MCttuWoPH10EB for ; Thu, 24 Mar 2016 14:56: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: A2DvCgCBYfRWPDGaLHldgzRTfaZVBowKg0mGIyGFZgQCAoE1TQEBAQEBAQcBAQEBQUBBEgGDbQEBAQMBMgEjKAsIAxgJJQ8FJQMHLYgfBw/BKgweGYU9hQyCW4Itgl+CKwWHXYcQiHGFcYgJjxVEjkaDEoFJKDABgkyHBwEBAQ Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail06.adl6.internode.on.net with ESMTP; 25 Mar 2016 08:26:03 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ajDEZ-0001SS-2e for xfs@oss.sgi.com; Fri, 25 Mar 2016 08:56:03 +1100 Date: Fri, 25 Mar 2016 08:56:03 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Message-ID: <20160324215603.GD11812@dastard> X-ASG-Orig-Subj: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery References: <20160322121922.GA53693@bfoster.bfoster> <6457b1d9de271ec6cca6bc2626aac161@mail.gmail.com> <20160322140345.GA54245@bfoster.bfoster> <0f3832c45509f444f55fda2aaf9c9deb@mail.gmail.com> <20160323123010.GA43073@bfoster.bfoster> <20160323153221.GA19456@redhat.com> <20160323223747.GX30721@dastard> <20160324165244.GA17555@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20160324165244.GA17555@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: 1458856564 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28137 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Mar 24, 2016 at 05:52:44PM +0100, Carlos Maiolino wrote: > I can now reproduce it, or at least part of the problem. > > Regarding your question Dave, yes, it can be unmounted after I issue xfs_io shutdown > command. But, if a umount is issued before that, then we can't find the > mountpoint anymore. > > I'm not sure if I'm correct, but, what it looks like to me, as you already > mentioned, is that we keep getting IO errors but we never actually shutdown > the filesystem while doing async metadata writes. *nod* > I believe I've found the problem. So, I will try to explain it, so you guys > can review and let me know if I'm right or not > > I was looking the code, and for me, looks like async retries are designed to > keep retrying forever, and rely on some other part of the filesystem to actually > shutdown it. *nod* [snip description of metadata IO error behaviour] Yes, that is exactly how the code is expected to behave - in fact, that's how it was originally designed to behave. > Looks like, somebody already noticed it: > > /* > ¦* If the write was asynchronous then no one will be looking for the > ¦* error. Clear the error state and write the buffer out again. > ¦* > ¦* XXX: This helps against transient write errors, but we need to find > ¦* a way to shut the filesystem down if the writes keep failing. > ¦* > ¦* In practice we'll shut the filesystem down soon as non-transient > ¦* errors tend to affect the whole device and a failing log write > ¦* will make us give up. But we really ought to do better here. > ¦*/ > > > So, if I'm write in how we hit this problem, and IIRC, Dave's patchset for > setting limits to IO errors can be slightly modified to fix this issue too, but, The patchset I have doesn't need modification to fix this issue - it has a patch specifically to address this, and it changes the default behaviour to "fail async writes at unmount": http://oss.sgi.com/archives/xfs/2015-08/msg00092.html > the problem is that the user must set it BEFORE he tries to unmount the > filesystem, otherwise it will get stuck here. Yes, but that doesn't answer the big question: why don't the periodic log forces that are failing with EIO cause a filesystem shutdown? We issue a log force every 30s even during unmount, and a failed log IO must cause the filesystem to shut down. So why aren't these causing the filesystem to shutdown as we'd expect when the device has been pulled? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Mar 24 16:59:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D67567CA0 for ; Thu, 24 Mar 2016 16:59:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9704E304051 for ; Thu, 24 Mar 2016 14:59:02 -0700 (PDT) X-ASG-Debug-ID: 1458856739-04cb6c246008790001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 83wyptkHoLaI6gXM for ; Thu, 24 Mar 2016 14:59:00 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AcCACxYvRWPDGaLHldgzSBUIZnn24GjAqJbIYHBAICgTVNAQEBAQEBBwEBAQFBQIRCAQEEOhwjEAgDDgoJJQ8FJQMHGhOIJsE5AQEBAQEFAQEBARwZhT2FDIQWg1GCKwWXXohjhRePFY8KhFsoMIgZgTsBAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail06.adl6.internode.on.net with ESMTP; 25 Mar 2016 08:28:59 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ajDHO-0001Su-No; Fri, 25 Mar 2016 08:58:58 +1100 Date: Fri, 25 Mar 2016 08:58:58 +1100 From: Dave Chinner To: Nikolay Borisov Cc: Brian Foster , xfs@oss.sgi.com Subject: Re: Failing XFS memory allocation Message-ID: <20160324215858.GE11812@dastard> X-ASG-Orig-Subj: Re: Failing XFS memory allocation References: <56F26CCE.6010502@kyup.com> <20160323124312.GB43073@bfoster.bfoster> <56F29279.70600@kyup.com> <20160323131059.GC43073@bfoster.bfoster> <20160323230002.GY30721@dastard> <56F3B157.2060505@kyup.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56F3B157.2060505@kyup.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: 1458856739 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28136 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Mar 24, 2016 at 11:20:23AM +0200, Nikolay Borisov wrote: > On 03/24/2016 01:00 AM, Dave Chinner wrote: > > As it is, yes, the memory allocation problem is with the in-core > > extent tree, and we've known about it for some time. The issue is > > that as memory gets fragmented, the top level indirection array > > grows too large to be allocated as a contiguous chunk. When this > > happens really depends on memory load, uptime and the way the extent > > tree is being modified. > > And what about the following completely crazy idea of switching order > > 3 allocations to using vmalloc? I know this would incur heavy > performance hit, but other than that would it cause correctness issues? > Of course I'm not saying this should be implemented in upstream rather > whether it's worth it having a go for experimenting with this idea. It's not an option as many supported platforms which have extremely limited vmalloc space. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Mar 24 17:00:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 79C1E7CA0 for ; Thu, 24 Mar 2016 17:00:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8F82DAC009 for ; Thu, 24 Mar 2016 15:00:25 -0700 (PDT) X-ASG-Debug-ID: 1458856822-04bdf05b7906d40001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 9gsuq5Fwzawnv8pz for ; Thu, 24 Mar 2016 15:00:22 -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: A2AcCACxYvRWPDGaLHldgzSBUIZnn24GjAqJbIYHBAICgTVNAQEBAQEBBwEBAQFBQIRCAQEEOhwjEAgDDgoJJQ8FJQMHGhOIJsE5AQEBAQYCAR0ZhT2FDIdngisFl16Neo8VjwqCZRmBXSgwiBkHgTQBAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail06.adl6.internode.on.net with ESMTP; 25 Mar 2016 08:30:21 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ajDIj-0001TX-FP; Fri, 25 Mar 2016 09:00:21 +1100 Date: Fri, 25 Mar 2016 09:00:21 +1100 From: Dave Chinner To: Christoph Hellwig Cc: Brian Foster , Nikolay Borisov , xfs@oss.sgi.com Subject: Re: Failing XFS memory allocation Message-ID: <20160324220021.GF11812@dastard> X-ASG-Orig-Subj: Re: Failing XFS memory allocation References: <56F26CCE.6010502@kyup.com> <20160323124312.GB43073@bfoster.bfoster> <56F29279.70600@kyup.com> <20160323131059.GC43073@bfoster.bfoster> <20160323230002.GY30721@dastard> <20160324093127.GA4204@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160324093127.GA4204@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: 1458856822 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28137 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Mar 24, 2016 at 02:31:27AM -0700, Christoph Hellwig wrote: > On Thu, Mar 24, 2016 at 10:00:02AM +1100, Dave Chinner wrote: > > I'm working on prototype patches to convert it to an in-memory btree > > but they are far from ready at this point. This isn't straight > > forward because all the extent management code assumes extents are > > kept in a linear array and can be directly indexed by array offset > > rather than file offset. I also want to make sure we can demand page > > the extent list if necessary, and that also complicates things like > > locking, as we currently assume the extent list is either completely > > in memory or not in memory at all. > > FYI, I did patches to get rid almost all direct extent array access > a while ago, but I never bothered to post it as it seemed to much > churn. Have you started that work yet or would it be useful > to dust those up again? I've done bits of it, but haven't completed it - send me the patches and I'll see which approch makes the most sense... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sarahamimore@gmail.com Thu Mar 24 17:34:49 2016 Return-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, 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 0CA6E7CA0 for ; Thu, 24 Mar 2016 17:34:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6E98BAC006 for ; Thu, 24 Mar 2016 15:34:45 -0700 (PDT) X-ASG-Debug-ID: 1458858882-04cb6c246409850001-NocioJ Received: from mail-qk0-f194.google.com (mail-qk0-f194.google.com [209.85.220.194]) by cuda.sgi.com with ESMTP id p0jdoMHmE6LQDACx (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 24 Mar 2016 15:34:43 -0700 (PDT) X-Barracuda-Envelope-From: sarahamimore@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.194 Received: by mail-qk0-f194.google.com with SMTP id q184so2628692qkb.0 for ; Thu, 24 Mar 2016 15:34:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:reply-to:date:message-id:subject:from:to; bh=A5ToT4WSyhO9SQ+njCaSeqV8SydGdGF7FrF11gpWLk4=; b=0B2wFyIOYTUX1nd99DYPjjopusZIo8WC0+Goy3NPlg88ZIdMB/qElqJNIV624R5e5R ctGmEfA9uOrbdiLPcQxqeptpVT8/ytG0v3YktiDpBvV+KQI4qt6clsxIFBvznV20y5kE ls5GK3qoJwKcEcnMIQhCbRoZWiKewfqtTNqx7kNxUlOhGY+ntaDfpyvHKd4eGQZYgHFz PhvSV0x/1TfH7rNwKoAE/QxaqlJQ90IDOc1tytMsd401KErLWr3aTwrBl/+ucnxJ2t6Q 7w1Gr5bhqIMrL5I8VUe1/Yb57Xfaf1UgevOvMnCL7LWFVacLTmCmhq75N3eP6VGvhp3Q S4ng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:reply-to:date:message-id:subject :from:to; bh=A5ToT4WSyhO9SQ+njCaSeqV8SydGdGF7FrF11gpWLk4=; b=g6EJOujWtLtpTeBkUdPgUU/Ijw6pE7OyDFy9Z6nwA3L5mA5iZUBcr1LbUOAJ9TV++x dkCg58b/d7+nKRKrHf1Pjj+hKh00o3LrmaqBlkSRf49Y6eNxjxBCwa2g5BaplNK39VRG 1bOJar0AWHyfT4qzdInfP66sme/brS3KTwExb3y290OlNcREHIJO2wvqgS+3zmED2Ztz SE/nChfQ1nLxq2PkoWeoE/AOaFs8lCiP6t55yRIth9/SnEnXWWp4j2VJaEtRmWaHUh+y c794OsDxF1mE1l7RCsKTi+QOfYP8eaFzgMa4L1dJvlweDScZR7iTnLAw9+LswbyuMC03 tLpg== X-Gm-Message-State: AD7BkJIQA6Nw4JBeAMAgSbBXchPnlQdGJotzfVXYdLdGUyKqmPvPa3jSqgNu21U0LzEMVkDlvofmVqTU+k382Q== MIME-Version: 1.0 X-Received: by 10.55.74.141 with SMTP id x135mr13628377qka.20.1458858882290; Thu, 24 Mar 2016 15:34:42 -0700 (PDT) Received: by 10.55.191.130 with HTTP; Thu, 24 Mar 2016 15:34:42 -0700 (PDT) Reply-To: polinacolee@yahoo.co.uk Date: Thu, 24 Mar 2016 22:34:42 +0000 Message-ID: Subject: hii From: Polina Cole X-ASG-Orig-Subj: hii To: undisclosed-recipients:; Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-qk0-f194.google.com[209.85.220.194] X-Barracuda-Start-Time: 1458858882 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.50 X-Barracuda-Spam-Status: No, SCORE=1.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_MJ1576, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28137 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 1.50 BSF_SC0_MJ1576 Custom Rule MJ1576 i am Polina Cole From UK, i get you through fb i need a good friendship my email, polinacolee@yahoo.co.uk, From vishal.l.verma@intel.com Thu Mar 24 18:17:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6CE3B7CA0 for ; Thu, 24 Mar 2016 18:17:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 413A8304051 for ; Thu, 24 Mar 2016 16:17:53 -0700 (PDT) X-ASG-Debug-ID: 1458861469-04cbb07ad60a3d0001-NocioJ Received: from mga11.intel.com ([192.55.52.93]) by cuda.sgi.com with ESMTP id 1OhGSG8PLWGKDOxs for ; Thu, 24 Mar 2016 16:17:49 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.93 X-ASG-Whitelist: Client Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga102.fm.intel.com with ESMTP; 24 Mar 2016 16:17:48 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,387,1455004800"; d="scan'208";a="944535546" Received: from omniknight.lm.intel.com ([10.232.112.171]) by fmsmga002.fm.intel.com with ESMTP; 24 Mar 2016 16:17:47 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Vishal Verma , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dan Williams , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton Subject: [PATCH 0/5] dax: handling of media errors Date: Thu, 24 Mar 2016 17:17:25 -0600 X-ASG-Orig-Subj: [PATCH 0/5] dax: handling of media errors Message-Id: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 X-Barracuda-Connect: UNKNOWN[192.55.52.93] X-Barracuda-Start-Time: 1458861469 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Until now, dax has been disabled if media errors were found on any device. This series attempts to address that. The first three patches from Dan re-enable dax even when media errors are present. The fourth patch from Matthew removes the zeroout path from dax entirely, making zeroout operations always go through the driver (The motivation is that if a backing device has media errors, and we create a sparse file on it, we don't want the initial zeroing to happen via dax, we want to give the block driver a chance to clear the errors). The fifth patch changes the behaviour of dax_do_io by adding a wrapper around it that is passed all the arguments also needed by __blockdev_do_direct_IO. If (the new) __dax_do_io fails with -EIO due to a bad block, we simply retry with the direct_IO path which forces the IO to go through the block driver, and can attempt to clear the error. Dan Williams (3): block, dax: pass blk_dax_ctl through to drivers dax: fallback from pmd to pte on error dax: enable dax in the presence of known media errors (badblocks) Vishal Verma (2): dax: use sb_issue_zerout instead of calling dax_clear_sectors dax: handle media errors in dax_do_io arch/powerpc/sysdev/axonram.c | 10 +++---- block/ioctl.c | 9 ------ drivers/block/brd.c | 9 +++--- drivers/nvdimm/pmem.c | 17 ++++++++--- drivers/s390/block/dcssblk.c | 12 ++++---- fs/block_dev.c | 7 +++-- fs/dax.c | 70 +++++++++++++++++++++---------------------- fs/ext2/inode.c | 12 ++++---- fs/ext4/indirect.c | 11 ++++--- fs/ext4/inode.c | 5 ++-- fs/xfs/xfs_aops.c | 7 +++-- fs/xfs/xfs_bmap_util.c | 9 ------ include/linux/blkdev.h | 3 +- include/linux/dax.h | 7 +++-- 14 files changed, 93 insertions(+), 95 deletions(-) -- 2.5.5 From vishal.l.verma@intel.com Thu Mar 24 18:17:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CC7237CA3 for ; Thu, 24 Mar 2016 18:17:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A0118304051 for ; Thu, 24 Mar 2016 16:17:55 -0700 (PDT) X-ASG-Debug-ID: 1458861469-04cbb07ad60a3d0002-NocioJ Received: from mga11.intel.com ([192.55.52.93]) by cuda.sgi.com with ESMTP id EeLyOKigRqy8aAZg for ; Thu, 24 Mar 2016 16:17:54 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.93 X-ASG-Whitelist: Client Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga102.fm.intel.com with ESMTP; 24 Mar 2016 16:17:53 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,387,1455004800"; d="scan'208";a="944535581" Received: from omniknight.lm.intel.com ([10.232.112.171]) by fmsmga002.fm.intel.com with ESMTP; 24 Mar 2016 16:17:53 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Dan Williams , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton Subject: [PATCH 1/5] block, dax: pass blk_dax_ctl through to drivers Date: Thu, 24 Mar 2016 17:17:26 -0600 X-ASG-Orig-Subj: [PATCH 1/5] block, dax: pass blk_dax_ctl through to drivers Message-Id: <1458861450-17705-2-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> References: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> X-Barracuda-Connect: UNKNOWN[192.55.52.93] X-Barracuda-Start-Time: 1458861472 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dan Williams From: Dan Williams This is in preparation for doing badblocks checking against the requested sector range in the driver. Currently we opportunistically return as much data that can be "dax'd" starting at the given sector. When errors are present we want to limit that range to the first encountered error, or fail the dax request if the range encompasses an error. Signed-off-by: Dan Williams --- arch/powerpc/sysdev/axonram.c | 10 +++++----- drivers/block/brd.c | 9 +++++---- drivers/nvdimm/pmem.c | 9 +++++---- drivers/s390/block/dcssblk.c | 12 ++++++------ fs/block_dev.c | 2 +- include/linux/blkdev.h | 3 +-- 6 files changed, 23 insertions(+), 22 deletions(-) diff --git a/arch/powerpc/sysdev/axonram.c b/arch/powerpc/sysdev/axonram.c index 0d112b9..d85673f 100644 --- a/arch/powerpc/sysdev/axonram.c +++ b/arch/powerpc/sysdev/axonram.c @@ -139,17 +139,17 @@ axon_ram_make_request(struct request_queue *queue, struct bio *bio) /** * axon_ram_direct_access - direct_access() method for block device - * @device, @sector, @data: see block_device_operations method + * @dax: see block_device_operations method */ static long -axon_ram_direct_access(struct block_device *device, sector_t sector, - void __pmem **kaddr, pfn_t *pfn) +axon_ram_direct_access(struct block_device *device, struct blk_dax_ctl *dax) { + sector_t sector = get_start_sect(device) + dax->sector; struct axon_ram_bank *bank = device->bd_disk->private_data; loff_t offset = (loff_t)sector << AXON_RAM_SECTOR_SHIFT; - *kaddr = (void __pmem __force *) bank->io_addr + offset; - *pfn = phys_to_pfn_t(bank->ph_addr + offset, PFN_DEV); + dax->addr = (void __pmem __force *) bank->io_addr + offset; + dax->pfn = phys_to_pfn_t(bank->ph_addr + offset, PFN_DEV); return bank->size - offset; } diff --git a/drivers/block/brd.c b/drivers/block/brd.c index cb27190..0b8bcfa 100644 --- a/drivers/block/brd.c +++ b/drivers/block/brd.c @@ -380,9 +380,10 @@ static int brd_rw_page(struct block_device *bdev, sector_t sector, } #ifdef CONFIG_BLK_DEV_RAM_DAX -static long brd_direct_access(struct block_device *bdev, sector_t sector, - void __pmem **kaddr, pfn_t *pfn) +static long brd_direct_access(struct block_device *bdev, + struct blk_dax_ctl *dax) { + sector_t sector = get_start_sect(bdev) + dax->sector; struct brd_device *brd = bdev->bd_disk->private_data; struct page *page; @@ -391,8 +392,8 @@ static long brd_direct_access(struct block_device *bdev, sector_t sector, page = brd_insert_page(brd, sector); if (!page) return -ENOSPC; - *kaddr = (void __pmem *)page_address(page); - *pfn = page_to_pfn_t(page); + dax->addr = (void __pmem *)page_address(page); + dax->pfn = page_to_pfn_t(page); return PAGE_SIZE; } diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c index ca5721c..da10554 100644 --- a/drivers/nvdimm/pmem.c +++ b/drivers/nvdimm/pmem.c @@ -167,14 +167,15 @@ static int pmem_rw_page(struct block_device *bdev, sector_t sector, return rc; } -static long pmem_direct_access(struct block_device *bdev, sector_t sector, - void __pmem **kaddr, pfn_t *pfn) +static long pmem_direct_access(struct block_device *bdev, + struct blk_dax_ctl *dax) { + sector_t sector = get_start_sect(bdev) + dax->sector; struct pmem_device *pmem = bdev->bd_disk->private_data; resource_size_t offset = sector * 512 + pmem->data_offset; - *kaddr = pmem->virt_addr + offset; - *pfn = phys_to_pfn_t(pmem->phys_addr + offset, pmem->pfn_flags); + dax->addr = pmem->virt_addr + offset; + dax->pfn = phys_to_pfn_t(pmem->phys_addr + offset, pmem->pfn_flags); return pmem->size - pmem->pfn_pad - offset; } diff --git a/drivers/s390/block/dcssblk.c b/drivers/s390/block/dcssblk.c index ce7b701..e5bda68 100644 --- a/drivers/s390/block/dcssblk.c +++ b/drivers/s390/block/dcssblk.c @@ -30,8 +30,8 @@ static int dcssblk_open(struct block_device *bdev, fmode_t mode); static void dcssblk_release(struct gendisk *disk, fmode_t mode); static blk_qc_t dcssblk_make_request(struct request_queue *q, struct bio *bio); -static long dcssblk_direct_access(struct block_device *bdev, sector_t secnum, - void __pmem **kaddr, pfn_t *pfn); +static long dcssblk_direct_access(struct block_device *bdev, + struct blk_dax_ctl *dax) static char dcssblk_segments[DCSSBLK_PARM_LEN] = "\0"; @@ -883,9 +883,9 @@ fail: } static long -dcssblk_direct_access (struct block_device *bdev, sector_t secnum, - void __pmem **kaddr, pfn_t *pfn) +dcssblk_direct_access(struct block_device *bdev, struct blk_dax_ctl *dax) { + sector_t secnum = get_start_sect(bdev) + dax->sector; struct dcssblk_dev_info *dev_info; unsigned long offset, dev_sz; @@ -894,8 +894,8 @@ dcssblk_direct_access (struct block_device *bdev, sector_t secnum, return -ENODEV; dev_sz = dev_info->end - dev_info->start; offset = secnum * 512; - *kaddr = (void __pmem *) (dev_info->start + offset); - *pfn = __pfn_to_pfn_t(PFN_DOWN(dev_info->start + offset), PFN_DEV); + dax->addr = (void __pmem *) (dev_info->start + offset); + dax->pfn = __pfn_to_pfn_t(PFN_DOWN(dev_info->start + offset), PFN_DEV); return dev_sz - offset; } diff --git a/fs/block_dev.c b/fs/block_dev.c index 826b164..9c0765b 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -488,7 +488,7 @@ long bdev_direct_access(struct block_device *bdev, struct blk_dax_ctl *dax) sector += get_start_sect(bdev); if (sector % (PAGE_SIZE / 512)) return -EINVAL; - avail = ops->direct_access(bdev, sector, &dax->addr, &dax->pfn); + avail = ops->direct_access(bdev, dax); if (!avail) return -ERANGE; if (avail > 0 && avail & ~PAGE_MASK) diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 413c84f..f8c65b8 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -1653,8 +1653,7 @@ struct block_device_operations { int (*rw_page)(struct block_device *, sector_t, struct page *, int rw); int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); - long (*direct_access)(struct block_device *, sector_t, void __pmem **, - pfn_t *); + long (*direct_access)(struct block_device *, struct blk_dax_ctl *dax); unsigned int (*check_events) (struct gendisk *disk, unsigned int clearing); /* ->media_changed() is DEPRECATED, use ->check_events() instead */ -- 2.5.5 From vishal.l.verma@intel.com Thu Mar 24 18:18:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 241E47CAF for ; Thu, 24 Mar 2016 18:18:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E80C48F8049 for ; Thu, 24 Mar 2016 16:17:57 -0700 (PDT) X-ASG-Debug-ID: 1458861469-04cbb07ad60a3d0003-NocioJ Received: from mga11.intel.com ([192.55.52.93]) by cuda.sgi.com with ESMTP id w1APIkDVJ9YNYqGI for ; Thu, 24 Mar 2016 16:17:56 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.93 X-ASG-Whitelist: Client Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga102.fm.intel.com with ESMTP; 24 Mar 2016 16:17:56 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,387,1455004800"; d="scan'208";a="944535609" Received: from omniknight.lm.intel.com ([10.232.112.171]) by fmsmga002.fm.intel.com with ESMTP; 24 Mar 2016 16:17:56 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Dan Williams , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton Subject: [PATCH 2/5] dax: fallback from pmd to pte on error Date: Thu, 24 Mar 2016 17:17:27 -0600 X-ASG-Orig-Subj: [PATCH 2/5] dax: fallback from pmd to pte on error Message-Id: <1458861450-17705-3-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> References: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> X-Barracuda-Connect: UNKNOWN[192.55.52.93] X-Barracuda-Start-Time: 1458861475 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dan Williams From: Dan Williams In preparation for consulting a badblocks list in pmem_direct_access(), teach dax_pmd_fault() to fallback rather than fail immediately upon encountering an error. The thought being that reducing the span of the dax request may avoid the error region. Signed-off-by: Dan Williams --- fs/dax.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/dax.c b/fs/dax.c index bbb2ad7..bb7e9f8 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -940,8 +940,8 @@ int __dax_pmd_fault(struct vm_area_struct *vma, unsigned long address, long length = dax_map_atomic(bdev, &dax); if (length < 0) { - result = VM_FAULT_SIGBUS; - goto out; + dax_pmd_dbg(&bh, address, "dax-error fallback"); + goto fallback; } if (length < PMD_SIZE) { dax_pmd_dbg(&bh, address, "dax-length too small"); -- 2.5.5 From vishal.l.verma@intel.com Thu Mar 24 18:18:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3941D7CB1 for ; Thu, 24 Mar 2016 18:18:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A6BADAC006 for ; Thu, 24 Mar 2016 16:18:00 -0700 (PDT) X-ASG-Debug-ID: 1458861469-04cbb07ad60a3d0004-NocioJ Received: from mga11.intel.com ([192.55.52.93]) by cuda.sgi.com with ESMTP id PICH8R85sAX6EABg for ; Thu, 24 Mar 2016 16:17:59 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.93 X-ASG-Whitelist: Client Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga102.fm.intel.com with ESMTP; 24 Mar 2016 16:17:59 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,387,1455004800"; d="scan'208";a="944535623" Received: from omniknight.lm.intel.com ([10.232.112.171]) by fmsmga002.fm.intel.com with ESMTP; 24 Mar 2016 16:17:58 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Dan Williams , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton Subject: [PATCH 3/5] dax: enable dax in the presence of known media errors (badblocks) Date: Thu, 24 Mar 2016 17:17:28 -0600 X-ASG-Orig-Subj: [PATCH 3/5] dax: enable dax in the presence of known media errors (badblocks) Message-Id: <1458861450-17705-4-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> References: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> X-Barracuda-Connect: UNKNOWN[192.55.52.93] X-Barracuda-Start-Time: 1458861477 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dan Williams From: Dan Williams 1/ If a mapping overlaps a bad sector fail the request. 2/ Do not opportunistically report more dax-capable capacity than is requested when errors present. [vishal: fix a conflict with system RAM collision patches] Signed-off-by: Dan Williams --- block/ioctl.c | 9 --------- drivers/nvdimm/pmem.c | 8 ++++++++ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/block/ioctl.c b/block/ioctl.c index d8996bb..cd7f392 100644 --- a/block/ioctl.c +++ b/block/ioctl.c @@ -423,15 +423,6 @@ bool blkdev_dax_capable(struct block_device *bdev) || (bdev->bd_part->nr_sects % (PAGE_SIZE / 512))) return false; - /* - * If the device has known bad blocks, force all I/O through the - * driver / page cache. - * - * TODO: support finer grained dax error handling - */ - if (disk->bb && disk->bb->count) - return false; - return true; } #endif diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c index da10554..eac5f93 100644 --- a/drivers/nvdimm/pmem.c +++ b/drivers/nvdimm/pmem.c @@ -174,9 +174,17 @@ static long pmem_direct_access(struct block_device *bdev, struct pmem_device *pmem = bdev->bd_disk->private_data; resource_size_t offset = sector * 512 + pmem->data_offset; + if (unlikely(is_bad_pmem(&pmem->bb, sector, dax->size))) + return -EIO; dax->addr = pmem->virt_addr + offset; dax->pfn = phys_to_pfn_t(pmem->phys_addr + offset, pmem->pfn_flags); + /* + * If badblocks are present, limit known good range to the + * requested range. + */ + if (unlikely(pmem->bb.count)) + return dax->size; return pmem->size - pmem->pfn_pad - offset; } -- 2.5.5 From vishal.l.verma@intel.com Thu Mar 24 18:18:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DB25B7CB7 for ; Thu, 24 Mar 2016 18:18:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 45436AC006 for ; Thu, 24 Mar 2016 16:18:05 -0700 (PDT) X-ASG-Debug-ID: 1458861469-04cbb07ad60a3d0005-NocioJ Received: from mga11.intel.com ([192.55.52.93]) by cuda.sgi.com with ESMTP id WOx5IO4DRZkvH6Eh for ; Thu, 24 Mar 2016 16:18:03 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.93 X-ASG-Whitelist: Client Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga102.fm.intel.com with ESMTP; 24 Mar 2016 16:18:03 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,387,1455004800"; d="scan'208";a="944535658" Received: from omniknight.lm.intel.com ([10.232.112.171]) by fmsmga002.fm.intel.com with ESMTP; 24 Mar 2016 16:18:00 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Vishal Verma , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dan Williams , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton Subject: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors Date: Thu, 24 Mar 2016 17:17:29 -0600 X-ASG-Orig-Subj: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors Message-Id: <1458861450-17705-5-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> References: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> X-Barracuda-Connect: UNKNOWN[192.55.52.93] X-Barracuda-Start-Time: 1458861479 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Matthew Wilcox dax_clear_sectors() cannot handle poisoned blocks. These must be zeroed using the BIO interface instead. Convert ext2 and XFS to use only sb_issue_zerout(). Signed-off-by: Matthew Wilcox [vishal: Also remove the dax_clear_sectors function entirely] Signed-off-by: Vishal Verma --- fs/dax.c | 32 -------------------------------- fs/ext2/inode.c | 7 +++---- fs/xfs/xfs_bmap_util.c | 9 --------- include/linux/dax.h | 1 - 4 files changed, 3 insertions(+), 46 deletions(-) diff --git a/fs/dax.c b/fs/dax.c index bb7e9f8..a30481e 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -78,38 +78,6 @@ struct page *read_dax_sector(struct block_device *bdev, sector_t n) return page; } -/* - * dax_clear_sectors() is called from within transaction context from XFS, - * and hence this means the stack from this point must follow GFP_NOFS - * semantics for all operations. - */ -int dax_clear_sectors(struct block_device *bdev, sector_t _sector, long _size) -{ - struct blk_dax_ctl dax = { - .sector = _sector, - .size = _size, - }; - - might_sleep(); - do { - long count, sz; - - count = dax_map_atomic(bdev, &dax); - if (count < 0) - return count; - sz = min_t(long, count, SZ_128K); - clear_pmem(dax.addr, sz); - dax.size -= sz; - dax.sector += sz / 512; - dax_unmap_atomic(bdev, &dax); - cond_resched(); - } while (dax.size); - - wmb_pmem(); - return 0; -} -EXPORT_SYMBOL_GPL(dax_clear_sectors); - /* the clear_pmem() calls are ordered by a wmb_pmem() in the caller */ static void dax_new_buf(void __pmem *addr, unsigned size, unsigned first, loff_t pos, loff_t end) diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index 6bd58e6..824f249 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -737,10 +738,8 @@ static int ext2_get_blocks(struct inode *inode, * so that it's not found by another thread before it's * initialised */ - err = dax_clear_sectors(inode->i_sb->s_bdev, - le32_to_cpu(chain[depth-1].key) << - (inode->i_blkbits - 9), - 1 << inode->i_blkbits); + err = sb_issue_zeroout(inode->i_sb, + le32_to_cpu(chain[depth-1].key), 1, GFP_NOFS); if (err) { mutex_unlock(&ei->truncate_mutex); goto cleanup; diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 6c87601..23a759a 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -72,16 +72,7 @@ xfs_zero_extent( struct xfs_mount *mp = ip->i_mount; xfs_daddr_t sector = xfs_fsb_to_db(ip, start_fsb); sector_t block = XFS_BB_TO_FSBT(mp, sector); - ssize_t size = XFS_FSB_TO_B(mp, count_fsb); - if (IS_DAX(VFS_I(ip))) - return dax_clear_sectors(xfs_find_bdev_for_inode(VFS_I(ip)), - sector, size); - - /* - * let the block layer decide on the fastest method of - * implementing the zeroing. - */ return sb_issue_zeroout(mp->m_super, block, count_fsb, GFP_NOFS); } diff --git a/include/linux/dax.h b/include/linux/dax.h index 636dd59..933198a 100644 --- a/include/linux/dax.h +++ b/include/linux/dax.h @@ -7,7 +7,6 @@ ssize_t dax_do_io(struct kiocb *, struct inode *, struct iov_iter *, loff_t, get_block_t, dio_iodone_t, int flags); -int dax_clear_sectors(struct block_device *bdev, sector_t _sector, long _size); int dax_zero_page_range(struct inode *, loff_t from, unsigned len, get_block_t); int dax_truncate_page(struct inode *, loff_t from, get_block_t); int dax_fault(struct vm_area_struct *, struct vm_fault *, get_block_t, -- 2.5.5 From vishal.l.verma@intel.com Thu Mar 24 18:18:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 705067CBB for ; Thu, 24 Mar 2016 18:18:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 340D08F8049 for ; Thu, 24 Mar 2016 16:18:07 -0700 (PDT) X-ASG-Debug-ID: 1458861469-04cbb07ad60a3d0006-NocioJ Received: from mga11.intel.com ([192.55.52.93]) by cuda.sgi.com with ESMTP id HtYULdXb6rASVdYd for ; Thu, 24 Mar 2016 16:18:06 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.93 X-ASG-Whitelist: Client Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga102.fm.intel.com with ESMTP; 24 Mar 2016 16:18:06 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,387,1455004800"; d="scan'208";a="944535754" Received: from omniknight.lm.intel.com ([10.232.112.171]) by fmsmga002.fm.intel.com with ESMTP; 24 Mar 2016 16:18:06 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Vishal Verma , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dan Williams , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton Subject: [PATCH 5/5] dax: handle media errors in dax_do_io Date: Thu, 24 Mar 2016 17:17:30 -0600 X-ASG-Orig-Subj: [PATCH 5/5] dax: handle media errors in dax_do_io Message-Id: <1458861450-17705-6-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> References: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> X-Barracuda-Connect: UNKNOWN[192.55.52.93] X-Barracuda-Start-Time: 1458861484 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 dax_do_io (called for read() or write() for a dax file system) may fail in the presence of bad blocks or media errors. Since we expect that a write should clear media errors on nvdimms, make dax_do_io fall back to the direct_IO path, which will send down a bio to the driver, which can then attempt to clear the error. Cc: Matthew Wilcox Cc: Dan Williams Cc: Ross Zwisler Cc: Dave Chinner Cc: Jan Kara Cc: Jens Axboe Cc: Al Viro Signed-off-by: Vishal Verma --- fs/block_dev.c | 5 +++-- fs/dax.c | 34 ++++++++++++++++++++++++++++++++-- fs/ext2/inode.c | 5 +++-- fs/ext4/indirect.c | 11 +++++++---- fs/ext4/inode.c | 5 +++-- fs/xfs/xfs_aops.c | 7 ++++--- include/linux/dax.h | 6 +++++- 7 files changed, 57 insertions(+), 16 deletions(-) diff --git a/fs/block_dev.c b/fs/block_dev.c index 9c0765b..f3873ab 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -168,8 +168,9 @@ blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) struct inode *inode = bdev_file_inode(file); if (IS_DAX(inode)) - return dax_do_io(iocb, inode, iter, offset, blkdev_get_block, - NULL, DIO_SKIP_DIO_COUNT); + return dax_do_io(iocb, inode, I_BDEV(inode), iter, offset, + blkdev_get_block, blkdev_get_block, + NULL, NULL, DIO_SKIP_DIO_COUNT); return __blockdev_direct_IO(iocb, inode, I_BDEV(inode), iter, offset, blkdev_get_block, NULL, NULL, DIO_SKIP_DIO_COUNT); diff --git a/fs/dax.c b/fs/dax.c index a30481e..b90c8e9 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -208,7 +208,7 @@ static ssize_t dax_io(struct inode *inode, struct iov_iter *iter, } /** - * dax_do_io - Perform I/O to a DAX file + * __dax_do_io - Perform I/O to a DAX file * @iocb: The control block for this I/O * @inode: The file which the I/O is directed at * @iter: The addresses to do I/O from or to @@ -224,7 +224,7 @@ static ssize_t dax_io(struct inode *inode, struct iov_iter *iter, * As with do_blockdev_direct_IO(), we increment i_dio_count while the I/O * is in progress. */ -ssize_t dax_do_io(struct kiocb *iocb, struct inode *inode, +ssize_t __dax_do_io(struct kiocb *iocb, struct inode *inode, struct iov_iter *iter, loff_t pos, get_block_t get_block, dio_iodone_t end_io, int flags) { @@ -262,8 +262,38 @@ ssize_t dax_do_io(struct kiocb *iocb, struct inode *inode, out: return retval; } +EXPORT_SYMBOL_GPL(__dax_do_io); + +/* + * This is a library function for use by file systems. It will perform a + * fallback to direct_io semantics if the dax_io fails due to a media error. + */ +ssize_t dax_do_io(struct kiocb *iocb, struct inode *inode, + struct block_device *bdev, struct iov_iter *iter, loff_t pos, + get_block_t dax_get_block, get_block_t dio_get_block, + dio_iodone_t end_io, dio_submit_t submit_io, int flags) +{ + ssize_t retval; + + retval = __dax_do_io(iocb, inode, iter, pos, dax_get_block, end_io, + flags); + if (iov_iter_rw(iter) == WRITE && retval == -EIO) { + /* + * __dax_do_io may have failed a write due to a bad block. + * Retry with direct_io, and if the direct_IO also fails, + * return -EIO as that was the original error that led us + * down the direct_IO path. + */ + retval = __blockdev_direct_IO(iocb, inode, bdev, iter, pos, + dio_get_block, end_io, submit_io, flags); + if (retval < 0) + return -EIO; + } + return retval; +} EXPORT_SYMBOL_GPL(dax_do_io); + /* * The user has performed a load from a hole in the file. Allocating * a new page in the file would cause excessive storage usage for diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index 824f249..8a307cf 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c @@ -862,8 +862,9 @@ ext2_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) ssize_t ret; if (IS_DAX(inode)) - ret = dax_do_io(iocb, inode, iter, offset, ext2_get_block, NULL, - DIO_LOCKING); + ret = dax_do_io(iocb, inode, inode->i_sb->s_bdev, iter, + offset, ext2_get_block, ext2_get_block, + NULL, NULL, DIO_LOCKING | DIO_SKIP_HOLES); else ret = blockdev_direct_IO(iocb, inode, iter, offset, ext2_get_block); diff --git a/fs/ext4/indirect.c b/fs/ext4/indirect.c index 355ef9c..4b087b7 100644 --- a/fs/ext4/indirect.c +++ b/fs/ext4/indirect.c @@ -692,8 +692,9 @@ retry: goto locked; } if (IS_DAX(inode)) - ret = dax_do_io(iocb, inode, iter, offset, - ext4_get_block, NULL, 0); + ret = dax_do_io(iocb, inode, inode->i_sb->s_bdev, iter, + offset, ext4_get_block, ext4_get_block, + NULL, NULL, 0); else ret = __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev, iter, @@ -703,8 +704,10 @@ retry: } else { locked: if (IS_DAX(inode)) - ret = dax_do_io(iocb, inode, iter, offset, - ext4_get_block, NULL, DIO_LOCKING); + ret = dax_do_io(iocb, inode, inode->i_sb->s_bdev, iter, + offset, ext4_get_block, ext4_get_block, + NULL, NULL, DIO_LOCKING | + DIO_SKIP_HOLES); else ret = blockdev_direct_IO(iocb, inode, iter, offset, ext4_get_block); diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index aee960b..4220dac 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -3315,8 +3315,9 @@ static ssize_t ext4_ext_direct_IO(struct kiocb *iocb, struct iov_iter *iter, BUG_ON(ext4_encrypted_inode(inode) && S_ISREG(inode->i_mode)); #endif if (IS_DAX(inode)) - ret = dax_do_io(iocb, inode, iter, offset, get_block_func, - ext4_end_io_dio, dio_flags); + ret = dax_do_io(iocb, inode, inode->i_sb->s_bdev, iter, offset, + get_block_func, get_block_func, + ext4_end_io_dio, NULL, dio_flags); else ret = __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev, iter, offset, diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index a9ebabfe..dc4e088 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -1682,11 +1682,12 @@ xfs_vm_do_dio( void *private), int flags) { - struct block_device *bdev; + struct block_device *bdev = xfs_find_bdev_for_inode(inode); if (IS_DAX(inode)) - return dax_do_io(iocb, inode, iter, offset, - xfs_get_blocks_direct, endio, 0); + return dax_do_io(iocb, inode, bdev, iter, offset, + xfs_get_blocks_direct, xfs_get_blocks_direct, + endio, NULL, flags); bdev = xfs_find_bdev_for_inode(inode); return __blockdev_direct_IO(iocb, inode, bdev, iter, offset, diff --git a/include/linux/dax.h b/include/linux/dax.h index 933198a..6981076 100644 --- a/include/linux/dax.h +++ b/include/linux/dax.h @@ -5,8 +5,12 @@ #include #include -ssize_t dax_do_io(struct kiocb *, struct inode *, struct iov_iter *, loff_t, +ssize_t __dax_do_io(struct kiocb *, struct inode *, struct iov_iter *, loff_t, get_block_t, dio_iodone_t, int flags); +ssize_t dax_do_io(struct kiocb *iocb, struct inode *inode, + struct block_device *bdev, struct iov_iter *iter, loff_t pos, + get_block_t dax_get_block, get_block_t dio_get_block, + dio_iodone_t end_io, dio_submit_t submit_io, int flags); int dax_zero_page_range(struct inode *, loff_t from, unsigned len, get_block_t); int dax_truncate_page(struct inode *, loff_t from, get_block_t); int dax_fault(struct vm_area_struct *, struct vm_fault *, get_block_t, -- 2.5.5 From vishal.l.verma@intel.com Thu Mar 24 18:23:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id ADA767CA1 for ; Thu, 24 Mar 2016 18:23:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5F46D304051 for ; Thu, 24 Mar 2016 16:23:35 -0700 (PDT) X-ASG-Debug-ID: 1458861814-04bdf05b7908cf0001-NocioJ Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by cuda.sgi.com with ESMTP id nrBDkLBoQ8YBumaQ for ; Thu, 24 Mar 2016 16:23:34 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Apparent-Source-IP: 134.134.136.65 X-ASG-Whitelist: Client Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga103.jf.intel.com with ESMTP; 24 Mar 2016 16:23:28 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,387,1455004800"; d="scan'208";a="918325543" Received: from fmsmsx106.amr.corp.intel.com ([10.18.124.204]) by orsmga001.jf.intel.com with ESMTP; 24 Mar 2016 16:23:27 -0700 Received: from fmsmsx158.amr.corp.intel.com (10.18.116.75) by FMSMSX106.amr.corp.intel.com (10.18.124.204) with Microsoft SMTP Server (TLS) id 14.3.248.2; Thu, 24 Mar 2016 16:23:27 -0700 Received: from fmsmsx113.amr.corp.intel.com ([169.254.13.211]) by fmsmsx158.amr.corp.intel.com ([169.254.15.243]) with mapi id 14.03.0248.002; Thu, 24 Mar 2016 16:23:26 -0700 From: "Verma, Vishal L" To: "linux-nvdimm@lists.01.org" CC: "Wilcox, Matthew R" , "linux-block@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "axboe@fb.com" , "akpm@linux-foundation.org" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , "david@fromorbit.com" , "jack@suse.cz" Subject: Re: [PATCH 3/5] dax: enable dax in the presence of known media errors (badblocks) Thread-Topic: [PATCH 3/5] dax: enable dax in the presence of known media errors (badblocks) X-ASG-Orig-Subj: Re: [PATCH 3/5] dax: enable dax in the presence of known media errors (badblocks) Thread-Index: AQHRhiNsMTjAiaMC8kykxVi2MStO+p9psWWA Date: Thu, 24 Mar 2016 23:23:26 +0000 Message-ID: <1458861805.7619.1.camel@intel.com> References: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> <1458861450-17705-4-git-send-email-vishal.l.verma@intel.com> In-Reply-To: <1458861450-17705-4-git-send-email-vishal.l.verma@intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.254.185.158] Content-Type: text/plain; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-Barracuda-Connect: mga03.intel.com[134.134.136.65] X-Barracuda-Start-Time: 1458861814 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 T24gVGh1LCAyMDE2LTAzLTI0IGF0IDE3OjE3IC0wNjAwLCBWaXNoYWwgVmVybWEgd3JvdGU6DQo+ IEZyb206IERhbiBXaWxsaWFtcyA8ZGFuLmoud2lsbGlhbXNAaW50ZWwuY29tPg0KPiANCj4gRnJv bTogRGFuIFdpbGxpYW1zIDxkYW4uai53aWxsaWFtc0BpbnRlbC5jb20+DQoNCkVlcCwgbm90IHN1 cmUgaG93IHRoaXMgaGFwcGVuZWQsIGxvb2tlZCBhbHJpZ2h0IGluIHRoZSBwYXRjaGVzIQ== From BATV+0bfc248439ae23c05d1f+4597+infradead.org+hch@bombadil.srs.infradead.org Fri Mar 25 05:44:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5D40D7CA0 for ; Fri, 25 Mar 2016 05:44:26 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 224B1304032 for ; Fri, 25 Mar 2016 03:44:23 -0700 (PDT) X-ASG-Debug-ID: 1458902659-04cb6c24621af00001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id BHEkGdDLwAxvNMBS (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 25 Mar 2016 03:44:20 -0700 (PDT) X-Barracuda-Envelope-From: BATV+0bfc248439ae23c05d1f+4597+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 1ajPE2-0002om-1k; Fri, 25 Mar 2016 10:44:18 +0000 Date: Fri, 25 Mar 2016 03:44:18 -0700 From: Christoph Hellwig To: Vishal Verma Cc: linux-nvdimm@ml01.01.org, linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dan Williams , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton Subject: Re: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors Message-ID: <20160325104418.GA10525@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors References: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> <1458861450-17705-5-git-send-email-vishal.l.verma@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1458861450-17705-5-git-send-email-vishal.l.verma@intel.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458902660 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28151 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Mar 24, 2016 at 05:17:29PM -0600, Vishal Verma wrote: > @@ -72,16 +72,7 @@ xfs_zero_extent( > struct xfs_mount *mp = ip->i_mount; > xfs_daddr_t sector = xfs_fsb_to_db(ip, start_fsb); > sector_t block = XFS_BB_TO_FSBT(mp, sector); > - ssize_t size = XFS_FSB_TO_B(mp, count_fsb); > > - if (IS_DAX(VFS_I(ip))) > - return dax_clear_sectors(xfs_find_bdev_for_inode(VFS_I(ip)), > - sector, size); > - > - /* > - * let the block layer decide on the fastest method of > - * implementing the zeroing. > - */ > return sb_issue_zeroout(mp->m_super, block, count_fsb, GFP_NOFS); While not new: using sb_issue_zeroout in XFS is wrong as it doesn't account for the RT device. We need the xfs_find_bdev_for_inode and call blkdev_issue_zeroout directly with the bdev it returned. From BATV+0bfc248439ae23c05d1f+4597+infradead.org+hch@bombadil.srs.infradead.org Fri Mar 25 05:45:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 213C17CA0 for ; Fri, 25 Mar 2016 05:45:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8A93CAC001 for ; Fri, 25 Mar 2016 03:45:55 -0700 (PDT) X-ASG-Debug-ID: 1458902749-04cbb07ad51a710001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id XJwy19JvWK9zXQXw (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 25 Mar 2016 03:45:50 -0700 (PDT) X-Barracuda-Envelope-From: BATV+0bfc248439ae23c05d1f+4597+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 1ajPFV-0004Co-5L; Fri, 25 Mar 2016 10:45:49 +0000 Date: Fri, 25 Mar 2016 03:45:49 -0700 From: Christoph Hellwig To: Vishal Verma Cc: linux-nvdimm@ml01.01.org, linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dan Williams , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton Subject: Re: [PATCH 5/5] dax: handle media errors in dax_do_io Message-ID: <20160325104549.GB10525@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 5/5] dax: handle media errors in dax_do_io References: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> <1458861450-17705-6-git-send-email-vishal.l.verma@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1458861450-17705-6-git-send-email-vishal.l.verma@intel.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458902750 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28151 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Mar 24, 2016 at 05:17:30PM -0600, Vishal Verma wrote: > dax_do_io (called for read() or write() for a dax file system) may fail > in the presence of bad blocks or media errors. Since we expect that a > write should clear media errors on nvdimms, make dax_do_io fall back to > the direct_IO path, which will send down a bio to the driver, which can > then attempt to clear the error. Leave the fallback on -EIO to the callers please. They generally call __blockdev_direct_IO anyway, so it should actually become simpler that way. From guaneryu@gmail.com Fri Mar 25 13:05:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 C80A77CA0 for ; Fri, 25 Mar 2016 13:05:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3B566AC002 for ; Fri, 25 Mar 2016 11:05:16 -0700 (PDT) X-ASG-Debug-ID: 1458929109-04cb6c246030470001-NocioJ Received: from mail-pf0-f177.google.com (mail-pf0-f177.google.com [209.85.192.177]) by cuda.sgi.com with ESMTP id XNF8zfRVHaSAqDfF (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 25 Mar 2016 11:05:09 -0700 (PDT) X-Barracuda-Envelope-From: guaneryu@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.177 Received: by mail-pf0-f177.google.com with SMTP id x3so87267626pfb.1 for ; Fri, 25 Mar 2016 11:05:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=nlSYnorceA+QVuRlEBSqH75DPRLkphwi14gGrCuOl/Y=; b=ohZQHIWbXXpZ3odYp1ckr6Eeat/Y/LeQUg+OUbG1vPhwtot2fRj24meep4w2jkdyA+ t/pE4w24sIPw93DqvHgZri8p3K3P//ZIm3MvGNONdDqhpCjnc52AbBaR60Chv9JMxaxE qx8kZdsTDMxpZyq44PZXAX2t/So19PP0qTof9csf1ZOF8N2geS3DjyOC7IXvQejA2daO lo54kwOWamZRCG5fe8ytQl/QXlvUOZQhtpx9oLLD4ILP9lfGJR3yZIBqrvcOZ/koYZO3 3aBoCLmg0UQlh+URc0wR45pQuU+nuzG/plUvH7vZK9Yw0uKpgF4h+GfMoXGymF1SzXdJ 696g== 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; bh=nlSYnorceA+QVuRlEBSqH75DPRLkphwi14gGrCuOl/Y=; b=PgYxtzCtKqIvm/5R8l0P9gRpccF5ElBPSD+xnrhDY+ikan+WuYOZWw777qZuGRccR0 DB/hNRKt4raa92235kSXE2R+aK8ANuZg/2HivBxeY3PiWh9eG37TtKN61o8LBT5a17rP tkWZMUzF49QsrFD0UMteQZjo1VAGOG6PLDrOWUhDhLUc/LNTnuSwHf8h6uF3PV8LHTTP GjGXoS4n6LEju/99o+av19QUcTuzezbUaGODkF8UMGAKi945n66wgH566vV13lRoqXUU CO3xy1mwPw95XXQbQUQn8Fx92Sixr6o6f1u+zhaFTJe/d8NClfMVKbH1mpl4sSviMYDA poeg== X-Gm-Message-State: AD7BkJKr2ndXMxP/IQhIfno+Buo81VyeGamNAVnQwLqyprh2H7wMbHCQVNtY9RJeM72znw== X-Received: by 10.98.75.214 with SMTP id d83mr22889274pfj.22.1458929108969; Fri, 25 Mar 2016 11:05:08 -0700 (PDT) Received: from localhost ([128.199.137.77]) by smtp.gmail.com with ESMTPSA id 9sm17832436pft.44.2016.03.25.11.05.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 25 Mar 2016 11:05:08 -0700 (PDT) From: Eryu Guan X-Barracuda-Apparent-Source-IP: 128.199.137.77 X-Barracuda-BBL-IP: 128.199.137.77 To: xfs@oss.sgi.com Cc: Eryu Guan Subject: [PATCH] xfs: mute some sparse warnings Date: Sat, 26 Mar 2016 02:04:02 +0800 X-ASG-Orig-Subj: [PATCH] xfs: mute some sparse warnings Message-Id: <1458929042-23991-1-git-send-email-guaneryu@gmail.com> X-Mailer: git-send-email 2.5.5 X-Barracuda-Connect: mail-pf0-f177.google.com[209.85.192.177] X-Barracuda-Start-Time: 1458929109 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28161 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 These three warnings are fixed: fs/xfs/xfs_inode.c:1033:44: warning: Using plain integer as NULL pointer fs/xfs/xfs_inode_item.c:525:20: warning: context imbalance in 'xfs_inode_item_push' - unexpected unlock fs/xfs/xfs_dquot.c:696:1: warning: symbol 'xfs_dq_get_next_id' was not declared. Should it be static? Signed-off-by: Eryu Guan --- fs/xfs/xfs_dquot.c | 2 +- fs/xfs/xfs_inode.c | 2 +- fs/xfs/xfs_inode_item.c | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index 316b2a1..8f51370 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -692,7 +692,7 @@ error0: * end of the chunk, skip ahead to first id in next allocated chunk * using the SEEK_DATA interface. */ -int +static int xfs_dq_get_next_id( xfs_mount_t *mp, uint type, diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 96f606d..1445a99 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1030,7 +1030,7 @@ xfs_dir_ialloc( tp->t_flags &= ~(XFS_TRANS_DQ_DIRTY); } - code = xfs_trans_roll(&tp, 0); + code = xfs_trans_roll(&tp, NULL); if (committed != NULL) *committed = 1; diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index c48b5b1..e91c1e6 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -478,7 +478,8 @@ xfs_inode_item_unpin( STATIC uint xfs_inode_item_push( struct xfs_log_item *lip, - struct list_head *buffer_list) + struct list_head *buffer_list) __releases(&lip->li_ailp->xa_lock) + __acquires(&lip->li_ailp->xa_lock) { struct xfs_inode_log_item *iip = INODE_ITEM(lip); struct xfs_inode *ip = iip->ili_inode; -- 2.5.5 From BATV+0bfc248439ae23c05d1f+4597+infradead.org+hch@bombadil.srs.infradead.org Fri Mar 25 13:07:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B4AF37CA0 for ; Fri, 25 Mar 2016 13:07:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 87F1E304064 for ; Fri, 25 Mar 2016 11:07:26 -0700 (PDT) X-ASG-Debug-ID: 1458929239-04cbb07ad630d60001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id FDmSuvVXHc6pAv9F (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 25 Mar 2016 11:07:20 -0700 (PDT) X-Barracuda-Envelope-From: BATV+0bfc248439ae23c05d1f+4597+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 1ajW8l-0001Fv-GA; Fri, 25 Mar 2016 18:07:19 +0000 Date: Fri, 25 Mar 2016 11:07:19 -0700 From: Christoph Hellwig To: Eryu Guan Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: mute some sparse warnings Message-ID: <20160325180719.GA4500@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: mute some sparse warnings References: <1458929042-23991-1-git-send-email-guaneryu@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1458929042-23991-1-git-send-email-guaneryu@gmail.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1458929240 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28161 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > @@ -478,7 +478,8 @@ xfs_inode_item_unpin( > STATIC uint > xfs_inode_item_push( > struct xfs_log_item *lip, > - struct list_head *buffer_list) > + struct list_head *buffer_list) __releases(&lip->li_ailp->xa_lock) > + __acquires(&lip->li_ailp->xa_lock) Can you move these down a bit? Something like: struct list_head *buffer_list) __releases(&lip->li_ailp->xa_lock) __acquires(&lip->li_ailp->xa_lock) { ? Otherwise looks fine, Reviewed-by: Christoph Hellwig From dan.j.williams@intel.com Fri Mar 25 13:47:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 C9C6C7CA0 for ; Fri, 25 Mar 2016 13:47:29 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4D1CAAC002 for ; Fri, 25 Mar 2016 11:47:29 -0700 (PDT) X-ASG-Debug-ID: 1458931646-04bdf05b7c30890001-NocioJ Received: from mail-oi0-f43.google.com (mail-oi0-f43.google.com [209.85.218.43]) by cuda.sgi.com with ESMTP id V9JtphRzHPYK9F9S (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 25 Mar 2016 11:47:27 -0700 (PDT) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Apparent-Source-IP: 209.85.218.43 Received: by mail-oi0-f43.google.com with SMTP id d205so105620973oia.0 for ; Fri, 25 Mar 2016 11:47:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=vUZ1MMUHVfRqchKN8xxIqKfDMbZZN3IEX7A91jJwqOE=; b=XVV1uaQQ8PuS3BWAHIK0Od98V+5lQUHtDf0fEvESULM1tRGxPuJr4PemBgrbek27qs h3EyX/TEffkKEHnsqheA5+G36evFmvhT+f0Soob4wW84o0VZb9s+KBM7PCfpMJMRvotr /+7HUzBcTB3U25EOTnpA/wI7QsQINGyIrOcJ5tdAJWN9IhUtw4/dvZtK2zNz8a9nV1VX JdBFgmDhDMHmGEfyBgdiVYG9Eg03nRexrpnN/osUTY9nMxV3B7Q+K1HZ/DCG9CAnOykL lXlPwllj9dPHP+Y66oHTsdnDqa6BZ18hBC/V5/i5CvGg44eS1z6E2giBFVCKgqaaKUIB vDKA== 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; bh=vUZ1MMUHVfRqchKN8xxIqKfDMbZZN3IEX7A91jJwqOE=; b=Vhx2vnkN/QPaI7zY1jaFyXdD0wn2LB/If7c5cg/eXAXa/1LW4FQ+dtIlhDMf4utC41 C2cnsHHmA64T+VlxSJY8h0L6bFf3SZ6wg3w/32iWw3pSKBhKwjWhrYZYfqGEQvoqGhRR CDFKSsWduFB2ytcyHycCaLXhqh/UojxiSZjUUkgpziUhiWiuzKUibh4VK5EHRaNpbQI+ Y5aSaROgTXQeEUYqo1CebCHc3M5W1VpHvtaiWGQqok/Op+x3vuCkwwGfnREnpd6fIAy+ Jm+C93ofkeU74V8BpJCHIwVJZxHDK09wViYzZUTMuw9/7AiGtsHPZMbwxdTS3VSl3E2y Nb4w== X-Gm-Message-State: AD7BkJL7mYcRx1GebUTDetA4DpD6HqwlYgBlrHU2TjX1aBmm5qCLs0hCONrZzWcGXK9WdQa8yhF2/0afvkUWiGFN MIME-Version: 1.0 X-Received: by 10.202.212.147 with SMTP id l141mr7064459oig.58.1458931646614; Fri, 25 Mar 2016 11:47:26 -0700 (PDT) Received: by 10.157.62.230 with HTTP; Fri, 25 Mar 2016 11:47:26 -0700 (PDT) In-Reply-To: <1458861450-17705-5-git-send-email-vishal.l.verma@intel.com> References: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> <1458861450-17705-5-git-send-email-vishal.l.verma@intel.com> Date: Fri, 25 Mar 2016 11:47:26 -0700 Message-ID: Subject: Re: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors From: Dan Williams X-ASG-Orig-Subj: Re: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors To: Vishal Verma Cc: "linux-nvdimm@lists.01.org" , linux-fsdevel , linux-block@vger.kernel.org, XFS Developers , linux-ext4 , Linux MM , Matthew Wilcox , Ross Zwisler , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-oi0-f43.google.com[209.85.218.43] X-Barracuda-Start-Time: 1458931647 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/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, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28163 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain On Thu, Mar 24, 2016 at 4:17 PM, Vishal Verma wrote: > From: Matthew Wilcox > > dax_clear_sectors() cannot handle poisoned blocks. These must be > zeroed using the BIO interface instead. Convert ext2 and XFS to use > only sb_issue_zerout(). > > Signed-off-by: Matthew Wilcox > [vishal: Also remove the dax_clear_sectors function entirely] > Signed-off-by: Vishal Verma > --- > fs/dax.c | 32 -------------------------------- > fs/ext2/inode.c | 7 +++---- > fs/xfs/xfs_bmap_util.c | 9 --------- > include/linux/dax.h | 1 - > 4 files changed, 3 insertions(+), 46 deletions(-) > > diff --git a/fs/dax.c b/fs/dax.c > index bb7e9f8..a30481e 100644 > --- a/fs/dax.c > +++ b/fs/dax.c > @@ -78,38 +78,6 @@ struct page *read_dax_sector(struct block_device *bdev, sector_t n) > return page; > } > > -/* > - * dax_clear_sectors() is called from within transaction context from XFS, > - * and hence this means the stack from this point must follow GFP_NOFS > - * semantics for all operations. > - */ > -int dax_clear_sectors(struct block_device *bdev, sector_t _sector, long _size) > -{ > - struct blk_dax_ctl dax = { > - .sector = _sector, > - .size = _size, > - }; > - > - might_sleep(); > - do { > - long count, sz; > - > - count = dax_map_atomic(bdev, &dax); > - if (count < 0) > - return count; > - sz = min_t(long, count, SZ_128K); > - clear_pmem(dax.addr, sz); > - dax.size -= sz; > - dax.sector += sz / 512; > - dax_unmap_atomic(bdev, &dax); > - cond_resched(); > - } while (dax.size); > - > - wmb_pmem(); > - return 0; > -} > -EXPORT_SYMBOL_GPL(dax_clear_sectors); What about the other unwritten extent conversions in the dax path? Shouldn't those be converted to block-layer zero-outs as well? From vishal.l.verma@intel.com Fri Mar 25 15:59:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BC4337CA0 for ; Fri, 25 Mar 2016 15:59:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 72B1D8F8052 for ; Fri, 25 Mar 2016 13:59:36 -0700 (PDT) X-ASG-Debug-ID: 1458939572-04bdf05b7936910001-NocioJ Received: from mga11.intel.com ([192.55.52.93]) by cuda.sgi.com with ESMTP id 62c9J2FC6JqAG0oB for ; Fri, 25 Mar 2016 13:59:32 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.93 X-ASG-Whitelist: Client Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga102.fm.intel.com with ESMTP; 25 Mar 2016 13:59:32 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,392,1455004800"; d="scan'208";a="918894960" Received: from fmsmsx108.amr.corp.intel.com ([10.18.124.206]) by orsmga001.jf.intel.com with ESMTP; 25 Mar 2016 13:59:32 -0700 Received: from FMSMSX109.amr.corp.intel.com (10.18.116.9) by FMSMSX108.amr.corp.intel.com (10.18.124.206) with Microsoft SMTP Server (TLS) id 14.3.248.2; Fri, 25 Mar 2016 13:59:31 -0700 Received: from fmsmsx113.amr.corp.intel.com ([169.254.13.211]) by FMSMSX109.amr.corp.intel.com ([10.18.116.9]) with mapi id 14.03.0248.002; Fri, 25 Mar 2016 13:59:31 -0700 From: "Verma, Vishal L" To: "hch@infradead.org" CC: "linux-block@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-nvdimm@ml01.01.org" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "Williams, Dan J" , "axboe@fb.com" , "akpm@linux-foundation.org" , "linux-fsdevel@vger.kernel.org" , "ross.zwisler@linux.intel.com" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" , "david@fromorbit.com" , "jack@suse.cz" Subject: Re: [PATCH 5/5] dax: handle media errors in dax_do_io Thread-Topic: [PATCH 5/5] dax: handle media errors in dax_do_io X-ASG-Orig-Subj: Re: [PATCH 5/5] dax: handle media errors in dax_do_io Thread-Index: AQHRhiN0/rGWKKyzgEa+J4vXlVWLHp9qcA6AgACrcQA= Date: Fri, 25 Mar 2016 20:59:30 +0000 Message-ID: <1458939566.5501.5.camel@intel.com> References: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> <1458861450-17705-6-git-send-email-vishal.l.verma@intel.com> <20160325104549.GB10525@infradead.org> In-Reply-To: <20160325104549.GB10525@infradead.org> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.232.115.161] Content-Type: text/plain; charset="utf-8" Content-ID: <21B546D71D01A9489F096D2F38A6C68A@intel.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-Barracuda-Connect: UNKNOWN[192.55.52.93] X-Barracuda-Start-Time: 1458939572 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 T24gRnJpLCAyMDE2LTAzLTI1IGF0IDAzOjQ1IC0wNzAwLCBDaHJpc3RvcGggSGVsbHdpZyB3cm90 ZToNCj4gT24gVGh1LCBNYXIgMjQsIDIwMTYgYXQgMDU6MTc6MzBQTSAtMDYwMCwgVmlzaGFsIFZl cm1hIHdyb3RlOg0KPiA+IA0KPiA+IGRheF9kb19pbyAoY2FsbGVkIGZvciByZWFkKCkgb3Igd3Jp dGUoKSBmb3IgYSBkYXggZmlsZSBzeXN0ZW0pIG1heQ0KPiA+IGZhaWwNCj4gPiBpbiB0aGUgcHJl c2VuY2Ugb2YgYmFkIGJsb2NrcyBvciBtZWRpYSBlcnJvcnMuIFNpbmNlIHdlIGV4cGVjdCB0aGF0 DQo+ID4gYQ0KPiA+IHdyaXRlIHNob3VsZCBjbGVhciBtZWRpYSBlcnJvcnMgb24gbnZkaW1tcywg bWFrZSBkYXhfZG9faW8gZmFsbA0KPiA+IGJhY2sgdG8NCj4gPiB0aGUgZGlyZWN0X0lPIHBhdGgs IHdoaWNoIHdpbGwgc2VuZCBkb3duIGEgYmlvIHRvIHRoZSBkcml2ZXIsIHdoaWNoDQo+ID4gY2Fu DQo+ID4gdGhlbiBhdHRlbXB0IHRvIGNsZWFyIHRoZSBlcnJvci4NCj4gTGVhdmUgdGhlIGZhbGxi YWNrIG9uIC1FSU8gdG8gdGhlIGNhbGxlcnMgcGxlYXNlLsKgwqBUaGV5IGdlbmVyYWxseQ0KPiBj YWxsDQo+IF9fYmxvY2tkZXZfZGlyZWN0X0lPIGFueXdheSwgc28gaXQgc2hvdWxkIGFjdHVhbGx5 IGJlY29tZSBzaW1wbGVyDQo+IHRoYXQNCj4gd2F5Lg0KDQpJIHRob3VnaHQgb2YgdGhpcywgYnV0 IG1hZGUgdGhlIHJldHJ5aW5nIGhhcHBlbiBpbiB0aGUgd3JhcHBlciBzbyB0aGF0DQppdCBjYW4g YmUgY2VudHJhbGl6ZWQuIElmIHRoZSBjYWxsZXJzIHdlcmUgdG8gYmVjb21lIHJlc3BvbnNpYmxl IGZvcg0KdGhlIHJldHJ5LCB0aGVuIGFueSBuZXcgY2FsbGVycyBvZiBkYXhfZG9faW8gbWlnaHQg bm90IHJlYWxpemUgdGhleSBhcmUNCnJlc3BvbnNpYmxlIGZvciByZXRyeWluZywgYW5kIGhpdCBw cm9ibGVtcy4gQW5vdGhlciB0cmlja3kgcG9pbnQgbWlnaHQNCmJlOiBpbiB0aGUgd3JhcHBlciwg aWYgX19kYXhfZG9faW8gZmFpbGVkIHdpdGggLUVJTywgYW5kIHN1YnNlcXVlbnRseQ0KX19ibG9j a2Rldl9kaXJlY3RfSU8gYWxzbyBmYWlscyB3aXRoIGEgKmRpZmZlcmVudCogZXJyb3IsIEkgY2hv c2UgdG8NCnJldHVybiAtRUlPIGJlY2F1c2UgdGhhdCB3YXMgdGhlICdmaXJzdCcgZXJyb3Igd2Ug aGl0IGFuZCBjYXVzZWQgdXMgdG8NCmZhbGxiYWNrLi4gKERvZXMgdGhpcyBldmVuIHNlZW0gcmVh c29uYWJsZT8pIEFuZCBpZiBzbywgZG8gd2Ugd2FudCB0bw0KcHVzaCBiYWNrIHRoaXMgZGVjaXNp b24gdG9vLCB0byB0aGUgY2FsbGVycz8= From vishal.l.verma@intel.com Fri Mar 25 16:01:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3FE917CA0 for ; Fri, 25 Mar 2016 16:01:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id EB4748F8050 for ; Fri, 25 Mar 2016 14:01:37 -0700 (PDT) X-ASG-Debug-ID: 1458939697-04bdf05b7936a80001-NocioJ Received: from mga01.intel.com ([192.55.52.88]) by cuda.sgi.com with ESMTP id FSJwFEk7qXn3RBBZ for ; Fri, 25 Mar 2016 14:01:37 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.88 X-ASG-Whitelist: Client Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga101.fm.intel.com with ESMTP; 25 Mar 2016 14:01:19 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,392,1455004800"; d="scan'208";a="918896131" Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by orsmga001.jf.intel.com with ESMTP; 25 Mar 2016 14:01:16 -0700 Received: from fmsmsx153.amr.corp.intel.com (10.18.125.6) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.248.2; Fri, 25 Mar 2016 14:01:16 -0700 Received: from fmsmsx113.amr.corp.intel.com ([169.254.13.211]) by FMSMSX153.amr.corp.intel.com ([169.254.9.172]) with mapi id 14.03.0248.002; Fri, 25 Mar 2016 14:01:15 -0700 From: "Verma, Vishal L" To: "hch@infradead.org" CC: "linux-block@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-nvdimm@ml01.01.org" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "Williams, Dan J" , "axboe@fb.com" , "akpm@linux-foundation.org" , "linux-fsdevel@vger.kernel.org" , "ross.zwisler@linux.intel.com" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" , "david@fromorbit.com" , "jack@suse.cz" Subject: Re: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors Thread-Topic: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors X-ASG-Orig-Subj: Re: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors Thread-Index: AQHRhiNvKoQhiC/aYEiTGtqXM3Dgv59qb6IAgACsXAA= Date: Fri, 25 Mar 2016 21:01:15 +0000 Message-ID: <1458939672.5501.6.camel@intel.com> References: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> <1458861450-17705-5-git-send-email-vishal.l.verma@intel.com> <20160325104418.GA10525@infradead.org> In-Reply-To: <20160325104418.GA10525@infradead.org> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.232.115.161] Content-Type: text/plain; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-Barracuda-Connect: UNKNOWN[192.55.52.88] X-Barracuda-Start-Time: 1458939697 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 T24gRnJpLCAyMDE2LTAzLTI1IGF0IDAzOjQ0IC0wNzAwLCBDaHJpc3RvcGggSGVsbHdpZyB3cm90 ZToNCj4gT24gVGh1LCBNYXIgMjQsIDIwMTYgYXQgMDU6MTc6MjlQTSAtMDYwMCwgVmlzaGFsIFZl cm1hIHdyb3RlOg0KPiA+IA0KPiA+IEBAIC03MiwxNiArNzIsNyBAQCB4ZnNfemVyb19leHRlbnQo DQo+ID4gwqAJc3RydWN0IHhmc19tb3VudCAqbXAgPSBpcC0+aV9tb3VudDsNCj4gPiDCoAl4ZnNf ZGFkZHJfdAlzZWN0b3IgPSB4ZnNfZnNiX3RvX2RiKGlwLCBzdGFydF9mc2IpOw0KPiA+IMKgCXNl Y3Rvcl90CWJsb2NrID0gWEZTX0JCX1RPX0ZTQlQobXAsIHNlY3Rvcik7DQo+ID4gLQlzc2l6ZV90 CQlzaXplID0gWEZTX0ZTQl9UT19CKG1wLCBjb3VudF9mc2IpOw0KPiA+IMKgDQo+ID4gLQlpZiAo SVNfREFYKFZGU19JKGlwKSkpDQo+ID4gLQkJcmV0dXJuDQo+ID4gZGF4X2NsZWFyX3NlY3RvcnMo eGZzX2ZpbmRfYmRldl9mb3JfaW5vZGUoVkZTX0koaXApKSwNCj4gPiAtCQkJCXNlY3Rvciwgc2l6 ZSk7DQo+ID4gLQ0KPiA+IC0JLyoNCj4gPiAtCcKgKiBsZXQgdGhlIGJsb2NrIGxheWVyIGRlY2lk ZSBvbiB0aGUgZmFzdGVzdCBtZXRob2Qgb2YNCj4gPiAtCcKgKiBpbXBsZW1lbnRpbmcgdGhlIHpl cm9pbmcuDQo+ID4gLQnCoCovDQo+ID4gwqAJcmV0dXJuIHNiX2lzc3VlX3plcm9vdXQobXAtPm1f c3VwZXIsIGJsb2NrLCBjb3VudF9mc2IsDQo+ID4gR0ZQX05PRlMpOw0KPiBXaGlsZSBub3QgbmV3 OiB1c2luZyBzYl9pc3N1ZV96ZXJvb3V0IGluIFhGUyBpcyB3cm9uZyBhcyBpdCBkb2Vzbid0DQo+ IGFjY291bnQgZm9yIHRoZSBSVCBkZXZpY2UuwqDCoFdlIG5lZWQgdGhlIHhmc19maW5kX2JkZXZf Zm9yX2lub2RlIGFuZA0KPiBjYWxsIGJsa2Rldl9pc3N1ZV96ZXJvb3V0IGRpcmVjdGx5IHdpdGgg dGhlIGJkZXYgaXQgcmV0dXJuZWQuDQoNCk9rLCBJJ2xsIGZpeCBhbmQgc2VuZCBhIHYyLiBUaGFu a3MhDQo+IA== From vishal.l.verma@intel.com Fri Mar 25 16:03:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1F19B7CA0 for ; Fri, 25 Mar 2016 16:03:35 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E61F58F8050 for ; Fri, 25 Mar 2016 14:03:34 -0700 (PDT) X-ASG-Debug-ID: 1458939813-04cbb07ad5377d0001-NocioJ Received: from mga04.intel.com ([192.55.52.120]) by cuda.sgi.com with ESMTP id sIaOXcat2XJvWjhh for ; Fri, 25 Mar 2016 14:03:33 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.120 X-ASG-Whitelist: Client Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga104.fm.intel.com with ESMTP; 25 Mar 2016 14:03:21 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,392,1455004800"; d="scan'208";a="675690217" Received: from fmsmsx106.amr.corp.intel.com ([10.18.124.204]) by FMSMGA003.fm.intel.com with ESMTP; 25 Mar 2016 14:03:22 -0700 Received: from fmsmsx158.amr.corp.intel.com (10.18.116.75) by FMSMSX106.amr.corp.intel.com (10.18.124.204) with Microsoft SMTP Server (TLS) id 14.3.248.2; Fri, 25 Mar 2016 14:03:20 -0700 Received: from fmsmsx113.amr.corp.intel.com ([169.254.13.211]) by fmsmsx158.amr.corp.intel.com ([169.254.15.243]) with mapi id 14.03.0248.002; Fri, 25 Mar 2016 14:03:21 -0700 From: "Verma, Vishal L" To: "Williams, Dan J" CC: "linux-block@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "axboe@fb.com" , "akpm@linux-foundation.org" , "linux-nvdimm@lists.01.org" , "linux-fsdevel@vger.kernel.org" , "ross.zwisler@linux.intel.com" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" , "david@fromorbit.com" , "jack@suse.cz" Subject: Re: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors Thread-Topic: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors X-ASG-Orig-Subj: Re: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors Thread-Index: AQHRhiNvKoQhiC/aYEiTGtqXM3Dgv59q9p4AgAAl9AA= Date: Fri, 25 Mar 2016 21:03:19 +0000 Message-ID: <1458939796.5501.8.camel@intel.com> References: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> <1458861450-17705-5-git-send-email-vishal.l.verma@intel.com> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.232.115.161] Content-Type: text/plain; charset="utf-8" Content-ID: <908F3F139AEC484E8BF8AC328A859865@intel.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-Barracuda-Connect: UNKNOWN[192.55.52.120] X-Barracuda-Start-Time: 1458939813 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 T24gRnJpLCAyMDE2LTAzLTI1IGF0IDExOjQ3IC0wNzAwLCBEYW4gV2lsbGlhbXMgd3JvdGU6DQo+ IE9uIFRodSwgTWFyIDI0LCAyMDE2IGF0IDQ6MTcgUE0sIFZpc2hhbCBWZXJtYSA8dmlzaGFsLmwu dmVybWFAaW50ZWwuYw0KPiBvbT4gd3JvdGU6DQo+ID4gDQo+ID4gRnJvbTogTWF0dGhldyBXaWxj b3ggPG1hdHRoZXcuci53aWxjb3hAaW50ZWwuY29tPg0KPiA+IA0KPiA+IGRheF9jbGVhcl9zZWN0 b3JzKCkgY2Fubm90IGhhbmRsZSBwb2lzb25lZCBibG9ja3MuwqDCoFRoZXNlIG11c3QgYmUNCj4g PiB6ZXJvZWQgdXNpbmcgdGhlIEJJTyBpbnRlcmZhY2UgaW5zdGVhZC7CoMKgQ29udmVydCBleHQy IGFuZCBYRlMgdG8NCj4gPiB1c2UNCj4gPiBvbmx5IHNiX2lzc3VlX3plcm91dCgpLg0KPiA+IA0K PiA+IFNpZ25lZC1vZmYtYnk6IE1hdHRoZXcgV2lsY294IDxtYXR0aGV3LnIud2lsY294QGludGVs LmNvbT4NCj4gPiBbdmlzaGFsOiBBbHNvIHJlbW92ZSB0aGUgZGF4X2NsZWFyX3NlY3RvcnMgZnVu Y3Rpb24gZW50aXJlbHldDQo+ID4gU2lnbmVkLW9mZi1ieTogVmlzaGFsIFZlcm1hIDx2aXNoYWwu bC52ZXJtYUBpbnRlbC5jb20+DQo+ID4gLS0tDQo+ID4gwqBmcy9kYXguY8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHwgMzIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCj4g PiDCoGZzL2V4dDIvaW5vZGUuY8KgwqDCoMKgwqDCoMKgwqB8wqDCoDcgKysrLS0tLQ0KPiA+IMKg ZnMveGZzL3hmc19ibWFwX3V0aWwuYyB8wqDCoDkgLS0tLS0tLS0tDQo+ID4gwqBpbmNsdWRlL2xp bnV4L2RheC5owqDCoMKgwqB8wqDCoDEgLQ0KPiA+IMKgNCBmaWxlcyBjaGFuZ2VkLCAzIGluc2Vy dGlvbnMoKyksIDQ2IGRlbGV0aW9ucygtKQ0KPiA+IA0KPiA+IGRpZmYgLS1naXQgYS9mcy9kYXgu YyBiL2ZzL2RheC5jDQo+ID4gaW5kZXggYmI3ZTlmOC4uYTMwNDgxZSAxMDA2NDQNCj4gPiAtLS0g YS9mcy9kYXguYw0KPiA+ICsrKyBiL2ZzL2RheC5jDQo+ID4gQEAgLTc4LDM4ICs3OCw2IEBAIHN0 cnVjdCBwYWdlICpyZWFkX2RheF9zZWN0b3Ioc3RydWN0IGJsb2NrX2RldmljZQ0KPiA+ICpiZGV2 LCBzZWN0b3JfdCBuKQ0KPiA+IMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gcGFnZTsNCj4gPiDCoH0N Cj4gPiANCj4gPiAtLyoNCj4gPiAtICogZGF4X2NsZWFyX3NlY3RvcnMoKSBpcyBjYWxsZWQgZnJv bSB3aXRoaW4gdHJhbnNhY3Rpb24gY29udGV4dA0KPiA+IGZyb20gWEZTLA0KPiA+IC0gKiBhbmQg aGVuY2UgdGhpcyBtZWFucyB0aGUgc3RhY2sgZnJvbSB0aGlzIHBvaW50IG11c3QgZm9sbG93DQo+ ID4gR0ZQX05PRlMNCj4gPiAtICogc2VtYW50aWNzIGZvciBhbGwgb3BlcmF0aW9ucy4NCj4gPiAt ICovDQo+ID4gLWludCBkYXhfY2xlYXJfc2VjdG9ycyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2 LCBzZWN0b3JfdCBfc2VjdG9yLA0KPiA+IGxvbmcgX3NpemUpDQo+ID4gLXsNCj4gPiAtwqDCoMKg wqDCoMKgwqBzdHJ1Y3QgYmxrX2RheF9jdGwgZGF4ID0gew0KPiA+IC3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAuc2VjdG9yID0gX3NlY3RvciwNCj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgLnNpemUgPSBfc2l6ZSwNCj4gPiAtwqDCoMKgwqDCoMKgwqB9Ow0KPiA+IC0N Cj4gPiAtwqDCoMKgwqDCoMKgwqBtaWdodF9zbGVlcCgpOw0KPiA+IC3CoMKgwqDCoMKgwqDCoGRv IHsNCj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbG9uZyBjb3VudCwgc3o7DQo+ ID4gLQ0KPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjb3VudCA9IGRheF9tYXBf YXRvbWljKGJkZXYsICZkYXgpOw0KPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBp ZiAoY291bnQgPCAwKQ0KPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgcmV0dXJuIGNvdW50Ow0KPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBzeiA9IG1pbl90KGxvbmcsIGNvdW50LCBTWl8xMjhLKTsNCj4gPiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgY2xlYXJfcG1lbShkYXguYWRkciwgc3opOw0KPiA+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBkYXguc2l6ZSAtPSBzejsNCj4gPiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgZGF4LnNlY3RvciArPSBzeiAvIDUxMjsNCj4gPiAtwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgZGF4X3VubWFwX2F0b21pYyhiZGV2LCAmZGF4KTsNCj4gPiAtwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY29uZF9yZXNjaGVkKCk7DQo+ID4gLcKgwqDCoMKg wqDCoMKgfSB3aGlsZSAoZGF4LnNpemUpOw0KPiA+IC0NCj4gPiAtwqDCoMKgwqDCoMKgwqB3bWJf cG1lbSgpOw0KPiA+IC3CoMKgwqDCoMKgwqDCoHJldHVybiAwOw0KPiA+IC19DQo+ID4gLUVYUE9S VF9TWU1CT0xfR1BMKGRheF9jbGVhcl9zZWN0b3JzKTsNCj4gV2hhdCBhYm91dCB0aGUgb3RoZXIg dW53cml0dGVuIGV4dGVudCBjb252ZXJzaW9ucyBpbiB0aGUgZGF4IHBhdGg/DQo+IFNob3VsZG4n dCB0aG9zZSBiZSBjb252ZXJ0ZWQgdG8gYmxvY2stbGF5ZXIgemVyby1vdXRzIGFzIHdlbGw/DQoN CkNvdWxkIHlvdSBwb2ludCBtZSB0byB3aGVyZSB0aGVzZSBtaWdodCBiZT8gSSB0aG91Z2h0IG9u Y2Ugd2UndmUNCmNvbnZlcnRlZCBhbGwgdGhlIHplcm9vdXQgdHlwZSBjYWxsZXJzIChieSByZW1v dmluZyBkYXhfY2xlYXJfc2VjdG9ycyksDQphbmQgZml4ZWQgdXAgZGF4X2RvX2lvIHRvIHRyeSBh IGRyaXZlciBmYWxsYmFjaywgd2UndmUgaGFuZGxlZCBhbGwgdGhlDQptZWRpYSBlcnJvciBjYXNl cyBpbiBkYXguLg== From dan.j.williams@intel.com Fri Mar 25 16:20:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 A25757CA0 for ; Fri, 25 Mar 2016 16:20:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1A180AC001 for ; Fri, 25 Mar 2016 14:20:42 -0700 (PDT) X-ASG-Debug-ID: 1458940840-04cbb07ad537f70001-NocioJ Received: from mail-ob0-f173.google.com (mail-ob0-f173.google.com [209.85.214.173]) by cuda.sgi.com with ESMTP id QUcAltEVeX7fsi4D (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 25 Mar 2016 14:20:40 -0700 (PDT) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Apparent-Source-IP: 209.85.214.173 Received: by mail-ob0-f173.google.com with SMTP id m7so64598355obh.3 for ; Fri, 25 Mar 2016 14:20:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=EExCQm1J3LSspzr3hRdrRdW0PHIvfydNMwcrvUXBNhc=; b=rroQrN/JIBcfTBgWFn+MgjUbCILdD5n21uNS5zZxNp6ouuEwE4Br90RE28V5B93bKN knlFGQKk2RtxX5YiJUGWb/h4pJh8raXyZDZdF5KQpXSZMml0LZRlTvBGOUgKGtOcoQEx tgIZK6FJt8fsVzHv/6hPjlYO+SXaMC9fXSrtYMSlxsLCmyjUZ7GZ19C5eEbq7mMPuEEx 8rlPfXj8F4jpFupT6vKP37nXPTplvbqr37sk9ndklc2BNlyHi8bDZHP4WwO/paZDo2Wh wSyZIrBG388800wM7DLtG72HvulxsDS2C9QYinZmLWWRW8xfgkvi5iM+c+i6sp9fPSRd u9qw== 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; bh=EExCQm1J3LSspzr3hRdrRdW0PHIvfydNMwcrvUXBNhc=; b=DTEsMesxJQzsntmio5hvvyJm3ABstkFT8tD5/wPibIcjXAVt+s9ua8gJV+kqPHEcQm DwKP4VKB7KvagdlCdqxOCE3W5imXdCVa9UGvJmTndV/kKm5fQtDFD49vTqpSvhp6Uh0M o6tsfqk222BpyW3lltU3z/gBihB9Dx0XSCKiU56yc9t0Cb3P08NeGyM+wVnDgav89KYc I7Dm5kFeqeL1/EEVJKtZ8mOdMq50pTA0laE46/SDNC9AP4GBbR8b47YYKr0UrzPKjxoq yaAoADOZ28di8ROvw9mVaGgx6ZdAZoYbVDHZmGtXxektwZNg2vRp2YtyXoOXTzvi2WRu H+dQ== X-Gm-Message-State: AD7BkJIHYZcjDSaTYODsUrH4lIYMitMZVx8t7W/Et0aiA/ji50PUx/NihcGTZ695MZyU2Y8ALtn7DWWGC+ipRgsB MIME-Version: 1.0 X-Received: by 10.60.140.168 with SMTP id rh8mr7991868oeb.9.1458940839840; Fri, 25 Mar 2016 14:20:39 -0700 (PDT) Received: by 10.157.62.230 with HTTP; Fri, 25 Mar 2016 14:20:39 -0700 (PDT) In-Reply-To: <1458939796.5501.8.camel@intel.com> References: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> <1458861450-17705-5-git-send-email-vishal.l.verma@intel.com> <1458939796.5501.8.camel@intel.com> Date: Fri, 25 Mar 2016 14:20:39 -0700 Message-ID: Subject: Re: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors From: Dan Williams X-ASG-Orig-Subj: Re: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors To: "Verma, Vishal L" Cc: "linux-block@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "axboe@fb.com" , "akpm@linux-foundation.org" , "linux-nvdimm@lists.01.org" , "linux-fsdevel@vger.kernel.org" , "ross.zwisler@linux.intel.com" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" , "david@fromorbit.com" , "jack@suse.cz" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ob0-f173.google.com[209.85.214.173] X-Barracuda-Start-Time: 1458940840 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/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, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28168 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain On Fri, Mar 25, 2016 at 2:03 PM, Verma, Vishal L wrote: > On Fri, 2016-03-25 at 11:47 -0700, Dan Williams wrote: >> On Thu, Mar 24, 2016 at 4:17 PM, Vishal Verma > om> wrote: >> > >> > From: Matthew Wilcox >> > >> > dax_clear_sectors() cannot handle poisoned blocks. These must be >> > zeroed using the BIO interface instead. Convert ext2 and XFS to >> > use >> > only sb_issue_zerout(). >> > >> > Signed-off-by: Matthew Wilcox >> > [vishal: Also remove the dax_clear_sectors function entirely] >> > Signed-off-by: Vishal Verma >> > --- >> > fs/dax.c | 32 -------------------------------- >> > fs/ext2/inode.c | 7 +++---- >> > fs/xfs/xfs_bmap_util.c | 9 --------- >> > include/linux/dax.h | 1 - >> > 4 files changed, 3 insertions(+), 46 deletions(-) >> > >> > diff --git a/fs/dax.c b/fs/dax.c >> > index bb7e9f8..a30481e 100644 >> > --- a/fs/dax.c >> > +++ b/fs/dax.c >> > @@ -78,38 +78,6 @@ struct page *read_dax_sector(struct block_device >> > *bdev, sector_t n) >> > return page; >> > } >> > >> > -/* >> > - * dax_clear_sectors() is called from within transaction context >> > from XFS, >> > - * and hence this means the stack from this point must follow >> > GFP_NOFS >> > - * semantics for all operations. >> > - */ >> > -int dax_clear_sectors(struct block_device *bdev, sector_t _sector, >> > long _size) >> > -{ >> > - struct blk_dax_ctl dax = { >> > - .sector = _sector, >> > - .size = _size, >> > - }; >> > - >> > - might_sleep(); >> > - do { >> > - long count, sz; >> > - >> > - count = dax_map_atomic(bdev, &dax); >> > - if (count < 0) >> > - return count; >> > - sz = min_t(long, count, SZ_128K); >> > - clear_pmem(dax.addr, sz); >> > - dax.size -= sz; >> > - dax.sector += sz / 512; >> > - dax_unmap_atomic(bdev, &dax); >> > - cond_resched(); >> > - } while (dax.size); >> > - >> > - wmb_pmem(); >> > - return 0; >> > -} >> > -EXPORT_SYMBOL_GPL(dax_clear_sectors); >> What about the other unwritten extent conversions in the dax path? >> Shouldn't those be converted to block-layer zero-outs as well? > > Could you point me to where these might be? I thought once we've > converted all the zeroout type callers (by removing dax_clear_sectors), > and fixed up dax_do_io to try a driver fallback, we've handled all the > media error cases in dax.. grep for usages of clear_pmem()... which I was hoping to eliminate after this change to push zeroing down to the driver. From dan.j.williams@intel.com Fri Mar 25 16:42:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 DF28A7CA0 for ; Fri, 25 Mar 2016 16: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 719D0AC002 for ; Fri, 25 Mar 2016 14:42:40 -0700 (PDT) X-ASG-Debug-ID: 1458942157-04bdf05b7c37d00001-NocioJ Received: from mail-ob0-f181.google.com (mail-ob0-f181.google.com [209.85.214.181]) by cuda.sgi.com with ESMTP id 7PeU5TJUbVNnigod (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 25 Mar 2016 14:42:38 -0700 (PDT) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Apparent-Source-IP: 209.85.214.181 Received: by mail-ob0-f181.google.com with SMTP id fp4so65090164obb.2 for ; Fri, 25 Mar 2016 14:42:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=f+qCR48v8uxXBb929iAb8VEY3jH0LGoc7EJ1WWZrQhI=; b=ZG+DlJN6SKjo/LRQxOyQ+5x3k5NmtHWBjBbBLiSZDM1sb+b0szUwmp0Wu3SRg0CcWY DRKQ7/FSFZ5Xf52U5XgbCnV+x25HoATdqeA+1mLxxx+OyZ+heB3xyX9kSREWk+y14LEI 2xUBRdaFIEJEQQHfBKQX0M8rdlxwle/TNhAs3334qYiTOjJwxxv6TzTpgDkjweYVo8z8 fbm6kZP/v/PLyBUT4A1mKhah0EJQY9vGfej4OLbXXOCAAse/8VxqYPm7RiZjDmWL1hHP zGRU7VaDKgZZT83lULk2PlDIDO+ZsRni68VxrWHYzfizlUpgEfOyofnmVQ9Pifgdl7GA 4eKw== 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; bh=f+qCR48v8uxXBb929iAb8VEY3jH0LGoc7EJ1WWZrQhI=; b=TrnGFlVidhR6NpNnRMaxvqaUpWUlR5a9b1Gb3mVayb8LUP1Zo4Gi7n7MLWDYZKNRhk du6NB45Ruok5ho/lwSOlfA+RJgT8w6FgVyMY61/cNew99SDFU0aAzdRh8/m19+AqUz+4 pN18F0vUtDRrcY6F+H4WPsGWyogt2KoJUBQuTX89k6E58YK3vKU82fPaMHBFjEyjKiQ4 g9SsekANEQ/H+YNaK00GNuz9XpXaSYJQAc4KPzJZ6zRIHTrnOobz5ndUl+ii23J3Fxrw EywmKP0LoEKRG6T79pe84bIVwWH206+qMx6FWwc7+ICd//toXqI0MHRpijU+HqP0O4Bm 7H/A== X-Gm-Message-State: AD7BkJK7lCl69/I0GYjCU06yYn/nGXqQcFWzAMgS2bgab8TmgxqZYRfAnei1ERJfYFcJf+qIhghrNnUwHcvqTL5C MIME-Version: 1.0 X-Received: by 10.60.140.168 with SMTP id rh8mr8020123oeb.9.1458942157460; Fri, 25 Mar 2016 14:42:37 -0700 (PDT) Received: by 10.157.62.230 with HTTP; Fri, 25 Mar 2016 14:42:37 -0700 (PDT) In-Reply-To: <1458939566.5501.5.camel@intel.com> References: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> <1458861450-17705-6-git-send-email-vishal.l.verma@intel.com> <20160325104549.GB10525@infradead.org> <1458939566.5501.5.camel@intel.com> Date: Fri, 25 Mar 2016 14:42:37 -0700 Message-ID: Subject: Re: [PATCH 5/5] dax: handle media errors in dax_do_io From: Dan Williams X-ASG-Orig-Subj: Re: [PATCH 5/5] dax: handle media errors in dax_do_io To: "Verma, Vishal L" Cc: "hch@infradead.org" , "linux-block@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-nvdimm@ml01.01.org" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "axboe@fb.com" , "akpm@linux-foundation.org" , "linux-fsdevel@vger.kernel.org" , "ross.zwisler@linux.intel.com" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" , "david@fromorbit.com" , "jack@suse.cz" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ob0-f181.google.com[209.85.214.181] X-Barracuda-Start-Time: 1458942158 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/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, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28168 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain On Fri, Mar 25, 2016 at 1:59 PM, Verma, Vishal L wrote: > On Fri, 2016-03-25 at 03:45 -0700, Christoph Hellwig wrote: >> On Thu, Mar 24, 2016 at 05:17:30PM -0600, Vishal Verma wrote: >> > >> > dax_do_io (called for read() or write() for a dax file system) may >> > fail >> > in the presence of bad blocks or media errors. Since we expect that >> > a >> > write should clear media errors on nvdimms, make dax_do_io fall >> > back to >> > the direct_IO path, which will send down a bio to the driver, which >> > can >> > then attempt to clear the error. >> Leave the fallback on -EIO to the callers please. They generally >> call >> __blockdev_direct_IO anyway, so it should actually become simpler >> that >> way. > > I thought of this, but made the retrying happen in the wrapper so that > it can be centralized. If the callers were to become responsible for > the retry, then any new callers of dax_do_io might not realize they are > responsible for retrying, and hit problems. That's their prerogative otherwise you are precluding an alternate handling of a dax_do_io() failure. Maybe a fs or upper layer can recover in a different manner than re-submit the I/O to the __blockdev_direct_IO path. From vishal.l.verma@intel.com Fri Mar 25 17:36:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 65AC77CA0 for ; Fri, 25 Mar 2016 17:36:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C3E28AC001 for ; Fri, 25 Mar 2016 15:36:50 -0700 (PDT) X-ASG-Debug-ID: 1458945409-04cbb07ad539310001-NocioJ Received: from mga01.intel.com ([192.55.52.88]) by cuda.sgi.com with ESMTP id ROU5YPBdh1PPTfbD for ; Fri, 25 Mar 2016 15:36:49 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.88 X-ASG-Whitelist: Client Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga101.fm.intel.com with ESMTP; 25 Mar 2016 15:36:49 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,392,1455004800"; d="scan'208";a="918940074" Received: from fmsmsx107.amr.corp.intel.com ([10.18.124.205]) by orsmga001.jf.intel.com with ESMTP; 25 Mar 2016 15:36:44 -0700 Received: from fmsmsx113.amr.corp.intel.com ([169.254.13.211]) by fmsmsx107.amr.corp.intel.com ([169.254.6.237]) with mapi id 14.03.0248.002; Fri, 25 Mar 2016 15:36:18 -0700 From: "Verma, Vishal L" To: "Williams, Dan J" CC: "linux-block@vger.kernel.org" , "hch@infradead.org" , "xfs@oss.sgi.com" , "linux-nvdimm@ml01.01.org" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "axboe@fb.com" , "akpm@linux-foundation.org" , "linux-fsdevel@vger.kernel.org" , "ross.zwisler@linux.intel.com" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" , "david@fromorbit.com" , "jack@suse.cz" Subject: Re: [PATCH 5/5] dax: handle media errors in dax_do_io Thread-Topic: [PATCH 5/5] dax: handle media errors in dax_do_io X-ASG-Orig-Subj: Re: [PATCH 5/5] dax: handle media errors in dax_do_io Thread-Index: AQHRhiN0/rGWKKyzgEa+J4vXlVWLHp9qcA6AgACrcQCAAAwRgIAADvsA Date: Fri, 25 Mar 2016 22:36:17 +0000 Message-ID: <1458945374.5501.9.camel@intel.com> References: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> <1458861450-17705-6-git-send-email-vishal.l.verma@intel.com> <20160325104549.GB10525@infradead.org> <1458939566.5501.5.camel@intel.com> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.232.115.161] Content-Type: text/plain; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-Barracuda-Connect: UNKNOWN[192.55.52.88] X-Barracuda-Start-Time: 1458945409 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 T24gRnJpLCAyMDE2LTAzLTI1IGF0IDE0OjQyIC0wNzAwLCBEYW4gV2lsbGlhbXMgd3JvdGU6DQo+ IE9uIEZyaSwgTWFyIDI1LCAyMDE2IGF0IDE6NTkgUE0sIFZlcm1hLCBWaXNoYWwgTA0KPiA8dmlz aGFsLmwudmVybWFAaW50ZWwuY29tPiB3cm90ZToNCj4gPiANCj4gPiBPbiBGcmksIDIwMTYtMDMt MjUgYXQgMDM6NDUgLTA3MDAsIENocmlzdG9waCBIZWxsd2lnIHdyb3RlOg0KPiA+ID4gDQo+ID4g PiBPbiBUaHUsIE1hciAyNCwgMjAxNiBhdCAwNToxNzozMFBNIC0wNjAwLCBWaXNoYWwgVmVybWEg d3JvdGU6DQo+ID4gPiA+IA0KPiA+ID4gPiANCj4gPiA+ID4gZGF4X2RvX2lvIChjYWxsZWQgZm9y IHJlYWQoKSBvciB3cml0ZSgpIGZvciBhIGRheCBmaWxlIHN5c3RlbSkNCj4gPiA+ID4gbWF5DQo+ ID4gPiA+IGZhaWwNCj4gPiA+ID4gaW4gdGhlIHByZXNlbmNlIG9mIGJhZCBibG9ja3Mgb3IgbWVk aWEgZXJyb3JzLiBTaW5jZSB3ZSBleHBlY3QNCj4gPiA+ID4gdGhhdA0KPiA+ID4gPiBhDQo+ID4g PiA+IHdyaXRlIHNob3VsZCBjbGVhciBtZWRpYSBlcnJvcnMgb24gbnZkaW1tcywgbWFrZSBkYXhf ZG9faW8gZmFsbA0KPiA+ID4gPiBiYWNrIHRvDQo+ID4gPiA+IHRoZSBkaXJlY3RfSU8gcGF0aCwg d2hpY2ggd2lsbCBzZW5kIGRvd24gYSBiaW8gdG8gdGhlIGRyaXZlciwNCj4gPiA+ID4gd2hpY2gN Cj4gPiA+ID4gY2FuDQo+ID4gPiA+IHRoZW4gYXR0ZW1wdCB0byBjbGVhciB0aGUgZXJyb3IuDQo+ ID4gPiBMZWF2ZSB0aGUgZmFsbGJhY2sgb24gLUVJTyB0byB0aGUgY2FsbGVycyBwbGVhc2UuwqDC oFRoZXkgZ2VuZXJhbGx5DQo+ID4gPiBjYWxsDQo+ID4gPiBfX2Jsb2NrZGV2X2RpcmVjdF9JTyBh bnl3YXksIHNvIGl0IHNob3VsZCBhY3R1YWxseSBiZWNvbWUgc2ltcGxlcg0KPiA+ID4gdGhhdA0K PiA+ID4gd2F5Lg0KPiA+IEkgdGhvdWdodCBvZiB0aGlzLCBidXQgbWFkZSB0aGUgcmV0cnlpbmcg aGFwcGVuIGluIHRoZSB3cmFwcGVyIHNvDQo+ID4gdGhhdA0KPiA+IGl0IGNhbiBiZSBjZW50cmFs aXplZC4gSWYgdGhlIGNhbGxlcnMgd2VyZSB0byBiZWNvbWUgcmVzcG9uc2libGUNCj4gPiBmb3IN Cj4gPiB0aGUgcmV0cnksIHRoZW4gYW55IG5ldyBjYWxsZXJzIG9mIGRheF9kb19pbyBtaWdodCBu b3QgcmVhbGl6ZSB0aGV5DQo+ID4gYXJlDQo+ID4gcmVzcG9uc2libGUgZm9yIHJldHJ5aW5nLCBh bmQgaGl0IHByb2JsZW1zLg0KPiBUaGF0J3MgdGhlaXIgcHJlcm9nYXRpdmUgb3RoZXJ3aXNlIHlv dSBhcmUgcHJlY2x1ZGluZyBhbiBhbHRlcm5hdGUNCj4gaGFuZGxpbmcgb2YgYSBkYXhfZG9faW8o KSBmYWlsdXJlLsKgwqBNYXliZSBhIGZzIG9yIHVwcGVyIGxheWVyIGNhbg0KPiByZWNvdmVyIGlu IGEgZGlmZmVyZW50IG1hbm5lciB0aGFuIHJlLXN1Ym1pdCB0aGUgSS9PIHRvIHRoZQ0KPiBfX2Js b2NrZGV2X2RpcmVjdF9JTyBwYXRoLg0KDQpJJ20gaGFwcHkgdG8gbWFrZSB0aGUgY2hhbmdlLCBi dXQgd2UgZG9uJ3QgcHJlY2x1ZGUgdGhhdCAtLSBfX2RheF9kb19pbw0KaXMgc3RpbGwgZXhwb3J0 ZWQgYW5kIGF2YWlsYWJsZS4u From darrick.wong@oracle.com Fri Mar 25 18:01:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B8B907CA0 for ; Fri, 25 Mar 2016 18:01:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6FF32304032 for ; Fri, 25 Mar 2016 16:00:58 -0700 (PDT) X-ASG-Debug-ID: 1458946852-04bdf05b7b39210001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id vGIafkUKVLC9vsPL (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 25 Mar 2016 16:00:53 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u2PN0Jg8001004 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 25 Mar 2016 23:00:19 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u2PN0Ie7030705 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 25 Mar 2016 23:00:18 GMT Received: from abhmp0010.oracle.com (abhmp0010.oracle.com [141.146.116.16]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u2PN0G5w007597; Fri, 25 Mar 2016 23:00:17 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 25 Mar 2016 16:00:15 -0700 Date: Fri, 25 Mar 2016 16:00:14 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 0/16] xfs: first part of rmapbt functionality Message-ID: <20160325230014.GA5822@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 0/16] xfs: first part of rmapbt functionality References: <1457410578-30233-1-git-send-email-david@fromorbit.com> <20160310141434.GA29058@infradead.org> <20160310214432.GX30721@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160310214432.GX30721@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1458946853 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28170 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Fri, Mar 11, 2016 at 08:44:32AM +1100, Dave Chinner wrote: > On Thu, Mar 10, 2016 at 06:14:34AM -0800, Christoph Hellwig wrote: > > On Tue, Mar 08, 2016 at 03:16:02PM +1100, Dave Chinner wrote: > > > This isn't all of the rmap functionality. It's patches up to the > > > point where I've come across the first piece that needs to be > > > reworked (the rmap intent execution code), so there's no point > > > holding these back until I've sorted that out. This builds on top of > > > for-next and the patch set I posted yesterday. > > > > > > Darrick, I've changed the authorship of the patches to reflect > > > the original series this has come from - can you check to see if > > > there's anything I got wrong when I did that? Looks ok to me. > > I'll come some minor bits on the actual patches, but I'd like to > > understand a few fundamental things first: > > > > For one Darrick has introduced a new rmapxbt btree recently, which > > allows using a rmap on reflink enabled file systems. In his tree > > we thus have two different implementation of a reverse mapping > > btree. Is there any good reason to keep it this way? For one > > reflinks are a compelling feature that I doubt people want to > > disable in the long run, so most filesystem will be using rmapxbt. > > I also don't think having these two implementations is good for the > > testing matrix in the long run. > > I haven't got as far as the rmapxbt code yet - it's currently at the > end of the entire series, and I'm trying to sort out problems in > infrastructure right now (i.e. rmapbt modifications are atomic and > crash safe w.r.t. bmapbt changes and EFI processing). > > I'm planning on re-ordering the rmapxbt and interval query tree > stuff to before the reflink code is included, but I haven't got > hatfar yet so I haven't looked at the code yet. It's slow going, and > right now I don't think I'm going to have even a complete rmapbt > series done in time for the merge 4.6 merge window, let alone all > the extra stuff Darrick has done. > > So with only a couple of days left before the merge window opens, I > think this all needs to slip to the next merge window while we sort > out what disk format we are going to use and rework the series to > introduce only that format. Now that rmap has slipped to 4.7, there's no point in holding back on the disk format changes that I wanted to make. The interval query code makes it much easier to look for left neighbor rmap records on a reflink filesystem. With that piece, we can drop the requirement that every bmbt record corresponds exactly with an rmapbt record; we can also make use of bits 20-30 of the rm_blockcount field, which will make the rmapbt smaller. Doing this also enables me to rip out a large chunk of the deferred rmap processing code (mostly patches 15-16) because everything can turn into calling the interval query aware versions of xfs_rmap_{alloc,free}. At the same time I'll add rmapbt update intent log items--Dave, I know you were working on that; please send along whatever you have. I've been wrangling with the problem of how to deal with refcount btree updates that update so many records that we overflow the transaction reservation. Right now we simply reserve so much space that we can (usually) pass xfstests without blowing up, but this won't work for all cases. One solution is to roll the transaction if we detect that we're about to run out of reservation, but that requires us to be able to log refcount update intents. However, that isn't so bad, because... ...I think there's a potential for deadlock when unmapping extents from a file. Let's say we want to unmap an extent in AG X whose bmbt block is in AG (X+1). Let's say that the bmbt unmap causes the block to split, and the new bmbt block is in AG (X+1). Next, we go to remove the rmapbt record from AG X, but let's say that record removal also causes a btree split. In that case, the transaction will deadlock because it has AGF (X+1) and is trying to grab AGF X, which is a violation of the locking order rules. In summary, I think we need to have intent log items for both rmapbt and refcountbt changes in order to keep things atomic w.r.t. crash recovery. I think this solves both the deadlock problem and the reservation overflow problems with the refcount btree. MCI/MCD = rMap change intent/done CCI/CCD = refCount change intent/done So now unmapping looks like this: unmap extent -> log MCI -> log CCI -> roll -> remove rmapbt entries -> -> log MCD -> roll -> -> update refcountbt -> log CCD -> log EFI (for btree merges) -+-> ^-- log CCI for remaining <--------------- if trans full ---| -> roll -> free extents -> log EFD -> done unmapping Regular mapping looks like this: map extent -> log MCI -> roll -> add rmapbt entries -> log MCD -> roll -> -> log EFI (for btree merges) -> free -> log EFD -> done mapping Reflinking looks like this: regular unmap -> log CCI -> roll -> -> update refcountbt -> log CCD -> log EFI (for btree merges) -+--> ^-- log CCI for remaining <--------------- if trans full ---| -> regular map -> done reflinking This is my rough roadmap heading towards LSF: 0) jump forward to 4.6-rc1 after merge window closes 1) drop the skinny rmapbt format 2) use interval queries for xfs_rmap_{alloc,free} 3) use MCI/MCD on freeing extents 4) shove the interval query code and all the rmap stuff before reflink 5) rework rmap to drop the "every bmbt record must have an rmap rec" 6) rework refcount to avoid exhausting transaction reservations 7) prototype btree scrubbing code (done) 8) come up with some toy xfs-scrub utility How's that sound? Sorry in advance for the code churn and the inevitable gigantic patchbomb. :) --D > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From eflorac@intellique.com Sat Mar 26 08:50:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 776577CA0 for ; Sat, 26 Mar 2016 08:50:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4C64E304039 for ; Sat, 26 Mar 2016 06:50:38 -0700 (PDT) X-ASG-Debug-ID: 1459000235-04cb6c245f4f0b0001-NocioJ Received: from mail1.g1.pair.com (mail1.g1.pair.com [66.39.3.162]) by cuda.sgi.com with ESMTP id HdVfD9M93KUxdIIH (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 26 Mar 2016 06:50:35 -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 D980B2CE4D for ; Sat, 26 Mar 2016 09:50:34 -0400 (EDT) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail1.g1.pair.com (Postfix) with ESMTPSA id 8160A2CE3D for ; Sat, 26 Mar 2016 09:50:34 -0400 (EDT) Date: Sat, 26 Mar 2016 14:50:37 +0100 From: Emmanuel Florac To: "xfs@oss.sgi.com" Subject: Weird behaviour of mkfs.xfs Message-ID: <20160326145037.3b5c6302@harpe.intellique.com> X-ASG-Orig-Subj: Weird behaviour of mkfs.xfs Organization: Intellique X-Mailer: Claws Mail 3.13.1 (GTK+ 2.24.30; i486-slackware-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail1.g1.pair.com[66.39.3.162] X-Barracuda-Start-Time: 1459000235 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28187 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi all, I'm testing NVMe storage, and it works fine so far. However here's something bizarre: I've made a RAID-0 array of 2 NVMe drives with mdadm, and mkfs.xfs /dev/md0 starts an endless, full speed write of the array: avg-cpu: %user %nice %system %iowait %steal %idle 0,21 0,00 0,17 12,39 0,00 87,24 Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 nvme0n1 0,00 0,00 0,00 5152,33 0,00 1288,03 511,98 1019,53 197,87 0,00 197,87 0,19 100,00 nvme1n1 0,00 0,00 0,00 5154,67 0,00 1288,67 512,00 50,62 9,82 0,00 9,82 0,19 100,00 dm-0 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 md0 0,00 0,00 0,00 5152,00 0,00 2576,00 1024,00 0,00 0,00 0,00 0,00 0,00 0,00 I'm running a plain vanilla 4.4.6 kernel; the xfs_progs are only slightly older, being version 4.2. Nothing will stop the crazy mkfs.xfs, but a hard reboot. Any idea? -- ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From eflorac@intellique.com Sat Mar 26 09:46:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 57C157CA0 for ; Sat, 26 Mar 2016 09:46:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 18F19304039 for ; Sat, 26 Mar 2016 07:46:19 -0700 (PDT) X-ASG-Debug-ID: 1459003576-04bdf06ddf00030001-NocioJ Received: from mail1.g1.pair.com (mail1.g1.pair.com [66.39.3.162]) by cuda.sgi.com with ESMTP id 4CwZC9PtmhQFN6cN (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 26 Mar 2016 07:46:16 -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 117142CC83 for ; Sat, 26 Mar 2016 10:46:16 -0400 (EDT) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail1.g1.pair.com (Postfix) with ESMTPSA id AD7482CD03 for ; Sat, 26 Mar 2016 10:46:15 -0400 (EDT) Date: Sat, 26 Mar 2016 15:46:19 +0100 From: Emmanuel Florac To: "xfs@oss.sgi.com" Subject: Re: Weird behaviour of mkfs.xfs Message-ID: <20160326154619.3649ebdf@harpe.intellique.com> X-ASG-Orig-Subj: Re: Weird behaviour of mkfs.xfs In-Reply-To: <20160326145037.3b5c6302@harpe.intellique.com> References: <20160326145037.3b5c6302@harpe.intellique.com> Organization: Intellique X-Mailer: Claws Mail 3.13.1 (GTK+ 2.24.30; i486-slackware-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail1.g1.pair.com[66.39.3.162] X-Barracuda-Start-Time: 1459003576 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28188 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Le Sat, 26 Mar 2016 14:50:37 +0100 Emmanuel Florac =C3=A9crivait: > I'm running a plain vanilla 4.4.6 kernel; the xfs_progs are only > slightly older, being version 4.2. >=20 > Nothing will stop the crazy mkfs.xfs, but a hard reboot. Any idea? >=20 Actually I was too impatient; it finally ended avec 30 minutes of burning bits to the flash. I don't understand the behaviour, though. I'm used to mkfs.xfs making its magic extremely quickly, even on humongous devices. Here it's a very fast array of only 3.2 TB... --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From BATV+260168ab34b6da391448+4598+infradead.org+hch@bombadil.srs.infradead.org Sat Mar 26 11:36:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 623947CA0 for ; Sat, 26 Mar 2016 11:36:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 37631304032 for ; Sat, 26 Mar 2016 09:36:50 -0700 (PDT) X-ASG-Debug-ID: 1459010203-04cb6c245f54950001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id B7K5M3xC1K3xVL06 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 26 Mar 2016 09:36:43 -0700 (PDT) X-Barracuda-Envelope-From: BATV+260168ab34b6da391448+4598+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 1ajrCc-00057M-Vv; Sat, 26 Mar 2016 16:36:42 +0000 Date: Sat, 26 Mar 2016 09:36:42 -0700 From: Christoph Hellwig To: Emmanuel Florac Cc: "xfs@oss.sgi.com" Subject: Re: Weird behaviour of mkfs.xfs Message-ID: <20160326163642.GA19464@infradead.org> X-ASG-Orig-Subj: Re: Weird behaviour of mkfs.xfs References: <20160326145037.3b5c6302@harpe.intellique.com> <20160326154619.3649ebdf@harpe.intellique.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160326154619.3649ebdf@harpe.intellique.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1459010203 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28189 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Sat, Mar 26, 2016 at 03:46:19PM +0100, Emmanuel Florac wrote: > Actually I was too impatient; it finally ended avec 30 minutes of > burning bits to the flash. I don't understand the behaviour, though. > I'm used to mkfs.xfs making its magic extremely quickly, even on > humongous devices. Here it's a very fast array of only 3.2 TB... Trey doing a mkfs.xfs -K, without that it diascards the whole device. I've seen some NVMe device misbehaving under discard storms, up to the point of resetting the controller.. From BATV+260168ab34b6da391448+4598+infradead.org+hch@bombadil.srs.infradead.org Sat Mar 26 11:54:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A1BDF7CA0 for ; Sat, 26 Mar 2016 11:54:09 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 74285304032 for ; Sat, 26 Mar 2016 09:54:09 -0700 (PDT) X-ASG-Debug-ID: 1459011247-04cbb07ad5544a0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id Id4NqYw69mWphDhA (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 26 Mar 2016 09:54:07 -0700 (PDT) X-Barracuda-Envelope-From: BATV+260168ab34b6da391448+4598+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 1ajrTL-0003VA-QH; Sat, 26 Mar 2016 16:53:59 +0000 Date: Sat, 26 Mar 2016 09:53:59 -0700 From: "hch@infradead.org" To: Dan Williams Cc: "Verma, Vishal L" , "linux-block@vger.kernel.org" , "jack@suse.cz" , "axboe@fb.com" , "linux-nvdimm@ml01.01.org" , "xfs@oss.sgi.com" , "hch@infradead.org" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "linux-fsdevel@vger.kernel.org" , "akpm@linux-foundation.org" , "linux-ext4@vger.kernel.org" , "ross.zwisler@linux.intel.com" , "Wilcox, Matthew R" Subject: Re: [PATCH 5/5] dax: handle media errors in dax_do_io Message-ID: <20160326165359.GA11387@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 5/5] dax: handle media errors in dax_do_io References: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> <1458861450-17705-6-git-send-email-vishal.l.verma@intel.com> <20160325104549.GB10525@infradead.org> <1458939566.5501.5.camel@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1459011247 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28190 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, Mar 25, 2016 at 02:42:37PM -0700, Dan Williams wrote: > That's their prerogative otherwise you are precluding an alternate > handling of a dax_do_io() failure. Maybe a fs or upper layer can > recover in a different manner than re-submit the I/O to the > __blockdev_direct_IO path. Let's keep the interface separate because they are, well separate. There is a reason direct I/O falls back to buffered I/O by returning and error if it can't handle it instead of handling all the magic. I also really want to get rid of get_block as soon as possible for DAX and direct I/O. For DAX that should actually be possible really quickly, while direct I/O might take some time and will be have to be gradual. So tighter integration of the two interface is not just bad design, but actively harmful at this point in time. From tireman@shaw.ca Sat Mar 26 13:16:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 925117CA0 for ; Sat, 26 Mar 2016 13:16:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 52DCF8F8035 for ; Sat, 26 Mar 2016 11:16:28 -0700 (PDT) X-ASG-Debug-ID: 1459016182-04cbb07ad6582f0001-NocioJ Received: from smtp-out-so.shaw.ca (smtp-out-so.shaw.ca [64.59.136.139]) by cuda.sgi.com with ESMTP id MSmZ4s47n4pAbTJi (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 26 Mar 2016 11:16:23 -0700 (PDT) X-Barracuda-Envelope-From: tireman@shaw.ca X-Barracuda-Apparent-Source-IP: 64.59.136.139 Received: from [192.168.0.2] ([174.5.126.242]) by shaw.ca with SMTP id jsl2aYQEYabIFjsl4aTc3b; Sat, 26 Mar 2016 12:16:22 -0600 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=shaw.ca; s=s20150330; t=1459016182; bh=8cIOhYPgHYm+VQIwLwM8Q2fxks6WYSdkQGuyUgxV8zs=; h=To:From:Subject:Date; b=mjCM6/hOxVWZ/ntcPSVzCMziXZvhGO4fu9Q6TCs5AE09Ae8gkB/qGXVRbkSosL13T fb+ErV5c3/sXMaxuHeq0pK+oBqc+B5bf656GVSPQ5Q39zIGAiXZKRgYgrIWpR4X1PF aNbT3ZkUAjWKSxpNwKvM4rCiBqzyidgibj6+iP0Jt7WT34ITUDZ/5mvu8BdJsHJc/i YPwyXfUNAWVWGaGnWZRL8C6SfZ+Koc9y1/ABmGw5ZlCEb+u23m4kXVznaBKxkAKLC/ u/dsGapw4zmq5nsUaxKqKNpTV5UqFy6DvYVQfDq7aaQLq7bt9pF5BC/pkqF9SxXoMR ZhBtO9/XUUCHQ== X-Authority-Analysis: v=2.1 cv=Daa30qZW c=1 sm=1 tr=0 a=YUpam8ogUlPMk4SS6ACeKg==:117 a=YUpam8ogUlPMk4SS6ACeKg==:17 a=L9H7d07YOLsA:10 a=9cW_t1CCXrUA:10 a=s5jvgZ67dGcA:10 a=IkcTkHD0fZMA:10 a=iLVBInUuvCZaDYBKj_sA:9 a=QEXdDO2ut3YA:10 To: xfs@oss.sgi.com From: Andrew Ryder Subject: xfs_repair fails after trying to format log cycle? Message-ID: <56F6DE67.60403@shaw.ca> X-ASG-Orig-Subj: xfs_repair fails after trying to format log cycle? Date: Sat, 26 Mar 2016 15:09:27 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-CMAE-Envelope: MS4wfHM8wExZkFRsetoPjnWUq+JHXq8MOTZ7r+/xiFB2tRPinJEpkpOWOV8/2rs+rIe4n+FfUZ6KYdDNxygK7iv9yZXYvT4SNy0NNM4EkNrZ9Cev1anqitsZ sd64Ib7WxLOE7h4sbKjYawBnOUFAga9/N2JjiImEspJtxJERroREcepl X-Barracuda-Connect: smtp-out-so.shaw.ca[64.59.136.139] X-Barracuda-Start-Time: 1459016183 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28191 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 have an mdadm array with a xfs v5 filesystem on it and its begun to give me issues when trying to mount it as well as complete xfs_repair. Not sure if anyone might be able to shed some light on what is going on or how to correct the issue? When I try and mount the fs, it complains with: [ 388.479847] XFS (md2): Mounting V5 Filesystem [ 388.494686] XFS (md2): metadata I/O error: block 0x15d6d39c0 ("xlog_bread_noalign") error 5 numblks 8192 [ 388.495013] XFS (md2): failed to find log head [ 388.495018] XFS (md2): log mount/recovery failed: error -5 [ 388.495090] XFS (md2): log mount failed This is where its not making any sense for me, If I try and run "xfs_repair /dev/md2" it fails with: Phase 1 - find and verify superblock... - reporting progress in intervals of 15 minutes Phase 2 - using internal log - zero log... xfs_repair: read failed: Input/output error failed to find log head zero_log: cannot find log head/tail (xlog_find_tail=-5) fatal error -- ERROR: The log head and/or tail cannot be discovered. Attempt to mount the filesystem to replay the log or use the -L option to destroy the log and attempt a repair. But if I run "xfs_repair -L /dev/md2" which gives: Phase 1 - find and verify superblock... - reporting progress in intervals of 15 minutes Phase 2 - using internal log - zero log... xfs_repair: read failed: Input/output error failed to find log head zero_log: cannot find log head/tail (xlog_find_tail=-5) xfs_repair: libxfs_device_zero write failed: Input/output error then try and re-run "xfs_repair /dev/md2" it starts traversing the filesystem all the way to "Phase 7" then errors with: Phase 7 - verify and correct link counts... - 14:36:55: verify and correct link counts - 33 of 33 allocation groups done Maximum metadata LSN (64:2230592) is ahead of log (0:0). Format log to cycle 67. xfs_repair: libxfs_device_zero write failed: Input/output error Yet at this point I can now mount the filesystem.. Checking the drives with smartctl shows no errors nor does 'dmesg' show any hardware i/o or controller related errors... I've tried scrubbing the array and no bad sectors are found either.. I'm running kernel 3.19.8 with xfsprogs 4.5. Thanks, Andrew From guaneryu@gmail.com Sat Mar 26 23:29:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 938867CA0 for ; Sat, 26 Mar 2016 23:29:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id ECC94AC001 for ; Sat, 26 Mar 2016 21:29:13 -0700 (PDT) X-ASG-Debug-ID: 1459052950-04cb6c24646a010001-NocioJ Received: from mail-pf0-f195.google.com (mail-pf0-f195.google.com [209.85.192.195]) by cuda.sgi.com with ESMTP id PD1qXZdaSJ6N0Z8c (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 26 Mar 2016 21:29:11 -0700 (PDT) X-Barracuda-Envelope-From: guaneryu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.195 Received: by mail-pf0-f195.google.com with SMTP id n5so16310056pfn.1 for ; Sat, 26 Mar 2016 21:29:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=v26H06ULpE3yVAOWNsRxAHGyZQRizwHn1dVinAlTQys=; b=K4hiTvO0yrecyakWMtDPnHJbJ1kaLqzaxyan6X8MEZjgda59bXaVbtjU1c7/dJWA1o miv8Ui3cI5FD4xIwJ9U99vFrxXY9xkllg58MN8VJcWRoD1v1QqKhF6dPb2XiqrMBo4wl lUyoXUyJMIIcuoG90OkMjjszherfa9GKWUXUHdiUBR782R6T8/jGoUs6O2bVDBn1Vrd4 BTzevhX7g6bAG7qqwaP+M2FrlYh0aCWvtm+0jQSrdZIcqUoDoqeLx5dLanfeteyP/iS6 MpLFKgX/u+hVLmXxXICbhSgQnd95F9JKchZuP3+3zAq1m8PlyIuxGs7zf3EvqppgLlbO X/qg== 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=v26H06ULpE3yVAOWNsRxAHGyZQRizwHn1dVinAlTQys=; b=QtuLxt1qWJyzaym27fA5n/bZpe3w0zb0l9wMlfahH68rUHsnjeBAiZFlxIhiOAsyRi S+/h15hCnP2U/aHH6lY8L9Z1oP3bQxCWdxON1ugyojqrMly8HG7tS++EQT//aZF8TEHd RpWxLP1kc0nrXFlGrr0AMTvl2Mb2lL2mmzzcAsMfVrMgBGTmjctRVBgr85PVYpdiVWNa N9rQtlFP95QZYuqALZR19Yy0gzUU5K4sNaq63C/yRtbZiWMMFLXa+SFOb+3qFGTbXlnQ 1RwZZihlA1TZGvwHDvSoI5Gua2w9O0s1BlSemyXlJ8c0WacmEIiiRPJeuix0MOAlpV7B Qu9g== X-Gm-Message-State: AD7BkJL9nAslYkoQ9EUFvSzjl3/u/ndLYH1Q3rTsqx6GauJ2WxYgPbwI36aFF99Uj5qR9Q== X-Received: by 10.98.18.212 with SMTP id 81mr33002485pfs.104.1459052950585; Sat, 26 Mar 2016 21:29:10 -0700 (PDT) Received: from localhost ([128.199.137.77]) by smtp.gmail.com with ESMTPSA id yx1sm26220729pac.29.2016.03.26.21.29.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 26 Mar 2016 21:29:09 -0700 (PDT) From: Eryu Guan To: xfs@oss.sgi.com Cc: Eryu Guan Subject: [PATCH v2] xfs: mute some sparse warnings Date: Sun, 27 Mar 2016 12:28:51 +0800 X-ASG-Orig-Subj: [PATCH v2] xfs: mute some sparse warnings Message-Id: <1459052931-25535-1-git-send-email-guaneryu@gmail.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1458929042-23991-1-git-send-email-guaneryu@gmail.com> References: <1458929042-23991-1-git-send-email-guaneryu@gmail.com> X-Barracuda-Connect: mail-pf0-f195.google.com[209.85.192.195] X-Barracuda-Start-Time: 1459052951 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28201 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 These three warnings are fixed: fs/xfs/xfs_inode.c:1033:44: warning: Using plain integer as NULL pointer fs/xfs/xfs_inode_item.c:525:20: warning: context imbalance in 'xfs_inode_item_push' - unexpected unlock fs/xfs/xfs_dquot.c:696:1: warning: symbol 'xfs_dq_get_next_id' was not declared. Should it be static? Reviewed-by: Christoph Hellwig Signed-off-by: Eryu Guan --- v2: - fix lock annotation format fs/xfs/xfs_dquot.c | 2 +- fs/xfs/xfs_inode.c | 2 +- fs/xfs/xfs_inode_item.c | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index 316b2a1..8f51370 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -692,7 +692,7 @@ error0: * end of the chunk, skip ahead to first id in next allocated chunk * using the SEEK_DATA interface. */ -int +static int xfs_dq_get_next_id( xfs_mount_t *mp, uint type, diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 96f606d..1445a99 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1030,7 +1030,7 @@ xfs_dir_ialloc( tp->t_flags &= ~(XFS_TRANS_DQ_DIRTY); } - code = xfs_trans_roll(&tp, 0); + code = xfs_trans_roll(&tp, NULL); if (committed != NULL) *committed = 1; diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index c48b5b1..d02cbab 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -479,6 +479,8 @@ STATIC uint xfs_inode_item_push( struct xfs_log_item *lip, struct list_head *buffer_list) + __releases(&lip->li_ailp->xa_lock) + __acquires(&lip->li_ailp->xa_lock) { struct xfs_inode_log_item *iip = INODE_ITEM(lip); struct xfs_inode *ip = iip->ili_inode; -- 2.5.5 From geert.uytterhoeven@gmail.com Sun Mar 27 07:43:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 9F3217CA0 for ; Sun, 27 Mar 2016 07:43:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4A886304032 for ; Sun, 27 Mar 2016 05:43:28 -0700 (PDT) X-ASG-Debug-ID: 1459082605-04bdf0110218480001-NocioJ Received: from mail-io0-f173.google.com (mail-io0-f173.google.com [209.85.223.173]) by cuda.sgi.com with ESMTP id STyprJ6aqyzPwVRX (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 27 Mar 2016 05:43:25 -0700 (PDT) X-Barracuda-Envelope-From: geert.uytterhoeven@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.223.173 Received: by mail-io0-f173.google.com with SMTP id e3so39414324ioa.1 for ; Sun, 27 Mar 2016 05:43:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc; bh=YOp8eRZxxZNVJxDs8JEIider/XPabCnN9P43JOvSfSY=; b=G+/9Hd5RhQe8CHzxfeTIU6qyPmpaNiqC6xVBj8cOA32DoiO1aikeBdfaSiQeBwNQ1D CmbX2bwbxkMm2aF0AEJ/+hLl6VJ7Sni1kKRCsz/WN65bBphbalimVfW0m6GIoU7KG7Ki TOCWi7x8AqyKk+nCLDL9g1KXKNfV0aXY5gZRPqIrTSTkjpYSf7PHbflv9DcFBxPSsWLK k/gZog5JhoMQ0idnV7EJRGPsJXVZEbIMYPMlex4j0d64LCzzV8ZhOB+jovsCwqW3JBxo M8oJGzEg0WCFmgpFOQsQ/EpgFepIuY2nKJZPvjUg3j9wX+67zI7SY563UibGzUEBN0Ru ovsw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:date :message-id:subject:from:to:cc; bh=YOp8eRZxxZNVJxDs8JEIider/XPabCnN9P43JOvSfSY=; b=AaU0N8r4Ul8LBxAOksGf2d2MQxgWw+G3oRxTIZzNfi++h7o6NJDJanXYzvjfuiJIZi zAbpaqn9+W58jCQf4GgM2EMS0tqxQq7A/8DybhaUqZowG1ndIqvyOd6S/MwwauB3BqlF 8XlXRtA2UWc1ammiJgA4aI4hH2/wTlmTvVOg6EfqmPb8oqhLvCb2JQqVnLGh/fe3rzaq 9ktlNjpXrQgUuMu4JfwXLwANaPbIE6C6B6rpIrw5nMCI8rb3JN5TmsuPWp5r2Dq/+41C E0Pbn7Z3eJGuf3cLs8YzddOYRo5YhSPMSjLGg5x16qxfgzJXI5vDGvZPPF3dtk8Upazn HQrQ== X-Gm-Message-State: AD7BkJInNN3rbfPHYsKNo54qsGeMMZ7ibwhAV9cfuYoJ9hnAXFrDor7WNeG0d4slDWTzkYsQ4dcamitK5M9hwQ== MIME-Version: 1.0 X-Received: by 10.107.158.138 with SMTP id h132mr20828467ioe.174.1459082604930; Sun, 27 Mar 2016 05:43:24 -0700 (PDT) Sender: geert.uytterhoeven@gmail.com Received: by 10.107.31.77 with HTTP; Sun, 27 Mar 2016 05:43:24 -0700 (PDT) In-Reply-To: References: Date: Sun, 27 Mar 2016 14:43:24 +0200 X-Google-Sender-Auth: AfoVp1BLOUOi_n-T2ylQRK6cEkE Message-ID: Subject: Re: Build regressions/improvements in v4.6-rc1 From: Geert Uytterhoeven X-ASG-Orig-Subj: Re: Build regressions/improvements in v4.6-rc1 To: "linux-kernel@vger.kernel.org" Cc: xfs@oss.sgi.com, Cris , Rich Felker , Linux-sh list Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-io0-f173.google.com[209.85.223.173] X-Barracuda-Start-Time: 1459082605 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28210 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Sun, Mar 27, 2016 at 2:39 PM, Geert Uytterhoeven wrote: > Below is the list of build error/warning regressions/improvements in > v4.6-rc1[1] compared to v4.5[2]. > > Summarized: > - build errors: +9/-6 > [1] http://kisskb.ellerman.id.au/kisskb/head/10114/ (all 262 configs) > [2] http://kisskb.ellerman.id.au/kisskb/head/10047/ (all 262 configs) > 9 error regressions: > + /home/kisskb/slave/src/fs/xfs/xfs_ondisk.h: error: call to > '__compiletime_assert_79' declared with attribute error: XFS: > sizeof(xfs_attr_shortform_t) is wrong, expected 8: => 79:2 cris-allyesconfig, cris-allmodconfig > + error: smp-shx3.c: undefined reference to `local_timer_setup': => > .text+0xadec) shx3_defconfig Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds From dalias@aerifal.cx Sun Mar 27 08:15:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3FD627CA0 for ; Sun, 27 Mar 2016 08:15:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C55D1AC001 for ; Sun, 27 Mar 2016 06:15:42 -0700 (PDT) X-ASG-Debug-ID: 1459084537-04bdf0110218e10001-NocioJ Received: from brightrain.aerifal.cx (216-12-86-13.cv.mvl.ntelos.net [216.12.86.13]) by cuda.sgi.com with ESMTP id 4lnlU7dAgxvl6iTQ for ; Sun, 27 Mar 2016 06:15:37 -0700 (PDT) X-Barracuda-Envelope-From: dalias@aerifal.cx X-Barracuda-Apparent-Source-IP: 216.12.86.13 Received: from dalias by brightrain.aerifal.cx with local (Exim 3.15 #2) id 1akAXS-0004LD-00; Sun, 27 Mar 2016 13:15:30 +0000 Date: Sun, 27 Mar 2016 09:15:30 -0400 From: Rich Felker To: Geert Uytterhoeven Cc: "linux-kernel@vger.kernel.org" , xfs@oss.sgi.com, Cris , Linux-sh list Subject: Re: Build regressions/improvements in v4.6-rc1 Message-ID: <20160327131530.GX21636@brightrain.aerifal.cx> X-ASG-Orig-Subj: Re: Build regressions/improvements in v4.6-rc1 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) Sender: Rich Felker X-Barracuda-Connect: 216-12-86-13.cv.mvl.ntelos.net[216.12.86.13] X-Barracuda-Start-Time: 1459084537 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28210 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS On Sun, Mar 27, 2016 at 02:43:24PM +0200, Geert Uytterhoeven wrote: > On Sun, Mar 27, 2016 at 2:39 PM, Geert Uytterhoeven > wrote: > > Below is the list of build error/warning regressions/improvements in > > v4.6-rc1[1] compared to v4.5[2]. > > > > Summarized: > > - build errors: +9/-6 > > > [1] http://kisskb.ellerman.id.au/kisskb/head/10114/ (all 262 configs) > > [2] http://kisskb.ellerman.id.au/kisskb/head/10047/ (all 262 configs) > > > 9 error regressions: > > + /home/kisskb/slave/src/fs/xfs/xfs_ondisk.h: error: call to > > '__compiletime_assert_79' declared with attribute error: XFS: > > sizeof(xfs_attr_shortform_t) is wrong, expected 8: => 79:2 > > cris-allyesconfig, cris-allmodconfig > > > + error: smp-shx3.c: undefined reference to `local_timer_setup': => > > .text+0xadec) > > shx3_defconfig Thanks for catching this. I've prepared a patch and I'm checking whether it fixes the problem. Rich From bfoster@redhat.com Mon Mar 28 03:55:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1C40A7CA0 for ; Mon, 28 Mar 2016 03:55:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E2D20304032 for ; Mon, 28 Mar 2016 01:55:46 -0700 (PDT) X-ASG-Debug-ID: 1459155344-04cbb07ad68d890001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id s89mSB50V0YsrBv5 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 28 Mar 2016 01:55: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-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 7CFB471085; Mon, 28 Mar 2016 08:55:44 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-6.bos.redhat.com [10.18.41.6]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2S8thgL000920; Mon, 28 Mar 2016 04:55:44 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 45D7B1205DF; Mon, 28 Mar 2016 04:55:43 -0400 (EDT) Date: Mon, 28 Mar 2016 04:55:43 -0400 From: Brian Foster To: Andrew Ryder Cc: xfs@oss.sgi.com Subject: Re: xfs_repair fails after trying to format log cycle? Message-ID: <20160328085541.GA27040@bfoster.bfoster> X-ASG-Orig-Subj: Re: xfs_repair fails after trying to format log cycle? References: <56F6DE67.60403@shaw.ca> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56F6DE67.60403@shaw.ca> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Mon, 28 Mar 2016 08:55:44 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1459155345 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sat, Mar 26, 2016 at 03:09:27PM -0400, Andrew Ryder wrote: > Hello, > > I have an mdadm array with a xfs v5 filesystem on it and its begun to give > me issues when trying to mount it as well as complete xfs_repair. Not sure > if anyone might be able to shed some light on what is going on or how to > correct the issue? > > When I try and mount the fs, it complains with: > > [ 388.479847] XFS (md2): Mounting V5 Filesystem > [ 388.494686] XFS (md2): metadata I/O error: block 0x15d6d39c0 > ("xlog_bread_noalign") error 5 numblks 8192 > [ 388.495013] XFS (md2): failed to find log head > [ 388.495018] XFS (md2): log mount/recovery failed: error -5 > [ 388.495090] XFS (md2): log mount failed > So a read I/O error from the kernel... > > This is where its not making any sense for me, If I try and run "xfs_repair > /dev/md2" it fails with: > > Phase 1 - find and verify superblock... > - reporting progress in intervals of 15 minutes > Phase 2 - using internal log > - zero log... > xfs_repair: read failed: Input/output error > failed to find log head > zero_log: cannot find log head/tail (xlog_find_tail=-5) > > fatal error -- ERROR: The log head and/or tail cannot be discovered. Attempt > to mount the > filesystem to replay the log or use the -L option to destroy the log and > attempt a repair. > ... similar read error from xfsprogs... > > But if I run "xfs_repair -L /dev/md2" which gives: > > Phase 1 - find and verify superblock... > - reporting progress in intervals of 15 minutes > Phase 2 - using internal log > - zero log... > xfs_repair: read failed: Input/output error > failed to find log head > zero_log: cannot find log head/tail (xlog_find_tail=-5) > xfs_repair: libxfs_device_zero write failed: Input/output error > ... and it looks like it fails to write as well when trying to zero the log... > then try and re-run "xfs_repair /dev/md2" it starts traversing the > filesystem all the way to "Phase 7" then errors with: > > Phase 7 - verify and correct link counts... > - 14:36:55: verify and correct link counts - 33 of 33 allocation > groups done > Maximum metadata LSN (64:2230592) is ahead of log (0:0). > Format log to cycle 67. > xfs_repair: libxfs_device_zero write failed: Input/output error > > > Yet at this point I can now mount the filesystem.. > ... and this is effectively a repeat of the write error as we try to format the log with a correct LSN based on the metadata LSN tracked by the repair process. Your kernel is old enough that runtime probably won't complain either way (note that 3.19 might be considered a fairly early kernel for using CRC support). Perhaps the first write attempt zeroed enough of the log before it failed that log recovery wasn't required, and thus these problematic I/Os were avoided. What's the history of this fs? Has it been working for some time, just recently formatted? What lead to the need for log recovery? What's the mdadm --detail info, member device size, total array size, xfs_info of the filesystem, etc..? Does xfs_repair run clean at this point? If so, does 'xfs_repair -L' still reproduce the write error (note that I'm assuming you have a clean log such that this command will not cause data loss). If so, an strace of the repair process might be interesting... Brian > > Checking the drives with smartctl shows no errors nor does 'dmesg' show any > hardware i/o or controller related errors... > > I've tried scrubbing the array and no bad sectors are found either.. > > I'm running kernel 3.19.8 with xfsprogs 4.5. > > Thanks, > Andrew > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From vydijirabe@korea.com Mon Mar 28 05:20:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 2BAC67CA0 for ; Mon, 28 Mar 2016 05:20:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9DFA8304032 for ; Mon, 28 Mar 2016 03:20:17 -0700 (PDT) X-ASG-Debug-ID: 1459160408-04bdf0110538e10001-NocioJ Received: from r-smtp6.korea.com (k154-31-240-91.szybszyinternet.pl [91.240.31.154]) by cuda.sgi.com with ESMTP id JbqpjGVwOZH6Weje for ; Mon, 28 Mar 2016 03:20:09 -0700 (PDT) X-Barracuda-Envelope-From: vydijirabe@korea.com X-Barracuda-Apparent-Source-IP: 91.240.31.154 Message-ID: From: "=?utf-8?B?0J/QvtCy0YvRiNC10L3QuNC1INC60L7QvdC60YPRgNC10L3RgtC+0YHQv9C+0YHQvtCx0L3QvtGB0YLQuA==?=" To: Subject: =?utf-8?B?0JrQvtC90LrRg9GA0LXQvdGC0L3QsNGPINGA0LDQt9Cy0LXQtNC60LAuINCa0LDQuiDRgNCw0YHQv9C+0LfQvdCw0LLQsNGC0Ywg0LLQvdC10YjQvdC40LUg0YDQuNGB0LrQuC4=?= Date: Mon, 28 Mar 2016 13:20:08 +0300 X-ASG-Orig-Subj: =?utf-8?B?0JrQvtC90LrRg9GA0LXQvdGC0L3QsNGPINGA0LDQt9Cy0LXQtNC60LAuINCa0LDQuiDRgNCw0YHQv9C+0LfQvdCw0LLQsNGC0Ywg0LLQvdC10YjQvdC40LUg0YDQuNGB0LrQuC4=?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0098_01D188F4.8CCB5A70" 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: k154-31-240-91.szybszyinternet.pl[91.240.31.154] X-Barracuda-Start-Time: 1459160408 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28232 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message Ýòî — ñîîáùåíèå èç íåñêîëüêèõ ÷àñòåé â ôîðìàòå MIME. ------=_NextPart_000_0098_01D188F4.8CCB5A70 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable =20 =20 7 =D0=B0=D0=BF=D1=80=D0=B5=D0=BB=D1=8F | =D0=B3. = =D0=9C=D0=BE=D1=81=D0=BA=D0=B2=D0=B0 =D0=A3=D1=87=D0=B5=D0=B1=D0=BD=D1=8B=D0=B9 = =D1=86=D0=B5=D0=BD=D1=82=D1=80 = =D0=BF=D1=80=D0=B8=D0=B3=D0=BB=D0=B0=D1=88=D0=B0=D0=B5=D1=82 = =D0=BD=D0=B0 =D0=BE=D0=B1=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B5: = =D0=9A=D0=9E=D0=9D=D0=9A=D0=A3=D0=A0=D0=95=D0=9D=D0=A2=D0=9D=D0=90=D0=AF = =D0=A0=D0=90=D0=97=D0=92=D0=95=D0=94=D0=9A=D0=90:=20 =D0=90=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7 = =D0=B1=D0=B5=D0=B7=D0=BE=D0=BF=D0=B0=D1=81=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=B4=D0=B5=D0=BB=D0=BE=D0=B2=D1=8B=D1=85 = =D0=BF=D1=80=D0=B5=D0=B4=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D0=B9 = =D0=B8=20 = =D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=B0=D0=BA=D1=82=D0=BE=D0=B2. = =D0=90=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7 = =D1=84=D0=B8=D0=BD=D0=B0=D0=BD=D1=81=D0=BE=D0=B2=D0=BE=D0=B9 = =D1=83=D1=81=D1=82=D0=BE=D0=B9=D1=87=D0=B8=D0=B2=D0=BE=D1=81=D1=82=D0=B8 = =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D0=B8. =D0=9F=D1=80=D0=BE=D0=BC=D0=BE=D0=BA=D0=BE=D0=B4 : 358 =D0=9E=D0=B1=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=B4=D0=BB=D1=8F: = =D1=80=D1=83=D0=BA=D0=BE=D0=B2=D0=BE=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D0=B5=D0= =B9 =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D0=B9, = =D1=80=D1=83=D0=BA=D0=BE=D0=B2=D0=BE=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D0=B5=D0= =B9 =D0=B8 = =D1=81=D0=BE=D1=82=D1=80=D1=83=D0=B4=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2 = =D0=A1=D0=BB=D1=83=D0=B6=D0=B1 = =D0=B1=D0=B5=D0=B7=D0=BE=D0=BF=D0=B0=D1=81=D0=BD=D0=BE=D1=81=D1=82=D0=B8,= =20 =D0=BC=D0=B5=D0=BD=D0=B5=D0=B4=D0=B6=D0=B5=D1=80=D0=BE=D0=B2 = =D0=B2=D1=8B=D1=81=D1=88=D0=B5=D0=B3=D0=BE =D0=B8 = =D1=81=D1=80=D0=B5=D0=B4=D0=BD=D0=B5=D0=B3=D0=BE = =D0=B7=D0=B2=D0=B5=D0=BD=D0=B0, =D0=B2 =D1=87=D1=8C=D0=B8 = =D0=B4=D0=BE=D0=BB=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D0=BD=D1=8B=D0=B5 = =D0=BE=D0=B1=D1=8F=D0=B7=D0=B0=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=B2=D1=85=D0=BE=D0=B4=D0=B8=D1=82 = =D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=B2=D0=BE=D0=BF=D1=80=D0=BE=D1=81=D0=BE=D0=B2=20 = =D0=B1=D0=B5=D0=B7=D0=BE=D0=BF=D0=B0=D1=81=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=B1=D0=B8=D0=B7=D0=BD=D0=B5=D1=81=D0=B0. =D0=92 = =D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0=D1=82=D0=B5 = =D0=BE=D0=B1=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F =D0=92=D1=8B: - =D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B8=D1=82=D0=B5 = =D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D0=BD=D1=8B=D0=B5 = =D0=B7=D0=BD=D0=B0=D0=BD=D0=B8=D1=8F =D0=BF=D0=BE = =D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=D0=B0=D0=BC = =D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F = =D0=BF=D0=BE=D0=B4=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D1= =8F = =D0=BA=D0=BE=D0=BD=D0=BA=D1=83=D1=80=D0=B5=D0=BD=D1=82=D0=BD=D0=BE=D0=B9 = =D1=80=D0=B0=D0=B7=D0=B2=D0=B5=D0=B4=D0=BA=D0=B8,=20 =D0=BF=D0=BE=D1=80=D1=8F=D0=B4=D0=BA=D1=83 = =D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F = =D0=BA=D0=BE=D0=BD=D0=BA=D1=83=D1=80=D0=B5=D0=BD=D1=82=D0=BD=D0=BE=D0=B9 = =D1=80=D0=B0=D0=B7=D0=B2=D0=B5=D0=B4=D0=BA=D0=B8 =D0=B2 = =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D0=B8, = =D1=81=D0=BF=D0=BE=D1=81=D0=BE=D0=B1=D0=B0=D0=BC =D0=B8 = =D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0=D0=BC = =D1=81=D0=B1=D0=BE=D1=80=D0=B0 =D0=B8 = =D0=B0=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=20 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8; - = =D1=83=D1=81=D0=BE=D0=B2=D0=B5=D1=80=D1=88=D0=B5=D0=BD=D1=81=D1=82=D0=B2=D1= =83=D0=B5=D1=82=D0=B5 = =D0=BF=D1=80=D0=B0=D0=BA=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B5 = =D0=BD=D0=B0=D0=B2=D1=8B=D0=BA=D0=B8 = =D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D0= =BE-=D0=B0=D0=BD=D0=B0=D0=BB=D0=B8=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0= =BE=D0=B9 =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B =D0=BF=D0=BE=20 = =D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D1=8E = =D1=84=D0=B8=D0=BD=D0=B0=D0=BD=D1=81=D0=BE=D0=B2=D0=BE=D0=B9 = =D1=83=D1=81=D1=82=D0=BE=D0=B9=D1=87=D0=B8=D0=B2=D0=BE=D1=81=D1=82=D0=B8 = =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D0=B8 =D0=BD=D0=B0 = =D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=B5 = =D0=BF=D1=80=D0=B5=D0=B4=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D1=8F=D0=B5=D0=BC=D1= =8B=D1=85 =D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=B2. = =C2=AB=C2=AB=C2=BB=C2=BB=C2=AB=C2=AB=C2=BB=C2=BB=C2=AB=C2=AB=C2=BB=C2=BB=C2= =AB=C2=AB=C2=BB=C2=BB=C2=AB=C2=AB=C2=BB=C2=BB=C2=AB=C2=AB=C2=BB=C2=BB=C2=AB= =C2=AB=C2=BB=C2=BB=C2=AB=C2=AB=C2=BB=C2=BB=C2=AB=C2=AB=C2=BB=C2=BB=C2=AB=C2= =AB=C2=BB=C2=BB=C2=AB=C2=AB=C2=BB=C2=BB=C2=AB=C2=AB=C2=BB=C2=BB =D0=9E=D0=B1=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=BF=D1=80=D0=BE=D0=B2=D0=BE=D0=B4=D0=B8=D1=82=D1=81=D1=8F: =D1=81 10:00 =D0=B4=D0=BE 17:30 = =D0=9C=D0=B5=D1=80=D0=BE=D0=BF=D1=80=D0=B8=D1=8F=D1=82=D0=B8=D0=B5 = =D1=81=D0=BE=D1=81=D1=82=D0=BE=D0=B8=D1=82=D1=81=D1=8F =D0=BF=D0=BE = =D0=B0=D0=B4=D1=80=D0=B5=D1=81=D1=83:=20 =D0=BC. = =D0=91=D0=B0=D1=83=D0=BC=D0=B0=D0=BD=D1=81=D0=BA=D0=B0=D1=8F, = =D1=83=D0=BB. = =D0=91=D0=B0=D1=83=D0=BC=D0=B0=D0=BD=D1=81=D0=BA=D0=B0=D1=8F, =D0=B4.6, = =D1=81=D1=82=D1=80.2, =D0=91.=D0=A6. = "=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D1=8F = =D0=9F=D0=BB=D0=B0=D0=B7=D0=B0" =D0=A3=D0=B7=D0=BD=D0=B0=D1=82=D1=8C =D0=B2=D1=81=D1=8E = =D0=BF=D0=BE=D0=B4=D1=80=D0=BE=D0=B1=D0=BD=D1=83=D1=8E = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D1=8E =D0=B8 = =D0=B7=D0=B0=D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B8=D1=80=D0=BE=D0= =B2=D0=B0=D1=82=D1=8C=D1=81=D1=8F =D0=92=D1=8B = =D0=BC=D0=BE=D0=B6=D0=B5=D1=82=D0=B5 =D0=BF=D0=BE = =D1=83=D0=BA=D0=B0=D0=B7=D0=B0=D0=BD=D0=BD=D0=BE=D0=BC=D1=83 = =D0=BD=D0=BE=D0=BC=D0=B5=D1=80=D1=83:=20 8 =D0=BA=D0=BE=D0=B4 =D0=B3=D0=BE=D1=80=D0=BE=D0=B4=D0=B0 = (495) =D1=82=D0=B5=D0=BB=D0=B5=D1=84=D0=BE=D0=BD 961 - 00 - 38 = (=D0=BC=D0=BD=D0=BE=D0=B3=D0=BE=D0=BA=D0=B0=D0=BD=D0=B0=D0=BB=D1=8C=D0=BD= =D1=8B=D0=B9) =20 =20 =D0=A1=D0=BE=D0=B4=D0=B5=D1=80=D0=B6=D0=B0=D0=BD=D0=B8=D0=B5 = =D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D1=8B = =D0=BE=D0=B1=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F: =20 1. =D0=9E=D1=81=D0=BD=D0=BE=D0=B2=D0=BD=D1=8B=D0=B5 = =D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B8 = =D0=BA=D0=BE=D0=BD=D0=BA=D1=83=D1=80=D0=B5=D0=BD=D1=82=D0=BD=D0=BE=D0=B9 = =D1=80=D0=B0=D0=B7=D0=B2=D0=B5=D0=B4=D0=BA=D0=B8. = =D0=97=D0=B0=D0=BA=D0=BE=D0=BD=D0=BE=D0=B4=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D1= =81=D1=82=D0=B2=D0=BE = =D0=A0=D0=BE=D1=81=D1=81=D0=B8=D0=B9=D1=81=D0=BA=D0=BE=D0=B9 = =D0=A4=D0=B5=D0=B4=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B8 =D0=BE=D0=B1=20 =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8, = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1= =8B=D1=85 = =D1=82=D0=B5=D1=85=D0=BD=D0=BE=D0=BB=D0=BE=D0=B3=D0=B8=D1=8F=D1=85 = =D0=B8 =D0=B7=D0=B0=D1=89=D0=B8=D1=82=D0=B5 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8. = =D0=9A=D0=BE=D0=BD=D1=81=D1=82=D0=B8=D1=82=D1=83=D1=86=D0=B8=D0=BE=D0=BD=D0= =BD=D0=BE=D0=B5 =D0=BF=D1=80=D0=B0=D0=B2=D0=BE =D0=BD=D0=B0=20 =D1=81=D0=B1=D0=BE=D1=80 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8 = =D0=BB=D1=8E=D0=B1=D1=8B=D0=BC=D0=B8 = =D0=B7=D0=B0=D0=BA=D0=BE=D0=BD=D0=BD=D1=8B=D0=BC=D0=B8 = =D1=81=D0=BF=D0=BE=D1=81=D0=BE=D0=B1=D0=B0=D0=BC=D0=B8. = =D0=90=D1=83=D1=82=D1=81=D0=BE=D1=80=D1=81=D0=B8=D0=BD=D0=B3 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D0= =BE-=D0=B0=D0=BD=D0=B0=D0=BB=D0=B8=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0= =B8=D1=85=20 =D1=83=D1=81=D0=BB=D1=83=D0=B3. = =D0=9F=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B5 = =D1=81=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D0=B9 =D0=B8=D0=B7 = =D1=81=D1=80=D0=B5=D0=B4=D1=81=D1=82=D0=B2 = =D0=BC=D0=B0=D1=81=D1=81=D0=BE=D0=B2=D0=BE=D0=B9 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8. = =D0=9E=D1=81=D0=BE=D0=B1=D0=B5=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20 =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8 = =D0=B8=D0=B7 = =D0=B4=D0=B5=D1=82=D0=B5=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D1=8B=D1=85 = =D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D1=81=D1=82=D0=B2. 2. =D0=A1=D0=BF=D0=BE=D1=81=D0=BE=D0=B1=D1=8B = =D1=81=D0=B1=D0=BE=D1=80=D0=B0 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8. = =D0=A1=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D0=B0=D1=82=D0=B8=D0=B7=D0=B0=D1=86=D0= =B8=D1=8F =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B =D0=BF=D0=BE = =D1=81=D0=B1=D0=BE=D1=80=D1=83 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8 =D0=BE = =D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D0=B5.=20 =D0=98=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D1=8F, = =D0=BF=D1=80=D0=B5=D0=B4=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D1=8F=D0=B5=D0=BC=D0= =B0=D1=8F =D1=81=D0=B0=D0=BC=D0=B8=D0=BC = =D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D0=BE=D0=BC.= =D0=9F=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8 =D1=81 = =D1=81=D0=B0=D0=B9=D1=82=D0=B0=20 = =D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D0=B0. 3. =D0=9F=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=BE=D1=84=D0=B8=D1=86=D0=B8=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B9 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8 = =D0=B8=D0=B7 = =D0=B3=D0=BE=D1=81=D1=83=D0=B4=D0=B0=D1=80=D1=81=D1=82=D0=B2=D0=B5=D0=BD=D0= =BD=D1=8B=D1=85 =D0=BE=D1=80=D0=B3=D0=B0=D0=BD=D0=BE=D0=B2 =D0=B8 = =D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0= =BD=D1=8B=D1=85=20 = =D0=BE=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B9. = =D0=9E=D0=B1=D0=B7=D0=BE=D1=80 = =D0=BE=D1=84=D0=B8=D1=86=D0=B8=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D1=85 = =D1=81=D0=B0=D0=B9=D1=82=D0=BE=D0=B2 = =D0=B3=D0=BE=D1=81=D1=83=D0=B4=D0=B0=D1=80=D1=81=D1=82=D0=B2=D0=B5=D0=BD=D0= =BD=D1=8B=D1=85 =D0=BE=D1=80=D0=B3=D0=B0=D0=BD=D0=BE=D0=B2 =D0=B8 = =D0=BF=D1=80=D0=B5=D0=B4=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=BD=D1= =8B=D1=85 =D0=BD=D0=B0 =D0=BD=D0=B8=D1=85=20 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1= =8B=D1=85 =D1=80=D0=B5=D1=81=D1=83=D1=80=D1=81=D0=BE=D0=B2. = =D0=98=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0= =B5 =D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D0=BD=D1=8B=D1=85 = =D0=BA=D0=BE=D0=BC=D0=BF=D0=BB=D0=B5=D0=BA=D1=81=D0=BE=D0=B2 = =D0=B4=D0=BB=D1=8F =D1=81=D0=B1=D0=BE=D1=80=D0=B0 =D0=B8 = =D0=B0=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=20 =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8 = (=D0=A1=D0=9F=D0=90=D0=A0=D0=9A, = =D0=98=D0=BD=D1=82=D0=B5=D0=B3=D1=80=D1=83=D0=BC =D0=B8 =D1=82.=D0=B4.). 4. =D0=9F=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=BD=D0=B5=D0=BE=D1=84=D0=B8=D1=86=D0=B8=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0= =B9 =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8. = =D0=A1=D0=B5=D1=80=D1=8B=D0=B5 =D0=B1=D0=B0=D0=B7=D1=8B = =D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85. = =D0=A1=D0=BF=D0=B5=D1=86=D0=B8=D0=B0=D0=BB=D0=B8=D0=B7=D0=B8=D1=80=D0=BE=D0= =B2=D0=B0=D0=BD=D0=BD=D1=8B=D0=B5 = =D1=80=D0=B5=D1=81=D1=83=D1=80=D1=81=D1=8B=20 =D0=BF=D0=BE =D0=BE=D1=82=D1=80=D0=B0=D1=81=D0=BB=D1=8F=D0=BC = =D0=B1=D0=B8=D0=B7=D0=BD=D0=B5=D1=81=D0=B0 =D0=B8 = =D1=82=D0=B5=D1=80=D1=80=D0=B8=D1=82=D0=BE=D1=80=D0=B8=D1=8F=D0=BC. = =D0=98=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0= =B5 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1= =8B=D1=85 =D1=80=D0=B5=D1=81=D1=83=D1=80=D1=81=D0=BE=D0=B2 = =D0=98=D0=BD=D1=82=D0=B5=D1=80=D0=BD=D0=B5=D1=82=D0=B0=20 =D0=B4=D0=BB=D1=8F =D0=B7=D0=B0=D0=B4=D0=B0=D1=87 = =D0=BA=D0=BE=D0=BD=D0=BA=D1=83=D1=80=D0=B5=D0=BD=D1=82=D0=BD=D0=BE=D0=B9 = =D1=80=D0=B0=D0=B7=D0=B2=D0=B5=D0=B4=D0=BA=D0=B8. = =D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D0=B0 =D0=B2 = =D1=87=D0=B0=D1=82=D0=B0=D1=85, =D0=B1=D0=BB=D0=BE=D0=B3=D0=B0=D1=85, = =D0=B6=D0=B8=D0=B2=D1=8B=D1=85 = =D0=B6=D1=83=D1=80=D0=BD=D0=B0=D0=BB=D0=B0=D1=85 =D0=B8 = =D0=B8=D0=BD=D1=8B=D1=85=20 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1= =8B=D1=85 =D0=BC=D0=B0=D1=81=D1=81=D0=B8=D0=B2=D0=B0=D1=85. = =D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D0=B0 =D1=81 = =D0=BD=D0=B5=D0=B2=D0=B8=D0=B4=D0=B8=D0=BC=D0=BE=D0=B9 = =D1=87=D0=B0=D1=81=D1=82=D1=8C=D1=8E = =D0=98=D0=BD=D1=82=D0=B5=D1=80=D0=BD=D0=B5=D1=82=D0=B0 = (=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D0=BD=D0=B5=D1=82 = =D1=80=D0=B0=D0=B7=D0=B2=D0=B5=D0=B4=D0=BA=D0=B0). 5. = =D0=9C=D0=B5=D0=B6=D0=B4=D1=83=D0=BD=D0=B0=D1=80=D0=BE=D0=B4=D0=BD=D1=8B=D0= =B5 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1= =8B=D0=B5 =D1=80=D0=B5=D1=81=D1=83=D1=80=D1=81=D1=8B =D0=B4=D0=BB=D1=8F = =D1=81=D0=B1=D0=BE=D1=80=D0=B0 =D0=B8 = =D0=B0=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8 = =D0=BF=D0=BE = =D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D1=83.=20 =D0=A1=D0=B1=D0=BE=D1=80 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8 = =D0=BF=D0=BE =D0=BE=D1=84=D1=84=D1=88=D0=BE=D1=80=D0=B0=D0=BC. = =D0=A1=D0=BF=D0=BE=D1=81=D0=BE=D0=B1=D1=8B = =D0=B2=D1=8B=D1=87=D0=B8=D1=81=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=BA=D0=BE=D0=BD=D0=B5=D1=87=D0=BD=D0=BE=D0=B3=D0=BE = =D0=B1=D0=B5=D0=BD=D0=B5=D1=84=D0=B8=D1=86=D0=B8=D0=B0=D1=80=D0=B0. 6. =D0=A1=D0=B1=D0=BE=D1=80 = =D1=81=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D0=B9 = =D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=82=D0=B8=D0=B2=D0=BD=D1=8B=D0=BC=D0=B8 = =D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0=D0=BC=D0=B8. = =D0=91=D0=B5=D1=81=D0=B5=D0=B4=D1=8B =D1=81 = =D1=81=D0=BE=D1=82=D1=80=D1=83=D0=B4=D0=BD=D0=B8=D0=BA=D0=B0=D0=BC=D0=B8 = =D0=B8 =D0=B8=D0=BD=D1=8B=D0=B5 = =D1=81=D0=BF=D0=BE=D1=81=D0=BE=D0=B1=D1=8B = =D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20 =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8, = =D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D1=83=D1=8F = "=D1=87=D0=B5=D0=BB=D0=BE=D0=B2=D0=B5=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B9= =D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80". = =D0=9C=D0=BE=D1=82=D0=B8=D0=B2=D0=B0=D1=86=D0=B8=D1=8F = =D1=87=D0=B5=D0=BB=D0=BE=D0=B2=D0=B5=D0=BA=D0=B0 =D0=BD=D0=B0 = =D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B0=D1=87=D1=83=20 = (=D1=80=D0=B0=D0=B7=D0=B3=D0=BB=D0=B0=D1=88=D0=B5=D0=BD=D0=B8=D0=B5) = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8. = =D0=92=D0=B8=D0=B7=D1=83=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B5 = =D0=BD=D0=B0=D0=B1=D0=BB=D1=8E=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5, = =D0=BE=D1=81=D0=BC=D0=BE=D1=82=D1=80 = =D0=BF=D0=BE=D0=BC=D0=B5=D1=89=D0=B5=D0=BD=D0=B8=D0=B9 =D0=B8 = =D0=BC=D0=B5=D1=81=D1=82=D0=BD=D0=BE=D1=81=D1=82=D0=B8. 7. =D0=9C=D0=B5=D1=82=D0=BE=D0=B4=D1=8B = =D0=B0=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8. = =D0=9E=D0=B1=D0=B7=D0=BE=D1=80 = =D0=B0=D0=B2=D1=82=D0=BE=D0=BC=D0=B0=D1=82=D0=B8=D0=B7=D0=B8=D1=80=D0=BE=D0= =B2=D0=B0=D0=BD=D0=BD=D1=8B=D1=85 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1= =8B=D1=85 =D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC (=D0=90=D0=98=D0=A1),=20 =D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D0=BD=D1=8F=D0=B5=D0=BC=D1=8B=D1=85 = =D0=BD=D0=B0 = =D0=BF=D1=80=D0=B5=D0=B4=D0=BF=D1=80=D0=B8=D1=8F=D1=82=D0=B8=D1=8F=D1=85.= =D0=A7=D1=82=D0=BE =D0=BC=D0=BE=D0=B6=D0=B5=D1=82 =D0=B8 = =D0=B4=D0=BB=D1=8F =D1=87=D0=B5=D0=B3=D0=BE = =D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D1=83=D1=8E=D1=82=D1=81=D1=8F = =D0=90=D0=98=D0=A1. = =D0=9F=D1=80=D0=B8=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=90=D0=98=D0=A1=20 =D0=B4=D0=BB=D1=8F = =D1=84=D0=B8=D0=BD=D0=B0=D0=BD=D1=81=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE = =D0=B0=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0 = =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D0=B8. = =D0=A4=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5 = =D0=BA=D0=BE=D1=80=D0=BF=D0=BE=D1=80=D0=B0=D1=82=D0=B8=D0=B2=D0=BD=D1=8B=D1= =85 =D0=B1=D0=B0=D0=B7 =D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85. 8. =D0=90=D0=BB=D0=B3=D0=BE=D1=80=D0=B8=D1=82=D0=BC = =D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F = =D0=BD=D0=B0=D0=B4=D0=B5=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D0=BE=D0=B2 = =E2=80=93 = =D1=8E=D1=80=D0=B8=D0=B4=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D1=85 = =D0=B8 =D1=84=D0=B8=D0=B7=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D1=85 = =D0=BB=D0=B8=D1=86.=20 = =D0=A4=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5 = =D0=BC=D0=B0=D1=82=D1=80=D0=B8=D1=86=D1=8B = =D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8 = =D0=BE=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8 = =D0=B2 = =D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D0=B8 = =D0=BE=D1=82 =D1=81=D1=83=D0=BC=D0=BC=D1=8B = =D1=81=D0=B4=D0=B5=D0=BB=D0=BA=D0=B8, = =D0=BF=D1=80=D0=B5=D0=B4=D0=BE=D0=BF=D0=BB=D0=B0=D1=82=D0=B5 =D0=B8=20 =D0=B8=D0=BD=D1=8B=D1=85 = =D1=83=D1=81=D0=BB=D0=BE=D0=B2=D0=B8=D0=B9. = =D0=9F=D1=80=D0=B8=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0 Due Diligence =D0=BF=D1=80=D0=B8 = =D0=BE=D1=86=D0=B5=D0=BD=D0=BA=D0=B5 = =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D0=B8. 9. =D0=9E=D1=86=D0=B5=D0=BD=D0=BA=D0=B0 = =D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D0=B0 = =D1=81 =D0=BF=D0=BE=D0=B7=D0=B8=D1=86=D0=B8=D0=B8 = =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=D1=8B=D1=85 = =D1=80=D0=B8=D1=81=D0=BA=D0=BE=D0=B2. = =D0=9F=D0=BE=D0=BD=D1=8F=D1=82=D0=B8=D0=B5 = "=D0=B4=D0=BE=D0=BB=D0=B6=D0=BD=D0=B0=D1=8F = =D0=BE=D1=81=D0=BC=D0=BE=D1=82=D1=80=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0= =BE=D1=81=D1=82=D1=8C" =D0=BF=D1=80=D0=B8=20 = =D0=B2=D0=B7=D0=B0=D0=B8=D0=BC=D0=BE=D0=BE=D1=82=D0=BD=D0=BE=D1=88=D0=B5=D0= =BD=D0=B8=D1=8F=D1=85 =D1=81 = =D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D0=B0=D0=BC=D0= =B8. = =D0=9A=D0=BE=D1=80=D1=80=D1=83=D0=BF=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1=8B=D0= =B5 =D1=80=D0=B8=D1=81=D0=BA=D0=B8. =D0=A3=D0=B3=D1=80=D0=BE=D0=B7=D0=B0 = =D0=BA=D0=BE=D0=BD=D1=84=D0=BB=D0=B8=D0=BA=D1=82=D0=B0 = =D0=B8=D0=BD=D1=82=D0=B5=D1=80=D0=B5=D1=81=D0=BE=D0=B2 =D0=B8=20 = =D0=B0=D1=84=D1=84=D0=B8=D0=BB=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D0= =BE=D1=81=D1=82=D0=B8 = =D1=81=D0=BE=D1=82=D1=80=D1=83=D0=B4=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2 = =D1=81 = =D0=BF=D1=80=D0=B5=D0=B4=D1=81=D1=82=D0=B0=D0=B2=D0=B8=D1=82=D0=B5=D0=BB=D1= =8F=D0=BC=D0=B8 = =D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D0=B0. 10. =D0=90=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7 = =D1=83=D1=87=D1=80=D0=B5=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D1= =85 =D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=B2 = =D0=BE=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8 = =D1=81 =D0=BF=D0=BE=D0=B7=D0=B8=D1=86=D0=B8=D0=B8 = =D0=B1=D0=B5=D0=B7=D0=BE=D0=BF=D0=B0=D1=81=D0=BD=D0=BE=D1=81=D1=82=D0=B8.= =D0=90=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7 = =D0=B0=D1=82=D1=80=D0=B8=D0=B1=D1=83=D1=82=D0=BE=D0=B2 =D0=B8=20 =D1=84=D0=B8=D1=80=D0=BC=D0=B5=D0=BD=D0=BD=D0=BE=D0=B3=D0=BE = =D1=81=D1=82=D0=B8=D0=BB=D1=8F. =D0=9E=D1=86=D0=B5=D0=BD=D0=BA=D0=B0 = =D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=BA=D1=80=D0=B8=D0=B7=D0=B8=D1=81=D0=BD=D1=8B=D1=85 = =D1=81=D0=B8=D1=82=D1=83=D0=B0=D1=86=D0=B8=D0=B9 =D0=B2 = =D0=B4=D0=B5=D1=8F=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D0=B8 =D0=BD=D0=B0=20 =D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=B5 = =D1=81=D1=82=D0=B0=D1=82=D0=B8=D1=81=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0= =B8=D1=85 =D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=BE=D0=B2. = =D0=9F=D1=80=D0=B8=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=BD=D0=B0 =D0=BF=D1=80=D0=B0=D0=BA=D1=82=D0=B8=D0=BA=D0=B5 = =D1=8D=D0=BC=D0=BF=D0=B8=D1=80=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D1=85 = =D0=B7=D0=B0=D0=BA=D0=BE=D0=BD=D0=BE=D0=B2. 11. =D0=A2=D0=B8=D0=BF=D1=8B = =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D0=B9, = =D0=BF=D1=80=D0=B5=D1=81=D0=BB=D0=B5=D0=B4=D1=83=D1=8E=D1=89=D0=B8=D0=B5 = =D0=BF=D1=80=D0=BE=D1=82=D0=B8=D0=B2=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=BD=D1= =8B=D0=B5 =D1=86=D0=B5=D0=BB=D0=B8. = =D0=9F=D1=80=D0=BE=D0=B3=D0=BD=D0=BE=D0=B7=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0= =BD=D0=B8=D0=B5 = =D0=BD=D0=B0=D0=B4=D0=B5=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20 =D0=BE=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B9 = =D0=BD=D0=B0 =D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=B5 = "=D1=80=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B2=D1=8B=D1=85 = =D0=BF=D1=80=D0=B8=D0=B7=D0=BD=D0=B0=D0=BA=D0=BE=D0=B2 = =D0=BE=D0=BF=D0=B0=D1=81=D0=BD=D0=BE=D1=81=D1=82=D0=B8". = =D0=A4=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5 = =D1=80=D0=B5=D0=B9=D1=82=D0=B8=D0=BD=D0=B3=D0=BE=D0=B2=20 =D0=BD=D0=B0=D0=B4=D0=B5=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=BF=D0=B0=D1=80=D1=82=D0=BD=D0=B5=D1=80=D0=BE=D0=B2. 12. =D0=90=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7 = =D0=B1=D0=B5=D0=B7=D0=BE=D0=BF=D0=B0=D1=81=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D1=80=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D1=85 = =D0=BF=D1=80=D0=B5=D0=B4=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D0=B9 = =D0=B8 =D0=B4=D0=BE=D0=B3=D0=BE=D0=B2=D0=BE=D1=80=D0=BE=D0=B2. = =D0=98=D0=B7=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=B8=D0=BD=D0=B8=D1=86=D0=B8=D0=B0=D1=82=D0=BE=D1=80=D0=BE=D0=B2 = =D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0,=20 =D0=B8=D1=85 =D0=B8=D0=BD=D1=82=D0=B5=D1=80=D0=B5=D1=81=D1=8B = =D0=B8 =D0=B4=D0=B5=D0=BB=D0=BE=D0=B2=D1=83=D1=8E = =D1=80=D0=B5=D0=BF=D1=83=D1=82=D0=B0=D1=86=D0=B8=D1=8E. = =D0=92=D0=B5=D1=80=D0=B8=D1=84=D0=B8=D0=BA=D0=B0=D1=86=D0=B8=D1=8F = =D0=BF=D1=80=D0=B5=D0=B4=D1=81=D1=82=D0=B0=D0=B2=D0=B8=D1=82=D0=B5=D0=BB=D0= =B5=D0=B9. =D0=98=D0=B7=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=BC=D0=B5=D1=85=D0=B0=D0=BD=D0=B8=D0=B7=D0=BC=D0=B0=20 =D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F = =D0=BF=D1=80=D0=B8=D0=B1=D1=8B=D0=BB=D0=B8. = =D0=90=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7 = =D0=BF=D0=B5=D1=80=D0=B2=D0=BE=D0=B3=D0=BE = =D0=BA=D0=BE=D0=BD=D1=82=D0=B0=D0=BA=D1=82=D0=B0. = =D0=9F=D0=BE=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0= =B5 =D0=B0=D1=81=D0=BF=D0=B5=D0=BA=D1=82=D1=8B =D0=BF=D1=80=D0=B8 = =D0=B2=D1=8B=D1=8F=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B8=20 =D0=BD=D0=B5=D0=BD=D0=B0=D0=B4=D0=B5=D0=B6=D0=BD=D0=BE=D0=B3=D0=BE = =D0=BF=D0=B0=D1=80=D1=82=D0=BD=D0=B5=D1=80=D0=B0. =20 =C2=AB=C2=AB=C2=BB=C2=BB =C2=AB=C2=AB=C2=BB=C2=BB = =C2=AB=C2=AB=C2=BB=C2=BB =C2=AB=C2=AB=C2=BB=C2=BB = =C2=AB=C2=AB=C2=BB=C2=BB =C2=AB=C2=AB=C2=BB=C2=BB = =C2=AB=C2=AB=C2=BB=C2=BB =C2=AB=C2=AB=C2=BB=C2=BB = =C2=AB=C2=AB=C2=BB=C2=BB =C2=AB=C2=AB=C2=BB=C2=BB = =C2=AB=C2=AB=C2=BB=C2=BB =C2=AB=C2=AB=C2=BB=C2=BB =D0=A1=D1=82=D0=BE=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D1=8C = =D1=83=D1=87=D0=B0=D1=81=D1=82=D0=B8=D1=8F: 11 800 =D1=80=D1=83=D0=B1.=20 =D0=A1=D0=BAu=D0=B4=D0=BAu (=D0=BE=D1=82 2 = =D1=87=D0=B5=D0=BB=D0=BE=D0=B2=D0=B5=D0=BA=D0=B0 =E2=80=93 10%, 3 = =D1=87=D0=B5=D0=BB=D0=BE=D0=B2=D0=B5=D0=BA=D0=B0 =E2=80=93 15%, 4 = =D1=87=D0=B5=D0=BB=D0=BE=D0=B2=D0=B5=D0=BA=D0=B0 =D0=B8 = =D0=B1=D0=BE=D0=BB=D0=B5=D0=B5 =E2=80=93 20%.) =D0=92 = =D1=81=D1=82=D0=BE=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D1=8C = =D0=B2=D1=85=D0=BE=D0=B4=D0=B8=D1=82 = =D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B9 = =D0=BC=D0=B0=D1=82=D0=B5=D1=80=D0=B8=D0=B0=D0=BB, = =D0=BE=D0=B1=D0=B5=D0=B4=D1=8B, = =D0=BA=D0=BE=D1=84=D0=B5-=D0=BF=D0=B0=D1=83=D0=B7=D1=8B, = =D1=81=D0=B5=D1=80=D1=82=D0=B8=D1=84=D0=B8=D0=BA=D0=B0=D1=82. =20 =20 =20 ------=_NextPart_000_0098_01D188F4.8CCB5A70 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable
           


7 = =D0=B0=D0=BF=D1=80=D0=B5=D0=BB=D1=8F | =D0=B3.=20 =D0=9C=D0=BE=D1=81=D0=BA=D0=B2=D0=B0

=D0=A3=D1=87=D0=B5=D0=B1=D0=BD=D1=8B=D0=B9 = =D1=86=D0=B5=D0=BD=D1=82=D1=80=20 =D0=BF=D1=80=D0=B8=D0=B3=D0=BB=D0=B0=D1=88=D0=B0=D0=B5=D1=82 = =D0=BD=D0=B0 = =D0=BE=D0=B1=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B5:

=D0=9A=D0=9E=D0=9D=D0=9A=D0=A3=D0=A0=D0=95=D0=9D=D0=A2=D0=9D=D0=90= =D0=AF =D0=A0=D0=90=D0=97=D0=92=D0=95=D0=94=D0=9A=D0=90: 
=D0=90=D0=BD=D0=B0=D0=BB=D0= =B8=D0=B7 = =D0=B1=D0=B5=D0=B7=D0=BE=D0=BF=D0=B0=D1=81=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=B4=D0=B5=D0=BB=D0=BE=D0=B2=D1=8B=D1=85 = =D0=BF=D1=80=D0=B5=D0=B4=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D0=B9 = =D0=B8 
=D0=BA=D0=BE=D0=BD=D1=82=D1= =80=D0=B0=D0=BA=D1=82=D0=BE=D0=B2. =D0=90=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7=20 =D1=84=D0=B8=D0=BD=D0=B0=D0=BD=D1=81=D0=BE=D0=B2=D0=BE=D0=B9 = =D1=83=D1=81=D1=82=D0=BE=D0=B9=D1=87=D0=B8=D0=B2=D0=BE=D1=81=D1=82=D0=B8 = =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D0=B8.

=D0=9F=D1=80=D0=BE=D0=BC=D0=BE=D0=BA=D0=BE=D0=B4 : 358

=D0=9E=D0=B1=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=B4=D0=BB=D1=8F: =D1=80=D1=83=D0=BA=D0=BE=D0=B2= =D0=BE=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D0=B5=D0=B9 = =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D0=B9,=20 = =D1=80=D1=83=D0=BA=D0=BE=D0=B2=D0=BE=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D0=B5=D0= =B9 =D0=B8 = =D1=81=D0=BE=D1=82=D1=80=D1=83=D0=B4=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2 = =D0=A1=D0=BB=D1=83=D0=B6=D0=B1 = =D0=B1=D0=B5=D0=B7=D0=BE=D0=BF=D0=B0=D1=81=D0=BD=D0=BE=D1=81=D1=82=D0=B8,=  
=D0=BC=D0=B5=D0=BD=D0=B5=D0= =B4=D0=B6=D0=B5=D1=80=D0=BE=D0=B2 = =D0=B2=D1=8B=D1=81=D1=88=D0=B5=D0=B3=D0=BE =D0=B8=20 =D1=81=D1=80=D0=B5=D0=B4=D0=BD=D0=B5=D0=B3=D0=BE = =D0=B7=D0=B2=D0=B5=D0=BD=D0=B0, =D0=B2 =D1=87=D1=8C=D0=B8 = =D0=B4=D0=BE=D0=BB=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D0=BD=D1=8B=D0=B5 = =D0=BE=D0=B1=D1=8F=D0=B7=D0=B0=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=B2=D1=85=D0=BE=D0=B4=D0=B8=D1=82 = =D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5=20 =D0=B2=D0=BE=D0=BF=D1=80=D0=BE=D1=81=D0=BE=D0=B2 
=D0=B1=D0=B5=D0=B7=D0=BE=D0= =BF=D0=B0=D1=81=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20 = =D0=B1=D0=B8=D0=B7=D0=BD=D0=B5=D1=81=D0=B0.


=D0=92 = =D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0=D1=82=D0=B5 = =D0=BE=D0=B1=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20 =D0=92=D1=8B:

  - =D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B8=D1=82=D0=B5=20 =D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D0=BD=D1=8B=D0=B5 = =D0=B7=D0=BD=D0=B0=D0=BD=D0=B8=D1=8F =D0=BF=D0=BE = =D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=D0=B0=D0=BC = =D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F = =D0=BF=D0=BE=D0=B4=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D1= =8F = =D0=BA=D0=BE=D0=BD=D0=BA=D1=83=D1=80=D0=B5=D0=BD=D1=82=D0=BD=D0=BE=D0=B9 = =D1=80=D0=B0=D0=B7=D0=B2=D0=B5=D0=B4=D0=BA=D0=B8, 
    =D0=BF=D0=BE=D1=80=D1=8F=D0=B4=D0=BA=D1=83=20 =D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F = =D0=BA=D0=BE=D0=BD=D0=BA=D1=83=D1=80=D0=B5=D0=BD=D1=82=D0=BD=D0=BE=D0=B9 = =D1=80=D0=B0=D0=B7=D0=B2=D0=B5=D0=B4=D0=BA=D0=B8 =D0=B2 = =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D0=B8, = =D1=81=D0=BF=D0=BE=D1=81=D0=BE=D0=B1=D0=B0=D0=BC =D0=B8 = =D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0=D0=BC=20 =D1=81=D0=B1=D0=BE=D1=80=D0=B0 =D0=B8 = =D0=B0=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0 
     =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8= ;
  - =D1=83=D1=81=D0=BE=D0=B2=D0=B5=D1=80=D1=88=D0=B5=D0=BD=D1=81= =D1=82=D0=B2=D1=83=D0=B5=D1=82=D0=B5 = =D0=BF=D1=80=D0=B0=D0=BA=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B5 = =D0=BD=D0=B0=D0=B2=D1=8B=D0=BA=D0=B8 = =D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F=20 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D0= =BE-=D0=B0=D0=BD=D0=B0=D0=BB=D0=B8=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0= =BE=D0=B9 =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B =D0=BF=D0=BE 
  =  =20 = =D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D1=8E = =D1=84=D0=B8=D0=BD=D0=B0=D0=BD=D1=81=D0=BE=D0=B2=D0=BE=D0=B9 = =D1=83=D1=81=D1=82=D0=BE=D0=B9=D1=87=D0=B8=D0=B2=D0=BE=D1=81=D1=82=D0=B8 = =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D0=B8 =D0=BD=D0=B0 = =D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=B5=20 = =D0=BF=D1=80=D0=B5=D0=B4=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D1=8F=D0=B5=D0=BC=D1= =8B=D1=85 = =D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=B2.

=C2=AB=C2=AB=C2=BB=C2=BB=C2=AB=C2=AB=C2=BB=C2=BB=C2=AB=C2=AB=C2=BB=C2=BB=C2=AB=C2=AB=C2=BB=C2=BB=C2=AB=C2=AB=C2=BB=C2=BB=C2=AB=C2=AB=C2=BB=C2=BB=C2=AB=C2=AB=C2=BB=C2=BB=C2=AB=C2=AB=C2=BB=C2=BB=C2=AB=C2=AB=C2=BB=C2=BB=C2=AB=C2=AB=C2=BB=C2=BB=C2=AB=C2=AB=C2=BB=C2=BB=C2=AB=C2=AB=C2=BB=C2=BB

=D0=9E=D0=B1=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=BF=D1=80=D0=BE=D0=B2=D0=BE=D0=B4=D0=B8=D1=82=D1=81=D1=8F:
=D1=81 10:00 =D0=B4=D0=BE=20 17:30

=D0=9C=D0=B5=D1=80=D0=BE=D0=BF=D1=80=D0= =B8=D1=8F=D1=82=D0=B8=D0=B5 = =D1=81=D0=BE=D1=81=D1=82=D0=BE=D0=B8=D1=82=D1=81=D1=8F =D0=BF=D0=BE=20 =D0=B0=D0=B4=D1=80=D0=B5=D1=81=D1=83: 
=D0=BC.=20 = =D0=91=D0=B0=D1=83=D0=BC=D0=B0=D0=BD=D1=81=D0=BA=D0=B0=D1=8F, = =D1=83=D0=BB. = =D0=91=D0=B0=D1=83=D0=BC=D0=B0=D0=BD=D1=81=D0=BA=D0=B0=D1=8F, =D0=B4.6, = =D1=81=D1=82=D1=80.2, =D0=91.=D0=A6. = "=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D1=8F=20 = =D0=9F=D0=BB=D0=B0=D0=B7=D0=B0"

=D0=A3=D0=B7=D0=BD=D0=B0=D1=82=D1= =8C =D0=B2=D1=81=D1=8E = =D0=BF=D0=BE=D0=B4=D1=80=D0=BE=D0=B1=D0=BD=D1=83=D1=8E = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D1=8E =D0=B8=20 = =D0=B7=D0=B0=D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B8=D1=80=D0=BE=D0= =B2=D0=B0=D1=82=D1=8C=D1=81=D1=8F =D0=92=D1=8B = =D0=BC=D0=BE=D0=B6=D0=B5=D1=82=D0=B5 =D0=BF=D0=BE = =D1=83=D0=BA=D0=B0=D0=B7=D0=B0=D0=BD=D0=BD=D0=BE=D0=BC=D1=83 = =D0=BD=D0=BE=D0=BC=D0=B5=D1=80=D1=83: 
8  = =D0=BA=D0=BE=D0=B4 =D0=B3=D0=BE=D1=80=D0=BE=D0=B4=D0=B0 (495)  = =D1=82=D0=B5=D0=BB=D0=B5=D1=84=D0=BE=D0=BD 961 -=20 00 - 38 (=D0=BC=D0=BD=D0=BE=D0=B3=D0=BE= =D0=BA=D0=B0=D0=BD=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9)
 

=D0=A1=D0=BE=D0=B4=D0=B5=D1=80=D0=B6=D0=B0=D0=BD=D0=B8=D0=B5= =D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D1=8B=20 = =D0=BE=D0=B1=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F:

1. =D0=9E=D1=81=D0=BD=D0=BE=D0=B2=D0=BD=D1=8B=D0=B5 = =D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B8 = =D0=BA=D0=BE=D0=BD=D0=BA=D1=83=D1=80=D0=B5=D0=BD=D1=82=D0=BD=D0=BE=D0=B9 = =D1=80=D0=B0=D0=B7=D0=B2=D0=B5=D0=B4=D0=BA=D0=B8.=20 = =D0=97=D0=B0=D0=BA=D0=BE=D0=BD=D0=BE=D0=B4=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D1= =81=D1=82=D0=B2=D0=BE = =D0=A0=D0=BE=D1=81=D1=81=D0=B8=D0=B9=D1=81=D0=BA=D0=BE=D0=B9 = =D0=A4=D0=B5=D0=B4=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B8 =D0=BE=D0=B1 
=D0=B8=D0=BD=D1=84=D0=BE=D1= =80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8, = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1= =8B=D1=85=20 =D1=82=D0=B5=D1=85=D0=BD=D0=BE=D0=BB=D0=BE=D0=B3=D0=B8=D1=8F=D1=85 = =D0=B8 =D0=B7=D0=B0=D1=89=D0=B8=D1=82=D0=B5 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8. = =D0=9A=D0=BE=D0=BD=D1=81=D1=82=D0=B8=D1=82=D1=83=D1=86=D0=B8=D0=BE=D0=BD=D0= =BD=D0=BE=D0=B5 =D0=BF=D1=80=D0=B0=D0=B2=D0=BE =D0=BD=D0=B0 
=D1=81=D0=B1=D0=BE=D1=80 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8 = =D0=BB=D1=8E=D0=B1=D1=8B=D0=BC=D0=B8=20 =D0=B7=D0=B0=D0=BA=D0=BE=D0=BD=D0=BD=D1=8B=D0=BC=D0=B8 = =D1=81=D0=BF=D0=BE=D1=81=D0=BE=D0=B1=D0=B0=D0=BC=D0=B8. = =D0=90=D1=83=D1=82=D1=81=D0=BE=D1=80=D1=81=D0=B8=D0=BD=D0=B3 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D0= =BE-=D0=B0=D0=BD=D0=B0=D0=BB=D0=B8=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0= =B8=D1=85 
=D1=83=D1=81=D0=BB=D1=83=D0= =B3. =D0=9F=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B5 = =D1=81=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D0=B9 =D0=B8=D0=B7=20 =D1=81=D1=80=D0=B5=D0=B4=D1=81=D1=82=D0=B2 = =D0=BC=D0=B0=D1=81=D1=81=D0=BE=D0=B2=D0=BE=D0=B9 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8. = =D0=9E=D1=81=D0=BE=D0=B1=D0=B5=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B5 
=D0=B8=D0=BD=D1=84=D0=BE=D1= =80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8 =D0=B8=D0=B7 = =D0=B4=D0=B5=D1=82=D0=B5=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D1=8B=D1=85=20 =D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D1=81=D1=82=D0=B2.

2. =D0=A1=D0=BF=D0=BE=D1=81= =D0=BE=D0=B1=D1=8B =D1=81=D0=B1=D0=BE=D1=80=D0=B0 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8.=20 = =D0=A1=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D0=B0=D1=82=D0=B8=D0=B7=D0=B0=D1=86=D0= =B8=D1=8F =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B =D0=BF=D0=BE = =D1=81=D0=B1=D0=BE=D1=80=D1=83 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8 =D0=BE = =D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D0=B5. 
=D0=98=D0=BD=D1=84=D0=BE=D1= =80=D0=BC=D0=B0=D1=86=D0=B8=D1=8F, = =D0=BF=D1=80=D0=B5=D0=B4=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D1=8F=D0=B5=D0=BC=D0= =B0=D1=8F=20 =D1=81=D0=B0=D0=BC=D0=B8=D0=BC = =D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D0=BE=D0=BC.= =D0=9F=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8 =D1=81 = =D1=81=D0=B0=D0=B9=D1=82=D0=B0 
=D0=BA=D0=BE=D0=BD=D1=82=D1= =80=D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D0=B0.

3. =D0=9F=D0=BE=D0=BB=D1=83= =D1=87=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=BE=D1=84=D0=B8=D1=86=D0=B8=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B9=20 =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8 = =D0=B8=D0=B7 = =D0=B3=D0=BE=D1=81=D1=83=D0=B4=D0=B0=D1=80=D1=81=D1=82=D0=B2=D0=B5=D0=BD=D0= =BD=D1=8B=D1=85 =D0=BE=D1=80=D0=B3=D0=B0=D0=BD=D0=BE=D0=B2 =D0=B8 = =D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0= =BD=D1=8B=D1=85 
=D0=BE=D1=80=D0=B3=D0=B0=D0= =BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B9. =D0=9E=D0=B1=D0=B7=D0=BE=D1=80=20 =D0=BE=D1=84=D0=B8=D1=86=D0=B8=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D1=85 = =D1=81=D0=B0=D0=B9=D1=82=D0=BE=D0=B2 = =D0=B3=D0=BE=D1=81=D1=83=D0=B4=D0=B0=D1=80=D1=81=D1=82=D0=B2=D0=B5=D0=BD=D0= =BD=D1=8B=D1=85 =D0=BE=D1=80=D0=B3=D0=B0=D0=BD=D0=BE=D0=B2 =D0=B8 = =D0=BF=D1=80=D0=B5=D0=B4=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=BD=D1= =8B=D1=85 =D0=BD=D0=B0 =D0=BD=D0=B8=D1=85 
=D0=B8=D0=BD=D1=84=D0=BE=D1= =80=D0=BC=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1=8B=D1=85 = =D1=80=D0=B5=D1=81=D1=83=D1=80=D1=81=D0=BE=D0=B2.=20 = =D0=98=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0= =B5 =D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D0=BD=D1=8B=D1=85 = =D0=BA=D0=BE=D0=BC=D0=BF=D0=BB=D0=B5=D0=BA=D1=81=D0=BE=D0=B2 = =D0=B4=D0=BB=D1=8F =D1=81=D0=B1=D0=BE=D1=80=D0=B0 =D0=B8 = =D0=B0=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0 
=D0=B8=D0=BD=D1=84=D0=BE=D1= =80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8 (=D0=A1=D0=9F=D0=90=D0=A0=D0=9A, = =D0=98=D0=BD=D1=82=D0=B5=D0=B3=D1=80=D1=83=D0=BC =D0=B8=20 =D1=82.=D0=B4.).

4. =D0=9F=D0=BE=D0=BB=D1=83= =D1=87=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=BD=D0=B5=D0=BE=D1=84=D0=B8=D1=86=D0=B8=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0= =B9=20 =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8. = =D0=A1=D0=B5=D1=80=D1=8B=D0=B5 =D0=B1=D0=B0=D0=B7=D1=8B = =D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85. = =D0=A1=D0=BF=D0=B5=D1=86=D0=B8=D0=B0=D0=BB=D0=B8=D0=B7=D0=B8=D1=80=D0=BE=D0= =B2=D0=B0=D0=BD=D0=BD=D1=8B=D0=B5 = =D1=80=D0=B5=D1=81=D1=83=D1=80=D1=81=D1=8B 
=D0=BF=D0=BE = =D0=BE=D1=82=D1=80=D0=B0=D1=81=D0=BB=D1=8F=D0=BC = =D0=B1=D0=B8=D0=B7=D0=BD=D0=B5=D1=81=D0=B0 =D0=B8=20 = =D1=82=D0=B5=D1=80=D1=80=D0=B8=D1=82=D0=BE=D1=80=D0=B8=D1=8F=D0=BC. = =D0=98=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0= =B5 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1= =8B=D1=85 =D1=80=D0=B5=D1=81=D1=83=D1=80=D1=81=D0=BE=D0=B2 = =D0=98=D0=BD=D1=82=D0=B5=D1=80=D0=BD=D0=B5=D1=82=D0=B0 
=D0=B4=D0=BB=D1=8F = =D0=B7=D0=B0=D0=B4=D0=B0=D1=87 = =D0=BA=D0=BE=D0=BD=D0=BA=D1=83=D1=80=D0=B5=D0=BD=D1=82=D0=BD=D0=BE=D0=B9 = =D1=80=D0=B0=D0=B7=D0=B2=D0=B5=D0=B4=D0=BA=D0=B8. = =D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D0=B0 =D0=B2 = =D1=87=D0=B0=D1=82=D0=B0=D1=85, =D0=B1=D0=BB=D0=BE=D0=B3=D0=B0=D1=85, = =D0=B6=D0=B8=D0=B2=D1=8B=D1=85 = =D0=B6=D1=83=D1=80=D0=BD=D0=B0=D0=BB=D0=B0=D1=85 =D0=B8 = =D0=B8=D0=BD=D1=8B=D1=85 
=D0=B8=D0=BD=D1=84=D0=BE=D1= =80=D0=BC=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1=8B=D1=85 = =D0=BC=D0=B0=D1=81=D1=81=D0=B8=D0=B2=D0=B0=D1=85.=20 =D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D0=B0 =D1=81 = =D0=BD=D0=B5=D0=B2=D0=B8=D0=B4=D0=B8=D0=BC=D0=BE=D0=B9 = =D1=87=D0=B0=D1=81=D1=82=D1=8C=D1=8E = =D0=98=D0=BD=D1=82=D0=B5=D1=80=D0=BD=D0=B5=D1=82=D0=B0 = (=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D0=BD=D0=B5=D1=82 = =D1=80=D0=B0=D0=B7=D0=B2=D0=B5=D0=B4=D0=BA=D0=B0).

5. =D0=9C=D0=B5=D0=B6=D0=B4= =D1=83=D0=BD=D0=B0=D1=80=D0=BE=D0=B4=D0=BD=D1=8B=D0=B5=20 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1= =8B=D0=B5 =D1=80=D0=B5=D1=81=D1=83=D1=80=D1=81=D1=8B =D0=B4=D0=BB=D1=8F = =D1=81=D0=B1=D0=BE=D1=80=D0=B0 =D0=B8 = =D0=B0=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8 = =D0=BF=D0=BE = =D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D1=83. 
=D0=A1=D0=B1=D0=BE=D1=80 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8 = =D0=BF=D0=BE =D0=BE=D1=84=D1=84=D1=88=D0=BE=D1=80=D0=B0=D0=BC.=20 =D0=A1=D0=BF=D0=BE=D1=81=D0=BE=D0=B1=D1=8B = =D0=B2=D1=8B=D1=87=D0=B8=D1=81=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=BA=D0=BE=D0=BD=D0=B5=D1=87=D0=BD=D0=BE=D0=B3=D0=BE = =D0=B1=D0=B5=D0=BD=D0=B5=D1=84=D0=B8=D1=86=D0=B8=D0=B0=D1=80=D0=B0.
6. =D0=A1=D0=B1=D0=BE=D1=80= =D1=81=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D0=B9 = =D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=82=D0=B8=D0=B2=D0=BD=D1=8B=D0=BC=D0=B8 = =D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0=D0=BC=D0=B8. = =D0=91=D0=B5=D1=81=D0=B5=D0=B4=D1=8B =D1=81 = =D1=81=D0=BE=D1=82=D1=80=D1=83=D0=B4=D0=BD=D0=B8=D0=BA=D0=B0=D0=BC=D0=B8 = =D0=B8 =D0=B8=D0=BD=D1=8B=D0=B5 = =D1=81=D0=BF=D0=BE=D1=81=D0=BE=D0=B1=D1=8B = =D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B5 
=D0=B8=D0=BD=D1=84=D0=BE=D1= =80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8, = =D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D1=83=D1=8F=20 = "=D1=87=D0=B5=D0=BB=D0=BE=D0=B2=D0=B5=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B9= =D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80". = =D0=9C=D0=BE=D1=82=D0=B8=D0=B2=D0=B0=D1=86=D0=B8=D1=8F = =D1=87=D0=B5=D0=BB=D0=BE=D0=B2=D0=B5=D0=BA=D0=B0 =D0=BD=D0=B0 = =D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B0=D1=87=D1=83 
(=D1=80=D0=B0=D0=B7=D0=B3=D0= =BB=D0=B0=D1=88=D0=B5=D0=BD=D0=B8=D0=B5) = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8.=20 =D0=92=D0=B8=D0=B7=D1=83=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B5 = =D0=BD=D0=B0=D0=B1=D0=BB=D1=8E=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5, = =D0=BE=D1=81=D0=BC=D0=BE=D1=82=D1=80 = =D0=BF=D0=BE=D0=BC=D0=B5=D1=89=D0=B5=D0=BD=D0=B8=D0=B9 =D0=B8 = =D0=BC=D0=B5=D1=81=D1=82=D0=BD=D0=BE=D1=81=D1=82=D0=B8.

7.<= SPAN=20 = class=3DApple-converted-space> =D0=9C=D0=B5=D1=82=D0=BE=D0=B4= =D1=8B =D0=B0=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8. = =D0=9E=D0=B1=D0=B7=D0=BE=D1=80=20 = =D0=B0=D0=B2=D1=82=D0=BE=D0=BC=D0=B0=D1=82=D0=B8=D0=B7=D0=B8=D1=80=D0=BE=D0= =B2=D0=B0=D0=BD=D0=BD=D1=8B=D1=85 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1= =8B=D1=85 =D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC = (=D0=90=D0=98=D0=A1), 
=D0=BF=D1=80=D0=B8=D0=BC=D0= =B5=D0=BD=D1=8F=D0=B5=D0=BC=D1=8B=D1=85 =D0=BD=D0=B0 = =D0=BF=D1=80=D0=B5=D0=B4=D0=BF=D1=80=D0=B8=D1=8F=D1=82=D0=B8=D1=8F=D1=85.= =20 =D0=A7=D1=82=D0=BE =D0=BC=D0=BE=D0=B6=D0=B5=D1=82 =D0=B8 = =D0=B4=D0=BB=D1=8F =D1=87=D0=B5=D0=B3=D0=BE = =D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D1=83=D1=8E=D1=82=D1=81=D1=8F = =D0=90=D0=98=D0=A1. = =D0=9F=D1=80=D0=B8=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=90=D0=98=D0=A1 
=D0=B4=D0=BB=D1=8F = =D1=84=D0=B8=D0=BD=D0=B0=D0=BD=D1=81=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE = =D0=B0=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=20 =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D0=B8. = =D0=A4=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5 = =D0=BA=D0=BE=D1=80=D0=BF=D0=BE=D1=80=D0=B0=D1=82=D0=B8=D0=B2=D0=BD=D1=8B=D1= =85 =D0=B1=D0=B0=D0=B7 = =D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85.

8. =D0=90=D0=BB=D0=B3=D0=BE=D1=80= =D0=B8=D1=82=D0=BC = =D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F = =D0=BD=D0=B0=D0=B4=D0=B5=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20 = =D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D0=BE=D0=B2 = =E2=80=93 = =D1=8E=D1=80=D0=B8=D0=B4=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D1=85 = =D0=B8 =D1=84=D0=B8=D0=B7=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D1=85 = =D0=BB=D0=B8=D1=86. 
=D0=A4=D0=BE=D1=80=D0=BC=D0= =B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5 = =D0=BC=D0=B0=D1=82=D1=80=D0=B8=D1=86=D1=8B = =D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8=20 =D0=BE=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8 = =D0=B2 = =D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D0=B8 = =D0=BE=D1=82 =D1=81=D1=83=D0=BC=D0=BC=D1=8B = =D1=81=D0=B4=D0=B5=D0=BB=D0=BA=D0=B8, = =D0=BF=D1=80=D0=B5=D0=B4=D0=BE=D0=BF=D0=BB=D0=B0=D1=82=D0=B5 =D0=B8 
=D0=B8=D0=BD=D1=8B=D1=85 = =D1=83=D1=81=D0=BB=D0=BE=D0=B2=D0=B8=D0=B9. = =D0=9F=D1=80=D0=B8=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20 =D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0 Due Diligence = =D0=BF=D1=80=D0=B8 =D0=BE=D1=86=D0=B5=D0=BD=D0=BA=D0=B5 = =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D0=B8.

9. =D0=9E=D1=86=D0=B5=D0=BD=D0=BA= =D0=B0 = =D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D0=B0 = =D1=81 =D0=BF=D0=BE=D0=B7=D0=B8=D1=86=D0=B8=D0=B8=20 =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=D1=8B=D1=85 = =D1=80=D0=B8=D1=81=D0=BA=D0=BE=D0=B2. = =D0=9F=D0=BE=D0=BD=D1=8F=D1=82=D0=B8=D0=B5 = "=D0=B4=D0=BE=D0=BB=D0=B6=D0=BD=D0=B0=D1=8F = =D0=BE=D1=81=D0=BC=D0=BE=D1=82=D1=80=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0= =BE=D1=81=D1=82=D1=8C" =D0=BF=D1=80=D0=B8 
=D0=B2=D0=B7=D0=B0=D0=B8=D0= =BC=D0=BE=D0=BE=D1=82=D0=BD=D0=BE=D1=88=D0=B5=D0=BD=D0=B8=D1=8F=D1=85 = =D1=81=20 = =D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D0=B0=D0=BC=D0= =B8. = =D0=9A=D0=BE=D1=80=D1=80=D1=83=D0=BF=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1=8B=D0= =B5 =D1=80=D0=B8=D1=81=D0=BA=D0=B8. =D0=A3=D0=B3=D1=80=D0=BE=D0=B7=D0=B0 = =D0=BA=D0=BE=D0=BD=D1=84=D0=BB=D0=B8=D0=BA=D1=82=D0=B0 = =D0=B8=D0=BD=D1=82=D0=B5=D1=80=D0=B5=D1=81=D0=BE=D0=B2 =D0=B8 
=D0=B0=D1=84=D1=84=D0=B8=D0= =BB=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D1=81=D0=BE=D1=82=D1=80=D1=83=D0=B4=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2=20 =D1=81 = =D0=BF=D1=80=D0=B5=D0=B4=D1=81=D1=82=D0=B0=D0=B2=D0=B8=D1=82=D0=B5=D0=BB=D1= =8F=D0=BC=D0=B8 = =D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D0=B0.
10. =D0=90=D0=BD=D0=B0=D0=BB=D0=B8= =D0=B7 = =D1=83=D1=87=D1=80=D0=B5=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D1= =85 =D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=B2=20 =D0=BE=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8 = =D1=81 =D0=BF=D0=BE=D0=B7=D0=B8=D1=86=D0=B8=D0=B8 = =D0=B1=D0=B5=D0=B7=D0=BE=D0=BF=D0=B0=D1=81=D0=BD=D0=BE=D1=81=D1=82=D0=B8.= =D0=90=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7 = =D0=B0=D1=82=D1=80=D0=B8=D0=B1=D1=83=D1=82=D0=BE=D0=B2 =D0=B8 
=D1=84=D0=B8=D1=80=D0=BC=D0= =B5=D0=BD=D0=BD=D0=BE=D0=B3=D0=BE =D1=81=D1=82=D0=B8=D0=BB=D1=8F. = =D0=9E=D1=86=D0=B5=D0=BD=D0=BA=D0=B0=20 =D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=BA=D1=80=D0=B8=D0=B7=D0=B8=D1=81=D0=BD=D1=8B=D1=85 = =D1=81=D0=B8=D1=82=D1=83=D0=B0=D1=86=D0=B8=D0=B9 =D0=B2 = =D0=B4=D0=B5=D1=8F=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D0=B8 =D0=BD=D0=B0 
=D0=BE=D1=81=D0=BD=D0=BE=D0= =B2=D0=B5 = =D1=81=D1=82=D0=B0=D1=82=D0=B8=D1=81=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0= =B8=D1=85=20 =D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=BE=D0=B2. = =D0=9F=D1=80=D0=B8=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=BD=D0=B0 =D0=BF=D1=80=D0=B0=D0=BA=D1=82=D0=B8=D0=BA=D0=B5 = =D1=8D=D0=BC=D0=BF=D0=B8=D1=80=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D1=85 = =D0=B7=D0=B0=D0=BA=D0=BE=D0=BD=D0=BE=D0=B2.

11. =D0=A2=D0=B8=D0=BF=D1=8B = =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D0=B9, = =D0=BF=D1=80=D0=B5=D1=81=D0=BB=D0=B5=D0=B4=D1=83=D1=8E=D1=89=D0=B8=D0=B5 = = =D0=BF=D1=80=D0=BE=D1=82=D0=B8=D0=B2=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=BD=D1= =8B=D0=B5 =D1=86=D0=B5=D0=BB=D0=B8. = =D0=9F=D1=80=D0=BE=D0=B3=D0=BD=D0=BE=D0=B7=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0= =BD=D0=B8=D0=B5 = =D0=BD=D0=B0=D0=B4=D0=B5=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D0=B8 
=D0=BE=D1=80=D0=B3=D0=B0=D0= =BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B9 =D0=BD=D0=B0 = =D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=B5=20 "=D1=80=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B2=D1=8B=D1=85 = =D0=BF=D1=80=D0=B8=D0=B7=D0=BD=D0=B0=D0=BA=D0=BE=D0=B2 = =D0=BE=D0=BF=D0=B0=D1=81=D0=BD=D0=BE=D1=81=D1=82=D0=B8". = =D0=A4=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5 = =D1=80=D0=B5=D0=B9=D1=82=D0=B8=D0=BD=D0=B3=D0=BE=D0=B2 
=D0=BD=D0=B0=D0=B4=D0=B5=D0= =B6=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20 = =D0=BF=D0=B0=D1=80=D1=82=D0=BD=D0=B5=D1=80=D0=BE=D0=B2.

12.=  =D0=90=D0=BD=D0=B0=D0=BB=D0=B8= =D0=B7 = =D0=B1=D0=B5=D0=B7=D0=BE=D0=BF=D0=B0=D1=81=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D1=80=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D1=85 = =D0=BF=D1=80=D0=B5=D0=B4=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D0=B9 = =D0=B8 =D0=B4=D0=BE=D0=B3=D0=BE=D0=B2=D0=BE=D1=80=D0=BE=D0=B2. = =D0=98=D0=B7=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=B8=D0=BD=D0=B8=D1=86=D0=B8=D0=B0=D1=82=D0=BE=D1=80=D0=BE=D0=B2 = =D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0, 
=D0=B8=D1=85 = =D0=B8=D0=BD=D1=82=D0=B5=D1=80=D0=B5=D1=81=D1=8B =D0=B8 = =D0=B4=D0=B5=D0=BB=D0=BE=D0=B2=D1=83=D1=8E=20 =D1=80=D0=B5=D0=BF=D1=83=D1=82=D0=B0=D1=86=D0=B8=D1=8E. = =D0=92=D0=B5=D1=80=D0=B8=D1=84=D0=B8=D0=BA=D0=B0=D1=86=D0=B8=D1=8F = =D0=BF=D1=80=D0=B5=D0=B4=D1=81=D1=82=D0=B0=D0=B2=D0=B8=D1=82=D0=B5=D0=BB=D0= =B5=D0=B9. =D0=98=D0=B7=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=BC=D0=B5=D1=85=D0=B0=D0=BD=D0=B8=D0=B7=D0=BC=D0=B0 
=D0=BF=D0=BE=D0=BB=D1=83=D1= =87=D0=B5=D0=BD=D0=B8=D1=8F =D0=BF=D1=80=D0=B8=D0=B1=D1=8B=D0=BB=D0=B8. = =D0=90=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7=20 =D0=BF=D0=B5=D1=80=D0=B2=D0=BE=D0=B3=D0=BE = =D0=BA=D0=BE=D0=BD=D1=82=D0=B0=D0=BA=D1=82=D0=B0. = =D0=9F=D0=BE=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0= =B5 =D0=B0=D1=81=D0=BF=D0=B5=D0=BA=D1=82=D1=8B =D0=BF=D1=80=D0=B8 = =D0=B2=D1=8B=D1=8F=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B8 
=D0=BD=D0=B5=D0=BD=D0=B0=D0= =B4=D0=B5=D0=B6=D0=BD=D0=BE=D0=B3=D0=BE=20 =D0=BF=D0=B0=D1=80=D1=82=D0=BD=D0=B5=D1=80=D0=B0.
 

=C2=AB=C2=AB=C2=BB=C2=BB =C2=AB=C2=AB=C2=BB=C2=BB =C2=AB=C2=AB=C2=BB=C2=BB =C2=AB=C2=AB=C2=BB=C2=BB =C2=AB=C2=AB=C2=BB=C2=BB =C2=AB=C2=AB=C2=BB=C2=BB =C2=AB=C2=AB=C2=BB=C2=BB =C2=AB=C2=AB=C2=BB=C2=BB =C2=AB=C2=AB=C2=BB=C2=BB =C2=AB=C2=AB=C2=BB=C2=BB =C2=AB=C2=AB=C2=BB=C2=BB =C2=AB=C2=AB=C2=BB=C2=BB

=D0=A1=D1=82=D0=BE=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D1=8C = =D1=83=D1=87=D0=B0=D1=81=D1=82=D0=B8=D1=8F:
 11 800 = =D1=80=D1=83=D0=B1. 
 =20  =D0=A1=D0=BAu=D0=B4=D0=BAu (=D0=BE=D1=82 2 = =D1=87=D0=B5=D0=BB=D0=BE=D0=B2=D0=B5=D0=BA=D0=B0 =E2=80=93 10%, 3=20 =D1=87=D0=B5=D0=BB=D0=BE=D0=B2=D0=B5=D0=BA=D0=B0 =E2=80=93 = 15%, 4 =D1=87=D0=B5=D0=BB=D0=BE=D0=B2=D0=B5=D0=BA=D0=B0 =D0=B8 = =D0=B1=D0=BE=D0=BB=D0=B5=D0=B5 =E2=80=93 20%.)
   =D0=92 = =D1=81=D1=82=D0=BE=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D1=8C = =D0=B2=D1=85=D0=BE=D0=B4=D0=B8=D1=82=20 = =D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B9 = =D0=BC=D0=B0=D1=82=D0=B5=D1=80=D0=B8=D0=B0=D0=BB, = =D0=BE=D0=B1=D0=B5=D0=B4=D1=8B, = =D0=BA=D0=BE=D1=84=D0=B5-=D0=BF=D0=B0=D1=83=D0=B7=D1=8B,=20 = =D1=81=D0=B5=D1=80=D1=82=D0=B8=D1=84=D0=B8=D0=BA=D0=B0=D1=82.

<= /TD>                
------=_NextPart_000_0098_01D188F4.8CCB5A70-- From bfoster@redhat.com Mon Mar 28 05:47:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 726317CA0 for ; Mon, 28 Mar 2016 05:47:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DCFA9AC004 for ; Mon, 28 Mar 2016 03:46:59 -0700 (PDT) X-ASG-Debug-ID: 1459162017-04cbb07ad591810001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id oJSOpFjXIJ2kCePD (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 28 Mar 2016 03:46:58 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 4DFFF461D6; Mon, 28 Mar 2016 10:46:57 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-6.bos.redhat.com [10.18.41.6]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2SAkuX8015477; Mon, 28 Mar 2016 06:46:57 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id A66AD1205DF; Mon, 28 Mar 2016 06:46:55 -0400 (EDT) Date: Mon, 28 Mar 2016 06:46:55 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: improve kmem_realloc Message-ID: <20160328104655.GB27040@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: improve kmem_realloc References: <1458740836-31211-1-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1458740836-31211-1-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1459162018 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Mar 23, 2016 at 02:47:16PM +0100, Christoph Hellwig wrote: > Use krealloc to implement our realloc function. This helps to avoid > new allocations if we are still in the slab bucket. At least for the > bmap btree root that's actually the common case. > > This also allows removing the now unused oldsize argument. > > Signed-off-by: Christoph Hellwig > --- Reviewed-by: Brian Foster > fs/xfs/kmem.c | 26 +++++++++++++++----------- > fs/xfs/kmem.h | 2 +- > fs/xfs/libxfs/xfs_inode_fork.c | 10 +++------- > fs/xfs/xfs_log_recover.c | 2 +- > fs/xfs/xfs_mount.c | 1 - > 5 files changed, 20 insertions(+), 21 deletions(-) > > diff --git a/fs/xfs/kmem.c b/fs/xfs/kmem.c > index 686ba6f..339c696 100644 > --- a/fs/xfs/kmem.c > +++ b/fs/xfs/kmem.c > @@ -93,19 +93,23 @@ kmem_zalloc_large(size_t size, xfs_km_flags_t flags) > } > > void * > -kmem_realloc(const void *ptr, size_t newsize, size_t oldsize, > - xfs_km_flags_t flags) > +kmem_realloc(const void *old, size_t newsize, xfs_km_flags_t flags) > { > - void *new; > + int retries = 0; > + gfp_t lflags = kmem_flags_convert(flags); > + void *ptr; > > - new = kmem_alloc(newsize, flags); > - if (ptr) { > - if (new) > - memcpy(new, ptr, > - ((oldsize < newsize) ? oldsize : newsize)); > - kmem_free(ptr); > - } > - return new; > + do { > + ptr = krealloc(old, newsize, lflags); > + if (ptr || (flags & (KM_MAYFAIL|KM_NOSLEEP))) > + return ptr; > + if (!(++retries % 100)) > + xfs_err(NULL, > + "%s(%u) possible memory allocation deadlock size %zu in %s (mode:0x%x)", > + current->comm, current->pid, > + newsize, __func__, lflags); > + congestion_wait(BLK_RW_ASYNC, HZ/50); > + } while (1); > } > > void * > diff --git a/fs/xfs/kmem.h b/fs/xfs/kmem.h > index d1c66e4..689f746 100644 > --- a/fs/xfs/kmem.h > +++ b/fs/xfs/kmem.h > @@ -62,7 +62,7 @@ kmem_flags_convert(xfs_km_flags_t flags) > > extern void *kmem_alloc(size_t, xfs_km_flags_t); > extern void *kmem_zalloc_large(size_t size, xfs_km_flags_t); > -extern void *kmem_realloc(const void *, size_t, size_t, xfs_km_flags_t); > +extern void *kmem_realloc(const void *, size_t, xfs_km_flags_t); > static inline void kmem_free(const void *ptr) > { > kvfree(ptr); > diff --git a/fs/xfs/libxfs/xfs_inode_fork.c b/fs/xfs/libxfs/xfs_inode_fork.c > index 4fbe226..d3d1477 100644 > --- a/fs/xfs/libxfs/xfs_inode_fork.c > +++ b/fs/xfs/libxfs/xfs_inode_fork.c > @@ -542,7 +542,6 @@ xfs_iroot_realloc( > new_max = cur_max + rec_diff; > new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, new_max); > ifp->if_broot = kmem_realloc(ifp->if_broot, new_size, > - XFS_BMAP_BROOT_SPACE_CALC(mp, cur_max), > KM_SLEEP | KM_NOFS); > op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, > ifp->if_broot_bytes); > @@ -686,7 +685,6 @@ xfs_idata_realloc( > ifp->if_u1.if_data = > kmem_realloc(ifp->if_u1.if_data, > real_size, > - ifp->if_real_bytes, > KM_SLEEP | KM_NOFS); > } > } else { > @@ -1402,8 +1400,7 @@ xfs_iext_realloc_direct( > if (rnew_size != ifp->if_real_bytes) { > ifp->if_u1.if_extents = > kmem_realloc(ifp->if_u1.if_extents, > - rnew_size, > - ifp->if_real_bytes, KM_NOFS); > + rnew_size, KM_NOFS); > } > if (rnew_size > ifp->if_real_bytes) { > memset(&ifp->if_u1.if_extents[ifp->if_bytes / > @@ -1487,9 +1484,8 @@ xfs_iext_realloc_indirect( > if (new_size == 0) { > xfs_iext_destroy(ifp); > } else { > - ifp->if_u1.if_ext_irec = (xfs_ext_irec_t *) > - kmem_realloc(ifp->if_u1.if_ext_irec, > - new_size, size, KM_NOFS); > + ifp->if_u1.if_ext_irec = > + kmem_realloc(ifp->if_u1.if_ext_irec, new_size, KM_NOFS); > } > } > > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > index 396565f..bf6e807 100644 > --- a/fs/xfs/xfs_log_recover.c > +++ b/fs/xfs/xfs_log_recover.c > @@ -3843,7 +3843,7 @@ xlog_recover_add_to_cont_trans( > 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); > + ptr = kmem_realloc(old_ptr, 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; > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index 536a0ee..654799f 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -89,7 +89,6 @@ xfs_uuid_mount( > if (hole < 0) { > xfs_uuid_table = kmem_realloc(xfs_uuid_table, > (xfs_uuid_table_size + 1) * sizeof(*xfs_uuid_table), > - xfs_uuid_table_size * sizeof(*xfs_uuid_table), > KM_SLEEP); > hole = xfs_uuid_table_size++; > } > -- > 2.1.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From eflorac@intellique.com Mon Mar 28 10:18:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C6E827CA2 for ; Mon, 28 Mar 2016 10:18:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8DE5E304039 for ; Mon, 28 Mar 2016 08:18:16 -0700 (PDT) X-ASG-Debug-ID: 1459178293-04bdf01102467f0001-NocioJ Received: from mail1.g1.pair.com (mail1.g1.pair.com [66.39.3.162]) by cuda.sgi.com with ESMTP id qR70LiJbajFlb5MI (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 28 Mar 2016 08:18:13 -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 E8E592C4F8; Mon, 28 Mar 2016 11:18:12 -0400 (EDT) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail1.g1.pair.com (Postfix) with ESMTPSA id 5566D2C4E3; Mon, 28 Mar 2016 11:18:12 -0400 (EDT) Date: Mon, 28 Mar 2016 17:18:16 +0200 From: Emmanuel Florac To: Christoph Hellwig Cc: "xfs@oss.sgi.com" Subject: Re: Weird behaviour of mkfs.xfs Message-ID: <20160328171816.3ea3ba63@harpe.intellique.com> X-ASG-Orig-Subj: Re: Weird behaviour of mkfs.xfs In-Reply-To: <20160326163642.GA19464@infradead.org> References: <20160326145037.3b5c6302@harpe.intellique.com> <20160326154619.3649ebdf@harpe.intellique.com> <20160326163642.GA19464@infradead.org> Organization: Intellique X-Mailer: Claws Mail 3.13.1 (GTK+ 2.24.30; i486-slackware-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail1.g1.pair.com[66.39.3.162] X-Barracuda-Start-Time: 1459178293 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28236 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Le Sat, 26 Mar 2016 09:36:42 -0700 Christoph Hellwig =C3=A9crivait: > On Sat, Mar 26, 2016 at 03:46:19PM +0100, Emmanuel Florac wrote: > > Actually I was too impatient; it finally ended avec 30 minutes of > > burning bits to the flash. I don't understand the behaviour, though. > > I'm used to mkfs.xfs making its magic extremely quickly, even on > > humongous devices. Here it's a very fast array of only 3.2 TB... =20 >=20 > Trey doing a mkfs.xfs -K, without that it diascards the whole device. > I've seen some NVMe device misbehaving under discard storms, up to > the point of resetting the controller.. Ah, the discard is a nice touch, good to know :) It doesn't seem to be mentioned in the man page (except for the -K option), it would be a good information to know. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From darrick.wong@oracle.com Mon Mar 28 14:51:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 099D77CA0 for ; Mon, 28 Mar 2016 14:51:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C3F518F804C for ; Mon, 28 Mar 2016 12:51:48 -0700 (PDT) X-ASG-Debug-ID: 1459194705-04cb6c2460b2240001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id kEQycYyJxkjrm70U (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 28 Mar 2016 12:51:45 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u2SJpgXl011364 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 28 Mar 2016 19:51:43 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u2SJpghj028927 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 28 Mar 2016 19:51:42 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u2SJpf1V023580; Mon, 28 Mar 2016 19:51:42 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 28 Mar 2016 12:51:41 -0700 Date: Mon, 28 Mar 2016 12:51:40 -0700 From: "Darrick J. Wong" To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: don't hand out pNFS layouts for reflink inodes Message-ID: <20160328195140.GB5360@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: don't hand out pNFS layouts for reflink inodes References: <1456936485-21940-1-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1456936485-21940-1-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1459194705 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28244 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines [back to XFS after a few weeks' distractions] On Wed, Mar 02, 2016 at 05:34:45PM +0100, Christoph Hellwig wrote: > Although the protocol allows for it, the Linux NFS server code doesn't > support reflink-like functionality yet. It's been added to by TODO > list.. > > Signed-off-by: Christoph Hellwig > --- > fs/xfs/xfs_pnfs.c | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/fs/xfs/xfs_pnfs.c b/fs/xfs/xfs_pnfs.c > index ade236e..9708fef 100644 > --- a/fs/xfs/xfs_pnfs.c > +++ b/fs/xfs/xfs_pnfs.c > @@ -139,6 +139,13 @@ xfs_fs_map_blocks( > return -ENXIO; > > /* > + * The pNFS block layout spec actually supports reflink like > + * functionality, but the Linux pNFS server doesn't implement it yet. > + */ > + if (!xfs_is_reflink_inode(ip)) > + return -ENXIO; /me isn't familiar with pNFS, but doesn't this make it so that xfs_fs_map_blocks /only/ works on reflinked files? Maybe I'm misreading the comment, but it sounds to me like Linux doesn't support reflinked files over pNFS and therefore we want to disable this iomapping functionality any time we find a reflinked file. But maybe there's a subtlety here that I'm missing? --D > + > + /* > * Lock out any other I/O before we flush and invalidate the pagecache, > * and then hand out a layout to the remote system. This is very > * similar to direct I/O, except that the synchronization is much more > -- > 2.1.4 > From vishal.l.verma@intel.com Mon Mar 28 15:01:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7B4E27CA1 for ; Mon, 28 Mar 2016 15:01:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5108F304032 for ; Mon, 28 Mar 2016 13:01:55 -0700 (PDT) X-ASG-Debug-ID: 1459195313-04cbb07ad6b2e60001-NocioJ Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by cuda.sgi.com with ESMTP id jrAag1fefhL8Esoi for ; Mon, 28 Mar 2016 13:01:53 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Apparent-Source-IP: 134.134.136.65 X-ASG-Whitelist: Client Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga103.jf.intel.com with ESMTP; 28 Mar 2016 13:01:32 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,408,1455004800"; d="scan'208";a="74715159" Received: from fmsmsx103.amr.corp.intel.com ([10.18.124.201]) by fmsmga004.fm.intel.com with ESMTP; 28 Mar 2016 13:01:31 -0700 Received: from fmsmsx123.amr.corp.intel.com (10.18.125.38) by FMSMSX103.amr.corp.intel.com (10.18.124.201) with Microsoft SMTP Server (TLS) id 14.3.248.2; Mon, 28 Mar 2016 13:01:30 -0700 Received: from fmsmsx113.amr.corp.intel.com ([169.254.13.211]) by fmsmsx123.amr.corp.intel.com ([10.18.125.38]) with mapi id 14.03.0248.002; Mon, 28 Mar 2016 13:01:30 -0700 From: "Verma, Vishal L" To: "Williams, Dan J" CC: "linux-block@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "akpm@linux-foundation.org" , "axboe@fb.com" , "linux-nvdimm@lists.01.org" , "linux-fsdevel@vger.kernel.org" , "ross.zwisler@linux.intel.com" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" , "david@fromorbit.com" , "jack@suse.cz" Subject: Re: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors Thread-Topic: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors X-ASG-Orig-Subj: Re: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors Thread-Index: AQHRhiNvKoQhiC/aYEiTGtqXM3Dgv59q9p4AgAAl9ACAAATbgIAEoN8A Date: Mon, 28 Mar 2016 20:01:29 +0000 Message-ID: <1459195288.15523.3.camel@intel.com> References: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> <1458861450-17705-5-git-send-email-vishal.l.verma@intel.com> <1458939796.5501.8.camel@intel.com> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.254.49.135] Content-Type: text/plain; charset="utf-8" Content-ID: <59E72D7F52648141A4EC0A334887F2DC@intel.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-Barracuda-Connect: mga03.intel.com[134.134.136.65] X-Barracuda-Start-Time: 1459195313 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 T24gRnJpLCAyMDE2LTAzLTI1IGF0IDE0OjIwIC0wNzAwLCBEYW4gV2lsbGlhbXMgd3JvdGU6DQo+ IE9uIEZyaSwgTWFyIDI1LCAyMDE2IGF0IDI6MDMgUE0sIFZlcm1hLCBWaXNoYWwgTA0KPiA8dmlz aGFsLmwudmVybWFAaW50ZWwuY29tPiB3cm90ZToNCj4gPiANCj4gPiBPbiBGcmksIDIwMTYtMDMt MjUgYXQgMTE6NDcgLTA3MDAsIERhbiBXaWxsaWFtcyB3cm90ZToNCj4gPiA+IA0KPiA+ID4gT24g VGh1LCBNYXIgMjQsIDIwMTYgYXQgNDoxNyBQTSwgVmlzaGFsIFZlcm1hIDx2aXNoYWwubC52ZXJt YUBpbnQNCj4gPiA+IGVsLmMNCj4gPiA+IG9tPiB3cm90ZToNCj4gPiA+ID4gDQo+ID4gPiA+IA0K PiA+ID4gPiBGcm9tOiBNYXR0aGV3IFdpbGNveCA8bWF0dGhldy5yLndpbGNveEBpbnRlbC5jb20+ DQo+ID4gPiA+IA0KPiA+ID4gPiBkYXhfY2xlYXJfc2VjdG9ycygpIGNhbm5vdCBoYW5kbGUgcG9p c29uZWQgYmxvY2tzLsKgwqBUaGVzZSBtdXN0DQo+ID4gPiA+IGJlDQo+ID4gPiA+IHplcm9lZCB1 c2luZyB0aGUgQklPIGludGVyZmFjZSBpbnN0ZWFkLsKgwqBDb252ZXJ0IGV4dDIgYW5kIFhGUw0K PiA+ID4gPiB0bw0KPiA+ID4gPiB1c2UNCj4gPiA+ID4gb25seSBzYl9pc3N1ZV96ZXJvdXQoKS4N Cj4gPiA+ID4gDQo+ID4gPiA+IFNpZ25lZC1vZmYtYnk6IE1hdHRoZXcgV2lsY294IDxtYXR0aGV3 LnIud2lsY294QGludGVsLmNvbT4NCj4gPiA+ID4gW3Zpc2hhbDogQWxzbyByZW1vdmUgdGhlIGRh eF9jbGVhcl9zZWN0b3JzIGZ1bmN0aW9uIGVudGlyZWx5XQ0KPiA+ID4gPiBTaWduZWQtb2ZmLWJ5 OiBWaXNoYWwgVmVybWEgPHZpc2hhbC5sLnZlcm1hQGludGVsLmNvbT4NCj4gPiA+ID4gLS0tDQo+ ID4gPiA+IMKgZnMvZGF4LmPCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB8IDMyIC0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQo+ID4gPiA+IMKgZnMvZXh0Mi9pbm9kZS5jwqDC oMKgwqDCoMKgwqDCoHzCoMKgNyArKystLS0tDQo+ID4gPiA+IMKgZnMveGZzL3hmc19ibWFwX3V0 aWwuYyB8wqDCoDkgLS0tLS0tLS0tDQo+ID4gPiA+IMKgaW5jbHVkZS9saW51eC9kYXguaMKgwqDC oMKgfMKgwqAxIC0NCj4gPiA+ID4gwqA0IGZpbGVzIGNoYW5nZWQsIDMgaW5zZXJ0aW9ucygrKSwg NDYgZGVsZXRpb25zKC0pDQo+ID4gPiA+IA0KPiA+ID4gPiBkaWZmIC0tZ2l0IGEvZnMvZGF4LmMg Yi9mcy9kYXguYw0KPiA+ID4gPiBpbmRleCBiYjdlOWY4Li5hMzA0ODFlIDEwMDY0NA0KPiA+ID4g PiAtLS0gYS9mcy9kYXguYw0KPiA+ID4gPiArKysgYi9mcy9kYXguYw0KPiA+ID4gPiBAQCAtNzgs MzggKzc4LDYgQEAgc3RydWN0IHBhZ2UgKnJlYWRfZGF4X3NlY3RvcihzdHJ1Y3QNCj4gPiA+ID4g YmxvY2tfZGV2aWNlDQo+ID4gPiA+ICpiZGV2LCBzZWN0b3JfdCBuKQ0KPiA+ID4gPiDCoMKgwqDC oMKgwqDCoMKgcmV0dXJuIHBhZ2U7DQo+ID4gPiA+IMKgfQ0KPiA+ID4gPiANCj4gPiA+ID4gLS8q DQo+ID4gPiA+IC0gKiBkYXhfY2xlYXJfc2VjdG9ycygpIGlzIGNhbGxlZCBmcm9tIHdpdGhpbiB0 cmFuc2FjdGlvbg0KPiA+ID4gPiBjb250ZXh0DQo+ID4gPiA+IGZyb20gWEZTLA0KPiA+ID4gPiAt ICogYW5kIGhlbmNlIHRoaXMgbWVhbnMgdGhlIHN0YWNrIGZyb20gdGhpcyBwb2ludCBtdXN0IGZv bGxvdw0KPiA+ID4gPiBHRlBfTk9GUw0KPiA+ID4gPiAtICogc2VtYW50aWNzIGZvciBhbGwgb3Bl cmF0aW9ucy4NCj4gPiA+ID4gLSAqLw0KPiA+ID4gPiAtaW50IGRheF9jbGVhcl9zZWN0b3JzKHN0 cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90DQo+ID4gPiA+IF9zZWN0b3IsDQo+ID4g PiA+IGxvbmcgX3NpemUpDQo+ID4gPiA+IC17DQo+ID4gPiA+IC3CoMKgwqDCoMKgwqDCoHN0cnVj dCBibGtfZGF4X2N0bCBkYXggPSB7DQo+ID4gPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAuc2VjdG9yID0gX3NlY3RvciwNCj4gPiA+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoC5zaXplID0gX3NpemUsDQo+ID4gPiA+IC3CoMKgwqDCoMKgwqDCoH07DQo+ID4gPiA+ IC0NCj4gPiA+ID4gLcKgwqDCoMKgwqDCoMKgbWlnaHRfc2xlZXAoKTsNCj4gPiA+ID4gLcKgwqDC oMKgwqDCoMKgZG8gew0KPiA+ID4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbG9u ZyBjb3VudCwgc3o7DQo+ID4gPiA+IC0NCj4gPiA+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGNvdW50ID0gZGF4X21hcF9hdG9taWMoYmRldiwgJmRheCk7DQo+ID4gPiA+IC3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAoY291bnQgPCAwKQ0KPiA+ID4gPiAtwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiBjb3VudDsNCj4g PiA+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHN6ID0gbWluX3QobG9uZywgY291 bnQsIFNaXzEyOEspOw0KPiA+ID4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY2xl YXJfcG1lbShkYXguYWRkciwgc3opOw0KPiA+ID4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgZGF4LnNpemUgLT0gc3o7DQo+ID4gPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBkYXguc2VjdG9yICs9IHN6IC8gNTEyOw0KPiA+ID4gPiAtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgZGF4X3VubWFwX2F0b21pYyhiZGV2LCAmZGF4KTsNCj4gPiA+ID4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNvbmRfcmVzY2hlZCgpOw0KPiA+ID4gPiAtwqDCoMKg wqDCoMKgwqB9IHdoaWxlIChkYXguc2l6ZSk7DQo+ID4gPiA+IC0NCj4gPiA+ID4gLcKgwqDCoMKg wqDCoMKgd21iX3BtZW0oKTsNCj4gPiA+ID4gLcKgwqDCoMKgwqDCoMKgcmV0dXJuIDA7DQo+ID4g PiA+IC19DQo+ID4gPiA+IC1FWFBPUlRfU1lNQk9MX0dQTChkYXhfY2xlYXJfc2VjdG9ycyk7DQo+ ID4gPiBXaGF0IGFib3V0IHRoZSBvdGhlciB1bndyaXR0ZW4gZXh0ZW50IGNvbnZlcnNpb25zIGlu IHRoZSBkYXgNCj4gPiA+IHBhdGg/DQo+ID4gPiBTaG91bGRuJ3QgdGhvc2UgYmUgY29udmVydGVk IHRvIGJsb2NrLWxheWVyIHplcm8tb3V0cyBhcyB3ZWxsPw0KPiA+IENvdWxkIHlvdSBwb2ludCBt ZSB0byB3aGVyZSB0aGVzZSBtaWdodCBiZT8gSSB0aG91Z2h0IG9uY2Ugd2UndmUNCj4gPiBjb252 ZXJ0ZWQgYWxsIHRoZSB6ZXJvb3V0IHR5cGUgY2FsbGVycyAoYnkgcmVtb3ZpbmcNCj4gPiBkYXhf Y2xlYXJfc2VjdG9ycyksDQo+ID4gYW5kIGZpeGVkIHVwIGRheF9kb19pbyB0byB0cnkgYSBkcml2 ZXIgZmFsbGJhY2ssIHdlJ3ZlIGhhbmRsZWQgYWxsDQo+ID4gdGhlDQo+ID4gbWVkaWEgZXJyb3Ig Y2FzZXMgaW4gZGF4Li4NCj4gZ3JlcCBmb3IgdXNhZ2VzIG9mIGNsZWFyX3BtZW0oKS4uLiB3aGlj aCBJIHdhcyBob3BpbmcgdG8gZWxpbWluYXRlDQo+IGFmdGVyIHRoaXMgY2hhbmdlIHRvIHB1c2gg emVyb2luZyBkb3duIHRvIHRoZSBkcml2ZXIuDQoNCk9rLCBzbyBJIGxvb2tlZCBhdCB0aGVzZSwg YW5kIGl0IGxvb2tzIGxpa2UgdGhlIG1ham9yaXR5IG9mIGNhbGxlcnMgb2YNCmNsZWFyX3BtZW0g YXJlIGZyb20gdGhlIGZhdWx0IHBhdGggKGVpdGhlciBwbWQgb3IgcmVndWxhciksIGFuZCBpbg0K dGhvc2UgY2FzZXMgd2Ugc2hvdWxkIGJlICdwcm90ZWN0ZWQnLCBhcyB3ZSB3b3VsZCBoYXZlIGZh aWxlZCBhdCBhDQpwcmlvciBzdGVwIChkYXhfbWFwX2F0b21pYykuDQoNClRoZSB0d28gY2FzZXMg dGhhdCBtYXkgbm90IGJlIHdlbGwgaGFuZGxlZCBhcmUgdGhlIGNhbGxzIHRvDQpkYXhfemVyb19w YWdlX3JhbmdlIGFuZCBkYXhfdHJ1bmNhdGVfcGFnZSB3aGljaCBhcmUgY2FsbGVkIGZyb20gZmls ZQ0Kc3lzdGVtcy4gSSB0aGluayB3ZSBtYXkgbmVlZCB0byBkbyBhIGZhbGxiYWNrIHRvIHRoZSBk cml2ZXIgZm9yIHRob3NlDQpjYXNlcyBqdXN0IGxpa2Ugd2UgZG8gZm9yIGRheF9kaXJlY3RfaW8u LiBUaG91Z2h0cz8= From david@fromorbit.com Mon Mar 28 16:59:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6F6497CA3 for ; Mon, 28 Mar 2016 16:59:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3372D304032 for ; Mon, 28 Mar 2016 14:59:31 -0700 (PDT) X-ASG-Debug-ID: 1459202365-04bdf011045e6f0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id TWJ4rt9xJsBUCj9J for ; Mon, 28 Mar 2016 14:59:26 -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: A2D/BwAsqPlWPDGaLHldgy5TfaZuAQQHjA2JbCGFZgICAQECgSNNAQEBAQEBBwEBAQFBQIRCAQEEOhwjEAgDGAklDwUlAwcaE4gmD8A3AQsBHRmFPIUMgTcBiFoFl2GFcYgLgj2MWI8LgnKBaSgwiHoBAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail06.adl2.internode.on.net with ESMTP; 29 Mar 2016 08:29:24 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1akfBz-00005y-Ay; Tue, 29 Mar 2016 08:59:23 +1100 Date: Tue, 29 Mar 2016 08:59:23 +1100 From: Dave Chinner To: Geert Uytterhoeven Cc: "linux-kernel@vger.kernel.org" , xfs@oss.sgi.com, Cris , Rich Felker , Linux-sh list Subject: Re: Build regressions/improvements in v4.6-rc1 Message-ID: <20160328215923.GG11812@dastard> X-ASG-Orig-Subj: Re: Build regressions/improvements in v4.6-rc1 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: 1459202365 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28249 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sun, Mar 27, 2016 at 02:43:24PM +0200, Geert Uytterhoeven wrote: > On Sun, Mar 27, 2016 at 2:39 PM, Geert Uytterhoeven > wrote: > > Below is the list of build error/warning regressions/improvements in > > v4.6-rc1[1] compared to v4.5[2]. > > > > Summarized: > > - build errors: +9/-6 > > > [1] http://kisskb.ellerman.id.au/kisskb/head/10114/ (all 262 configs) > > [2] http://kisskb.ellerman.id.au/kisskb/head/10047/ (all 262 configs) > > > 9 error regressions: > > + /home/kisskb/slave/src/fs/xfs/xfs_ondisk.h: error: call to > > '__compiletime_assert_79' declared with attribute error: XFS: > > sizeof(xfs_attr_shortform_t) is wrong, expected 8: => 79:2 > > cris-allyesconfig, cris-allmodconfig Yup, cris is the only platform that throws this error on this structure. It's an on-disk structure and relying on the gcc optimiser to do the same thing from release to release has become such a crap-shoot these days. Hence as a stop-gap measure we added build time checking of what they compiler is doing with those structures, and to refuse to build XFS if the compiler/platform is doing something obviously different. Modernising the on-disk structure definitions is on the list of things to do, but it's nowhere near the top of my list at the moment... Cheers, Dave. -- Dave Chinner david@fromorbit.com From darrick.wong@oracle.com Mon Mar 28 17:05:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DD8BD7CA6 for ; Mon, 28 Mar 2016 17:05:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 60F47AC001 for ; Mon, 28 Mar 2016 15:05:49 -0700 (PDT) X-ASG-Debug-ID: 1459202742-04cb6c2462b90d0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id W5kkqGXydVCfMswQ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 28 Mar 2016 15:05:42 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u2SM59kl008379 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 28 Mar 2016 22:05:09 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u2SM582L006638 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 28 Mar 2016 22:05:09 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u2SM58kH027748; Mon, 28 Mar 2016 22:05:08 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 28 Mar 2016 15:05:07 -0700 Date: Mon, 28 Mar 2016 15:05:06 -0700 From: "Darrick J. Wong" To: Christoph Hellwig Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 05/16] xfs: add owner field to extent allocation and freeing Message-ID: <20160328220506.GB5822@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 05/16] xfs: add owner field to extent allocation and freeing References: <1457410578-30233-1-git-send-email-david@fromorbit.com> <1457410578-30233-6-git-send-email-david@fromorbit.com> <20160310141913.GC29058@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160310141913.GC29058@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1459202742 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28249 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Thu, Mar 10, 2016 at 06:19:13AM -0800, Christoph Hellwig wrote: > On Tue, Mar 08, 2016 at 03:16:07PM +1100, Dave Chinner wrote: > > From: "Darrick J. Wong" > > > > For the rmap btree to work, we have to fed the extent owner > > s/fed/feed/ > > > +/* > > + * Ownership info for an extent. This is used to create reverse-mapping > > + * entries. > > + */ > > +#define XFS_RMAP_INO_ATTR_FORK (1) > > +#define XFS_RMAP_BMBT_BLOCK (2) > > These are OR-able flags - it might make sense to define them as: > > #define XFS_RMAP_INO_ATTR_FORK (1 << 0) > #define XFS_RMAP_BMBT_BLOCK (1 << 1) > > to make this more obvious. Ok. Will do when I merge the "separate xfs_rmap_irec flags field" patch into the appropriate patches (like this one). --D > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From darrick.wong@oracle.com Mon Mar 28 17:47:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 03C1E7CAE for ; Mon, 28 Mar 2016 17:47:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id AAC798F8037 for ; Mon, 28 Mar 2016 15:47:31 -0700 (PDT) X-ASG-Debug-ID: 1459205248-04bdf0110260690001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 56LJt1hbO1OjAMdA (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 28 Mar 2016 15:47:28 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u2SMlJgC018279 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 28 Mar 2016 22:47:20 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u2SMlJVG022437 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 28 Mar 2016 22:47:19 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u2SMlCIZ029887; Mon, 28 Mar 2016 22:47:15 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 28 Mar 2016 15:47:12 -0700 Date: Mon, 28 Mar 2016 15:47:10 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: Geert Uytterhoeven , Linux-sh list , Rich Felker , "linux-kernel@vger.kernel.org" , Cris , xfs@oss.sgi.com Subject: Re: Build regressions/improvements in v4.6-rc1 Message-ID: <20160328224710.GC5822@birch.djwong.org> X-ASG-Orig-Subj: Re: Build regressions/improvements in v4.6-rc1 References: <20160328215923.GG11812@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160328215923.GG11812@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1459205248 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28250 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Tue, Mar 29, 2016 at 08:59:23AM +1100, Dave Chinner wrote: > On Sun, Mar 27, 2016 at 02:43:24PM +0200, Geert Uytterhoeven wrote: > > On Sun, Mar 27, 2016 at 2:39 PM, Geert Uytterhoeven > > wrote: > > > Below is the list of build error/warning regressions/improvements in > > > v4.6-rc1[1] compared to v4.5[2]. > > > > > > Summarized: > > > - build errors: +9/-6 > > > > > [1] http://kisskb.ellerman.id.au/kisskb/head/10114/ (all 262 configs) > > > [2] http://kisskb.ellerman.id.au/kisskb/head/10047/ (all 262 configs) > > > > > 9 error regressions: > > > + /home/kisskb/slave/src/fs/xfs/xfs_ondisk.h: error: call to > > > '__compiletime_assert_79' declared with attribute error: XFS: > > > sizeof(xfs_attr_shortform_t) is wrong, expected 8: => 79:2 > > > > cris-allyesconfig, cris-allmodconfig > > Yup, cris is the only platform that throws this error on this > structure. It's an on-disk structure and relying on the gcc > optimiser to do the same thing from release to release has become > such a crap-shoot these days. Hence as a stop-gap measure we added > build time checking of what they compiler is doing with those > structures, and to refuse to build XFS if the compiler/platform is > doing something obviously different. > > Modernising the on-disk structure definitions is on the list of > things to do, but it's nowhere near the top of my list at the > moment... I have a test patch that (for now) changes the ondisk format checks for the variable-length structures to look at the offsets of the non-variable-length fields. Can you give it a try? (No idea if it fixes fixes cris, but it passes the six arches that I can actually test on (x86/power/arm)). The downside is that it does nothing about troubling implication that there could be computers writing out a disk format that's incompatible with x86 XFSes...) --D ----------- From: Darrick J. Wong Subject: [PATCH] xfs: check offsets of variable length structures Some of the directory/attr structures contain variable-length objects, so the enclosing structure doesn't have a meaningful fixed size at compile time. We can check the offsets of the members before the variable-length member, so do those. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_ondisk.h | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_ondisk.h b/fs/xfs/xfs_ondisk.h index 960648b..3742216 100644 --- a/fs/xfs/xfs_ondisk.h +++ b/fs/xfs/xfs_ondisk.h @@ -22,6 +22,11 @@ BUILD_BUG_ON_MSG(sizeof(structname) != (size), "XFS: sizeof(" \ #structname ") is wrong, expected " #size) +#define XFS_CHECK_OFFSET(structname, member, off) \ + BUILD_BUG_ON_MSG(offsetof(structname, member) != (off), \ + "XFS: offsetof(" #structname ", " #member ") is wrong, " \ + "expected " #off) + static inline void __init xfs_check_ondisk_structs(void) { @@ -81,15 +86,28 @@ xfs_check_ondisk_structs(void) XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_name_remote_t, 12); */ + XFS_CHECK_OFFSET(xfs_attr_leaf_name_local_t, valuelen, 0); + XFS_CHECK_OFFSET(xfs_attr_leaf_name_local_t, namelen, 2); + XFS_CHECK_OFFSET(xfs_attr_leaf_name_local_t, nameval, 3); + XFS_CHECK_OFFSET(xfs_attr_leaf_name_remote_t, valueblk, 0); + XFS_CHECK_OFFSET(xfs_attr_leaf_name_remote_t, valuelen, 4); + XFS_CHECK_OFFSET(xfs_attr_leaf_name_remote_t, namelen, 8); + XFS_CHECK_OFFSET(xfs_attr_leaf_name_remote_t, name, 9); XFS_CHECK_STRUCT_SIZE(xfs_attr_leafblock_t, 40); - XFS_CHECK_STRUCT_SIZE(xfs_attr_shortform_t, 8); + XFS_CHECK_OFFSET(xfs_attr_shortform_t, hdr.totsize, 0); + XFS_CHECK_OFFSET(xfs_attr_shortform_t, hdr.count, 2); + XFS_CHECK_OFFSET(xfs_attr_shortform_t, list[0].namelen, 4); + XFS_CHECK_OFFSET(xfs_attr_shortform_t, list[0].valuelen, 5); + XFS_CHECK_OFFSET(xfs_attr_shortform_t, list[0].flags, 6); + XFS_CHECK_OFFSET(xfs_attr_shortform_t, list[0].nameval, 7); XFS_CHECK_STRUCT_SIZE(xfs_da_blkinfo_t, 12); XFS_CHECK_STRUCT_SIZE(xfs_da_intnode_t, 16); XFS_CHECK_STRUCT_SIZE(xfs_da_node_entry_t, 8); XFS_CHECK_STRUCT_SIZE(xfs_da_node_hdr_t, 16); XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_free_t, 4); XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_hdr_t, 16); - XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_unused_t, 6); + XFS_CHECK_OFFSET(xfs_dir2_data_unused_t, freetag, 0); + XFS_CHECK_OFFSET(xfs_dir2_data_unused_t, length, 2); XFS_CHECK_STRUCT_SIZE(xfs_dir2_free_hdr_t, 16); XFS_CHECK_STRUCT_SIZE(xfs_dir2_free_t, 16); XFS_CHECK_STRUCT_SIZE(xfs_dir2_ino4_t, 4); @@ -100,6 +118,9 @@ xfs_check_ondisk_structs(void) XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_t, 16); XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_tail_t, 4); XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_entry_t, 3); + XFS_CHECK_OFFSET(xfs_dir2_sf_entry_t, namelen, 0); + XFS_CHECK_OFFSET(xfs_dir2_sf_entry_t, offset, 1); + XFS_CHECK_OFFSET(xfs_dir2_sf_entry_t, name, 3); XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_hdr_t, 10); XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_off_t, 2); From david@fromorbit.com Mon Mar 28 18:13:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9B1D17CB0 for ; Mon, 28 Mar 2016 18:13:29 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1E2C3AC006 for ; Mon, 28 Mar 2016 16:13:29 -0700 (PDT) X-ASG-Debug-ID: 1459206802-04bdf0110561be0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id NQa9SDFolhOvHIPm for ; Mon, 28 Mar 2016 16:13:23 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AbCQDYuflWPDGaLHldgy4iMX2GaJ9uAhYBBAEGgRGKfIVfhA0XAoVuBIEoTQEBAQEBAQcBAQEBQUCFHjskNAUlAwctiCagW6AZCBmFPIoUgXwLQIJDBZdhhXGIC4FaARWETIhXAoYQiHuCGAELAYI2KDCIegEBAQ Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail06.adl2.internode.on.net with ESMTP; 29 Mar 2016 09:32:28 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1akgB1-0000CB-O2 for xfs@oss.sgi.com; Tue, 29 Mar 2016 10:02:27 +1100 Date: Tue, 29 Mar 2016 10:02:27 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfs: master, for-next branches updated to 4.6-rc1 Message-ID: <20160328230227.GH11812@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfs: master, for-next branches updated to 4.6-rc1 MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="w7PDEPdKQumQfZlR" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1459206802 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28250 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --w7PDEPdKQumQfZlR Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The master and for-next branches of the xfs kernel repository at git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git has just been updated to 4.6-rc1, ready for the next development cycle. Please update your trees and send future patches against these updated branches. Cheers, Dave. --=20 Dave Chinner david@fromorbit.com --w7PDEPdKQumQfZlR Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJW+bgDAAoJEK3oKUf0dfodhn8QAL4smXL9Cm9kC5UEhgC9vGl0 go/C6RrnkA3avifauuBvPiXac9gXxendN0Vp0AXVClqLZCdAPYBWHAYDVTX+eqmR maU5pLAsWLlhQ6RGoLJxGDkgl29qM3umNnz+d8IJo6iLYRTcyj3Oqn0N++1jteyQ RqOQ+ovFdmtWWdQf7Xw+FVVzFsNu7dk3ivOHgb8jnTqRMHQp2QaGe23fO9tRPFiP MaK+KR2ViKXQYfblaJNBa2bBbc6U1JvoeRND+MrcAqZPFI2FVFusQYSMe/O5LpIA PyZOtFWiZGGwgR93Mt55NLbAsW9JlxOkkiPGjtjXjg/ysIVY3eugu2gTVA4Qlcju Y+MWG9HPtuMS+zF5kuLq+JDvgNycDTcPl1+evjWBk/X5MVWZol5yhoWrNSf93K0I wM4PZdsxY6A0ocEkAypRN4joMgU2fK40nvT5jfJwA9xRCbzG33GE6H+4i6s7WGBI 108fbFtI9JjOnRecN1Pw+yDDEqqotUVrmkup0GIOcfQ75xWgoSu/jfCXx8FPSJtb euWjOgBm7R/CLW1Kg81z1nUTYeFjmpWM6TkU7v5CqM562x3aPCuU3AYIXX44k+YD wmWwNvtNJMVKD3azjx4iRBcOR/dec9lzCgpLO0Wh0Rf7AfL8aYn3Rthh6mvTJOW0 vJpr8T7MeQYvMcXfC5YT =Gi4W -----END PGP SIGNATURE----- --w7PDEPdKQumQfZlR-- From dan.j.williams@intel.com Mon Mar 28 18:34:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 0299E7CB7 for ; Mon, 28 Mar 2016 18:34:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6F916AC002 for ; Mon, 28 Mar 2016 16:34:19 -0700 (PDT) X-ASG-Debug-ID: 1459208056-04bdf0110462e10001-NocioJ Received: from mail-ob0-f177.google.com (mail-ob0-f177.google.com [209.85.214.177]) by cuda.sgi.com with ESMTP id dhjvItPWOEVwGXes (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 28 Mar 2016 16:34:16 -0700 (PDT) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Apparent-Source-IP: 209.85.214.177 Received: by mail-ob0-f177.google.com with SMTP id fp4so111207209obb.2 for ; Mon, 28 Mar 2016 16:34:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=EuAFMN2xENtcVEqn3cfAWDXkVIxTQzEbL2/eeCRYEAU=; b=bKLXqO+Ra9ZcTOaQOBE0umnGDZg4CIER2iaoe3xoEq+qhFnXazWL/zrKBJGfB/SMhI toWRuJLtteUknJ/odRq15eFncHazX1X+APJBPhTVm/egx4kM5X16uotas6z02Zd5++IW DRHBowETHE5hPyezdBnYHN9GbjWtdbAuj4P/b+Xryaitq3mSIvpsx9HkZwilpJFkdo2l 03/5tRDifIHs/qndyv1KOkmmGtLivFzpEgH7h8gXqJkGCC3dzIHHKiB2FMtw1hZImKJe n/knInatoVGDwG60p7bnaqrdWp2vUoXoWHuu6N5cBPRqEZrdo6KsuOnn2oJLfZJOMWpX uphQ== 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; bh=EuAFMN2xENtcVEqn3cfAWDXkVIxTQzEbL2/eeCRYEAU=; b=MY2BzQRuX0vPtD21Ajv8yrNnx3T2XFX5wop8MTB78MdcZEDchQDAdDckw5v+2lgfJQ aD6RujX/Zbms7lYKTI9qi/MzJpJY7/lSBye56eCMcNQ/tiR4FfqOpmTuLxSSneAgakGN XMG1aAayACM9bXwNn5Sx0iqlrSU57q+hK7188y+uIqMb1kJF6IBoVlzSONxGJsVd7Lzp erPR0lGJsU39EKh0uUqxN9TGQ+ZZZ65NQvNjav2SOiNgy03wdeqLlE/YL3TjRnNopUSi 24/Gthyc2rluFO6SfJOgjE+jaSkx3u++ED2hiCSVo8iIi5BDK7VcH3yhsgTXK79NYl8B tYeQ== X-Gm-Message-State: AD7BkJIz2qaLUKGD+yMp3zDPW6NXSk7sLY4I7zbSlC9CWWHvAyzSGZA4ohtVY3LJ9G6xUTlicv4QPdwSF9GElY/0 MIME-Version: 1.0 X-Received: by 10.182.242.4 with SMTP id wm4mr13295726obc.85.1459208056152; Mon, 28 Mar 2016 16:34:16 -0700 (PDT) Received: by 10.157.62.230 with HTTP; Mon, 28 Mar 2016 16:34:16 -0700 (PDT) In-Reply-To: <1459195288.15523.3.camel@intel.com> References: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> <1458861450-17705-5-git-send-email-vishal.l.verma@intel.com> <1458939796.5501.8.camel@intel.com> <1459195288.15523.3.camel@intel.com> Date: Mon, 28 Mar 2016 16:34:16 -0700 Message-ID: Subject: Re: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors From: Dan Williams X-ASG-Orig-Subj: Re: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors To: "Verma, Vishal L" Cc: "linux-block@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "akpm@linux-foundation.org" , "axboe@fb.com" , "linux-nvdimm@lists.01.org" , "linux-fsdevel@vger.kernel.org" , "ross.zwisler@linux.intel.com" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" , "david@fromorbit.com" , "jack@suse.cz" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ob0-f177.google.com[209.85.214.177] X-Barracuda-Start-Time: 1459208056 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/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, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28251 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain On Mon, Mar 28, 2016 at 1:01 PM, Verma, Vishal L wrote: > On Fri, 2016-03-25 at 14:20 -0700, Dan Williams wrote: >> On Fri, Mar 25, 2016 at 2:03 PM, Verma, Vishal L >> wrote: >> > >> > On Fri, 2016-03-25 at 11:47 -0700, Dan Williams wrote: >> > > >> > > On Thu, Mar 24, 2016 at 4:17 PM, Vishal Verma > > > el.c >> > > om> wrote: >> > > > >> > > > >> > > > From: Matthew Wilcox >> > > > >> > > > dax_clear_sectors() cannot handle poisoned blocks. These must >> > > > be >> > > > zeroed using the BIO interface instead. Convert ext2 and XFS >> > > > to >> > > > use >> > > > only sb_issue_zerout(). >> > > > >> > > > Signed-off-by: Matthew Wilcox >> > > > [vishal: Also remove the dax_clear_sectors function entirely] >> > > > Signed-off-by: Vishal Verma >> > > > --- >> > > > fs/dax.c | 32 -------------------------------- >> > > > fs/ext2/inode.c | 7 +++---- >> > > > fs/xfs/xfs_bmap_util.c | 9 --------- >> > > > include/linux/dax.h | 1 - >> > > > 4 files changed, 3 insertions(+), 46 deletions(-) >> > > > >> > > > diff --git a/fs/dax.c b/fs/dax.c >> > > > index bb7e9f8..a30481e 100644 >> > > > --- a/fs/dax.c >> > > > +++ b/fs/dax.c >> > > > @@ -78,38 +78,6 @@ struct page *read_dax_sector(struct >> > > > block_device >> > > > *bdev, sector_t n) >> > > > return page; >> > > > } >> > > > >> > > > -/* >> > > > - * dax_clear_sectors() is called from within transaction >> > > > context >> > > > from XFS, >> > > > - * and hence this means the stack from this point must follow >> > > > GFP_NOFS >> > > > - * semantics for all operations. >> > > > - */ >> > > > -int dax_clear_sectors(struct block_device *bdev, sector_t >> > > > _sector, >> > > > long _size) >> > > > -{ >> > > > - struct blk_dax_ctl dax = { >> > > > - .sector = _sector, >> > > > - .size = _size, >> > > > - }; >> > > > - >> > > > - might_sleep(); >> > > > - do { >> > > > - long count, sz; >> > > > - >> > > > - count = dax_map_atomic(bdev, &dax); >> > > > - if (count < 0) >> > > > - return count; >> > > > - sz = min_t(long, count, SZ_128K); >> > > > - clear_pmem(dax.addr, sz); >> > > > - dax.size -= sz; >> > > > - dax.sector += sz / 512; >> > > > - dax_unmap_atomic(bdev, &dax); >> > > > - cond_resched(); >> > > > - } while (dax.size); >> > > > - >> > > > - wmb_pmem(); >> > > > - return 0; >> > > > -} >> > > > -EXPORT_SYMBOL_GPL(dax_clear_sectors); >> > > What about the other unwritten extent conversions in the dax >> > > path? >> > > Shouldn't those be converted to block-layer zero-outs as well? >> > Could you point me to where these might be? I thought once we've >> > converted all the zeroout type callers (by removing >> > dax_clear_sectors), >> > and fixed up dax_do_io to try a driver fallback, we've handled all >> > the >> > media error cases in dax.. >> grep for usages of clear_pmem()... which I was hoping to eliminate >> after this change to push zeroing down to the driver. > > Ok, so I looked at these, and it looks like the majority of callers of > clear_pmem are from the fault path (either pmd or regular), and in > those cases we should be 'protected', as we would have failed at a > prior step (dax_map_atomic). Seems kind of sad to fail the fault due to a bad block when we were going to zero it anyway, right? I'm not seeing a compelling reason to keep any zeroing in fs/dax.c. From ming.lei@canonical.com Mon Mar 28 20:33:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7DDDB7CA3 for ; Mon, 28 Mar 2016 20:33:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id F290CAC004 for ; Mon, 28 Mar 2016 18:33:17 -0700 (PDT) X-ASG-Debug-ID: 1459215194-04cbb07ad5c2610001-NocioJ Received: from youngberry.canonical.com (youngberry.canonical.com [91.189.89.112]) by cuda.sgi.com with ESMTP id IsDbm5gIiQoFdFfq (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 28 Mar 2016 18:33:15 -0700 (PDT) X-Barracuda-Envelope-From: ming.lei@canonical.com X-Barracuda-Apparent-Source-IP: 91.189.89.112 Received: from mail-yw0-f172.google.com ([209.85.161.172]) by youngberry.canonical.com with esmtpsa (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.76) (envelope-from ) id 1akiWw-0002rk-3D for xfs@oss.sgi.com; Tue, 29 Mar 2016 01:33:14 +0000 Received: by mail-yw0-f172.google.com with SMTP id g127so1699018ywf.2 for ; Mon, 28 Mar 2016 18:33:14 -0700 (PDT) X-Gm-Message-State: AD7BkJIrUcX1UaYVs6reEL4Osn7r+svuGKUt7b9keSnIt9FK78EsYwQRYvkevgO64NdbcWBt/8FWor1fTJd6lA== MIME-Version: 1.0 X-Received: by 10.13.241.199 with SMTP id a190mr15348877ywf.47.1459215193234; Mon, 28 Mar 2016 18:33:13 -0700 (PDT) Received: by 10.37.207.145 with HTTP; Mon, 28 Mar 2016 18:33:13 -0700 (PDT) In-Reply-To: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> References: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> Date: Tue, 29 Mar 2016 09:33:13 +0800 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH 0/8] block: prepare for multipage bvecs From: Ming Lei X-ASG-Orig-Subj: Re: [PATCH 0/8] block: prepare for multipage bvecs To: Jens Axboe , Linux Kernel Mailing List Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: youngberry.canonical.com[91.189.89.112] X-Barracuda-Start-Time: 1459215195 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-ASG-Whitelist: Body =?UTF-8?B?aHR0cDovL21hcmNcLmluZm8vXD8=?= X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Mar 22, 2016 at 2:12 PM, Ming Lei wrote: > Hi, > > Interests[1] have been shown in multipage bvecs, so this patchset > try to prepare for the support and do two things: > > 1) the 1st 4 patches use bvec iterator to implement iterate_bvec(), > then we can drop the non-standard way for iterating bvec > > 2) remove BIO_MAX_SECTORS & BIO_MAX_SIZE, and now there is only > one user for each. Once multipage bvecs is introduced, one bio > may hold lots of sectors, and we should always use sort of BIO_MAX_VECS > which should be introduced in future and is similiar with current > BIO_MAX_PAGES. > > xfstests(-a auto) have been run and no regression found by this > patchset against linus v4.5+. Hi Jens, Looks no one objects this patchset, and the change of iov_iter.c is a good cleanup too, so what do you think of the patchset? Thanks, Ming > > drivers/block/drbd/drbd_int.h | 4 +-- > fs/xfs/xfs_buf.c | 2 +- > include/linux/bio.h | 55 +------------------------------ > include/linux/blk_types.h | 4 +-- > include/linux/bvec_iter.h | 77 +++++++++++++++++++++++++++++++++++++++++++ > lib/iov_iter.c | 31 +++++++---------- > 6 files changed, 94 insertions(+), 79 deletions(-) > > > [1], http://marc.info/?w=2&r=1&s=++[LSF%2FMM+ATTEND]+block%3A+multipage+bvecs&q=t > > > Thanks, > Ming > From jens@gecius.de Mon Mar 28 23:54:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A02FA7CA4 for ; Mon, 28 Mar 2016 23:54:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C8F19AC001 for ; Mon, 28 Mar 2016 21:54:40 -0700 (PDT) X-ASG-Debug-ID: 1459227275-04bdf0110570f50001-NocioJ Received: from mail.gecius.de (bum4.dynsinn.org [88.198.11.146]) by cuda.sgi.com with ESMTP id pDb8W02enlcSmVe8 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 28 Mar 2016 21:54:36 -0700 (PDT) X-Barracuda-Envelope-From: jens@gecius.de X-Barracuda-Apparent-Source-IP: 88.198.11.146 Received: from STab.fritz.box (ip4d16b9de.dynamic.kabel-deutschland.de [77.22.185.222]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: jens@gecius.de) by mail.gecius.de (Postfix) with ESMTPSA id 71496E029A for ; Tue, 29 Mar 2016 06:54:33 +0200 (CEST) User-Agent: K-9 Mail for Android MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Subject: Xfs-related oops? From: Jens X-ASG-Orig-Subj: Xfs-related oops? Date: Tue, 29 Mar 2016 06:53:08 +0200 To: xfs@oss.sgi.com Message-ID: <33B260EF-3E3A-48D8-A04E-12470B63054E@gecius.de> X-Barracuda-Connect: bum4.dynsinn.org[88.198.11.146] X-Barracuda-Start-Time: 1459227276 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28256 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 Hi folks, I haven't found any recent hints on xfs-related kernel oops, but I obviously get some, unfortunately. If any other information is needed, pls let me know (not subscribed to list, pls cc me). Any help would be appreciated. Thanks, Jens Mar 29 04:09:49 server kernel: [1572426.666492] BUG: unable to handle kernel NULL pointer dereference at 00000000000001bb Mar 29 04:09:49 server kernel: [1572426.667356] IP: [] xfs_inode_set_reclaim_tag+0x27/0x170 [xfs] Mar 29 04:09:49 server kernel: [1572426.668173] PGD 0 Mar 29 04:09:49 server kernel: [1572426.668984] Oops: 0000 [#1] SMP Mar 29 04:09:49 server kernel: [1572426.669774] Modules linked in: nls_iso8859_1 nf_conntrack_netlink nfnetlink xt_multiport vhost_net vhost macvtap macvlan ipt_MASQUERADE iptable_nat nf_nat_ipv4 nf_nat nf_conntrack_ipv4 nf_defrag_ipv4 xt_conntrack nf_conntrack ipt_REJECT xt_CHECKSUM iptable_mangle xt_tcpudp bridge stp llc ip6table_filter ip6_tables iptable_filter ip_tables ebtable_nat ebtables x_tables dm_crypt snd_usb_audio snd_usbmidi_lib uvcvideo snd_hwdep snd_pcm snd_page_alloc snd_seq_midi snd_seq_midi_event snd_rawmidi snd_seq bnep videobuf2_vmalloc snd_seq_device videobuf2_memops snd_timer videobuf2_core ftdi_sio usbserial videodev snd joydev soundcore stv6110x rfcomm bluetooth lnbp21 stv090x ddbridge x86_pkg_temp_thermal intel_powerclamp coretemp cxd2099(C) kvm_intel kvm dvb_core crct10dif_pclmul crc32_pclmul aesni_intel dm_multipath scsi_dh aes_x86_64 ipmi_si lrw gf128mul shpchp lpc_ich glue_helper ablk_helper mac_hid cryptd nfsd parport_pc ppdev auth_rpcgss binfmt_ misc nfs _acl hwmon_vid ipmi_devintf ipmi_watchdog nfs lockd sunrpc lp parport fscache xfs btrfs xor raid6_pq libcrc32c dm_mirror dm_region_hash dm_log hid_generic usbhid hid usb_storage ast syscopyarea sysfillrect sysimgblt ttm drm_kms_helper igb drm e1000e dca ahci libahci ptp i2c_algo_bit arcmsr pps_core video Mar 29 04:09:49 server kernel: [1572426.675311] CPU: 7 PID: 77 Comm: kswapd0 Tainted: G C 3.13.0-79-generic #123-Ubuntu Mar 29 04:09:49 server kernel: [1572426.676293] Hardware name: Supermicro X10SLL-F/X10SLL-F, BIOS 3.0 04/24/2015 Mar 29 04:09:49 server kernel: [1572426.677363] task: ffff8807ee199800 ti: ffff8807ee1a8000 task.ti: ffff8807ee1a8000 Mar 29 04:09:49 server kernel: [1572426.678396] RIP: 0010:[] [] xfs_inode_set_reclaim_tag+0x27/0x170 [xfs] Mar 29 04:09:49 server kernel: [1572426.679495] RSP: 0018:ffff8807ee1a9b58 EFLAGS: 00010292 Mar 29 04:09:49 server kernel: [1572426.680541] RAX: 0000000000020002 RBX: ffff880004000000 RCX: 0000000000000034 Mar 29 04:09:49 server kernel: [1572426.681596] RDX: 0000000000000002 RSI: 0000000000000000 RDI: 0000000000000000 Mar 29 04:09:49 server kernel: [1572426.682567] RBP: ffff8807ee1a9b98 R08: 7018000000000000 R09: 00040002380c0000 Mar 29 04:09:49 server kernel: [1572426.683534] R10: ffddfffec7f48e03 R11: 00000000ffffffff R12: ffff880004000000 Mar 29 04:09:49 server kernel: [1572426.684549] R13: 0000000000000000 R14: ffff8800040000d4 R15: 0000000000000560 Mar 29 04:09:49 server kernel: [1572426.685564] FS: 0000000000000000(0000) GS:ffff88081fdc0000(0000) knlGS:0000000000000000 Mar 29 04:09:49 server kernel: [1572426.686577] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 Mar 29 04:09:49 server kernel: [1572426.687544] CR2: 00000000000001bb CR3: 0000000001c0e000 CR4: 00000000001427e0 Mar 29 04:09:49 server kernel: [1572426.688547] Stack: Mar 29 04:09:49 server kernel: [1572426.689531] ffff8807ee1a9ba0 ffffffff81201534 ffff8807ee1a9b68 ffff8800040000d4 Mar 29 04:09:49 server kernel: [1572426.690561] ffff880004000000 0000000000000000 0000000000000000 0000000000000560 Mar 29 04:09:49 server kernel: [1572426.691580] ffff8807ee1a9bc8 ffffffffa02d7a6f ffff880004000198 ffff880004000220 Mar 29 04:09:49 server kernel: [1572426.692593] Call Trace: Mar 29 04:09:49 server kernel: [1572426.693892] [] ? fsnotify_clear_marks_by_inode+0xa4/0x130 Mar 29 04:09:49 server kernel: [1572426.695346] [] xfs_fs_destroy_inode+0xbf/0x100 [xfs] Mar 29 04:09:49 server kernel: [1572426.696346] [] destroy_inode+0x38/0x60 Mar 29 04:09:49 server kernel: [1572426.697415] [] evict+0x11b/0x1b0 Mar 29 04:09:49 server kernel: [1572426.698450] [] dispose_list+0x39/0x50 Mar 29 04:09:49 server kernel: [1572426.700428] [] prune_icache_sb+0x47/0x60 Mar 29 04:09:49 server kernel: [1572426.702333] [] super_cache_scan+0x105/0x170 Mar 29 04:09:49 server kernel: [1572426.704129] [] shrink_slab+0x1c7/0x370 Mar 29 04:09:49 server kernel: [1572426.705213] [] balance_pgdat+0x3e8/0x610 Mar 29 04:09:49 server kernel: [1572426.706226] [] kswapd+0x15b/0x3f0 Mar 29 04:09:49 server kernel: [1572426.707237] [] ? prepare_to_wait_event+0x100/0x100 Mar 29 04:09:49 server kernel: [1572426.708298] [] ? balance_pgdat+0x610/0x610 Mar 29 04:09:49 server kernel: [1572426.709385] [] kthread+0xd2/0xf0 Mar 29 04:09:49 server kernel: [1572426.710494] [] ? kthread_create_on_node+0x1c0/0x1c0 Mar 29 04:09:49 server kernel: [1572426.711540] [] ret_from_fork+0x58/0x90 Mar 29 04:09:49 server kernel: [1572426.712649] [] ? kthread_create_on_node+0x1c0/0x1c0 Mar 29 04:09:49 server kernel: [1572426.713688] Code: 0f 1f 40 00 0f 1f 44 00 00 55 48 89 e5 41 57 41 56 41 55 41 54 53 48 89 fb 4c 8d b3 d4 00 00 00 48 83 ec 18 48 8b 3f 48 8b 73 20 <0f> b6 8f bb 01 00 00 48 d3 ee e8 fa d1 04 00 4c 8d 68 4c 49 89 Mar 29 04:09:49 server kernel: [1572426.714816] RIP [] xfs_inode_set_reclaim_tag+0x27/0x170 [xfs] Mar 29 04:09:49 server kernel: [1572426.715941] RSP Mar 29 04:09:49 server kernel: [1572426.717013] CR2: 00000000000001bb Mar 29 04:09:49 server kernel: [1572426.724720] ---[ end trace ea84784f70a01498 ]--- -----BEGIN PGP SIGNATURE----- Version: APG v1.1.1 iGQEAREKACQFAlb6CjQdHEplbnMgR2VjaXVzIDxqZW5zQGdlY2l1cy5kZT4ACgkQ GNSomyjQ8JfazACeOcfyqsiHrx1EeHtioJ3aQvYSluAAn0BZOM7xycIRd7caL44B JyN4dOBk =u2ZC -----END PGP SIGNATURE----- From mikael.starvik@axis.com Tue Mar 29 01:16:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 993177CA0 for ; Tue, 29 Mar 2016 01:16:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4FA5C8F8033 for ; Mon, 28 Mar 2016 23:16:29 -0700 (PDT) X-ASG-Debug-ID: 1459232183-04bdf0110474720001-NocioJ Received: from bastet.se.axis.com (bastet.se.axis.com [195.60.68.11]) by cuda.sgi.com with ESMTP id zGpEom3BPwplNlju for ; Mon, 28 Mar 2016 23:16:24 -0700 (PDT) X-Barracuda-Envelope-From: mikael.starvik@axis.com X-Barracuda-Apparent-Source-IP: 195.60.68.11 Received: from localhost (localhost [127.0.0.1]) by bastet.se.axis.com (Postfix) with ESMTP id 3D23C18163; Tue, 29 Mar 2016 08:16:23 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at bastet.se.axis.com Received: from bastet.se.axis.com ([IPv6:::ffff:127.0.0.1]) by localhost (bastet.se.axis.com [::ffff:127.0.0.1]) (amavisd-new, port 10024) with LMTP id mJa44rIKeS6Z; Tue, 29 Mar 2016 08:16:21 +0200 (CEST) Received: from boulder.se.axis.com (boulder.se.axis.com [10.0.2.104]) by bastet.se.axis.com (Postfix) with ESMTP id D4371180AE; Tue, 29 Mar 2016 08:16:20 +0200 (CEST) Received: from boulder.se.axis.com (localhost [127.0.0.1]) by postfix.imss71 (Postfix) with ESMTP id BACC713E0; Tue, 29 Mar 2016 08:16:20 +0200 (CEST) Received: from thoth.se.axis.com (thoth.se.axis.com [10.0.2.173]) by boulder.se.axis.com (Postfix) with ESMTP id AF2891102; Tue, 29 Mar 2016 08:16:20 +0200 (CEST) Received: from XBOX03.axis.com (xbox03.axis.com [10.0.5.17]) by thoth.se.axis.com (Postfix) with ESMTP id ABEDDFB5; Tue, 29 Mar 2016 08:16:20 +0200 (CEST) Received: from xbox12.axis.com (10.0.5.26) by XBOX03.axis.com (10.0.5.17) with Microsoft SMTP Server (TLS) id 15.0.1156.6; Tue, 29 Mar 2016 08:16:17 +0200 Received: from XBOX04.axis.com (10.0.5.18) by xbox12.axis.com (10.0.5.26) with Microsoft SMTP Server (TLS) id 15.0.1156.6; Tue, 29 Mar 2016 08:16:17 +0200 Received: from XBOX04.axis.com ([fe80::210a:724b:68cb:a917]) by XBOX04.axis.com ([fe80::210a:724b:68cb:a917%23]) with mapi id 15.00.1156.000; Tue, 29 Mar 2016 08:16:17 +0200 From: Mikael Starvik To: "Darrick J. Wong" CC: Dave Chinner , Rich Felker , linux-cris-kernel , Linux-sh list , "linux-kernel@vger.kernel.org" , "xfs@oss.sgi.com" , "Geert Uytterhoeven" Subject: Re: Build regressions/improvements in v4.6-rc1 Thread-Topic: Build regressions/improvements in v4.6-rc1 X-ASG-Orig-Subj: Re: Build regressions/improvements in v4.6-rc1 Thread-Index: AQHRiCZCBlOGAOIShkewj/KvxxijkJ9vSFiAgAANWgCAAJ8Dkw== Date: Tue, 29 Mar 2016 06:16:17 +0000 Message-ID: <8E4F6C1A-10FC-4862-9D7A-583777F7A6CC@axis.com> References: <20160328215923.GG11812@dastard>,<20160328224710.GC5822@birch.djwong.org> In-Reply-To: <20160328224710.GC5822@birch.djwong.org> Accept-Language: sv-SE, en-US Content-Language: sv-SE X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-exchange-transport-fromentityheader: Hosted Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Barracuda-Connect: bastet.se.axis.com[195.60.68.11] X-Barracuda-Start-Time: 1459232183 X-Barracuda-URL: https://192.48.157.11:443/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=BSF_SC0_MISMATCH_TO, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28257 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header I have not lookend at the structs but CRIS is a bit unusual since it does n= o alignment what so ever. If a short is followed by an int will be unaligne= d like in a packed struct. Jesper or someone else will take a look at this specific issue. /Mikael > 29 mars 2016 kl. 00:47 skrev Darrick J. Wong : >=20 >> On Tue, Mar 29, 2016 at 08:59:23AM +1100, Dave Chinner wrote: >>> On Sun, Mar 27, 2016 at 02:43:24PM +0200, Geert Uytterhoeven wrote: >>> On Sun, Mar 27, 2016 at 2:39 PM, Geert Uytterhoeven >>> wrote: >>>> Below is the list of build error/warning regressions/improvements in >>>> v4.6-rc1[1] compared to v4.5[2]. >>>>=20 >>>> Summarized: >>>> - build errors: +9/-6 >>>=20 >>>> [1] http://kisskb.ellerman.id.au/kisskb/head/10114/ (all 262 configs) >>>> [2] http://kisskb.ellerman.id.au/kisskb/head/10047/ (all 262 configs) >>>=20 >>>> 9 error regressions: >>>> + /home/kisskb/slave/src/fs/xfs/xfs_ondisk.h: error: call to >>>> '__compiletime_assert_79' declared with attribute error: XFS: >>>> sizeof(xfs_attr_shortform_t) is wrong, expected 8: =3D> 79:2 >>>=20 >>> cris-allyesconfig, cris-allmodconfig >>=20 >> Yup, cris is the only platform that throws this error on this >> structure. It's an on-disk structure and relying on the gcc >> optimiser to do the same thing from release to release has become >> such a crap-shoot these days. Hence as a stop-gap measure we added >> build time checking of what they compiler is doing with those >> structures, and to refuse to build XFS if the compiler/platform is >> doing something obviously different. >>=20 >> Modernising the on-disk structure definitions is on the list of >> things to do, but it's nowhere near the top of my list at the >> moment... >=20 > I have a test patch that (for now) changes the ondisk format checks for t= he > variable-length structures to look at the offsets of the non-variable-len= gth > fields. Can you give it a try? >=20 > (No idea if it fixes fixes cris, but it passes the six arches that I can > actually test on (x86/power/arm)). The downside is that it does nothing = about > troubling implication that there could be computers writing out a disk fo= rmat > that's incompatible with x86 XFSes...) >=20 > --D > ----------- > From: Darrick J. Wong > Subject: [PATCH] xfs: check offsets of variable length structures >=20 > Some of the directory/attr structures contain variable-length objects, > so the enclosing structure doesn't have a meaningful fixed size at > compile time. We can check the offsets of the members before the > variable-length member, so do those. >=20 > Signed-off-by: Darrick J. Wong > --- > fs/xfs/xfs_ondisk.h | 25 +++++++++++++++++++++++-- > 1 file changed, 23 insertions(+), 2 deletions(-) >=20 > diff --git a/fs/xfs/xfs_ondisk.h b/fs/xfs/xfs_ondisk.h > index 960648b..3742216 100644 > --- a/fs/xfs/xfs_ondisk.h > +++ b/fs/xfs/xfs_ondisk.h > @@ -22,6 +22,11 @@ > BUILD_BUG_ON_MSG(sizeof(structname) !=3D (size), "XFS: sizeof(" \ > #structname ") is wrong, expected " #size) >=20 > +#define XFS_CHECK_OFFSET(structname, member, off) \ > + BUILD_BUG_ON_MSG(offsetof(structname, member) !=3D (off), \ > + "XFS: offsetof(" #structname ", " #member ") is wrong, " \ > + "expected " #off) > + > static inline void __init > xfs_check_ondisk_structs(void) > { > @@ -81,15 +86,28 @@ xfs_check_ondisk_structs(void) > XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_name_remote_t, 12); > */ >=20 > + XFS_CHECK_OFFSET(xfs_attr_leaf_name_local_t, valuelen, 0); > + XFS_CHECK_OFFSET(xfs_attr_leaf_name_local_t, namelen, 2); > + XFS_CHECK_OFFSET(xfs_attr_leaf_name_local_t, nameval, 3); > + XFS_CHECK_OFFSET(xfs_attr_leaf_name_remote_t, valueblk, 0); > + XFS_CHECK_OFFSET(xfs_attr_leaf_name_remote_t, valuelen, 4); > + XFS_CHECK_OFFSET(xfs_attr_leaf_name_remote_t, namelen, 8); > + XFS_CHECK_OFFSET(xfs_attr_leaf_name_remote_t, name, 9); > XFS_CHECK_STRUCT_SIZE(xfs_attr_leafblock_t, 40); > - XFS_CHECK_STRUCT_SIZE(xfs_attr_shortform_t, 8); > + XFS_CHECK_OFFSET(xfs_attr_shortform_t, hdr.totsize, 0); > + XFS_CHECK_OFFSET(xfs_attr_shortform_t, hdr.count, 2); > + XFS_CHECK_OFFSET(xfs_attr_shortform_t, list[0].namelen, 4); > + XFS_CHECK_OFFSET(xfs_attr_shortform_t, list[0].valuelen, 5); > + XFS_CHECK_OFFSET(xfs_attr_shortform_t, list[0].flags, 6); > + XFS_CHECK_OFFSET(xfs_attr_shortform_t, list[0].nameval, 7); > XFS_CHECK_STRUCT_SIZE(xfs_da_blkinfo_t, 12); > XFS_CHECK_STRUCT_SIZE(xfs_da_intnode_t, 16); > XFS_CHECK_STRUCT_SIZE(xfs_da_node_entry_t, 8); > XFS_CHECK_STRUCT_SIZE(xfs_da_node_hdr_t, 16); > XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_free_t, 4); > XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_hdr_t, 16); > - XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_unused_t, 6); > + XFS_CHECK_OFFSET(xfs_dir2_data_unused_t, freetag, 0); > + XFS_CHECK_OFFSET(xfs_dir2_data_unused_t, length, 2); > XFS_CHECK_STRUCT_SIZE(xfs_dir2_free_hdr_t, 16); > XFS_CHECK_STRUCT_SIZE(xfs_dir2_free_t, 16); > XFS_CHECK_STRUCT_SIZE(xfs_dir2_ino4_t, 4); > @@ -100,6 +118,9 @@ xfs_check_ondisk_structs(void) > XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_t, 16); > XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_tail_t, 4); > XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_entry_t, 3); > + XFS_CHECK_OFFSET(xfs_dir2_sf_entry_t, namelen, 0); > + XFS_CHECK_OFFSET(xfs_dir2_sf_entry_t, offset, 1); > + XFS_CHECK_OFFSET(xfs_dir2_sf_entry_t, name, 3); > XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_hdr_t, 10); > XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_off_t, 2); >=20 From geert.uytterhoeven@gmail.com Tue Mar 29 01:46:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 E2C3C7CA0 for ; Tue, 29 Mar 2016 01:46:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 467FBAC002 for ; Mon, 28 Mar 2016 23:46:34 -0700 (PDT) X-ASG-Debug-ID: 1459233992-04cb6c245fcfb00001-NocioJ Received: from mail-io0-f194.google.com (mail-io0-f194.google.com [209.85.223.194]) by cuda.sgi.com with ESMTP id 52DPCg3eyNdRDmIB (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 28 Mar 2016 23:46:32 -0700 (PDT) X-Barracuda-Envelope-From: geert.uytterhoeven@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.223.194 Received: by mail-io0-f194.google.com with SMTP id g185so1361662ioa.0 for ; Mon, 28 Mar 2016 23:46:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc; bh=iiP7E+0/kIJr92JjuNwG9PMmi/VKUr5LMY+gxFRLL4w=; b=yubydrS8G6/YxJOH9q0IzzZX30rnaLVQ2gn5qims5C7PoBnT+wn6j5RC3yu/zJAV9P wQSipRNHrMWcxHl39+G9TLxnlJyCwM4Adq6XW3e4llPLrOREgnpq7m5weVw1C1XGu3hC y9YeWi1GXUQVdZdDnAXyd7d6wsGdeE8velNQ2ChA4SXtZjp6Hhs/Sy/JD/I26NDK4uD2 jyRQmkT30gxlBM4Mp8dSORw46L8q+LKleMIpckNpAPaiEBRxuAPQ0QXHLSibtuevl78T wZBg5URqXygmkOXTlVrrUoMsx1W19lmPWvEKALfCzw6ZfdiVQRfpdD32qzXsvFec0/hy RZ1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:date :message-id:subject:from:to:cc; bh=iiP7E+0/kIJr92JjuNwG9PMmi/VKUr5LMY+gxFRLL4w=; b=UHsc7O8XODXqAXQzaB+Qs1FYGQtq1d3HoyMY3rZ4eqcaMw4eAxHvsjxGycG+XwpgMg C6sXft4RQLi+XiMqCwDMq7N7JY9fy7cnmwP7tP5/dSzA3y2hyn31CrBpKsua+Y+aogZO AlhFwa5zKKB55WXZtgmsasD/C+r5fOY5LAkY9ggz8I2487TALmQEb1WtGcdC5waFKGML ExYwTy0+pCSSY5rTKo6yf8oGIUX6F5dmeJvcRIc8qA3eRGU/cB6Sz6HG5hkFP95RWuJy tlPDNMTOuDOmSxdLEae3x9CQD3ymgraQbSeeRDCumsTpgiVvgN5mp1F7jADnXaP3hGsG ct+A== X-Gm-Message-State: AD7BkJIibfFkdSRvhJPdlpMFTkhfd+mOJltSkq9W0Nxj9oYqgEBOaGOLQ3s7GCRq9hF9lPSs1HVHMxi0fDzJPA== MIME-Version: 1.0 X-Received: by 10.107.26.203 with SMTP id a194mr1132299ioa.115.1459233992148; Mon, 28 Mar 2016 23:46:32 -0700 (PDT) Sender: geert.uytterhoeven@gmail.com Received: by 10.107.31.77 with HTTP; Mon, 28 Mar 2016 23:46:32 -0700 (PDT) In-Reply-To: <20160328224710.GC5822@birch.djwong.org> References: <20160328215923.GG11812@dastard> <20160328224710.GC5822@birch.djwong.org> Date: Tue, 29 Mar 2016 08:46:32 +0200 X-Google-Sender-Auth: rfnZEdKfMOWZ-2q4U5BWqTGfeEs Message-ID: Subject: Re: Build regressions/improvements in v4.6-rc1 From: Geert Uytterhoeven X-ASG-Orig-Subj: Re: Build regressions/improvements in v4.6-rc1 To: "Darrick J. Wong" Cc: Dave Chinner , Linux-sh list , Rich Felker , "linux-kernel@vger.kernel.org" , Cris , xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-io0-f194.google.com[209.85.223.194] X-Barracuda-Start-Time: 1459233992 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28257 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Mar 29, 2016 at 12:47 AM, Darrick J. Wong wrote: > (No idea if it fixes fixes cris, but it passes the six arches that I can > actually test on (x86/power/arm)). The downside is that it does nothing about https://www.kernel.org/pub/tools/crosstool/ Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds From hch@lst.de Tue Mar 29 02:21:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CF0367CA0 for ; Tue, 29 Mar 2016 02:21:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A26C5304032 for ; Tue, 29 Mar 2016 00:21:32 -0700 (PDT) X-ASG-Debug-ID: 1459236089-04cb6c2462d05e0001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id KHBBzE3rbfNA3bja (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 29 Mar 2016 00:21:30 -0700 (PDT) X-Barracuda-Envelope-From: hch@lst.de X-Barracuda-Apparent-Source-IP: 213.95.11.211 Received: by newverein.lst.de (Postfix, from userid 2407) id 5540668BF0; Tue, 29 Mar 2016 09:21:28 +0200 (CEST) Date: Tue, 29 Mar 2016 09:21:28 +0200 From: Christoph Hellwig To: "Darrick J. Wong" Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: don't hand out pNFS layouts for reflink inodes Message-ID: <20160329072128.GA14940@lst.de> X-ASG-Orig-Subj: Re: [PATCH] xfs: don't hand out pNFS layouts for reflink inodes References: <1456936485-21940-1-git-send-email-hch@lst.de> <20160328195140.GB5360@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160328195140.GB5360@birch.djwong.org> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1459236090 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28258 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Mar 28, 2016 at 12:51:40PM -0700, Darrick J. Wong wrote: > > /* > > + * The pNFS block layout spec actually supports reflink like > > + * functionality, but the Linux pNFS server doesn't implement it yet. > > + */ > > + if (!xfs_is_reflink_inode(ip)) > > + return -ENXIO; > > /me isn't familiar with pNFS, but doesn't this make it so that > xfs_fs_map_blocks /only/ works on reflinked files? Maybe I'm misreading the > comment, but it sounds to me like Linux doesn't support reflinked files over > pNFS and therefore we want to disable this iomapping functionality any time we > find a reflinked file. > > But maybe there's a subtlety here that I'm missing? You jsut missed me fat fingering the check :) Btw, we'll need something similar to prevent swapfiles which just use ->bmap, but unfortunately swap just checks for the existences of method, so I'll probably have to do some VFS changes to properly support that. From BATV+6cc4c2ca6091f98ba507+4601+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 29 02:26:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C4D777CA1 for ; Tue, 29 Mar 2016 02:26:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 827A9304032 for ; Tue, 29 Mar 2016 00:26:27 -0700 (PDT) X-ASG-Debug-ID: 1459236384-04bdf0110575d60001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id Hzoz92WBKMGXdye7 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 29 Mar 2016 00:26:24 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6cc4c2ca6091f98ba507+4601+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 1ako2b-0006Si-Pd; Tue, 29 Mar 2016 07:26:17 +0000 Date: Tue, 29 Mar 2016 00:26:17 -0700 From: Christoph Hellwig To: Ming Lei Cc: Jens Axboe , linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh Subject: Re: [PATCH 1/8] block: move bvec iterator into include/linux/bvec_iter.h Message-ID: <20160329072617.GB18920@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/8] block: move bvec iterator into include/linux/bvec_iter.h References: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> <1458627149-12988-2-git-send-email-ming.lei@canonical.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1458627149-12988-2-git-send-email-ming.lei@canonical.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1459236384 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28259 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > --- a/include/linux/bio.h > +++ b/include/linux/bio.h > @@ -31,6 +31,7 @@ > > /* struct bio, bio_vec and BIO_* flags are defined in blk_types.h */ > #include > +#include > > #define BIO_DEBUG > > @@ -40,10 +41,6 @@ > #define BIO_BUG_ON > #endif > > -#define BIO_MAX_PAGES 256 > -#define BIO_MAX_SIZE (BIO_MAX_PAGES << PAGE_CACHE_SHIFT) > -#define BIO_MAX_SECTORS (BIO_MAX_SIZE >> 9) I see no reason why these should be moved out of bio.h. Otherwise this looks fine to me. From BATV+6cc4c2ca6091f98ba507+4601+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 29 02:26:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D38607CA7 for ; Tue, 29 Mar 2016 02:26:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A330D8F8039 for ; Tue, 29 Mar 2016 00:26:37 -0700 (PDT) X-ASG-Debug-ID: 1459236395-04cb6c2460d06f0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id gi02G17gwKkAZ156 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 29 Mar 2016 00:26:36 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6cc4c2ca6091f98ba507+4601+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 1ako2q-0006U2-MA; Tue, 29 Mar 2016 07:26:32 +0000 Date: Tue, 29 Mar 2016 00:26:32 -0700 From: Christoph Hellwig To: Ming Lei Cc: Jens Axboe , linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh Subject: Re: [PATCH 2/8] block: make 'struct bvec_iter' not depend on CONFIG_BLOCK Message-ID: <20160329072632.GC18920@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/8] block: make 'struct bvec_iter' not depend on CONFIG_BLOCK References: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> <1458627149-12988-3-git-send-email-ming.lei@canonical.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1458627149-12988-3-git-send-email-ming.lei@canonical.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1459236396 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/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=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28258 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+6cc4c2ca6091f98ba507+4601+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 29 02:26:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D33F17CA1 for ; Tue, 29 Mar 2016 02:26:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 63CA0AC004 for ; Tue, 29 Mar 2016 00:26:49 -0700 (PDT) X-ASG-Debug-ID: 1459236407-04bdf0110475d90001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 1vTGyBt9B9rGDYYV (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 29 Mar 2016 00:26:48 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6cc4c2ca6091f98ba507+4601+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 1ako32-0006VZ-V9; Tue, 29 Mar 2016 07:26:44 +0000 Date: Tue, 29 Mar 2016 00:26:44 -0700 From: Christoph Hellwig To: Ming Lei Cc: Jens Axboe , linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh Subject: Re: [PATCH 3/8] block: mark 1st parameter of bvec_iter_advance as const Message-ID: <20160329072644.GD18920@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 3/8] block: mark 1st parameter of bvec_iter_advance as const References: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> <1458627149-12988-4-git-send-email-ming.lei@canonical.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1458627149-12988-4-git-send-email-ming.lei@canonical.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1459236408 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/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=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28259 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+6cc4c2ca6091f98ba507+4601+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 29 02:27:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CB20B7CA1 for ; Tue, 29 Mar 2016 02:27:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4D9F7AC003 for ; Tue, 29 Mar 2016 00:27:47 -0700 (PDT) X-ASG-Debug-ID: 1459236466-04bdf0110275db0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id REWALRIXZyPVsJCk (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 29 Mar 2016 00:27:46 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6cc4c2ca6091f98ba507+4601+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 1ako3z-0006fH-49; Tue, 29 Mar 2016 07:27:43 +0000 Date: Tue, 29 Mar 2016 00:27:43 -0700 From: Christoph Hellwig To: Ming Lei Cc: Jens Axboe , linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh Subject: Re: [PATCH 4/8] iov_iter: use bvec iterator to implement iterate_bvec() Message-ID: <20160329072743.GE18920@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 4/8] iov_iter: use bvec iterator to implement iterate_bvec() References: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> <1458627149-12988-5-git-send-email-ming.lei@canonical.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1458627149-12988-5-git-send-email-ming.lei@canonical.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1459236466 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28259 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS This looks fine to me, but I'd really like to see Al review it as well. From BATV+6cc4c2ca6091f98ba507+4601+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 29 02:29:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0A5437CB6 for ; Tue, 29 Mar 2016 02:29:39 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8EBC8AC003 for ; Tue, 29 Mar 2016 00:29:38 -0700 (PDT) X-ASG-Debug-ID: 1459236577-04bdf0110375e50001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id almNHZI5IdqshuNM (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 29 Mar 2016 00:29:37 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6cc4c2ca6091f98ba507+4601+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 1ako5l-0007dV-Jc; Tue, 29 Mar 2016 07:29:33 +0000 Date: Tue, 29 Mar 2016 00:29:33 -0700 From: Christoph Hellwig To: Ming Lei Cc: Jens Axboe , linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh Subject: Re: [PATCH 5/8] fs: xfs: replace BIO_MAX_SECTORS with BIO_MAX_PAGES Message-ID: <20160329072933.GF18920@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 5/8] fs: xfs: replace BIO_MAX_SECTORS with BIO_MAX_PAGES References: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> <1458627149-12988-6-git-send-email-ming.lei@canonical.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1458627149-12988-6-git-send-email-ming.lei@canonical.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1459236577 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28259 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > + nr_pages = BIO_MAX_PAGES; > if (nr_pages > total_nr_pages) > nr_pages = total_nr_pages; Looks reasonable, but the whole thing could simply become: nr_pages = min(total_nr_pages, BIO_MAX_PAGES); From BATV+6cc4c2ca6091f98ba507+4601+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 29 02:30:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 32A5D7CBB for ; Tue, 29 Mar 2016 02:30:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id F05198F8037 for ; Tue, 29 Mar 2016 00:30:01 -0700 (PDT) X-ASG-Debug-ID: 1459236599-04cb6c245fd0780001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id gk9RR5aLi0i4Rixw (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 29 Mar 2016 00:29:59 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6cc4c2ca6091f98ba507+4601+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 1ako68-0007yq-A2; Tue, 29 Mar 2016 07:29:56 +0000 Date: Tue, 29 Mar 2016 00:29:56 -0700 From: Christoph Hellwig To: Ming Lei Cc: Jens Axboe , linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh Subject: Re: [PATCH 6/8] block: bio: remove BIO_MAX_SECTORS Message-ID: <20160329072956.GG18920@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 6/8] block: bio: remove BIO_MAX_SECTORS References: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> <1458627149-12988-7-git-send-email-ming.lei@canonical.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1458627149-12988-7-git-send-email-ming.lei@canonical.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1459236599 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/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=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28258 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+6cc4c2ca6091f98ba507+4601+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 29 02:31:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 016FB7CB7 for ; Tue, 29 Mar 2016 02:31:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C7D9F304032 for ; Tue, 29 Mar 2016 00:31:30 -0700 (PDT) X-ASG-Debug-ID: 1459236688-04cb6c2460d07e0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id WTO7EV8i6lrtoqlC (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 29 Mar 2016 00:31:29 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6cc4c2ca6091f98ba507+4601+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 1ako7Y-0001mQ-Q5; Tue, 29 Mar 2016 07:31:24 +0000 Date: Tue, 29 Mar 2016 00:31:24 -0700 From: Christoph Hellwig To: Ming Lei Cc: Jens Axboe , linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh Subject: Re: [PATCH 7/8] block: drbd: avoid to use BIO_MAX_SIZE Message-ID: <20160329073124.GH18920@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 7/8] block: drbd: avoid to use BIO_MAX_SIZE References: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> <1458627149-12988-8-git-send-email-ming.lei@canonical.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1458627149-12988-8-git-send-email-ming.lei@canonical.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1459236689 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28258 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Mar 22, 2016 at 02:12:28PM +0800, Ming Lei wrote: > drbd is the only user of BIO_MAX_SIZE, so use BIO_MAX_PAGES > instead. That whole code block looks completely bogus to me, although your patch doesn't make it any worse. I/O size for a network protocol shouldn't dependend on the number of vectors in a kernel internal structure. Well, getting rid of BIO_MAX_SIZE is worth it, so: Reviewed-by: Christoph Hellwig From BATV+6cc4c2ca6091f98ba507+4601+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 29 02:31:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4F0097CA4 for ; Tue, 29 Mar 2016 02:31:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 20C9D304032 for ; Tue, 29 Mar 2016 00:31:46 -0700 (PDT) X-ASG-Debug-ID: 1459236704-04cbb07ad6d0f40001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id CqqQZkOIiN2DXHW2 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 29 Mar 2016 00:31:44 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6cc4c2ca6091f98ba507+4601+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 1ako7p-00026K-2o; Tue, 29 Mar 2016 07:31:41 +0000 Date: Tue, 29 Mar 2016 00:31:41 -0700 From: Christoph Hellwig To: Ming Lei Cc: Jens Axboe , linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh Subject: Re: [PATCH 8/8] block: bio: remove BIO_MAX_SIZE Message-ID: <20160329073141.GI18920@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 8/8] block: bio: remove BIO_MAX_SIZE References: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> <1458627149-12988-9-git-send-email-ming.lei@canonical.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1458627149-12988-9-git-send-email-ming.lei@canonical.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1459236704 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/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=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28259 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From lars.ellenberg@linbit.com Tue Mar 29 03:09:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6C3957CB5 for ; Tue, 29 Mar 2016 03:09:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 21C3F8F8035 for ; Tue, 29 Mar 2016 01:09:33 -0700 (PDT) X-ASG-Debug-ID: 1459238963-04bdf0110476a50001-NocioJ Received: from zimbra13.linbit.com (zimbra13.linbit.com [212.69.166.240]) by cuda.sgi.com with ESMTP id Wi8fqrhLRGF4Yrwf (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 29 Mar 2016 01:09:25 -0700 (PDT) X-Barracuda-Envelope-From: lars.ellenberg@linbit.com X-Barracuda-Apparent-Source-IP: 212.69.166.240 Received: from localhost (localhost [127.0.0.1]) by zimbra13.linbit.com (Postfix) with ESMTP id 9D5212AFBB7; Tue, 29 Mar 2016 10:09:22 +0200 (CEST) Received: from zimbra13.linbit.com ([127.0.0.1]) by localhost (zimbra13.linbit.com [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id Max5oo6J6CDW; Tue, 29 Mar 2016 10:09:22 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by zimbra13.linbit.com (Postfix) with ESMTP id 696463FE182; Tue, 29 Mar 2016 10:09:22 +0200 (CEST) X-Virus-Scanned: amavisd-new at linbit.com Received: from zimbra13.linbit.com ([127.0.0.1]) by localhost (zimbra13.linbit.com [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id YXofLZ4PdRLR; Tue, 29 Mar 2016 10:09:21 +0200 (CEST) Received: from soda.linbit (tuerlsteher.linbit.com [86.59.100.100]) by zimbra13.linbit.com (Postfix) with ESMTPS id 931F52AFBB7; Tue, 29 Mar 2016 10:09:21 +0200 (CEST) Date: Tue, 29 Mar 2016 10:09:21 +0200 From: Lars Ellenberg To: Christoph Hellwig Cc: Ming Lei , Jens Axboe , linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Boaz Harrosh Subject: Re: [PATCH 7/8] block: drbd: avoid to use BIO_MAX_SIZE Message-ID: <20160329080921.GG15579@soda.linbit> X-ASG-Orig-Subj: Re: [PATCH 7/8] block: drbd: avoid to use BIO_MAX_SIZE Mail-Followup-To: Christoph Hellwig , Ming Lei , Jens Axboe , linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Boaz Harrosh References: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> <1458627149-12988-8-git-send-email-ming.lei@canonical.com> <20160329073124.GH18920@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160329073124.GH18920@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: zimbra13.linbit.com[212.69.166.240] X-Barracuda-Start-Time: 1459238965 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28259 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Mar 29, 2016 at 12:31:24AM -0700, Christoph Hellwig wrote: > On Tue, Mar 22, 2016 at 02:12:28PM +0800, Ming Lei wrote: > > drbd is the only user of BIO_MAX_SIZE, so use BIO_MAX_PAGES > > instead. > > That whole code block looks completely bogus to me, although your patch > doesn't make it any worse. > > I/O size for a network protocol shouldn't dependend on the number of > vectors in a kernel internal structure. That's correct. But we needed some limit there. Initially, up until I changed it like six years ago iirc, the receiving side would receive into a single bio. So limiting us to what a single bio could usually handle seemed like a good idea at the time. Today, we should be able to handle 128 MiB easily, maybe more. But that would require a protocol bump to stay backwards compatible. The part about "architecture not supported", if our limit (1 MiB) is bigger than the "system" limit: Never met that in real life. Probably not even possible. Just a paranoia on my side: what if. If that would have happened somewhere, on some strange architecture or configuration, I wanted to know about that. Best way: don't even compile. > Well, getting rid of BIO_MAX_SIZE is worth it, so: > > Reviewed-by: Christoph Hellwig Thanks, Lars Ellenberg From ming.lei@canonical.com Tue Mar 29 03:53:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DF09A7CA0 for ; Tue, 29 Mar 2016 03:53:28 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id AD3548F8039 for ; Tue, 29 Mar 2016 01:53:28 -0700 (PDT) X-ASG-Debug-ID: 1459241604-04cbb07ad7d2970001-NocioJ Received: from youngberry.canonical.com (youngberry.canonical.com [91.189.89.112]) by cuda.sgi.com with ESMTP id TNvHKbjEwXK3XnIU (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 29 Mar 2016 01:53:25 -0700 (PDT) X-Barracuda-Envelope-From: ming.lei@canonical.com X-Barracuda-Apparent-Source-IP: 91.189.89.112 Received: from mail-yw0-f177.google.com ([209.85.161.177]) by youngberry.canonical.com with esmtpsa (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.76) (envelope-from ) id 1akpOt-0004OG-O9 for xfs@oss.sgi.com; Tue, 29 Mar 2016 08:53:23 +0000 Received: by mail-yw0-f177.google.com with SMTP id h65so10246392ywe.0 for ; Tue, 29 Mar 2016 01:53:23 -0700 (PDT) X-Gm-Message-State: AD7BkJJiFrAQt0Ws15CifhmWu2L4LA+1kyYhvkxUOlE6nLdCrQ+q/9cyu/ZQjolc3H7Yg3qDEEcVmi8Ndnam2A== MIME-Version: 1.0 X-Received: by 10.13.241.199 with SMTP id a190mr485591ywf.47.1459241602806; Tue, 29 Mar 2016 01:53:22 -0700 (PDT) Received: by 10.37.207.145 with HTTP; Tue, 29 Mar 2016 01:53:22 -0700 (PDT) In-Reply-To: <20160329072617.GB18920@infradead.org> References: <1458627149-12988-1-git-send-email-ming.lei@canonical.com> <1458627149-12988-2-git-send-email-ming.lei@canonical.com> <20160329072617.GB18920@infradead.org> Date: Tue, 29 Mar 2016 16:53:22 +0800 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH 1/8] block: move bvec iterator into include/linux/bvec_iter.h From: Ming Lei X-ASG-Orig-Subj: Re: [PATCH 1/8] block: move bvec iterator into include/linux/bvec_iter.h To: Christoph Hellwig Cc: Jens Axboe , Linux Kernel Mailing List , linux-block@vger.kernel.org, Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: youngberry.canonical.com[91.189.89.112] X-Barracuda-Start-Time: 1459241604 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28260 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Mar 29, 2016 at 3:26 PM, Christoph Hellwig wrote: >> --- a/include/linux/bio.h >> +++ b/include/linux/bio.h >> @@ -31,6 +31,7 @@ >> >> /* struct bio, bio_vec and BIO_* flags are defined in blk_types.h */ >> #include >> +#include >> >> #define BIO_DEBUG >> >> @@ -40,10 +41,6 @@ >> #define BIO_BUG_ON >> #endif >> >> -#define BIO_MAX_PAGES 256 >> -#define BIO_MAX_SIZE (BIO_MAX_PAGES << PAGE_CACHE_SHIFT) >> -#define BIO_MAX_SECTORS (BIO_MAX_SIZE >> 9) > > I see no reason why these should be moved out of bio.h. You are right, these should be kept in bio.h. Thanks for your review! > > Otherwise this looks fine to me. > -- > To unsubscribe from this list: send the line "unsubscribe linux-block" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html From admin@mpzero.com Tue Mar 29 06:34:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 A54687CA1 for ; Tue, 29 Mar 2016 06:34:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A73A1AC001 for ; Tue, 29 Mar 2016 04:34:12 -0700 (PDT) X-ASG-Debug-ID: 1459251246-04cbb07ad8dcd20001-NocioJ Received: from mpzero.com ([39.169.142.3]) by cuda.sgi.com with ESMTP id pNC1Jv0DB6pXbCFi for ; Tue, 29 Mar 2016 04:34:07 -0700 (PDT) X-Barracuda-Envelope-From: admin@mpzero.com X-Barracuda-Apparent-Source-IP: 39.169.142.3 Received: from mo (unknown [149.158.59.249]) by mpzero.com with SMTP id 0NJR1kNWGQab5Hly.1 for ; Tue, 29 Mar 2016 19:34:13 +0800 Message-ID: <20160329193413285133@mpzero.com> From: =?utf-8?B?6Ze75Lq66Iux?= To: Subject: order management Date: Tue, 29 Mar 2016 19:34:06 +0800 X-ASG-Orig-Subj: order management MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_06B5_01E9B839.1D5F05C0" X-mailer: Fjnwtsql 5 X-Barracuda-Connect: UNKNOWN[39.169.142.3] X-Barracuda-Start-Time: 1459251246 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28262 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 This is a multi-part message in MIME format. ------=_NextPart_000_06B5_01E9B839.1D5F05C0 Content-Type: multipart/alternative; boundary="----=_NextPart_001_0DFF_01E9B839.1D5F05C0" ------=_NextPart_001_0DFF_01E9B839.1D5F05C0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 6ZmE5Lu26LWE5paZ6K+35p+l6ZiF ------=_NextPart_001_0DFF_01E9B839.1D5F05C0 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8geG1sbnM6byA9ICJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29t Om9mZmljZTpvZmZpY2UiPjxIRUFEPg0KPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29u dGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCjxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2 LjAwLjI5MDAuNjQ1MiIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPg0KPEJPRFk+DQo8RElWIA0Kc3R5 bGU9IlBBRERJTkctUklHSFQ6IDBweDsgUEFERElORy1MRUZUOiAwcHg7IEZPTlQtV0VJR0hUOiBu b3JtYWw7IEZPTlQtU0laRTogMTJweDsgUEFERElORy1CT1RUT006IDJweDsgV09SRC1TUEFDSU5H OiAwcHg7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBDT0xPUjogcmdiKDAsMCwwKTsgVEVYVC1JTkRF TlQ6IDBweDsgUEFERElORy1UT1A6IDJweDsgRk9OVC1TVFlMRTogbm9ybWFsOyBGT05ULUZBTUlM WTogJ0FyaWFsIE5hcnJvdyc7IFdISVRFLVNQQUNFOiBub3JtYWw7IExFVFRFUi1TUEFDSU5HOiBu b3JtYWw7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNTUsMjU1LDI1NSk7IEZPTlQtVkFSSUFOVDog bm9ybWFsOyB3ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PEZPTlQgDQpjb2xvcj1kYXJr Ymx1ZSBzaXplPTM+6ZmE5Lu26LWE5paZ6K+35p+l6ZiFPC9GT05UPjwvRElWPg0KPERJViANCnN0 eWxlPSJQQURESU5HLVJJR0hUOiAwcHg7IFBBRERJTkctTEVGVDogMHB4OyBGT05ULVdFSUdIVDog bm9ybWFsOyBGT05ULVNJWkU6IDEycHg7IFBBRERJTkctQk9UVE9NOiAycHg7IFdPUkQtU1BBQ0lO RzogMHB4OyBURVhULVRSQU5TRk9STTogbm9uZTsgQ09MT1I6IHJnYigwLDAsMCk7IFRFWFQtSU5E RU5UOiAwcHg7IFBBRERJTkctVE9QOiAycHg7IEZPTlQtU1RZTEU6IG5vcm1hbDsgRk9OVC1GQU1J TFk6ICdBcmlhbCBOYXJyb3cnOyBXSElURS1TUEFDRTogbm9ybWFsOyBMRVRURVItU1BBQ0lORzog bm9ybWFsOyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1LDI1NSwyNTUpOyBGT05ULVZBUklBTlQ6 IG5vcm1hbDsgd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiPiZuYnNwOzwvRElWPg0KPERJ ViANCnN0eWxlPSJQQURESU5HLVJJR0hUOiAwcHg7IFBBRERJTkctTEVGVDogMHB4OyBGT05ULVdF SUdIVDogbm9ybWFsOyBGT05ULVNJWkU6IDEycHg7IFBBRERJTkctQk9UVE9NOiAycHg7IFdPUkQt U1BBQ0lORzogMHB4OyBURVhULVRSQU5TRk9STTogbm9uZTsgQ09MT1I6IHJnYigwLDAsMCk7IFRF WFQtSU5ERU5UOiAwcHg7IFBBRERJTkctVE9QOiAycHg7IEZPTlQtU1RZTEU6IG5vcm1hbDsgRk9O VC1GQU1JTFk6ICdBcmlhbCBOYXJyb3cnOyBXSElURS1TUEFDRTogbm9ybWFsOyBMRVRURVItU1BB Q0lORzogbm9ybWFsOyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1LDI1NSwyNTUpOyBGT05ULVZB UklBTlQ6IG5vcm1hbDsgd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiPiZuYnNwOzwvRElW PjxCUiANCmNsYXNzPUFwcGxlLWludGVyY2hhbmdlLW5ld2xpbmU+DQo8UD4mbmJzcDs8L1A+DQo8 UD4mbmJzcDs8L1A+DQo8UD4NCjxQPjxGT05UIGNvbG9yPWRhcmtibHVlPjwvRk9OVD48L1A+DQo8 UD48L1A+PC9CT0RZPjwvSFRNTD4NCg== ------=_NextPart_001_0DFF_01E9B839.1D5F05C0-- ------=_NextPart_000_06B5_01E9B839.1D5F05C0 Content-Type: application/octet-stream; name="order management.docx" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="order management.docx" UEsDBBQABgAIAAAAIQAwySgMcgEAAKUFAAATAAgCW0NvbnRlbnRfVHlwZXNdLnhtbCCiBAIooAAC AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC0 VMluwjAQvVfqP0S+Vomhh6qqCBy6HFuk0g8w9gSsepPHbH/fSaBR1UKQClwiJeO3+OXZg9HammwJ EbV3JesXPZaBk15pNyvZx+Qlv2cZJuGUMN5ByTaAbDS8vhpMNgEwI7TDks1TCg+co5yDFVj4AI4m lY9WJHqNMx6E/BQz4Le93h2X3iVwKU81BxsOnqASC5Oy5zV93jqJYJBlj9uFtVbJRAhGS5HIKV86 9Usl3ykUhGzW4FwHvCEbjO9VqCeHBXa4N4omagXZWMT0KizZ4CsfFVdeLiztoeim2ePTV5WW0OJr thC9BETK3JqinVih3bf/gz7cwk4hEvL8RlrqoyYwbQzg+R1sebvkKaxx9AE5leNkfajrp0Dl9D8C xKSh7c/B/BFSovQvsfkdc9f2myomOnTAm2f/5AwamqOSFZ3LiZgaOFnvT/1b6qMmVjB9v1j6P8i7 jLT9kz7+I4zvO6tG72kdby7Z4RcAAAD//wMAUEsDBBQABgAIAAAAIQAekRq38wAAAE4CAAALAAgC X3JlbHMvLnJlbHMgogQCKKAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAjJLbSgNBDIbvBd9hyH032woi0tneSKF3IusDhJnsAXcOzKTavr2j ILpQ217m9OfLT9abg5vUO6c8Bq9hWdWg2JtgR99reG23iwdQWchbmoJnDUfOsGlub9YvPJGUoTyM Maui4rOGQSQ+ImYzsKNchci+VLqQHEkJU4+RzBv1jKu6vsf0VwOamabaWQ1pZ+9AtcdYNl/WDl03 Gn4KZu/Yy4kVyAdhb9kuYipsScZyjWop9SwabDDPJZ2RYqwKNuBpotX1RP9fi46FLAmhCYnP83x1 nANaXg902aJ5x687HyFZLBZ9e/tDg7MvaD4BAAD//wMAUEsDBBQABgAIAAAAIQCzvosdCQEAALYD AAAcAAgBd29yZC9fcmVscy9kb2N1bWVudC54bWwucmVscyCiBAEooAABAAAAAAAAAAAAAAAAAAAA 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 gQAAAAA= ------=_NextPart_000_06B5_01E9B839.1D5F05C0-- From jiakernel@gmail.com Tue Mar 29 10:44:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 25F4F7CA0 for ; Tue, 29 Mar 2016 10:44:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E96C98F8033 for ; Tue, 29 Mar 2016 08:43:59 -0700 (PDT) X-ASG-Debug-ID: 1459266238-04cbb07ad8fe480001-NocioJ Received: from mail-io0-f171.google.com (mail-io0-f171.google.com [209.85.223.171]) by cuda.sgi.com with ESMTP id IEBPCeqrdlKQLcuU (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 29 Mar 2016 08:43:58 -0700 (PDT) X-Barracuda-Envelope-From: jiakernel@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.223.171 Received: by mail-io0-f171.google.com with SMTP id q128so26604967iof.3 for ; Tue, 29 Mar 2016 08:43:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=subject:to:references:cc:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding; bh=Wx3hVet1ve6XJn5hyFT+XRoB56/NKocW7t4EaCIFhm4=; b=IwNH6JAfRqJtytN/B0BkmVDEpbGpRb3x0HgnJd03bDVJT1j+YyeSPpZVGM0I2DE5ik /1qO2DxwEpQhNPPBNM/pjmojbLh4sme+NBea/lcC0J5Cahjwch3C0qXsPWaVCbkUFGWc FILHNQwpHhMVkBJYvTK/JLw9b9o3HBo4ZM1x4JlFjJpdW4I6ok+kZp7ljojdJZw9E0jq +nYxxd5HrhvtjeAdeSa6iznxZDYW48uMYT/IFQeKFzfgkzq/pBFoKfcWctHtMDbd15aa KTD29V57C7Y/vWDpvVrTSC43VLSW99+8lvgWkvj7IcjE3kD/YvUbVE6vnBNL6HSkbFhI 0d9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:subject:to:references:cc:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=Wx3hVet1ve6XJn5hyFT+XRoB56/NKocW7t4EaCIFhm4=; b=X/r4Xq/mHx3hYD0Ad4i3g0APbi4VBwygbr4zyTu9cc8CSfKo+WP60ve5LFad3ym3eL ja7uNQyfWS/S3dY9q5+wkvJ8DJwCc/9SCmVIPoosb8L6epeo8fCJBpwgg83DBMFHeCLh ZiWz3MeWUPcooQmLDRsD6HY8233kkfdTxhQHROziyH6ofQ29+17ybIbJMvTwNXFb+JyP c1C+aTBUBm5g2/mnHEycFKT6O7WPz3Vm4j1iAFKzaPRaWEYkO3+fLlf6dOcREY8yE38n Dh2qG/hrSIxn90qN3syqc/prusO8aaCt1WiUcXgLu5VXiuZMXPHbik2+f3CWqcR71tBV FIQQ== X-Gm-Message-State: AD7BkJJ347dzTzXXNmch16nbidAOnIPEORKCWHYVVJqUmR4nUxMUaE1DDwe0ZyRNEQAFDw== X-Received: by 10.107.128.149 with SMTP id k21mr3901092ioi.127.1459266238171; Tue, 29 Mar 2016 08:43:58 -0700 (PDT) Received: from Justin.local (bi-03pt2.bluebird.ibm.com. [129.42.208.173]) by smtp.gmail.com with ESMTPSA id aw5sm6465581igc.1.2016.03.29.08.43.55 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 29 Mar 2016 08:43:57 -0700 (PDT) Subject: Re: BUG: unable to handle kernel paging request at ffffffff82200000 (xlog_recover_buffer_pass2) X-Barracuda-Apparent-Source-IP: 129.42.208.173 X-Barracuda-BBL-IP: 129.42.208.173 To: Vegard Nossum , Dave Chinner X-ASG-Orig-Subj: Re: BUG: unable to handle kernel paging request at ffffffff82200000 (xlog_recover_buffer_pass2) References: <565EA0DF.609@oracle.com> Cc: xfs@oss.sgi.com From: Jia He Message-ID: <56FAA2B9.9060606@gmail.com> Date: Tue, 29 Mar 2016 23:43:53 +0800 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <565EA0DF.609@oracle.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mail-io0-f171.google.com[209.85.223.171] X-Barracuda-Start-Time: 1459266238 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.13 X-Barracuda-Spam-Status: No, SCORE=0.13 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, SUBJECT_NOVOWEL X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28266 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.13 SUBJECT_NOVOWEL Subject: has long non-vowel letter sequence 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi Vegard Does this commit fix the crash? commit 7088c4136fa1cba26531fde40bdcfcf3d2ccd533 (patch) xfs: detect and trim torn writes during log recovery B.R. 在 12/2/15 3:42 PM, Vegard Nossum 写é“: > Hi, > > Mounting the attached XFS image (fuzzed) gives me the following invalid > memory dereference on latest linus/master: > > XFS (vda): Mounting V4 Filesystem > XFS (vda): Starting recovery (logdev: internal) > XFS (vda): log record CRC mismatch: found 0x9f534964, expected > 0xd46d59ce. > ffffc90000442000: 00 00 00 01 00 00 00 00 69 01 00 00 e6 33 18 19 > ........i....3.. > ffffc90000442010: 00 00 00 10 69 00 00 00 4e 41 52 54 2a 00 00 00 > ....i...NART*... > XFS (vda): log record CRC mismatch: found 0xedba28e, expected 0x9f019b73. > ffffc90000442000: 00 00 00 01 00 00 00 00 69 01 00 00 5c 47 88 1e > ........i...\G.. > ffffc90000442010: 00 00 00 10 69 00 00 00 4e 41 52 54 2a 00 00 00 > ....i...NART*... > XFS (vda): log record CRC mismatch: found 0x9f534964, expected > 0xd46d59ce. > ffffc9000044a000: 00 00 00 01 00 00 00 00 69 01 00 00 e6 33 18 19 > ........i....3.. > ffffc9000044a010: 00 00 00 10 69 00 00 00 4e 41 52 54 2a 00 00 00 > ....i...NART*... > BUG: unable to handle kernel paging request at ffffffff82200000 > IP: [] memcpy_erms+0x6/0x10 > PGD 1e10067 PUD 1e11063 PMD 0 > Oops: 0000 [#1] SMP KASAN > CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.4.0-rc3+ #245 > task: ffff880016e28000 ti: ffff880016e30000 task.ti: ffff880016e30000 > RIP: 0010:[] [] memcpy_erms+0x6/0x10 > RSP: 0000:ffff880016e377b8 EFLAGS: 00010287 > RAX: ffff88001494e380 RBX: 0000000000000027 RCX: ffffffff80285761 > RDX: ffffffff81150400 RSI: ffffffff82200000 RDI: ffff88001581901f > RBP: ffff880016e37808 R08: ffff880016429ba8 R09: 0000000000000018 > R10: 0000000000000000 R11: 0000000000000000 R12: ffff880016429b90 > R13: 0000000000000002 R14: 00000000ff022a08 R15: ffffffff81335361 > FS: 0000000000000000(0000) GS:ffff880017200000(0000) > knlGS:0000000000000000 > CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 > CR2: ffffffff82200000 CR3: 0000000001e0f000 CR4: 00000000001406b0 > Stack: > ffffffff8133eb74 ffff880000079b80 ffff880015bf6e40 ffff880016429ba4 > ffff880000108470 ffff880016429b90 ffff880014c26290 ffff880015bf6e40 > ffff880000108450 ffff880000079b80 ffff880016e37870 ffffffff8133f02a > Call Trace: > [] ? xlog_recover_do_reg_buffer.isra.23+0x124/0x1b0 > [] xlog_recover_buffer_pass2+0x35a/0x450 > [] xlog_recover_commit_pass2+0xe9/0x160 > [] xlog_recover_items_pass2+0x3c/0x60 > [] xlog_recover_commit_trans+0x206/0x230 > [] xlog_recovery_process_trans+0x7a/0xb0 > [] xlog_recover_process_ophdr+0x5e/0xc0 > [] xlog_recover_process_data+0x9a/0xc0 > [] xlog_do_recovery_pass+0x440/0x540 > [] ? kasan_poison_shadow+0x2f/0x40 > [] xlog_do_log_recovery+0x79/0xc0 > [] xlog_do_recover+0x11/0xe0 > [] xlog_recover+0xa3/0x140 > [] xfs_log_mount+0x24e/0x2c0 > [] xfs_mountfs+0x499/0x7d0 > [] ? xfs_mru_cache_create+0x121/0x180 > [] xfs_fs_fill_super+0x38d/0x4a0 > [] mount_bdev+0x185/0x1c0 > [] ? xfs_parseargs+0xaa0/0xaa0 > [] xfs_fs_mount+0x10/0x20 > [] mount_fs+0x34/0x160 > [] ? __alloc_percpu+0x10/0x20 > [] vfs_kern_mount+0x62/0x110 > [] do_mount+0x21b/0xdd0 > > $ addr2line -e vmlinux -i ffffffff81475616 # memcpy_erms+0x6/0x10 > arch/x86/lib/memcpy_64.S:50 > > $ addr2line -e vmlinux -i ffffffff8133eb74 # > xlog_recover_do_reg_buffer.isra.23+0x124/0x1b0 > fs/xfs/xfs_log_recover.c:2238 > > $ addr2line -e vmlinux -i ffffffff8133f02a # > xlog_recover_buffer_pass2+0x35a/0x450 > fs/xfs/xfs_log_recover.c:2397 > > which is this bit: > > memcpy(xfs_buf_offset(bp, > (uint)bit << XFS_BLF_SHIFT), /* dest */ > item->ri_buf[i].i_addr, /* source */ > nbits< > Because of the memory corruption the bug manifests in different ways, > but the stacktrace above is by far the most common. > > I can test patches. Thanks, > > > Vegard > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From jtulak@redhat.com Tue Mar 29 11:12:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 C013E7CA0 for ; Tue, 29 Mar 2016 11:12:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9011B30404E for ; Tue, 29 Mar 2016 09:12:03 -0700 (PDT) X-ASG-Debug-ID: 1459267921-04cbb07ad6101d60001-NocioJ Received: from mail-ig0-f169.google.com (mail-ig0-f169.google.com [209.85.213.169]) by cuda.sgi.com with ESMTP id Jbaq0q9lPG2nOovJ (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 29 Mar 2016 09:12:02 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.213.169 Received: by mail-ig0-f169.google.com with SMTP id nk17so79748524igb.1 for ; Tue, 29 Mar 2016 09:12: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:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=vi80EXzppiO5OaFzjyaKTaH0X4rxb5JUjhO4G6C9PFg=; b=DsNMUpyc2g9ZxsEV/c4D1RgSTjg8vS2A2y9J1EhwZ25YN11Ui9D9152LULCUCwax6G JaVP+0Jb88lG8Mx4PlPxhqxnWjrEeNTFbDKAf6yInMjlN5Gn1E7v+xxCEZIC23Zto9Ks mWG7Y4rvg9QvKzUYZKIEcIWHSvs2vZMRRR3VXphDVzFWm8bbKMJ173DgDIejTa83j7sa fdUIBlyHCiRPfQUi3ASNBsmfP57EReVkMmLa0w0Z065z5lXi2O19lAQ7cJ5Qpjzfksxs pUx+4Xf3TekgQpwKv3Rc68AfrMs44+wGsb0pNlbPDJE3+Pe1xljpNyZCCv/gOhUN8ETE 40AQ== X-Gm-Message-State: AD7BkJLkbGFcLymxWecgZvFm27MWG5FfMhJn2B4d/Fd31xVQP6iOY7mqUT+VYv3n65XLb6d1h9xW0pKX1Izl+EU0 X-Received: by 10.50.30.201 with SMTP id u9mr3665371igh.63.1459267921538; Tue, 29 Mar 2016 09:12:01 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.142 with HTTP; Tue, 29 Mar 2016 09:11:42 -0700 (PDT) In-Reply-To: <56F416E8.5000704@sandeen.net> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-3-git-send-email-jtulak@redhat.com> <56F416E8.5000704@sandeen.net> From: Jan Tulak Date: Tue, 29 Mar 2016 18:11:42 +0200 Message-ID: Subject: Re: [PATCH 02/19] mkfs: sanitise ftype parameter values. To: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH 02/19] mkfs: sanitise ftype parameter values. Cc: xfs-oss Content-Type: multipart/alternative; boundary=047d7ba97ee01891ce052f324ad2 X-Barracuda-Connect: mail-ig0-f169.google.com[209.85.213.169] X-Barracuda-Start-Time: 1459267922 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28268 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 --047d7ba97ee01891ce052f324ad2 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Thu, Mar 24, 2016 at 5:33 PM, Eric Sandeen wrote: > > > On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > > From: Dave Chinner > > > > Because passing "-n ftype=3D2" should fail. > > but passing crc=3D1 ftype=3D1 shouldn't fail, should it? > Seems like it will here. > =E2=80=8BFrom man page: When CRCs are enabled via -m crc=3D1, the ftype functionality is always enabled. This feature can not be =E2=80=8B turned off for such filesystem configurations.=E2=80=8B =E2=80=8BSo I think it should not be possible to enter both crc and ftype a= t the same time - which is the current behaviour. It feels strange a bit to allow ftype=3D1 (which does nothing with crc=3D1), but fail on ftype=3D0=E2=80=8B =E2=80=8BJan=E2=80=8B --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --047d7ba97ee01891ce052f324ad2 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
On Thu, Ma= r 24, 2016 at 5:33 PM, Eric Sandeen <sandeen@sandeen.net> wrote:


On 3/24/16 6:15 AM, jtulak@redhat.com<= /a> wrote:
> From: Dave Chinner <
dchinner= @redhat.com>
>
> Because passing "-n ftype=3D2" should fail.

but passing crc=3D1 ftype=3D1 shouldn't fail, should it?
Seems like it will here.

=E2=80=8BFrom man page:
When =C2=A0CRCs are enabled via -m crc=3D1, the ftype functionality is alwa= ys enabled. This feature can not be
=E2=80=8B=C2=A0
<= /span>
turned off for such filesystem configurations.= =E2=80=8B
=C2=A0

=E2=80=8BSo I thin= k it should not be possible to enter both crc and ftype at the same time - = which is the current behaviour. It feels strange a bit to allow ftype=3D1 (= which does nothing with crc=3D1), but fail on ftype=3D0=E2=80=8B

<= /div>
=E2=80=8BJan=E2=80=8B


-= -
--047d7ba97ee01891ce052f324ad2-- From sandeen@sandeen.net Tue Mar 29 11:18:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BCABB7CA0 for ; Tue, 29 Mar 2016 11:18:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3B656AC001 for ; Tue, 29 Mar 2016 09:17:58 -0700 (PDT) X-ASG-Debug-ID: 1459268276-04cbb07ad61027b0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id ZjAcuAkocb0mX0pA for ; Tue, 29 Mar 2016 09:17:56 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 8F9DD569; Tue, 29 Mar 2016 11:17:56 -0500 (CDT) Subject: Re: [PATCH 02/19] mkfs: sanitise ftype parameter values. To: Jan Tulak X-ASG-Orig-Subj: Re: [PATCH 02/19] mkfs: sanitise ftype parameter values. References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-3-git-send-email-jtulak@redhat.com> <56F416E8.5000704@sandeen.net> Cc: xfs-oss From: Eric Sandeen Message-ID: <56FAAAB4.7090602@sandeen.net> Date: Tue, 29 Mar 2016 11:17:56 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1459268276 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28268 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 3/29/16 11:11 AM, Jan Tulak wrote: > On Thu, Mar 24, 2016 at 5:33 PM, Eric Sandeen >wrote: > > > > On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > > From: Dave Chinner > > > > > Because passing "-n ftype=2" should fail. > > but passing crc=1 ftype=1 shouldn't fail, should it? > Seems like it will here. > > > ​From man page: > When CRCs are enabled via -m crc=1, the ftype functionality is always enabled. This feature can not be > ​ > turned off for such filesystem configurations.​ > > > ​So I think it should not be possible to enter both crc and ftype at > the same time - which is the current behaviour. It feels strange a > bit to allow ftype=1 (which does nothing with crc=1), but fail on > ftype=0​ My point is that -m crc=1 -d ftype=1 simply restates the defaults. Why should that combination fail? And -m crc=0 -d ftype=0 is also perfectly acceptable. In fact, -m crc=1 -d ftype=0 is the only one of the 4 combinations which is not ok, but AFAICT your patch fails the other 3 as well. -Eric From jtulak@redhat.com Tue Mar 29 11:21:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 7113A7CA0 for ; Tue, 29 Mar 2016 11:21:21 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4204D8F8033 for ; Tue, 29 Mar 2016 09:21:18 -0700 (PDT) X-ASG-Debug-ID: 1459268476-04cb6c2464101fc0001-NocioJ Received: from mail-io0-f175.google.com (mail-io0-f175.google.com [209.85.223.175]) by cuda.sgi.com with ESMTP id rUisVEJe1T3Mg3TF (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 29 Mar 2016 09:21:17 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.223.175 Received: by mail-io0-f175.google.com with SMTP id e3so28375707ioa.1 for ; Tue, 29 Mar 2016 09:21:17 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=PAioKuhji76eXJ37acv8w+pwzNj+8HAvbHRkbJCSaEc=; b=irjlW7Xpj4mYG2RxhjatJyVygvAjbNAmsihckDOzXFssk/KT7IRwbx5Ijsb8umhBpz vMVTothUDI+mJDXLkjBJtuxcCxKnI2K0CQ+HUQjQj/JQHlaXrRb0/9/RFlU9u/LezEIk 1YGpz4GCGyaPCFBDs81Ct8dBGdmV2k6r1SxVrTdhGKyc6IFR33P66cj05cA0sJ+Sql+x Kr6a7jacf2xlvpcvbpX+fyd/4EUP0QL8XO84QtF02qYFSjRCSId3J7InzsfTeksX3+nD pLjF+3Ip4DoATid/wUXxPZGH4b6AEFhkzC79d/9+eLGd87b58nq2g1ER+V4d7HOgCrVb 6kqg== X-Gm-Message-State: AD7BkJJSrQcKDAh6pq0QZ444whL5MApwSyw4CHZKSWcp/Ao+rTvMmhXxIZMcX9sEb85Dvma6KDK33mgqe7By9vDa X-Received: by 10.107.9.202 with SMTP id 71mr4430527ioj.52.1459268476634; Tue, 29 Mar 2016 09:21:16 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.142 with HTTP; Tue, 29 Mar 2016 09:20:57 -0700 (PDT) In-Reply-To: <56FAAAB4.7090602@sandeen.net> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-3-git-send-email-jtulak@redhat.com> <56F416E8.5000704@sandeen.net> <56FAAAB4.7090602@sandeen.net> From: Jan Tulak Date: Tue, 29 Mar 2016 18:20:57 +0200 Message-ID: Subject: Re: [PATCH 02/19] mkfs: sanitise ftype parameter values. To: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH 02/19] mkfs: sanitise ftype parameter values. Cc: xfs-oss Content-Type: multipart/alternative; boundary=001a113ebe202ebf55052f326bc7 X-Barracuda-Connect: mail-io0-f175.google.com[209.85.223.175] X-Barracuda-Start-Time: 1459268477 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28268 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 --001a113ebe202ebf55052f326bc7 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Tue, Mar 29, 2016 at 6:17 PM, Eric Sandeen wrote: > > > On 3/29/16 11:11 AM, Jan Tulak wrote: > > On Thu, Mar 24, 2016 at 5:33 PM, Eric Sandeen >wrote: > > > > > > > > On 3/24/16 6:15 AM, jtulak@redhat.com > wrote: > > > From: Dave Chinner dchinner@redhat.com>> > > > > > > Because passing "-n ftype=3D2" should fail. > > > > but passing crc=3D1 ftype=3D1 shouldn't fail, should it? > > Seems like it will here. > > > > > > =E2=80=8BFrom man page: > > When CRCs are enabled via -m crc=3D1, the ftype functionality is alway= s > enabled. This feature can not be > > =E2=80=8B > > turned off for such filesystem configurations.=E2=80=8B > > > > > > =E2=80=8BSo I think it should not be possible to enter both crc and fty= pe at > > the same time - which is the current behaviour. It feels strange a > > bit to allow ftype=3D1 (which does nothing with crc=3D1), but fail on > > ftype=3D0=E2=80=8B > > My point is that -m crc=3D1 -d ftype=3D1 simply restates the defaults. > Why should that combination fail? > > And -m crc=3D0 -d ftype=3D0 is also perfectly acceptable. > > In fact, -m crc=3D1 -d ftype=3D0 is the only one of the 4 combinations > which is not ok, but AFAICT your patch fails the other 3 as well. > =E2=80=8BTrue... I'm adding it into a test and will send an update. Jan =E2=80=8B --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --001a113ebe202ebf55052f326bc7 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable


On Tue, Mar 29, 2016 at 6:17 PM, Eric Sandeen <sandeen@sand= een.net> wrote:


On 3/29/16 11:11 AM, Jan Tulak wrote:
> On Thu, Mar 24, 2016 at 5:33 PM, Eric Sandeen <sandeen@sandeen.net <mailto:sandeen@sandeen.net>>wrote:
>
>
>
>=C2=A0 =C2=A0 =C2=A0On 3/24/16 6:15 AM, jtulak@redhat.com <mailto:jtulak@redhat.com> wrote:
>=C2=A0 =C2=A0 =C2=A0> From: Dave Chinner <dchinner@redhat.com <mailto:dchinner@redhat.com>>
>=C2=A0 =C2=A0 =C2=A0>
>=C2=A0 =C2=A0 =C2=A0> Because passing "-n ftype=3D2" shoul= d fail.
>
>=C2=A0 =C2=A0 =C2=A0but passing crc=3D1 ftype=3D1 shouldn't fail, s= hould it?
>=C2=A0 =C2=A0 =C2=A0Seems like it will here.
>
>
> =E2=80=8BFrom man page:
> When=C2=A0 CRCs are enabled via -m crc=3D1, the ftype functionality is= always enabled. This feature can not be
> =E2=80=8B
> turned off for such filesystem configurations.=E2=80=8B
>
>
> =E2=80=8BSo I think it should not be possible to enter both crc and ft= ype at
> the same time - which is the current behaviour. It feels strange a
> bit to allow ftype=3D1 (which does nothing with crc=3D1), but fail on<= br> > ftype=3D0=E2=80=8B

My point is that -m crc=3D1 -d ftype=3D1 simply restates the default= s.
Why should that combination fail?

And -m crc=3D0 -d ftype=3D0 is also perfectly acceptable.

In fact, -m crc=3D1 -d ftype=3D0 is the only one of the 4 combinations
which is not ok, but AFAICT your patch fails the other 3 as well.

=E2=80=8BTrue... I'm addin= g it into a test and will send an update.

Jan
=E2=80=8B
=C2=A0
--
<= div dir=3D"ltr"><= /div>
--001a113ebe202ebf55052f326bc7-- From jtulak@redhat.com Tue Mar 29 12:15:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 4C0097CA0 for ; Tue, 29 Mar 2016 12:15:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B1790AC002 for ; Tue, 29 Mar 2016 10:14:59 -0700 (PDT) X-ASG-Debug-ID: 1459271694-04cb6c2460106170001-NocioJ Received: from mail-ig0-f179.google.com (mail-ig0-f179.google.com [209.85.213.179]) by cuda.sgi.com with ESMTP id UnE8U4UJmZcQOjfm (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 29 Mar 2016 10:14:54 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.213.179 Received: by mail-ig0-f179.google.com with SMTP id ui10so10638585igc.1 for ; Tue, 29 Mar 2016 10:14:54 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=KB9NJ0SFdyWaKS+Un6JJcMfdUYWqVTlkZkKzCh4FelU=; b=m/1GkJRqFIlJq5g+L3G4STXdmUW12rA+ffWM466IfbOH2rrBixcHwtk3F4YejEx6dY +pXXhQuLuVsuZVRAcbCqMyr8UOpihFTa9IN7k6OR7D78fRIJ4DsPiOKxHmBfeTZ+e/Zy x+sbT5LLBb/hkon2m9ABRoIJMG1/qKvzUX6iKLcOJNARyBV+YgQHfA+DyZfaz0nt9CYo JGmhgXpwckBGhOq8WME+o/feVdY2bcffuRO8KyCGtV2vCLrSSly0LDhPW8rjzXIFdmeX jnZKEoJ5G4KLYDdJLHYm9/LV3Ru8KLc+83jKl95qIUac02e+P6J+vLgbbnDiEn18p/fn YpFg== X-Gm-Message-State: AD7BkJJEdUv6syykXS8rdJRhfmAbOJ0iBAFdonP89TE2bhUjUScl7vN7dUtDEX97Oq+J1aYbJ3FI/YhTpTuodJaq X-Received: by 10.50.112.137 with SMTP id iq9mr16318297igb.19.1459271693809; Tue, 29 Mar 2016 10:14:53 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.142 with HTTP; Tue, 29 Mar 2016 10:14:34 -0700 (PDT) In-Reply-To: <56FAAAB4.7090602@sandeen.net> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-3-git-send-email-jtulak@redhat.com> <56F416E8.5000704@sandeen.net> <56FAAAB4.7090602@sandeen.net> From: Jan Tulak Date: Tue, 29 Mar 2016 19:14:34 +0200 Message-ID: Subject: Re: [PATCH 02/19] mkfs: sanitise ftype parameter values. To: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH 02/19] mkfs: sanitise ftype parameter values. Cc: xfs-oss Content-Type: multipart/alternative; boundary=089e013c60ecf0d859052f332af3 X-Barracuda-Connect: mail-ig0-f179.google.com[209.85.213.179] X-Barracuda-Start-Time: 1459271694 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28270 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 --089e013c60ecf0d859052f332af3 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Tue, Mar 29, 2016 at 6:17 PM, Eric Sandeen wrote: > > > On 3/29/16 11:11 AM, Jan Tulak wrote: > > On Thu, Mar 24, 2016 at 5:33 PM, Eric Sandeen >wrote: > > > > > > > > On 3/24/16 6:15 AM, jtulak@redhat.com > wrote: > > > From: Dave Chinner dchinner@redhat.com>> > > > > > > Because passing "-n ftype=3D2" should fail. > > > > but passing crc=3D1 ftype=3D1 shouldn't fail, should it? > > Seems like it will here. > > > > > > =E2=80=8BFrom man page: > > When CRCs are enabled via -m crc=3D1, the ftype functionality is alway= s > enabled. This feature can not be > > =E2=80=8B > > turned off for such filesystem configurations.=E2=80=8B > > > > > > =E2=80=8BSo I think it should not be possible to enter both crc and fty= pe at > > the same time - which is the current behaviour. It feels strange a > > bit to allow ftype=3D1 (which does nothing with crc=3D1), but fail on > > ftype=3D0=E2=80=8B > > My point is that -m crc=3D1 -d ftype=3D1 simply restates the defaults. > Why should that combination fail? > > And -m crc=3D0 -d ftype=3D0 is also perfectly acceptable. > > In fact, -m crc=3D1 -d ftype=3D0 is the only one of the 4 combinations > which is not ok, but AFAICT your patch fails the other 3 as well. > =E2=80=8BI removed the entire crc check - there is another one later in the= code, so this was 1) redundant, 2) wrong, because it depended on whether -m crc= =3D0 was before or after -n ftype (if after, default crc value was used for the check). However, it causes lots of conflicts on the following patches, so I will send it later, once there are more changes... Cheers, and thanks for catching it. Jan --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --089e013c60ecf0d859052f332af3 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
On Tue, Ma= r 29, 2016 at 6:17 PM, Eric Sandeen <sandeen@sandeen.net> wrote:


On 3/29/16 11:11 AM, Jan Tulak wrote:
> On Thu, Mar 24, 2016 at 5:33 PM, Eric Sandeen <sandeen@sandeen.net <mailto:sandeen@sandeen.net>>wrote:
>
>
>
>=C2=A0 =C2=A0 =C2=A0On 3/24/16 6:15 AM, jtulak@redhat.com <mailto:jtulak@redhat.com> wrote:
>=C2=A0 =C2=A0 =C2=A0> From: Dave Chinner <dchinner@redhat.com <mailto:dchinner@redhat.com>>
>=C2=A0 =C2=A0 =C2=A0>
>=C2=A0 =C2=A0 =C2=A0> Because passing "-n ftype=3D2" shoul= d fail.
>
>=C2=A0 =C2=A0 =C2=A0but passing crc=3D1 ftype=3D1 shouldn't fail, s= hould it?
>=C2=A0 =C2=A0 =C2=A0Seems like it will here.
>
>
> =E2=80=8BFrom man page:
> When=C2=A0 CRCs are enabled via -m crc=3D1, the ftype functionality is= always enabled. This feature can not be
> =E2=80=8B
> turned off for such filesystem configurations.=E2=80=8B
>
>
> =E2=80=8BSo I think it should not be possible to enter both crc and ft= ype at
> the same time - which is the current behaviour. It feels strange a
> bit to allow ftype=3D1 (which does nothing with crc=3D1), but fail on<= br> > ftype=3D0=E2=80=8B

My point is that -m crc=3D1 -d ftype=3D1 simply restates the default= s.
Why should that combination fail?

And -m crc=3D0 -d ftype=3D0 is also perfectly acceptable.

In fact, -m crc=3D1 -d ftype=3D0 is the only one of the 4 combinations
which is not ok, but AFAICT your patch fails the other 3 as well.

=E2=80=8BI removed the entire = crc check - there is another one later in the code, so this was 1) redundan= t, 2) wrong, because it depended on whether -m crc=3D0 was before or after = -n ftype (if after, default crc value was used for the check).
<= div>

However, it ca= uses lots of conflicts on the following patches, so I will send it later, o= nce there are more changes...

<= /div>
Cheers, and thanks for catching it.
=

Jan

--
--089e013c60ecf0d859052f332af3-- From olaf@aepfle.de Tue Mar 29 12:16:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 117927CA3 for ; Tue, 29 Mar 2016 12:16:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C42708F8049 for ; Tue, 29 Mar 2016 10:16:01 -0700 (PDT) X-ASG-Debug-ID: 1459271755-04cb6c2464106290001-NocioJ Received: from mo4-p00-ob.smtp.rzone.de (mo4-p00-ob.smtp.rzone.de [81.169.146.220]) by cuda.sgi.com with ESMTP id 3feRzEEuWGPCA5eS (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 29 Mar 2016 10:15:56 -0700 (PDT) X-Barracuda-Envelope-From: olaf@aepfle.de X-Barracuda-Apparent-Source-IP: 81.169.146.220 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; t=1459271755; l=86316; s=domk; d=aepfle.de; h=Content-Disposition:Content-Type:MIME-Version:Subject:To:From:Date; bh=4LEIWiZCODTr9V7Pn7AQWmN8jMp8MVkzgnhLvDVUs4U=; b=Nel73GcC2MLpRuh1//nd8/X9lT1iWNp6k6pASAyYhbokscklGe5VZmVJqwMcsp9jIyi 86KffkvzncBV5ZbPwRB9gP3XuiWejVAN15QBoYrCa/M3dwXwjLPWtNdXMtDykhSnVbdX4 GE6mCr3AmCGVkzpTH1pflEC8CXTsV9+rndM= X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+yackYocTD1iAi8x+OWi/zfN1cLnDYUgpR1SBw9S9SIfAunSGOqn6pIHKx9Yq69yXFYel X-RZG-CLASS-ID: mo00 Received: from probook ([2001:a62:1280:ddff:38da:30c:6dd5:66f4]) by smtp.strato.de (RZmta 37.22 AUTH) with ESMTPSA id L026bds2THFs6ak (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (curve secp521r1 with 521 ECDH bits, eq. 15360 bits RSA)) (Client did not present a certificate) for ; Tue, 29 Mar 2016 19:15:54 +0200 (CEST) Received: by probook (Postfix, from userid 1000) id 02026508B4; Tue, 29 Mar 2016 19:15:53 +0200 (CEST) Date: Tue, 29 Mar 2016 19:15:53 +0200 From: Olaf Hering To: xfs@oss.sgi.com Subject: BUG in xfs_trans_binval Message-ID: <20160329171553.GA17885@aepfle.de> X-ASG-Orig-Subj: BUG in xfs_trans_binval MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="azLHFNyN32YCQGCU" Content-Disposition: inline User-Agent: Mutt/1.5.24 (6598) X-Barracuda-Connect: mo4-p00-ob.smtp.rzone.de[81.169.146.220] X-Barracuda-Start-Time: 1459271756 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28270 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 --azLHFNyN32YCQGCU Content-Type: text/plain; charset=utf-8 Content-Disposition: inline During receiving a backup stream (netcal -l 12345 | tar xf -) the host crashed and rebooted, no idea why. After reboot I tried to remove the received directory (rm -rf dir) and got this BUG: "_xfs_buf_find: Block out of range: block 0x81ffff3f8, EOFS 0x7fffd000" xfs_trans_binval xfs_alloc_fix_freelist xfs_free_extent xfs_trans_free_extent xfs_bmap_finis xfs_itruncate_extents xfs_incative_truncate xfs_incative xfs_fs_evict_inode evict iput do_unlinkat SyS_unlinkat Kernel is 4.5.0 from openSUSE Tumbleweed. dmesg is attached, I just realized it has the backtrace. # dmesg | grep sdb [ 1.882794] sd 4:0:0:0: [sdb] 2930277168 512-byte logical blocks: (1.50 TB/1.36 TiB) [ 1.883317] sd 4:0:0:0: [sdb] Write Protect is off [ 1.883324] sd 4:0:0:0: [sdb] Mode Sense: 00 3a 00 00 [ 1.883626] sd 4:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA [ 1.898471] sdb: sdb1 sdb2 [ 1.900079] sd 4:0:0:0: [sdb] Attached SCSI removable disk [ 3.613022] EXT4-fs (sdb2): mounted filesystem with ordered data mode. Opts: (null) [ 11.690375] EXT4-fs (sdb2): re-mounted. Opts: acl,user_xattr [ 20.083397] XFS (sdb1): Mounting V5 Filesystem [ 20.291900] XFS (sdb1): Starting recovery (logdev: internal) [ 25.285846] XFS (sdb1): Bad dir block magic! [ 26.448027] XFS (sdb1): Ending recovery (logdev: internal) [ 130.489414] XFS (sdb1): _xfs_buf_find: Block out of range: block 0x81ffff3f8, EOFS 0x7fffd000 [ 130.494271] XFS (sdb1): _xfs_buf_find: Block out of range: block 0x81ffff3f8, EOFS 0x7fffd000 Olaf --azLHFNyN32YCQGCU Content-Type: text/plain; charset=utf-8 Content-Disposition: attachment; filename="dmesg-4.5.0-1-default.txt" [ 0.000000] Linux version 4.5.0-1-default (geeko@buildhost) (gcc version 5.3.1 20151207 [gcc-5-branch revision 231355] (SUSE Linux) ) #1 SMP PREEMPT Wed Mar 16 17:30:21 UTC 2016 (b2c9ae5) [ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.5.0-1-default root=UUID=861a7aa5-a56f-48a6-9884-a4b35d39c0f2 quiet panic=9 sysrq_always_enabled splash=silent showopts [ 0.000000] x86/fpu: Legacy x87 FPU detected. [ 0.000000] x86/fpu: Using 'lazy' FPU context switches. [ 0.000000] e820: BIOS-provided physical RAM map: [ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009ebff] usable [ 0.000000] BIOS-e820: [mem 0x00000000000f0000-0x00000000000fffff] reserved [ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000db6cfbff] usable [ 0.000000] BIOS-e820: [mem 0x00000000db6cfc00-0x00000000db723bff] ACPI NVS [ 0.000000] BIOS-e820: [mem 0x00000000db723c00-0x00000000db725bff] ACPI data [ 0.000000] BIOS-e820: [mem 0x00000000db725c00-0x00000000dbffffff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000f8000000-0x00000000fbffffff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000fec00000-0x00000000fed003ff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000fed20000-0x00000000fed9ffff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000fee00000-0x00000000feefffff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000ffb00000-0x00000000ffffffff] reserved [ 0.000000] BIOS-e820: [mem 0x0000000100000000-0x000000021fffffff] usable [ 0.000000] NX (Execute Disable) protection: active [ 0.000000] SMBIOS 2.6 present. [ 0.000000] DMI: Dell Inc. OptiPlex 980 /0D441T, BIOS A16 05/28/2014 [ 0.000000] e820: update [mem 0x00000000-0x00000fff] usable ==> reserved [ 0.000000] e820: remove [mem 0x000a0000-0x000fffff] usable [ 0.000000] e820: last_pfn = 0x220000 max_arch_pfn = 0x400000000 [ 0.000000] MTRR default type: write-back [ 0.000000] MTRR fixed ranges enabled: [ 0.000000] 00000-9FFFF write-back [ 0.000000] A0000-BFFFF uncachable [ 0.000000] C0000-D7FFF write-protect [ 0.000000] D8000-EFFFF uncachable [ 0.000000] F0000-FFFFF write-protect [ 0.000000] MTRR variable ranges enabled: [ 0.000000] 0 base 0DF800000 mask FFF800000 uncachable [ 0.000000] 1 base 0E0000000 mask FE0000000 uncachable [ 0.000000] 2 disabled [ 0.000000] 3 disabled [ 0.000000] 4 disabled [ 0.000000] 5 disabled [ 0.000000] 6 disabled [ 0.000000] 7 disabled [ 0.000000] x86/PAT: Configuration [0-7]: WB WC UC- UC WB WC UC- WT [ 0.000000] e820: last_pfn = 0xdb6cf max_arch_pfn = 0x400000000 [ 0.000000] found SMP MP-table at [mem 0x000fe710-0x000fe71f] mapped at [ffff8800000fe710] [ 0.000000] Scanning 1 areas for low memory corruption [ 0.000000] Base memory trampoline at [ffff880000098000] 98000 size 24576 [ 0.000000] BRK [0x0224a000, 0x0224afff] PGTABLE [ 0.000000] BRK [0x0224b000, 0x0224bfff] PGTABLE [ 0.000000] BRK [0x0224c000, 0x0224cfff] PGTABLE [ 0.000000] BRK [0x0224d000, 0x0224dfff] PGTABLE [ 0.000000] BRK [0x0224e000, 0x0224efff] PGTABLE [ 0.000000] BRK [0x0224f000, 0x0224ffff] PGTABLE [ 0.000000] RAMDISK: [mem 0x37277000-0x37932fff] [ 0.000000] ACPI: Early table checksum verification disabled [ 0.000000] ACPI: RSDP 0x00000000000FEC00 000024 (v02 DELL ) [ 0.000000] ACPI: XSDT 0x00000000000FC7E0 00007C (v01 DELL B11K 00000015 ASL 00000061) [ 0.000000] ACPI: FACP 0x00000000000FC8D0 0000F4 (v03 DELL B11K 00000015 ASL 00000061) [ 0.000000] ACPI BIOS Warning (bug): 32/64X length mismatch in FADT/Gpe0Block: 128/64 (20160108/tbfadt-623) [ 0.000000] ACPI: DSDT 0x00000000FFDCBEE5 0047BC (v01 DELL dt_ex 00001000 INTL 20050624) [ 0.000000] ACPI: FACS 0x00000000DB6CFC00 000040 [ 0.000000] ACPI: FACS 0x00000000DB6CFC00 000040 [ 0.000000] ACPI: SSDT 0x00000000FFDD07C2 0000AC (v01 DELL st_ex 00001000 INTL 20050624) [ 0.000000] ACPI: APIC 0x00000000000FC9C4 000092 (v01 DELL B11K 00000015 ASL 00000061) [ 0.000000] ACPI: BOOT 0x00000000000FCA56 000028 (v01 DELL B11K 00000015 ASL 00000061) [ 0.000000] ACPI: ASF! 0x00000000000FCA7E 000096 (v32 DELL B11K 00000015 ASL 00000061) [ 0.000000] ACPI: MCFG 0x00000000000FCB14 00003C (v01 DELL B11K 00000015 ASL 00000061) [ 0.000000] ACPI: HPET 0x00000000000FCB50 000038 (v01 DELL B11K 00000015 ASL 00000061) [ 0.000000] ACPI: TCPA 0x00000000000FCDAC 000032 (v01 DELL B11K 00000015 ASL 00000061) [ 0.000000] ACPI: DMAR 0x00000000000FCDDE 000068 (v01 DELL B11K 00000015 ASL 00000061) [ 0.000000] ACPI: SLIC 0x00000000000FCB88 000176 (v01 DELL B11K 00000015 ASL 00000061) [ 0.000000] ACPI: SSDT 0x00000000DB725C00 002874 (v01 INTEL PPM RCM 80000001 INTL 20061109) [ 0.000000] ACPI: Local APIC address 0xfee00000 [ 0.000000] No NUMA configuration found [ 0.000000] Faking a node at [mem 0x0000000000000000-0x000000021fffffff] [ 0.000000] NODE_DATA(0) allocated [mem 0x21ffe8000-0x21fff9fff] [ 0.000000] Zone ranges: [ 0.000000] DMA [mem 0x0000000000001000-0x0000000000ffffff] [ 0.000000] DMA32 [mem 0x0000000001000000-0x00000000ffffffff] [ 0.000000] Normal [mem 0x0000000100000000-0x000000021fffffff] [ 0.000000] Movable zone start for each node [ 0.000000] Early memory node ranges [ 0.000000] node 0: [mem 0x0000000000001000-0x000000000009dfff] [ 0.000000] node 0: [mem 0x0000000000100000-0x00000000db6cefff] [ 0.000000] node 0: [mem 0x0000000100000000-0x000000021fffffff] [ 0.000000] Initmem setup node 0 [mem 0x0000000000001000-0x000000021fffffff] [ 0.000000] On node 0 totalpages: 2078316 [ 0.000000] DMA zone: 64 pages used for memmap [ 0.000000] DMA zone: 21 pages reserved [ 0.000000] DMA zone: 3997 pages, LIFO batch:0 [ 0.000000] DMA32 zone: 13980 pages used for memmap [ 0.000000] DMA32 zone: 894671 pages, LIFO batch:31 [ 0.000000] Normal zone: 18432 pages used for memmap [ 0.000000] Normal zone: 1179648 pages, LIFO batch:31 [ 0.000000] ACPI: PM-Timer IO Port: 0x808 [ 0.000000] ACPI: Local APIC address 0xfee00000 [ 0.000000] ACPI: LAPIC_NMI (acpi_id[0xff] high level lint[0x1]) [ 0.000000] IOAPIC[0]: apic_id 8, version 32, address 0xfec00000, GSI 0-23 [ 0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl) [ 0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level) [ 0.000000] ACPI: IRQ0 used by override. [ 0.000000] ACPI: IRQ9 used by override. [ 0.000000] Using ACPI (MADT) for SMP configuration information [ 0.000000] ACPI: HPET id: 0x8086a701 base: 0xfed00000 [ 0.000000] smpboot: Allowing 8 CPUs, 0 hotplug CPUs [ 0.000000] PM: Registered nosave memory: [mem 0x00000000-0x00000fff] [ 0.000000] PM: Registered nosave memory: [mem 0x0009e000-0x000effff] [ 0.000000] PM: Registered nosave memory: [mem 0x000f0000-0x000fffff] [ 0.000000] PM: Registered nosave memory: [mem 0xdb6cf000-0xdb6cffff] [ 0.000000] PM: Registered nosave memory: [mem 0xdb6d0000-0xdb722fff] [ 0.000000] PM: Registered nosave memory: [mem 0xdb723000-0xdb723fff] [ 0.000000] PM: Registered nosave memory: [mem 0xdb724000-0xdb724fff] [ 0.000000] PM: Registered nosave memory: [mem 0xdb725000-0xdb725fff] [ 0.000000] PM: Registered nosave memory: [mem 0xdb726000-0xdbffffff] [ 0.000000] PM: Registered nosave memory: [mem 0xdc000000-0xf7ffffff] [ 0.000000] PM: Registered nosave memory: [mem 0xf8000000-0xfbffffff] [ 0.000000] PM: Registered nosave memory: [mem 0xfc000000-0xfebfffff] [ 0.000000] PM: Registered nosave memory: [mem 0xfec00000-0xfecfffff] [ 0.000000] PM: Registered nosave memory: [mem 0xfed00000-0xfed1ffff] [ 0.000000] PM: Registered nosave memory: [mem 0xfed20000-0xfed9ffff] [ 0.000000] PM: Registered nosave memory: [mem 0xfeda0000-0xfedfffff] [ 0.000000] PM: Registered nosave memory: [mem 0xfee00000-0xfeefffff] [ 0.000000] PM: Registered nosave memory: [mem 0xfef00000-0xffafffff] [ 0.000000] PM: Registered nosave memory: [mem 0xffb00000-0xffffffff] [ 0.000000] e820: [mem 0xdc000000-0xf7ffffff] available for PCI devices [ 0.000000] Booting paravirtualized kernel on bare hardware [ 0.000000] clocksource: refined-jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645519600211568 ns [ 0.000000] setup_percpu: NR_CPUS:512 nr_cpumask_bits:512 nr_cpu_ids:8 nr_node_ids:1 [ 0.000000] PERCPU: Embedded 34 pages/cpu @ffff88021fc00000 s99096 r8192 d31976 u262144 [ 0.000000] pcpu-alloc: s99096 r8192 d31976 u262144 alloc=1*2097152 [ 0.000000] pcpu-alloc: [0] 0 1 2 3 4 5 6 7 [ 0.000000] Built 1 zonelists in Node order, mobility grouping on. Total pages: 2045819 [ 0.000000] Policy zone: Normal [ 0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-4.5.0-1-default root=UUID=861a7aa5-a56f-48a6-9884-a4b35d39c0f2 quiet panic=9 sysrq_always_enabled splash=silent showopts [ 0.000000] sysrq: sysrq always enabled. [ 0.000000] log_buf_len individual max cpu contribution: 32768 bytes [ 0.000000] log_buf_len total cpu_extra contributions: 229376 bytes [ 0.000000] log_buf_len min size: 262144 bytes [ 0.000000] log_buf_len: 524288 bytes [ 0.000000] early log buf free: 252696(96%) [ 0.000000] PID hash table entries: 4096 (order: 3, 32768 bytes) [ 0.000000] Memory: 5600524K/8313264K available (6978K kernel code, 1179K rwdata, 5152K rodata, 1628K init, 1544K bss, 224804K reserved, 0K cma-reserved) [ 0.000000] Preemptible hierarchical RCU implementation. [ 0.000000] Build-time adjustment of leaf fanout to 64. [ 0.000000] RCU restricting CPUs from NR_CPUS=512 to nr_cpu_ids=8. [ 0.000000] RCU: Adjusting geometry for rcu_fanout_leaf=64, nr_cpu_ids=8 [ 0.000000] NR_IRQS:33024 nr_irqs:488 16 [ 0.000000] Console: colour VGA+ 80x25 [ 0.000000] console [tty0] enabled [ 0.000000] clocksource: hpet: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 133484882848 ns [ 0.000000] hpet clockevent registered [ 0.000000] tsc: Fast TSC calibration using PIT [ 0.000000] tsc: Detected 2793.023 MHz processor [ 0.000030] Calibrating delay loop (skipped), value calculated using timer frequency.. 5586.04 BogoMIPS (lpj=11172092) [ 0.000033] pid_max: default: 32768 minimum: 301 [ 0.000045] ACPI: Core revision 20160108 [ 0.069516] ACPI: 3 ACPI AML tables successfully acquired and loaded [ 0.069558] Security Framework initialized [ 0.069564] AppArmor: AppArmor initialized [ 0.070043] Dentry cache hash table entries: 1048576 (order: 11, 8388608 bytes) [ 0.071504] Inode-cache hash table entries: 524288 (order: 10, 4194304 bytes) [ 0.072118] Mount-cache hash table entries: 16384 (order: 5, 131072 bytes) [ 0.072126] Mountpoint-cache hash table entries: 16384 (order: 5, 131072 bytes) [ 0.072377] CPU: Physical Processor ID: 0 [ 0.072378] CPU: Processor Core ID: 0 [ 0.072382] mce: CPU supports 9 MCE banks [ 0.072391] CPU0: Thermal monitoring enabled (TM1) [ 0.072397] process: using mwait in idle threads [ 0.072399] Last level iTLB entries: 4KB 512, 2MB 7, 4MB 7 [ 0.072400] Last level dTLB entries: 4KB 512, 2MB 32, 4MB 32, 1GB 0 [ 0.072637] Freeing SMP alternatives memory: 28K (ffffffff820bf000 - ffffffff820c6000) [ 0.073993] ftrace: allocating 26991 entries in 106 pages [ 0.084244] DMAR: Host address width 36 [ 0.084246] DMAR: DRHD base: 0x000000fedc0000 flags: 0x1 [ 0.084254] DMAR: dmar0: reg_base_addr fedc0000 ver 1:0 cap c90780106f0462 ecap f020e2 [ 0.084255] DMAR: RMRR base: 0x000000db730000 end: 0x000000db76ffff [ 0.084641] ..TIMER: vector=0x30 apic1=0 pin1=2 apic2=-1 pin2=-1 [ 0.229437] smpboot: CPU0: Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz (family: 0x6, model: 0x1e, stepping: 0x5) [ 0.229456] Performance Events: PEBS fmt1+, 16-deep LBR, Nehalem events, Intel PMU driver. [ 0.229470] perf_event_intel: CPU erratum AAJ80 worked around [ 0.229471] perf_event_intel: CPUID marked event: 'bus cycles' unavailable [ 0.229473] ... version: 3 [ 0.229473] ... bit width: 48 [ 0.229474] ... generic registers: 4 [ 0.229475] ... value mask: 0000ffffffffffff [ 0.229476] ... max period: 000000007fffffff [ 0.229477] ... fixed-purpose events: 3 [ 0.229477] ... event mask: 000000070000000f [ 0.265492] x86: Booting SMP configuration: [ 0.265496] .... node #0, CPUs: #1 [ 0.268073] NMI watchdog: enabled on all CPUs, permanently consumes one hw-PMU counter. [ 0.277499] #2 #3 #4 #5 #6 #7 [ 0.339974] x86: Booted up 1 node, 8 CPUs [ 0.339977] smpboot: Total of 8 processors activated (44688.36 BogoMIPS) [ 0.360818] node 0 initialised, 621984 pages in 16ms [ 0.360938] devtmpfs: initialized [ 0.363443] PM: Registering ACPI NVS region [mem 0xdb6cfc00-0xdb723bff] (344064 bytes) [ 0.363538] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns [ 0.363602] pinctrl core: initialized pinctrl subsystem [ 0.363639] RTC time: 16:57:38, date: 03/29/16 [ 0.363747] NET: Registered protocol family 16 [ 0.373481] cpuidle: using governor ladder [ 0.385478] cpuidle: using governor menu [ 0.385551] Simple Boot Flag at 0x7a set to 0x1 [ 0.385586] ACPI FADT declares the system doesn't support PCIe ASPM, so disable it [ 0.385588] ACPI: bus type PCI registered [ 0.385589] acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5 [ 0.385658] PCI: MMCONFIG for domain 0000 [bus 00-3f] at [mem 0xf8000000-0xfbffffff] (base 0xf8000000) [ 0.385660] PCI: MMCONFIG at [mem 0xf8000000-0xfbffffff] reserved in E820 [ 0.385668] PCI: Using configuration type 1 for base access [ 0.385674] dmi type 0xB1 record - unknown flag [ 0.397627] HugeTLB registered 2 MB page size, pre-allocated 0 pages [ 0.397857] ACPI: Added _OSI(Module Device) [ 0.397859] ACPI: Added _OSI(Processor Device) [ 0.397860] ACPI: Added _OSI(3.0 _SCP Extensions) [ 0.397861] ACPI: Added _OSI(Processor Aggregator Device) [ 0.433272] [Firmware Bug]: ACPI: BIOS _OSI(Linux) query ignored [ 0.436787] ACPI: Interpreter enabled [ 0.436806] ACPI: (supports S0 S1 S3 S4 S5) [ 0.436807] ACPI: Using IOAPIC for interrupt routing [ 0.436918] PCI: Using host bridge windows from ACPI; if necessary, use "pci=nocrs" and report a bug [ 0.498137] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff]) [ 0.498142] acpi PNP0A03:00: _OSC: OS supports [ExtendedConfig ASPM ClockPM Segments MSI] [ 0.498147] acpi PNP0A03:00: _OSC failed (AE_NOT_FOUND); disabling ASPM [ 0.498156] acpi PNP0A03:00: [Firmware Info]: MMCONFIG for domain 0000 [bus 00-3f] only partially covers this bridge [ 0.504270] PCI host bridge to bus 0000:00 [ 0.504273] pci_bus 0000:00: root bus resource [io 0x0000-0x0cf7 window] [ 0.504274] pci_bus 0000:00: root bus resource [io 0x0d00-0xffff window] [ 0.504276] pci_bus 0000:00: root bus resource [mem 0x000a0000-0x000bffff window] [ 0.504277] pci_bus 0000:00: root bus resource [mem 0x000c0000-0x000effff window] [ 0.504279] pci_bus 0000:00: root bus resource [mem 0x000f0000-0x000fffff window] [ 0.504280] pci_bus 0000:00: root bus resource [mem 0xdb800000-0xf7ffffff window] [ 0.504282] pci_bus 0000:00: root bus resource [mem 0xff87c000-0xff87ffff window] [ 0.504283] pci_bus 0000:00: root bus resource [mem 0xff870000-0xff8707ff window] [ 0.504285] pci_bus 0000:00: root bus resource [mem 0xfed20000-0xfed9ffff window] [ 0.504287] pci_bus 0000:00: root bus resource [mem 0xfeda6000-0xfeda6fff window] [ 0.504288] pci_bus 0000:00: root bus resource [mem 0xfeda7000-0xfeda7fff window] [ 0.504290] pci_bus 0000:00: root bus resource [bus 00-ff] [ 0.504298] pci 0000:00:00.0: [8086:d131] type 00 class 0x060000 [ 0.504620] pci 0000:00:03.0: [8086:d138] type 01 class 0x060400 [ 0.504667] pci 0000:00:03.0: PME# supported from D0 D3hot D3cold [ 0.504962] pci 0000:00:08.0: [8086:d155] type 00 class 0x088000 [ 0.505276] pci 0000:00:08.1: [8086:d156] type 00 class 0x088000 [ 0.505593] pci 0000:00:08.2: [8086:d157] type 00 class 0x088000 [ 0.505912] pci 0000:00:10.0: [8086:d150] type 00 class 0x088000 [ 0.506212] pci 0000:00:10.1: [8086:d151] type 00 class 0x088000 [ 0.506526] pci 0000:00:16.0: [8086:3b64] type 00 class 0x078000 [ 0.506551] pci 0000:00:16.0: reg 0x10: [mem 0xfeda6000-0xfeda600f 64bit] [ 0.506637] pci 0000:00:16.0: PME# supported from D0 D3hot D3cold [ 0.506930] pci 0000:00:16.2: [8086:3b66] type 00 class 0x010185 [ 0.506947] pci 0000:00:16.2: reg 0x10: [io 0xfe80-0xfe87] [ 0.506957] pci 0000:00:16.2: reg 0x14: [io 0xfe90-0xfe93] [ 0.506965] pci 0000:00:16.2: reg 0x18: [io 0xfea0-0xfea7] [ 0.506975] pci 0000:00:16.2: reg 0x1c: [io 0xfeb0-0xfeb3] [ 0.506983] pci 0000:00:16.2: reg 0x20: [io 0xfef0-0xfeff] [ 0.507320] pci 0000:00:16.3: [8086:3b67] type 00 class 0x070002 [ 0.507337] pci 0000:00:16.3: reg 0x10: [io 0xec98-0xec9f] [ 0.507346] pci 0000:00:16.3: reg 0x14: [mem 0xf7fdb000-0xf7fdbfff] [ 0.507705] pci 0000:00:19.0: [8086:10ef] type 00 class 0x020000 [ 0.507718] pci 0000:00:19.0: reg 0x10: [mem 0xf7fe0000-0xf7ffffff] [ 0.507726] pci 0000:00:19.0: reg 0x14: [mem 0xf7fdc000-0xf7fdcfff] [ 0.507733] pci 0000:00:19.0: reg 0x18: [io 0xecc0-0xecdf] [ 0.507787] pci 0000:00:19.0: PME# supported from D0 D3hot D3cold [ 0.508080] pci 0000:00:1a.0: [8086:3b3c] type 00 class 0x0c0320 [ 0.508097] pci 0000:00:1a.0: reg 0x10: [mem 0xf7fdd000-0xf7fdd3ff] [ 0.508173] pci 0000:00:1a.0: PME# supported from D0 D3hot D3cold [ 0.508433] pci 0000:00:1a.0: System wakeup disabled by ACPI [ 0.508475] pci 0000:00:1b.0: [8086:3b56] type 00 class 0x040300 [ 0.508490] pci 0000:00:1b.0: reg 0x10: [mem 0xff87c000-0xff87ffff 64bit] [ 0.508555] pci 0000:00:1b.0: PME# supported from D0 D3hot D3cold [ 0.508847] pci 0000:00:1c.0: [8086:3b42] type 01 class 0x060400 [ 0.508908] pci 0000:00:1c.0: PME# supported from D0 D3hot D3cold [ 0.509168] pci 0000:00:1c.0: System wakeup disabled by ACPI [ 0.509212] pci 0000:00:1c.4: [8086:3b4a] type 01 class 0x060400 [ 0.509272] pci 0000:00:1c.4: PME# supported from D0 D3hot D3cold [ 0.509536] pci 0000:00:1c.4: System wakeup disabled by ACPI [ 0.509580] pci 0000:00:1d.0: [8086:3b34] type 00 class 0x0c0320 [ 0.509596] pci 0000:00:1d.0: reg 0x10: [mem 0xf7fde000-0xf7fde3ff] [ 0.509673] pci 0000:00:1d.0: PME# supported from D0 D3hot D3cold [ 0.509933] pci 0000:00:1d.0: System wakeup disabled by ACPI [ 0.509971] pci 0000:00:1e.0: [8086:244e] type 01 class 0x060401 [ 0.510268] pci 0000:00:1e.0: System wakeup disabled by ACPI [ 0.510309] pci 0000:00:1f.0: [8086:3b0a] type 00 class 0x060100 [ 0.510690] pci 0000:00:1f.2: [8086:3b22] type 00 class 0x010601 [ 0.510703] pci 0000:00:1f.2: reg 0x10: [io 0xfe00-0xfe07] [ 0.510710] pci 0000:00:1f.2: reg 0x14: [io 0xfe10-0xfe13] [ 0.510717] pci 0000:00:1f.2: reg 0x18: [io 0xfe20-0xfe27] [ 0.510723] pci 0000:00:1f.2: reg 0x1c: [io 0xfe30-0xfe33] [ 0.510730] pci 0000:00:1f.2: reg 0x20: [io 0xfec0-0xfedf] [ 0.510737] pci 0000:00:1f.2: reg 0x24: [mem 0xff870000-0xff8707ff] [ 0.510774] pci 0000:00:1f.2: PME# supported from D3hot [ 0.511060] pci 0000:00:1f.3: [8086:3b30] type 00 class 0x0c0500 [ 0.511073] pci 0000:00:1f.3: reg 0x10: [mem 0xf7fdf000-0xf7fdf0ff 64bit] [ 0.511091] pci 0000:00:1f.3: reg 0x20: [io 0xece0-0xecff] [ 0.511425] pci 0000:01:00.0: [1002:95c5] type 00 class 0x030000 [ 0.511439] pci 0000:01:00.0: reg 0x10: [mem 0xe0000000-0xefffffff 64bit pref] [ 0.511448] pci 0000:01:00.0: reg 0x18: [mem 0xf7df0000-0xf7dfffff 64bit] [ 0.511455] pci 0000:01:00.0: reg 0x20: [io 0xdc00-0xdcff] [ 0.511466] pci 0000:01:00.0: reg 0x30: [mem 0xf7e00000-0xf7e1ffff pref] [ 0.511497] pci 0000:01:00.0: supports D1 D2 [ 0.519986] pci 0000:00:03.0: PCI bridge to [bus 01] [ 0.519992] pci 0000:00:03.0: bridge window [io 0xd000-0xdfff] [ 0.519997] pci 0000:00:03.0: bridge window [mem 0xf7d00000-0xf7efffff] [ 0.520004] pci 0000:00:03.0: bridge window [mem 0xe0000000-0xefffffff 64bit pref] [ 0.520082] pci 0000:02:00.0: [8086:10d3] type 00 class 0x020000 [ 0.520109] pci 0000:02:00.0: reg 0x10: [mem 0xf7b60000-0xf7b7ffff] [ 0.520125] pci 0000:02:00.0: reg 0x14: [mem 0xf7b80000-0xf7bfffff] [ 0.520142] pci 0000:02:00.0: reg 0x18: [io 0xcce0-0xccff] [ 0.520158] pci 0000:02:00.0: reg 0x1c: [mem 0xf7b5c000-0xf7b5ffff] [ 0.520204] pci 0000:02:00.0: reg 0x30: [mem 0xf7c00000-0xf7c3ffff pref] [ 0.520303] pci 0000:02:00.0: PME# supported from D0 D3hot D3cold [ 0.527994] pci 0000:00:1c.0: PCI bridge to [bus 02] [ 0.528000] pci 0000:00:1c.0: bridge window [io 0xc000-0xcfff] [ 0.528006] pci 0000:00:1c.0: bridge window [mem 0xf7b00000-0xf7cfffff] [ 0.528065] pci 0000:00:1c.4: PCI bridge to [bus 03] [ 0.528108] pci 0000:04:02.0: [14e4:4318] type 00 class 0x028000 [ 0.528120] pci 0000:04:02.0: reg 0x10: [mem 0xf7afe000-0xf7afffff] [ 0.528233] pci 0000:00:1e.0: PCI bridge to [bus 04] (subtractive decode) [ 0.528238] pci 0000:00:1e.0: bridge window [mem 0xf7a00000-0xf7afffff] [ 0.528243] pci 0000:00:1e.0: bridge window [io 0x0000-0x0cf7 window] (subtractive decode) [ 0.528244] pci 0000:00:1e.0: bridge window [io 0x0d00-0xffff window] (subtractive decode) [ 0.528246] pci 0000:00:1e.0: bridge window [mem 0x000a0000-0x000bffff window] (subtractive decode) [ 0.528248] pci 0000:00:1e.0: bridge window [mem 0x000c0000-0x000effff window] (subtractive decode) [ 0.528249] pci 0000:00:1e.0: bridge window [mem 0x000f0000-0x000fffff window] (subtractive decode) [ 0.528251] pci 0000:00:1e.0: bridge window [mem 0xdb800000-0xf7ffffff window] (subtractive decode) [ 0.528252] pci 0000:00:1e.0: bridge window [mem 0xff87c000-0xff87ffff window] (subtractive decode) [ 0.528254] pci 0000:00:1e.0: bridge window [mem 0xff870000-0xff8707ff window] (subtractive decode) [ 0.528255] pci 0000:00:1e.0: bridge window [mem 0xfed20000-0xfed9ffff window] (subtractive decode) [ 0.528257] pci 0000:00:1e.0: bridge window [mem 0xfeda6000-0xfeda6fff window] (subtractive decode) [ 0.528258] pci 0000:00:1e.0: bridge window [mem 0xfeda7000-0xfeda7fff window] (subtractive decode) [ 0.542385] ACPI: PCI Interrupt Link [LNKA] (IRQs 3 4 5 6 7 9 10 *11 12 15) [ 0.543289] ACPI: PCI Interrupt Link [LNKB] (IRQs 3 4 *5 6 7 9 10 11 12 15) [ 0.544196] ACPI: PCI Interrupt Link [LNKC] (IRQs 3 4 5 6 7 9 *10 11 12 15) [ 0.545118] ACPI: PCI Interrupt Link [LNKD] (IRQs 3 4 5 6 7 9 10 11 12 15) *0, disabled. [ 0.546043] ACPI: PCI Interrupt Link [LNKE] (IRQs 3 4 5 6 7 9 10 11 12 15) *0, disabled. [ 0.546947] ACPI: PCI Interrupt Link [LNKF] (IRQs 3 4 5 6 7 *9 10 11 12 15) [ 0.547868] ACPI: PCI Interrupt Link [LNKG] (IRQs 3 4 5 6 7 9 10 11 12 15) *0, disabled. [ 0.548774] ACPI: PCI Interrupt Link [LNKH] (IRQs 3 4 *5 6 7 9 10 11 12 15) [ 0.549424] ACPI: Enabled 3 GPEs in block 00 to 3F [ 0.549511] vgaarb: setting as boot device: PCI:0000:01:00.0 [ 0.549513] vgaarb: device added: PCI:0000:01:00.0,decodes=io+mem,owns=io+mem,locks=none [ 0.549514] vgaarb: loaded [ 0.549515] vgaarb: bridge control possible 0000:01:00.0 [ 0.549607] SCSI subsystem initialized [ 0.549642] libata version 3.00 loaded. [ 0.549702] PCI: Using ACPI for IRQ routing [ 0.550999] PCI: Discovered peer bus 3f [ 0.551000] PCI: root bus 3f: using default resources [ 0.551001] PCI: Probing PCI hardware (bus 3f) [ 0.551027] ACPI: \: failed to evaluate _DSM (0x1001) [ 0.551028] PCI host bridge to bus 0000:3f [ 0.551030] pci_bus 0000:3f: root bus resource [io 0x0000-0xffff] [ 0.551032] pci_bus 0000:3f: root bus resource [mem 0x00000000-0xfffffffff] [ 0.551033] pci_bus 0000:3f: No busn resource found for root bus, will use [bus 3f-ff] [ 0.551035] pci_bus 0000:3f: busn_res: can not insert [bus 3f-ff] under domain [bus 00-ff] (conflicts with (null) [bus 00-ff]) [ 0.551040] pci 0000:3f:00.0: [8086:2c51] type 00 class 0x060000 [ 0.551081] pci 0000:3f:00.1: [8086:2c81] type 00 class 0x060000 [ 0.551123] pci 0000:3f:02.0: [8086:2c90] type 00 class 0x060000 [ 0.551162] pci 0000:3f:02.1: [8086:2c91] type 00 class 0x060000 [ 0.551202] pci 0000:3f:03.0: [8086:2c98] type 00 class 0x060000 [ 0.551240] pci 0000:3f:03.1: [8086:2c99] type 00 class 0x060000 [ 0.551280] pci 0000:3f:03.4: [8086:2c9c] type 00 class 0x060000 [ 0.551319] pci 0000:3f:04.0: [8086:2ca0] type 00 class 0x060000 [ 0.551359] pci 0000:3f:04.1: [8086:2ca1] type 00 class 0x060000 [ 0.551398] pci 0000:3f:04.2: [8086:2ca2] type 00 class 0x060000 [ 0.551436] pci 0000:3f:04.3: [8086:2ca3] type 00 class 0x060000 [ 0.551477] pci 0000:3f:05.0: [8086:2ca8] type 00 class 0x060000 [ 0.551516] pci 0000:3f:05.1: [8086:2ca9] type 00 class 0x060000 [ 0.551554] pci 0000:3f:05.2: [8086:2caa] type 00 class 0x060000 [ 0.551594] pci 0000:3f:05.3: [8086:2cab] type 00 class 0x060000 [ 0.551641] pci_bus 0000:3f: busn_res: [bus 3f-ff] end is updated to 3f [ 0.551644] pci_bus 0000:3f: busn_res: can not insert [bus 3f] under domain [bus 00-ff] (conflicts with (null) [bus 00-ff]) [ 0.551648] PCI: pci_cache_line_size set to 64 bytes [ 0.551705] Expanded resource reserved due to conflict with PCI Bus 0000:00 [ 0.551707] e820: reserve RAM buffer [mem 0x0009ec00-0x0009ffff] [ 0.551708] e820: reserve RAM buffer [mem 0xdb6cfc00-0xdbffffff] [ 0.551812] NetLabel: Initializing [ 0.551813] NetLabel: domain hash size = 128 [ 0.551813] NetLabel: protocols = UNLABELED CIPSOv4 [ 0.551826] NetLabel: unlabeled traffic allowed by default [ 0.551885] HPET: 8 timers in total, 5 timers will be used for per-cpu timer [ 0.551891] hpet0: at MMIO 0xfed00000, IRQs 2, 8, 24, 25, 26, 27, 28, 0 [ 0.551895] hpet0: 8 comparators, 64-bit 14.318180 MHz counter [ 0.553919] hpet: hpet2 irq 24 for MSI [ 0.553956] hpet: hpet3 irq 25 for MSI [ 0.553994] hpet: hpet4 irq 26 for MSI [ 0.554032] hpet: hpet5 irq 27 for MSI [ 0.554065] hpet: hpet6 irq 28 for MSI [ 0.554155] clocksource: Switched to clocksource hpet [ 0.560231] VFS: Disk quotas dquot_6.6.0 [ 0.560262] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes) [ 0.560346] AppArmor: AppArmor Filesystem Enabled [ 0.560390] pnp: PnP ACPI init [ 0.562850] system 00:00: [io 0x0800-0x085f] could not be reserved [ 0.562852] system 00:00: [io 0x0c00-0x0c7f] has been reserved [ 0.562854] system 00:00: [io 0x0860-0x08ff] has been reserved [ 0.562858] system 00:00: Plug and Play ACPI device, IDs PNP0c01 (active) [ 0.563093] pnp 00:01: Plug and Play ACPI device, IDs PNP0b00 (active) [ 0.569695] pnp 00:02: [dma 0 disabled] [ 0.569759] pnp 00:02: Plug and Play ACPI device, IDs PNP0401 (active) [ 0.574309] pnp 00:03: Plug and Play ACPI device, IDs PNP0501 (active) [ 0.583533] pnp: PnP ACPI: found 4 devices [ 0.590093] clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns: 2085701024 ns [ 0.590112] pci 0000:00:1c.0: bridge window [mem 0x00100000-0x000fffff 64bit pref] to [bus 02] add_size 200000 add_align 100000 [ 0.590119] pci 0000:00:1c.4: bridge window [io 0x1000-0x0fff] to [bus 03] add_size 1000 [ 0.590121] pci 0000:00:1c.4: bridge window [mem 0x00100000-0x000fffff 64bit pref] to [bus 03] add_size 200000 add_align 100000 [ 0.590123] pci 0000:00:1c.4: bridge window [mem 0x00100000-0x000fffff] to [bus 03] add_size 200000 add_align 100000 [ 0.590133] pci 0000:00:1c.0: res[15]=[mem 0x00100000-0x000fffff 64bit pref] res_to_dev_res add_size 200000 min_align 100000 [ 0.590134] pci 0000:00:1c.0: res[15]=[mem 0x00100000-0x002fffff 64bit pref] res_to_dev_res add_size 200000 min_align 100000 [ 0.590136] pci 0000:00:1c.4: res[14]=[mem 0x00100000-0x000fffff] res_to_dev_res add_size 200000 min_align 100000 [ 0.590138] pci 0000:00:1c.4: res[14]=[mem 0x00100000-0x002fffff] res_to_dev_res add_size 200000 min_align 100000 [ 0.590139] pci 0000:00:1c.4: res[15]=[mem 0x00100000-0x000fffff 64bit pref] res_to_dev_res add_size 200000 min_align 100000 [ 0.590141] pci 0000:00:1c.4: res[15]=[mem 0x00100000-0x002fffff 64bit pref] res_to_dev_res add_size 200000 min_align 100000 [ 0.590143] pci 0000:00:1c.4: res[13]=[io 0x1000-0x0fff] res_to_dev_res add_size 1000 min_align 1000 [ 0.590144] pci 0000:00:1c.4: res[13]=[io 0x1000-0x1fff] res_to_dev_res add_size 1000 min_align 1000 [ 0.590152] pci 0000:00:1c.0: BAR 15: assigned [mem 0xdc000000-0xdc1fffff 64bit pref] [ 0.590160] pci 0000:00:1c.4: BAR 14: assigned [mem 0xdc200000-0xdc3fffff] [ 0.590164] pci 0000:00:1c.4: BAR 15: assigned [mem 0xdc400000-0xdc5fffff 64bit pref] [ 0.590166] pci 0000:00:1c.4: BAR 13: assigned [io 0x1000-0x1fff] [ 0.590169] pci 0000:00:03.0: PCI bridge to [bus 01] [ 0.590171] pci 0000:00:03.0: bridge window [io 0xd000-0xdfff] [ 0.590174] pci 0000:00:03.0: bridge window [mem 0xf7d00000-0xf7efffff] [ 0.590177] pci 0000:00:03.0: bridge window [mem 0xe0000000-0xefffffff 64bit pref] [ 0.590181] pci 0000:00:1c.0: PCI bridge to [bus 02] [ 0.590183] pci 0000:00:1c.0: bridge window [io 0xc000-0xcfff] [ 0.590186] pci 0000:00:1c.0: bridge window [mem 0xf7b00000-0xf7cfffff] [ 0.590189] pci 0000:00:1c.0: bridge window [mem 0xdc000000-0xdc1fffff 64bit pref] [ 0.590194] pci 0000:00:1c.4: PCI bridge to [bus 03] [ 0.590196] pci 0000:00:1c.4: bridge window [io 0x1000-0x1fff] [ 0.590199] pci 0000:00:1c.4: bridge window [mem 0xdc200000-0xdc3fffff] [ 0.590202] pci 0000:00:1c.4: bridge window [mem 0xdc400000-0xdc5fffff 64bit pref] [ 0.590207] pci 0000:00:1e.0: PCI bridge to [bus 04] [ 0.590211] pci 0000:00:1e.0: bridge window [mem 0xf7a00000-0xf7afffff] [ 0.590218] pci_bus 0000:00: resource 4 [io 0x0000-0x0cf7 window] [ 0.590219] pci_bus 0000:00: resource 5 [io 0x0d00-0xffff window] [ 0.590221] pci_bus 0000:00: resource 6 [mem 0x000a0000-0x000bffff window] [ 0.590222] pci_bus 0000:00: resource 7 [mem 0x000c0000-0x000effff window] [ 0.590223] pci_bus 0000:00: resource 8 [mem 0x000f0000-0x000fffff window] [ 0.590225] pci_bus 0000:00: resource 9 [mem 0xdb800000-0xf7ffffff window] [ 0.590226] pci_bus 0000:00: resource 10 [mem 0xff87c000-0xff87ffff window] [ 0.590228] pci_bus 0000:00: resource 11 [mem 0xff870000-0xff8707ff window] [ 0.590229] pci_bus 0000:00: resource 12 [mem 0xfed20000-0xfed9ffff window] [ 0.590230] pci_bus 0000:00: resource 13 [mem 0xfeda6000-0xfeda6fff window] [ 0.590232] pci_bus 0000:00: resource 14 [mem 0xfeda7000-0xfeda7fff window] [ 0.590233] pci_bus 0000:01: resource 0 [io 0xd000-0xdfff] [ 0.590235] pci_bus 0000:01: resource 1 [mem 0xf7d00000-0xf7efffff] [ 0.590236] pci_bus 0000:01: resource 2 [mem 0xe0000000-0xefffffff 64bit pref] [ 0.590237] pci_bus 0000:02: resource 0 [io 0xc000-0xcfff] [ 0.590239] pci_bus 0000:02: resource 1 [mem 0xf7b00000-0xf7cfffff] [ 0.590240] pci_bus 0000:02: resource 2 [mem 0xdc000000-0xdc1fffff 64bit pref] [ 0.590242] pci_bus 0000:03: resource 0 [io 0x1000-0x1fff] [ 0.590243] pci_bus 0000:03: resource 1 [mem 0xdc200000-0xdc3fffff] [ 0.590244] pci_bus 0000:03: resource 2 [mem 0xdc400000-0xdc5fffff 64bit pref] [ 0.590246] pci_bus 0000:04: resource 1 [mem 0xf7a00000-0xf7afffff] [ 0.590247] pci_bus 0000:04: resource 4 [io 0x0000-0x0cf7 window] [ 0.590248] pci_bus 0000:04: resource 5 [io 0x0d00-0xffff window] [ 0.590250] pci_bus 0000:04: resource 6 [mem 0x000a0000-0x000bffff window] [ 0.590251] pci_bus 0000:04: resource 7 [mem 0x000c0000-0x000effff window] [ 0.590253] pci_bus 0000:04: resource 8 [mem 0x000f0000-0x000fffff window] [ 0.590254] pci_bus 0000:04: resource 9 [mem 0xdb800000-0xf7ffffff window] [ 0.590255] pci_bus 0000:04: resource 10 [mem 0xff87c000-0xff87ffff window] [ 0.590257] pci_bus 0000:04: resource 11 [mem 0xff870000-0xff8707ff window] [ 0.590258] pci_bus 0000:04: resource 12 [mem 0xfed20000-0xfed9ffff window] [ 0.590260] pci_bus 0000:04: resource 13 [mem 0xfeda6000-0xfeda6fff window] [ 0.590261] pci_bus 0000:04: resource 14 [mem 0xfeda7000-0xfeda7fff window] [ 0.590264] pci_bus 0000:3f: resource 4 [io 0x0000-0xffff] [ 0.590265] pci_bus 0000:3f: resource 5 [mem 0x00000000-0xfffffffff] [ 0.590330] NET: Registered protocol family 2 [ 0.590509] TCP established hash table entries: 65536 (order: 7, 524288 bytes) [ 0.590695] TCP bind hash table entries: 65536 (order: 8, 1048576 bytes) [ 0.590949] TCP: Hash tables configured (established 65536 bind 65536) [ 0.590974] UDP hash table entries: 4096 (order: 5, 131072 bytes) [ 0.591028] UDP-Lite hash table entries: 4096 (order: 5, 131072 bytes) [ 0.591145] NET: Registered protocol family 1 [ 0.592896] pci 0000:01:00.0: Video device with shadowed ROM [ 0.592916] PCI: CLS 64 bytes, default 64 [ 0.592957] Unpacking initramfs... [ 1.274540] Freeing initrd memory: 6896K (ffff880037277000 - ffff880037933000) [ 1.274570] PCI-DMA: Using software bounce buffering for IO (SWIOTLB) [ 1.274572] software IO TLB [mem 0xd76cf000-0xdb6cf000] (64MB) mapped at [ffff8800d76cf000-ffff8800db6cefff] [ 1.274732] Scanning for low memory corruption every 60 seconds [ 1.275053] futex hash table entries: 2048 (order: 5, 131072 bytes) [ 1.275094] audit: initializing netlink subsys (disabled) [ 1.275111] audit: type=2000 audit(1459270658.172:1): initialized [ 1.275520] zbud: loaded [ 1.275838] Key type big_key registered [ 1.276136] Key type asymmetric registered [ 1.276139] Asymmetric key parser 'x509' registered [ 1.276165] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 250) [ 1.276197] io scheduler noop registered [ 1.276200] io scheduler deadline registered [ 1.276216] io scheduler cfq registered (default) [ 1.277680] pci_hotplug: PCI Hot Plug PCI Core version: 0.5 [ 1.277686] pciehp: PCI Express Hot Plug Controller Driver version: 0.4 [ 1.277710] intel_idle: MWAIT substates: 0x1120 [ 1.277719] intel_idle: v0.4 model 0x1E [ 1.277720] intel_idle: lapic_timer_reliable_states 0x2 [ 1.278298] GHES: HEST is not enabled! [ 1.278366] Serial: 8250/16550 driver, 32 ports, IRQ sharing disabled [ 1.298789] 00:03: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A [ 1.321098] 0000:00:16.3: ttyS4 at I/O 0xec98 (irq = 17, base_baud = 115200) is a 16550A [ 1.321491] Non-volatile memory driver v1.3 [ 1.321523] Linux agpgart interface v0.103 [ 1.322448] ahci 0000:00:1f.2: version 3.0 [ 1.333091] ahci 0000:00:1f.2: AHCI 0001.0300 32 slots 6 ports 3 Gbps 0x17 impl SATA mode [ 1.333095] ahci 0000:00:1f.2: flags: 64bit ncq sntf led clo pmp fbs pio ems sxs apst [ 1.333102] ahci 0000:00:1f.2: port 0 is not capable of FBS [ 1.333123] ahci 0000:00:1f.2: port 1 is not capable of FBS [ 1.338189] ahci 0000:00:1f.2: port 2 is not capable of FBS [ 1.354820] scsi host0: ahci [ 1.354968] scsi host1: ahci [ 1.355110] scsi host2: ahci [ 1.355235] scsi host3: ahci [ 1.355363] scsi host4: ahci [ 1.355486] scsi host5: ahci [ 1.355543] ata1: SATA max UDMA/133 abar m2048@0xff870000 port 0xff870100 irq 29 [ 1.355545] ata2: SATA max UDMA/133 abar m2048@0xff870000 port 0xff870180 irq 29 [ 1.355547] ata3: SATA max UDMA/133 abar m2048@0xff870000 port 0xff870200 irq 29 [ 1.355548] ata4: DUMMY [ 1.355550] ata5: SATA max UDMA/133 abar m2048@0xff870000 port 0xff870300 irq 29 [ 1.355552] ata6: DUMMY [ 1.355614] i8042: PNP: No PS/2 controller found. Probing ports directly. [ 1.358468] serio: i8042 KBD port at 0x60,0x64 irq 1 [ 1.358508] serio: i8042 AUX port at 0x60,0x64 irq 12 [ 1.358626] mousedev: PS/2 mouse device common for all mice [ 1.358722] rtc_cmos 00:01: RTC can wake from S4 [ 1.358868] rtc_cmos 00:01: rtc core: registered rtc_cmos as rtc0 [ 1.358892] rtc_cmos 00:01: alarms up to one day, 242 bytes nvram, hpet irqs [ 1.358906] ledtrig-cpu: registered to indicate activity on CPUs [ 1.358925] hidraw: raw HID events driver (C) Jiri Kosina [ 1.359259] NET: Registered protocol family 10 [ 1.359718] microcode: CPU0 sig=0x106e5, pf=0x2, revision=0x5 [ 1.359725] microcode: CPU1 sig=0x106e5, pf=0x2, revision=0x5 [ 1.359733] microcode: CPU2 sig=0x106e5, pf=0x2, revision=0x5 [ 1.359740] microcode: CPU3 sig=0x106e5, pf=0x2, revision=0x5 [ 1.359747] microcode: CPU4 sig=0x106e5, pf=0x2, revision=0x5 [ 1.359754] microcode: CPU5 sig=0x106e5, pf=0x2, revision=0x5 [ 1.359760] microcode: CPU6 sig=0x106e5, pf=0x2, revision=0x5 [ 1.359766] microcode: CPU7 sig=0x106e5, pf=0x2, revision=0x5 [ 1.359801] microcode: Microcode Update Driver: v2.01 , Peter Oruba [ 1.359927] registered taskstats version 1 [ 1.359956] zswap: loaded using pool lzo/zbud [ 1.363054] Key type encrypted registered [ 1.363059] AppArmor: AppArmor sha1 policy hashing enabled [ 1.363418] Magic number: 8:301:996 [ 1.363458] memory memory39: hash matches [ 1.363548] rtc_cmos 00:01: setting system clock to 2016-03-29 16:57:39 UTC (1459270659) [ 1.363603] PM: Hibernation image not present or could not be loaded. [ 1.663795] ata3: SATA link down (SStatus 4 SControl 300) [ 1.822372] ata5: SATA link up 3.0 Gbps (SStatus 123 SControl 300) [ 1.822392] ata1: SATA link up 3.0 Gbps (SStatus 123 SControl 300) [ 1.822411] ata2: SATA link up 1.5 Gbps (SStatus 113 SControl 300) [ 1.823096] ata2.00: ATAPI: TSSTcorp DVD+/-RW TS-H653G, DW30, max UDMA/100 [ 1.823104] ata2.00: applying bridge limits [ 1.823274] ata1.00: ATA-9: WDC WD20EZRX-00D8PB0, 80.00A80, max UDMA/133 [ 1.823280] ata1.00: 3907029168 sectors, multi 0: LBA48 NCQ (depth 31/32), AA [ 1.824092] ata2.00: configured for UDMA/100 [ 1.824380] ata1.00: configured for UDMA/133 [ 1.824905] scsi 0:0:0:0: Direct-Access ATA WDC WD20EZRX-00D 0A80 PQ: 0 ANSI: 5 [ 1.831231] ata5.00: ATA-8: WDC WD15EADS-00P8B0, 01.00A01, max UDMA/133 [ 1.831237] ata5.00: 2930277168 sectors, multi 0: LBA48 [ 1.840785] ata5.00: configured for UDMA/133 [ 1.846773] sd 0:0:0:0: [sda] 3907029168 512-byte logical blocks: (2.00 TB/1.82 TiB) [ 1.846776] sd 0:0:0:0: [sda] 4096-byte physical blocks [ 1.847255] sd 0:0:0:0: [sda] Write Protect is off [ 1.847262] sd 0:0:0:0: [sda] Mode Sense: 00 3a 00 00 [ 1.847473] sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA [ 1.847505] scsi 1:0:0:0: CD-ROM TSSTcorp DVD+-RW TS-H653G DW30 PQ: 0 ANSI: 5 [ 1.855703] scsi 4:0:0:0: Direct-Access ATA WDC WD15EADS-00P 0A01 PQ: 0 ANSI: 5 [ 1.882794] sd 4:0:0:0: [sdb] 2930277168 512-byte logical blocks: (1.50 TB/1.36 TiB) [ 1.883317] sd 4:0:0:0: [sdb] Write Protect is off [ 1.883324] sd 4:0:0:0: [sdb] Mode Sense: 00 3a 00 00 [ 1.883626] sd 4:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA [ 1.898471] sdb: sdb1 sdb2 [ 1.900079] sd 4:0:0:0: [sdb] Attached SCSI removable disk [ 2.274199] tsc: Refined TSC clocksource calibration: 2792.982 MHz [ 2.274204] clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x28425adda3a, max_idle_ns: 440795215496 ns [ 2.775263] sda: sda1 sda2 sda3 sda4 < sda5 sda6 sda7 sda8 sda9 sda10 sda11 sda12 sda13 sda14 sda15 sda16 sda17 sda18 sda19 sda20 sda21 sda22 sda23 sda24 sda25 sda26 sda27 sda28 sda29 sda30 sda31 sda32 sda33 sda34 sda35 sda36 sda37 sda38 sda39 sda40 sda41 sda42 sda43 sda44 sda45 sda46 sda47 sda48 sda49 sda50 > [ 2.778716] sd 0:0:0:0: [sda] Attached SCSI disk [ 2.780069] Freeing unused kernel memory: 1628K (ffffffff81f28000 - ffffffff820bf000) [ 2.780071] Write protecting the kernel read-only data: 14336k [ 2.780715] Freeing unused kernel memory: 1200K (ffff8800016d4000 - ffff880001800000) [ 2.782744] Freeing unused kernel memory: 992K (ffff880001d08000 - ffff880001e00000) [ 2.784956] random: systemd urandom read with 45 bits of entropy available [ 2.787474] systemd[1]: systemd 228 running in system mode. (+PAM +AUDIT +SELINUX -IMA +APPARMOR -SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 +SECCOMP +BLKID -ELFUTILS +KMOD +IDN) [ 2.787702] systemd[1]: Detected architecture x86-64. [ 2.787705] systemd[1]: Running in initial RAM disk. [ 2.787726] systemd[1]: Set hostname to . [ 2.830358] systemd[1]: Listening on udev Kernel Socket. [ 2.830393] systemd[1]: Reached target Swap. [ 2.830425] systemd[1]: Listening on Journal Socket. [ 2.830453] systemd[1]: Listening on udev Control Socket. [ 2.830463] systemd[1]: Reached target Timers. [ 2.830496] systemd[1]: Started Dispatch Password Requests to Console Directory Watch. [ 2.830506] systemd[1]: Reached target Paths. [ 2.830515] systemd[1]: Reached target Local File Systems. [ 2.830573] systemd[1]: Listening on Journal Audit Socket. [ 2.830596] systemd[1]: Listening on Journal Socket (/dev/log). [ 2.830827] systemd[1]: Created slice System Slice. [ 2.830840] systemd[1]: Reached target Slices. [ 2.842550] systemd[1]: Starting Create list of required static device nodes for the current kernel... [ 2.842942] systemd[1]: Started Entropy Daemon based on the HAVEGE algorithm. [ 2.843554] systemd[1]: Starting Load Kernel Modules... [ 2.844149] systemd[1]: Starting dracut cmdline hook... [ 2.844171] systemd[1]: Reached target Sockets. [ 2.844755] systemd[1]: Starting Journal Service... [ 2.845412] sd 0:0:0:0: Attached scsi generic sg0 type 0 [ 2.845467] scsi 1:0:0:0: Attached scsi generic sg1 type 5 [ 2.845520] sd 4:0:0:0: Attached scsi generic sg2 type 0 [ 2.846534] systemd[1]: Started Create list of required static device nodes for the current kernel. [ 2.846809] systemd[1]: Started Load Kernel Modules. [ 2.846832] audit: type=1130 audit(1459270660.980:2): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-modules-load comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 2.860079] systemd[1]: Starting Apply Kernel Variables... [ 2.860736] systemd[1]: Starting Create Static Device Nodes in /dev... [ 2.862611] systemd[1]: Started Apply Kernel Variables. [ 2.862657] audit: type=1130 audit(1459270660.996:3): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-sysctl comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 2.862903] systemd[1]: Started Create Static Device Nodes in /dev. [ 2.862930] audit: type=1130 audit(1459270660.996:4): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-tmpfiles-setup-dev comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 2.871229] systemd[1]: Started Journal Service. [ 2.871287] audit: type=1130 audit(1459270661.004:5): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-journald comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 2.884768] audit: type=1130 audit(1459270661.016:6): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=dracut-cmdline comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 2.888468] audit: type=1130 audit(1459270661.020:7): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-udevd comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 2.899924] audit: type=1130 audit(1459270661.032:8): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=dracut-pre-trigger comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 2.949665] ACPI: bus type USB registered [ 2.949703] usbcore: registered new interface driver usbfs [ 2.949717] usbcore: registered new interface driver hub [ 2.949758] usbcore: registered new device driver usb [ 2.950385] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver [ 2.950451] audit: type=1130 audit(1459270661.084:9): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-udev-trigger comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 2.950583] ehci-pci: EHCI PCI platform driver [ 2.951268] scsi host6: ata_generic [ 2.951378] scsi host7: ata_generic [ 2.951420] ata7: PATA max UDMA/100 cmd 0xfe80 ctl 0xfe90 bmdma 0xfef0 irq 18 [ 2.951422] ata8: PATA max UDMA/100 cmd 0xfea0 ctl 0xfeb0 bmdma 0xfef8 irq 18 [ 2.951945] ehci-pci 0000:00:1a.0: EHCI Host Controller [ 2.951952] ehci-pci 0000:00:1a.0: new USB bus registered, assigned bus number 1 [ 2.951963] ehci-pci 0000:00:1a.0: debug port 2 [ 2.955887] ehci-pci 0000:00:1a.0: cache line size of 64 is not supported [ 2.955903] ehci-pci 0000:00:1a.0: irq 16, io mem 0xf7fdd000 [ 2.966159] ehci-pci 0000:00:1a.0: USB 2.0 started, EHCI 1.00 [ 2.970818] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002 [ 2.970822] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1 [ 2.970824] usb usb1: Product: EHCI Host Controller [ 2.970826] usb usb1: Manufacturer: Linux 4.5.0-1-default ehci_hcd [ 2.970828] usb usb1: SerialNumber: 0000:00:1a.0 [ 2.971012] hub 1-0:1.0: USB hub found [ 2.971025] hub 1-0:1.0: 3 ports detected [ 2.971785] ehci-pci 0000:00:1d.0: EHCI Host Controller [ 2.971793] ehci-pci 0000:00:1d.0: new USB bus registered, assigned bus number 2 [ 2.971805] ehci-pci 0000:00:1d.0: debug port 2 [ 2.975756] sr 1:0:0:0: [sr0] scsi3-mmc drive: 48x/48x writer dvd-ram cd/rw xa/form2 cdda tray [ 2.975759] cdrom: Uniform CD-ROM driver Revision: 3.20 [ 2.975895] sr 1:0:0:0: Attached scsi CD-ROM sr0 [ 2.977508] ehci-pci 0000:00:1d.0: cache line size of 64 is not supported [ 2.977524] ehci-pci 0000:00:1d.0: irq 23, io mem 0xf7fde000 [ 2.986169] ehci-pci 0000:00:1d.0: USB 2.0 started, EHCI 1.00 [ 2.986212] usb usb2: New USB device found, idVendor=1d6b, idProduct=0002 [ 2.986214] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1 [ 2.986216] usb usb2: Product: EHCI Host Controller [ 2.986217] usb usb2: Manufacturer: Linux 4.5.0-1-default ehci_hcd [ 2.986219] usb usb2: SerialNumber: 0000:00:1d.0 [ 2.986360] hub 2-0:1.0: USB hub found [ 2.986368] hub 2-0:1.0: 3 ports detected [ 3.285554] clocksource: Switched to clocksource tsc [ 3.285558] usb 1-1: new high-speed USB device number 2 using ehci-pci [ 3.298239] usb 2-1: new high-speed USB device number 2 using ehci-pci [ 3.315708] random: nonblocking pool is initialized [ 3.414605] usb 1-1: New USB device found, idVendor=8087, idProduct=0020 [ 3.414608] usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0 [ 3.414855] hub 1-1:1.0: USB hub found [ 3.414935] hub 1-1:1.0: 6 ports detected [ 3.434561] usb 2-1: New USB device found, idVendor=8087, idProduct=0020 [ 3.434564] usb 2-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0 [ 3.434726] hub 2-1:1.0: USB hub found [ 3.434809] hub 2-1:1.0: 8 ports detected [ 3.591289] audit: type=1130 audit(1459270661.726:10): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-fsck-root comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 3.613022] EXT4-fs (sdb2): mounted filesystem with ordered data mode. Opts: (null) [ 3.710122] usb 2-1.5: new low-speed USB device number 3 using ehci-pci [ 3.805874] usb 2-1.5: New USB device found, idVendor=046a, idProduct=0011 [ 3.805877] usb 2-1.5: New USB device strings: Mfr=0, Product=0, SerialNumber=0 [ 3.878209] usb 2-1.6: new low-speed USB device number 4 using ehci-pci [ 3.976472] usb 2-1.6: New USB device found, idVendor=046d, idProduct=c050 [ 3.976479] usb 2-1.6: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [ 3.976483] usb 2-1.6: Product: USB-PS/2 Optical Mouse [ 3.976486] usb 2-1.6: Manufacturer: Logitech [ 9.079515] audit_printk_skb: 42 callbacks suppressed [ 9.079518] audit: type=1130 audit(1459270667.214:25): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-udevd comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 9.079532] audit: type=1131 audit(1459270667.214:26): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-udevd comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 9.103284] audit: type=1130 audit(1459270667.238:27): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-tmpfiles-setup-dev comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 9.103297] audit: type=1131 audit(1459270667.238:28): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-tmpfiles-setup-dev comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 9.103821] audit: type=1130 audit(1459270667.238:29): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=kmod-static-nodes comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 9.103832] audit: type=1131 audit(1459270667.238:30): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=kmod-static-nodes comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 9.120963] audit: type=1130 audit(1459270667.254:31): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=initrd-udevadm-cleanup-db comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 9.120977] audit: type=1131 audit(1459270667.254:32): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=initrd-udevadm-cleanup-db comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 9.182971] systemd-journald[157]: Received SIGTERM from PID 1 (systemd). [ 11.208191] audit: type=1130 audit(1459270669.342:33): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=haveged comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 11.208205] audit: type=1131 audit(1459270669.342:34): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=haveged comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 11.690375] EXT4-fs (sdb2): re-mounted. Opts: acl,user_xattr [ 12.265497] systemd-journald[405]: File /var/log/journal/ccd9567dcb1d7c87983a02da56d44567/system.journal corrupted or uncleanly shut down, renaming and replacing. [ 12.428595] systemd-journald[405]: Received request to flush runtime journal from PID 1 [ 13.020724] input: Power Button as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input3 [ 13.020772] ACPI: Power Button [VBTN] [ 13.020839] input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/input/input4 [ 13.020869] ACPI: Power Button [PWRF] [ 13.056751] dcdbas dcdbas: Dell Systems Management Base Driver (version 5.6.0-3.2) [ 13.097933] wmi: Mapper loaded [ 13.188482] shpchp: Standard Hot Plug PCI Controller Driver version: 0.4 [ 13.225016] EDAC MC: Ver: 3.0.0 [ 13.246230] input: PC Speaker as /devices/platform/pcspkr/input/input5 [ 13.246919] i801_smbus 0000:00:1f.3: SMBus using PCI interrupt [ 13.308824] kvm: VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL does not work properly. Using workaround [ 13.396556] dell_wmi: Detected Dell WMI interface version 1 [ 13.396599] input: Dell WMI hotkeys as /devices/virtual/input/input6 [ 13.398325] ACPI Warning: SystemIO range 0x0000000000000828-0x000000000000082F conflicts with OpRegion 0x0000000000000828-0x000000000000082D (\GLBC) (20160108/utaddress-255) [ 13.398330] ACPI Warning: SystemIO range 0x0000000000000828-0x000000000000082F conflicts with OpRegion 0x000000000000082A-0x000000000000082A (\SACT) (20160108/utaddress-255) [ 13.398334] ACPI Warning: SystemIO range 0x0000000000000828-0x000000000000082F conflicts with OpRegion 0x0000000000000828-0x0000000000000828 (\SSTS) (20160108/utaddress-255) [ 13.398338] ACPI: If an ACPI driver is available for this device, you should use it instead of the native driver [ 13.398369] lpc_ich: Resource conflict(s) found affecting gpio_ich [ 13.399056] pps_core: LinuxPPS API ver. 1 registered [ 13.399059] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti [ 13.399526] parport_pc 00:02: reported by Plug and Play ACPI [ 13.399592] parport0: PC-style at 0x378 (0x778), irq 7, using FIFO [PCSPP,TRISTATE,COMPAT,EPP,ECP] [ 13.404400] usbcore: registered new interface driver usbhid [ 13.404402] usbhid: USB HID core driver [ 13.420341] PTP clock support registered [ 13.466453] e1000e: Intel(R) PRO/1000 Network Driver - 3.2.6-k [ 13.466455] e1000e: Copyright(c) 1999 - 2015 Intel Corporation. [ 13.466978] e1000e 0000:00:19.0: Interrupt Throttling Rate (ints/sec) set to dynamic conservative mode [ 13.524244] iTCO_vendor_support: vendor-support=0 [ 13.524812] iTCO_wdt: Intel TCO WatchDog Timer Driver v1.11 [ 13.524839] iTCO_wdt: Found a Q57 TCO device (Version=2, TCOBASE=0x0860) [ 13.524903] iTCO_wdt: initialized. heartbeat=30 sec (nowayout=0) [ 13.530310] gpio_ich: GPIO from 436 to 511 on gpio_ich [ 13.539576] input: HID 046a:0011 as /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.5/2-1.5:1.0/0003:046A:0011.0001/input/input7 [ 13.546536] EDAC MC0: Giving out device to module i7core_edac.c controller i7 core #0: DEV 0000:3f:03.0 (POLLED) [ 13.546601] EDAC PCI0: Giving out device to module i7core_edac controller EDAC PCI controller: DEV 0000:3f:03.0 (POLLED) [ 13.546608] EDAC i7core: Driver loaded, 1 memory controller(s) found. [ 13.554307] ppdev: user-space parallel port driver [ 13.594115] hid-generic 0003:046A:0011.0001: input,hidraw0: USB HID v1.10 Keyboard [HID 046a:0011] on usb-0000:00:1d.0-1.5/input0 [ 13.594230] input: Logitech USB-PS/2 Optical Mouse as /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6/2-1.6:1.0/0003:046D:C050.0002/input/input8 [ 13.594315] hid-generic 0003:046D:C050.0002: input,hidraw1: USB HID v1.10 Mouse [Logitech USB-PS/2 Optical Mouse] on usb-0000:00:1d.0-1.6/input0 [ 13.688310] e1000e 0000:00:19.0 eth0: (PCI Express:2.5GT/s:Width x1) b8:ac:6f:a3:7d:0a [ 13.688316] e1000e 0000:00:19.0 eth0: Intel(R) PRO/1000 Network Connection [ 13.688350] e1000e 0000:00:19.0 eth0: MAC: 9, PHY: 9, PBA No: A002FF-0FF [ 13.689107] e1000e 0000:02:00.0: Interrupt Throttling Rate (ints/sec) set to dynamic conservative mode [ 13.796995] e1000e 0000:02:00.0 eth1: registered PHC clock [ 13.796998] e1000e 0000:02:00.0 eth1: (PCI Express:2.5GT/s:Width x1) 68:05:ca:39:d6:f0 [ 13.797001] e1000e 0000:02:00.0 eth1: Intel(R) PRO/1000 Network Connection [ 13.797014] e1000e 0000:02:00.0 eth1: MAC: 3, PHY: 8, PBA No: E46981-008 [ 13.995157] [drm] Initialized drm 1.1.0 20060810 [ 14.070600] [drm] radeon kernel modesetting enabled. [ 14.091812] AMD IOMMUv2 driver by Joerg Roedel [ 14.091814] AMD IOMMUv2 functionality not available on this system [ 14.102323] CRAT table not found [ 14.102325] Finished initializing topology ret=0 [ 14.102377] kfd kfd: Initialized module [ 14.103235] [drm] initializing kernel modesetting (RV620 0x1002:0x95C5 0x1028:0x0342). [ 14.103246] [drm] register mmio base: 0xF7DF0000 [ 14.103248] [drm] register mmio size: 65536 [ 14.103284] ATOM BIOS: 113 [ 14.103300] radeon 0000:01:00.0: VRAM: 256M 0x0000000000000000 - 0x000000000FFFFFFF (256M used) [ 14.103302] radeon 0000:01:00.0: GTT: 512M 0x0000000010000000 - 0x000000002FFFFFFF [ 14.103304] [drm] Detected VRAM RAM=256M, BAR=256M [ 14.103305] [drm] RAM width 64bits DDR [ 14.103350] [TTM] Zone kernel: Available graphics memory: 4049602 kiB [ 14.103351] [TTM] Zone dma32: Available graphics memory: 2097152 kiB [ 14.103352] [TTM] Initializing pool allocator [ 14.103358] [TTM] Initializing DMA pool allocator [ 14.103375] [drm] radeon: 256M of VRAM memory ready [ 14.103377] [drm] radeon: 512M of GTT memory ready. [ 14.103389] [drm] Loading RV620 Microcode [ 14.117873] e1000e 0000:02:00.0 p4p1: renamed from eth1 [ 14.123396] snd_hda_codec_realtek hdaudioC0D0: ALC269VB: SKU not ready 0x411111f0 [ 14.123921] snd_hda_codec_realtek hdaudioC0D0: autoconfig for ALC269VB: line_outs=1 (0x1b/0x0/0x0/0x0/0x0) type:line [ 14.123924] snd_hda_codec_realtek hdaudioC0D0: speaker_outs=1 (0x14/0x0/0x0/0x0/0x0) [ 14.123926] snd_hda_codec_realtek hdaudioC0D0: hp_outs=1 (0x21/0x0/0x0/0x0/0x0) [ 14.123928] snd_hda_codec_realtek hdaudioC0D0: mono: mono_out=0x0 [ 14.123929] snd_hda_codec_realtek hdaudioC0D0: inputs: [ 14.123932] snd_hda_codec_realtek hdaudioC0D0: Rear Mic=0x19 [ 14.123934] snd_hda_codec_realtek hdaudioC0D0: Front Mic=0x18 [ 14.130572] input: HDA Digital PCBeep as /devices/pci0000:00/0000:00:1b.0/sound/card0/input9 [ 14.131606] input: HDA Intel MID Rear Mic as /devices/pci0000:00/0000:00:1b.0/sound/card0/input10 [ 14.131680] input: HDA Intel MID Front Mic as /devices/pci0000:00/0000:00:1b.0/sound/card0/input11 [ 14.131750] input: HDA Intel MID Line Out as /devices/pci0000:00/0000:00:1b.0/sound/card0/input12 [ 14.131817] input: HDA Intel MID Front Headphone as /devices/pci0000:00/0000:00:1b.0/sound/card0/input13 [ 14.134046] e1000e 0000:00:19.0 em1: renamed from eth0 [ 14.196367] [drm] Internal thermal controller with fan control [ 14.196402] [drm] radeon: power management initialized [ 14.199191] [drm] GART: num cpu pages 131072, num gpu pages 131072 [ 14.199632] [drm] enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0 [ 14.206395] [drm] PCIE GART of 512M enabled (table at 0x0000000000254000). [ 14.206445] radeon 0000:01:00.0: WB enabled [ 14.206448] radeon 0000:01:00.0: fence driver on ring 0 use gpu addr 0x0000000010000c00 and cpu addr 0xffff880211849c00 [ 14.207112] radeon 0000:01:00.0: fence driver on ring 5 use gpu addr 0x00000000000521d0 and cpu addr 0xffffc900014121d0 [ 14.207113] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013). [ 14.207114] [drm] Driver supports precise vblank timestamp query. [ 14.207115] radeon 0000:01:00.0: radeon: MSI limited to 32-bit [ 14.207136] radeon 0000:01:00.0: radeon: using MSI. [ 14.207157] [drm] radeon: irq initialized. [ 14.239071] [drm] ring test on 0 succeeded in 1 usecs [ 14.350006] ssb: Found chip with id 0x4318, rev 0x02 and package 0x00 [ 14.350013] ssb: Core 0 found: ChipCommon (cc 0x800, rev 0x0D, vendor 0x4243) [ 14.350018] ssb: Core 1 found: IEEE 802.11 (cc 0x812, rev 0x09, vendor 0x4243) [ 14.350023] ssb: Core 2 found: PCI (cc 0x804, rev 0x0C, vendor 0x4243) [ 14.350028] ssb: Core 3 found: PCMCIA (cc 0x80D, rev 0x07, vendor 0x4243) [ 14.390038] ssb: Sonics Silicon Backplane found on PCI device 0000:04:02.0 [ 14.414023] [drm] ring test on 5 succeeded in 1 usecs [ 14.414032] [drm] UVD initialized successfully. [ 14.414248] [drm] ib test on ring 0 succeeded in 0 usecs [ 14.596603] b43-phy0: Broadcom 4318 WLAN found (core revision 9) [ 14.625990] b43-phy0: Found PHY: Analog 3, Type 2 (G), Revision 7 [ 14.626009] b43-phy0: Found Radio: Manuf 0x17F, ID 0x2050, Revision 8, Version 0 [ 14.638147] Broadcom 43xx driver loaded [ Features: PNLS ] [ 14.710559] ieee80211 phy0: Selected rate control algorithm 'minstrel_ht' [ 14.733144] audit_printk_skb: 63 callbacks suppressed [ 14.733146] audit: type=1130 audit(1459270672.866:56): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-rfkill comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 15.062075] [drm] ib test on ring 5 succeeded [ 15.062394] [drm] Radeon Display Connectors [ 15.062396] [drm] Connector 0: [ 15.062397] [drm] DIN-1 [ 15.062398] [drm] Encoders: [ 15.062399] [drm] TV1: INTERNAL_KLDSCP_DAC2 [ 15.062399] [drm] Connector 1: [ 15.062400] [drm] DVI-I-1 [ 15.062401] [drm] HPD1 [ 15.062402] [drm] DDC: 0x7e60 0x7e60 0x7e64 0x7e64 0x7e68 0x7e68 0x7e6c 0x7e6c [ 15.062403] [drm] Encoders: [ 15.062404] [drm] CRT1: INTERNAL_KLDSCP_DAC1 [ 15.062404] [drm] DFP2: INTERNAL_KLDSCP_LVTMA [ 15.062405] [drm] Connector 2: [ 15.062406] [drm] DVI-I-2 [ 15.062407] [drm] HPD2 [ 15.062408] [drm] DDC: 0x7e20 0x7e20 0x7e24 0x7e24 0x7e28 0x7e28 0x7e2c 0x7e2c [ 15.062408] [drm] Encoders: [ 15.062409] [drm] CRT2: INTERNAL_KLDSCP_DAC2 [ 15.062410] [drm] DFP1: INTERNAL_UNIPHY [ 15.116631] [drm] fb mappable at 0xE0355000 [ 15.116632] [drm] vram apper at 0xE0000000 [ 15.116633] [drm] size 8294400 [ 15.116634] [drm] fb depth is 24 [ 15.116635] [drm] pitch is 7680 [ 15.116816] fbcon: radeondrmfb (fb0) is primary device [ 15.143340] Console: switching to colour frame buffer device 240x67 [ 15.147345] radeon 0000:01:00.0: fb0: radeondrmfb frame buffer device [ 15.162060] [drm] Initialized radeon 2.43.0 20080528 for 0000:01:00.0 on minor 0 [ 16.305953] floppy0: no floppy controllers found [ 18.502801] audit: type=1130 audit(1459270676.638:57): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-udev-settle comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 18.628761] Adding 8388604k swap on /dev/sda3. Priority:-1 extents:1 across:8388604k FS [ 19.739096] audit: type=1131 audit(1459270677.874:58): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-rfkill comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 19.741788] audit: type=1130 audit(1459270677.874:59): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=lvm2-activation-early comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 19.741817] audit: type=1131 audit(1459270677.874:60): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=lvm2-activation-early comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 19.851564] audit: type=1130 audit(1459270677.986:61): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=lvm2-activation comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 19.851608] audit: type=1131 audit(1459270677.986:62): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=lvm2-activation comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 19.979209] audit: type=1130 audit(1459270678.114:63): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-fsck@dev-disk-by\x2dlabel-WD15_optiplx comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 20.082343] SGI XFS with ACLs, security attributes, realtime, no debug enabled [ 20.083397] XFS (sdb1): Mounting V5 Filesystem [ 20.291900] XFS (sdb1): Starting recovery (logdev: internal) [ 22.559804] audit: type=1130 audit(1459270680.694:64): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-fsck@dev-disk-by\x2dlabel-WD20_SL12 comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 23.003329] EXT4-fs (sda32): mounted filesystem with ordered data mode. Opts: acl,user_xattr [ 24.396101] audit: type=1130 audit(1459270682.530:65): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=lvm2-activation-net comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 24.396118] audit: type=1131 audit(1459270682.530:66): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=lvm2-activation-net comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 24.871782] audit: type=1130 audit(1459270683.006:67): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-fsck@dev-disk-by\x2dlabel-WD20_SL11SP3 comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 24.992189] EXT4-fs (sda26): mounting ext3 file system using the ext4 subsystem [ 25.012711] EXT4-fs (sda26): mounted filesystem with ordered data mode. Opts: acl,user_xattr [ 25.066685] audit: type=1130 audit(1459270683.202:68): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-fsck@dev-disk-by\x2dlabel-WD20_Debian comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 25.285846] XFS (sdb1): Bad dir block magic! [ 25.316146] audit: type=1130 audit(1459270683.450:69): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-fsck@dev-disk-by\x2dlabel-WD20_SLED12 comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 25.360240] EXT4-fs (sda39): mounted filesystem with ordered data mode. Opts: acl,user_xattr [ 25.368605] audit: type=1130 audit(1459270683.502:70): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-fsck@dev-disk-by\x2dlabel-WD20_VM_IMG comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 25.439120] EXT4-fs (sda30): mounted filesystem with ordered data mode. Opts: acl,user_xattr [ 25.439391] XFS (sda49): Mounting V4 Filesystem [ 25.755628] audit: type=1130 audit(1459270683.890:71): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-fsck@dev-disk-by\x2dlabel-WD20_13.2 comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 26.051706] EXT4-fs (sda16): mounted filesystem with ordered data mode. Opts: acl,user_xattr [ 26.081978] XFS (sda49): Ending clean mount [ 26.448027] XFS (sdb1): Ending recovery (logdev: internal) [ 27.568655] audit: type=1130 audit(1459270685.702:72): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-fsck@dev-disk-by\x2dlabel-WD20_SL11DEV comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 27.610753] audit: type=1130 audit(1459270685.746:73): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-fsck@dev-disk-by\x2dlabel-WD20_MUSIC comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 27.644246] EXT4-fs (sda22): mounting ext3 file system using the ext4 subsystem [ 27.672267] XFS (sda48): Mounting V4 Filesystem [ 28.235188] EXT4-fs (sda22): mounted filesystem with ordered data mode. Opts: acl,user_xattr [ 28.236916] XFS (sda48): Ending clean mount [ 29.367420] audit: type=1130 audit(1459270687.502:74): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-fsck@dev-disk-by\x2dlabel-WD20_BOOT comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 29.484851] EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts: acl,user_xattr [ 29.652239] audit: type=1130 audit(1459270687.786:75): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-fsck@dev-disk-by\x2dlabel-WD20_11.4 comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 29.995766] EXT4-fs (sda14): mounted filesystem with ordered data mode. Opts: acl,user_xattr [ 31.285159] audit: type=1130 audit(1459270689.418:76): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-fsck@dev-disk-by\x2dlabel-WD20_SLED11 comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 31.306398] audit: type=1130 audit(1459270689.442:77): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-fsck@dev-disk-by\x2dlabel-WD20_DIST comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 31.308955] EXT4-fs (sda29): mounting ext3 file system using the ext4 subsystem [ 31.384396] XFS (sda50): Mounting V4 Filesystem [ 31.520593] EXT4-fs (sda29): mounted filesystem with ordered data mode. Opts: acl,user_xattr [ 31.829496] XFS (sda50): Ending clean mount [ 33.175003] audit: type=1130 audit(1459270691.310:78): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-fsck@dev-disk-by\x2dlabel-WD20_SL11SP4 comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 33.229142] EXT4-fs (sda27): mounting ext3 file system using the ext4 subsystem [ 33.284536] EXT4-fs (sda27): mounted filesystem with ordered data mode. Opts: acl,user_xattr [ 33.493852] audit: type=1130 audit(1459270691.630:79): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-fsck@dev-disk-by\x2dlabel-WD20_SL12DEV comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 33.704382] EXT4-fs (sda23): mounted filesystem with ordered data mode. Opts: acl,user_xattr [ 33.759545] audit: type=1130 audit(1459270691.894:80): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-fsck@dev-disk-by\x2dlabel-WD20_13.1 comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 34.081651] EXT4-fs (sda15): mounted filesystem with ordered data mode. Opts: acl,user_xattr [ 35.299909] audit: type=1130 audit(1459270693.434:81): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-fsck@dev-disk-by\x2dlabel-WD20_SL11SP2 comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 35.346232] EXT4-fs (sda25): mounting ext3 file system using the ext4 subsystem [ 35.387406] EXT4-fs (sda25): mounted filesystem with ordered data mode. Opts: acl,user_xattr [ 35.555118] audit: type=1130 audit(1459270693.690:82): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-fsck@dev-disk-by\x2dlabel-WD20_TW comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 35.759629] EXT4-fs (sda13): mounted filesystem with ordered data mode. Opts: acl,user_xattr [ 35.820003] audit: type=1130 audit(1459270693.954:83): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-fsck@dev-disk-by\x2dlabel-WD20_SL12SP1 comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 35.904108] EXT4-fs (sda33): mounted filesystem with ordered data mode. Opts: acl,user_xattr [ 36.073661] audit: type=1130 audit(1459270694.210:84): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-fsck@dev-disk-by\x2dlabel-WD20_42.1 comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 36.094748] audit: type=1130 audit(1459270694.230:85): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-fsck@dev-disk-by\x2dlabel-WD20_WORK comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 36.137135] EXT4-fs (sda17): mounted filesystem with ordered data mode. Opts: acl,user_xattr [ 36.171996] XFS (sda47): Mounting V4 Filesystem [ 36.263812] XFS (sda47): Ending clean mount [ 36.292697] audit: type=1130 audit(1459270694.426:86): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-sysctl comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 36.358176] audit: type=1130 audit(1459270694.494:87): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-tmpfiles-setup comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 36.358655] audit: type=1130 audit(1459270694.494:88): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=dracut-shutdown comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 36.383860] audit: type=1127 audit(1459270694.518:89): pid=1021 uid=0 auid=4294967295 ses=4294967295 msg=' comm="systemd-update-utmp" exe="/usr/lib/systemd/systemd-update-utmp" hostname=? addr=? terminal=? res=success' [ 36.400697] audit: type=1130 audit(1459270694.534:90): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-update-utmp comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 36.648563] audit: type=1130 audit(1459270694.782:91): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=dbus comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 36.790167] audit: type=1130 audit(1459270694.926:92): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=irqbalance comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 36.791394] audit: type=1130 audit(1459270694.926:93): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=rc-local comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 36.791743] audit: type=1130 audit(1459270694.926:94): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=nscd comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 36.838579] audit: type=1130 audit(1459270694.974:95): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=wickedd-dhcp4 comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 37.033358] No iBFT detected. [ 37.346006] IPv6: ADDRCONF(NETDEV_UP): em1: link is not ready [ 41.118914] e1000e: em1 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx [ 41.119062] IPv6: ADDRCONF(NETDEV_CHANGE): em1: link becomes ready [ 41.251972] NET: Registered protocol family 17 [ 62.289302] audit_printk_skb: 24 callbacks suppressed [ 62.289307] audit: type=1130 audit(1459270720.426:104): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=wicked comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 62.541739] audit: type=1130 audit(1459270720.678:105): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=sshd comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 62.889492] audit: type=1130 audit(1459270720.611:106): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=ntpd comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 62.919904] audit: type=1129 audit(1459270720.639:107): pid=1581 uid=0 auid=4294967295 ses=4294967295 msg='old-level=N new-level=3 comm="systemd-update-utmp" exe="/usr/lib/systemd/systemd-update-utmp" hostname=? addr=? terminal=? res=success' [ 62.920963] audit: type=1130 audit(1459270720.639:108): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-update-utmp-runlevel comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 62.920978] audit: type=1131 audit(1459270720.639:109): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=systemd-update-utmp-runlevel comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' [ 65.442222] audit: type=2404 audit(1459270723.163:110): pid=1586 uid=0 auid=4294967295 ses=4294967295 msg='op=destroy kind=server fp=c9:88:34:d0:8a:ee:cc:07:58:e9:cb:82:78:28:90:08 [MD5] direction=? spid=1586 suid=0 exe="/usr/sbin/sshd" hostname=? addr=fd00:172:16:0:38da:30c:6dd5:66f4 terminal=? res=success' [ 65.442341] audit: type=2404 audit(1459270723.163:111): pid=1586 uid=0 auid=4294967295 ses=4294967295 msg='op=destroy kind=server fp=ec:bb:cc:b7:3a:dc:74:e1:13:03:aa:2b:81:b0:8c:44 [MD5] direction=? spid=1586 suid=0 exe="/usr/sbin/sshd" hostname=? addr=fd00:172:16:0:38da:30c:6dd5:66f4 terminal=? res=success' [ 65.442596] audit: type=2404 audit(1459270723.163:112): pid=1586 uid=0 auid=4294967295 ses=4294967295 msg='op=destroy kind=server fp=bf:3e:17:14:81:29:58:f9:47:c7:95:68:cf:d4:90:bb [MD5] direction=? spid=1586 suid=0 exe="/usr/sbin/sshd" hostname=? addr=fd00:172:16:0:38da:30c:6dd5:66f4 terminal=? res=success' [ 65.442688] audit: type=2404 audit(1459270723.163:113): pid=1586 uid=0 auid=4294967295 ses=4294967295 msg='op=destroy kind=server fp=12:84:48:01:40:04:70:38:72:54:4f:8b:96:9d:b5:44 [MD5] direction=? spid=1586 suid=0 exe="/usr/sbin/sshd" hostname=? addr=fd00:172:16:0:38da:30c:6dd5:66f4 terminal=? res=success' [ 65.804435] cgroup: cgroup: disabling cgroup2 socket matching due to net_prio or net_cls activation [ 130.489414] XFS (sdb1): _xfs_buf_find: Block out of range: block 0x81ffff3f8, EOFS 0x7fffd000 [ 130.489500] ------------[ cut here ]------------ [ 130.489557] WARNING: CPU: 5 PID: 1665 at ../fs/xfs/xfs_buf.c:472 _xfs_buf_find+0x350/0x3b0 [xfs]() [ 130.489559] Modules linked in: af_packet iscsi_ibft iscsi_boot_sysfs xfs libcrc32c arc4 b43 bcma mac80211 cfg80211 rfkill ssb mmc_core pcmcia snd_hda_codec_realtek amdkfd amd_iommu_v2 radeon ttm drm_kms_helper drm fb_sys_fops syscopyarea snd_hda_codec_generic sysfillrect sysimgblt acpi_cpufreq i2c_algo_bit snd_hda_intel snd_hda_codec snd_hda_core ppdev i7core_edac hid_generic gpio_ich iTCO_wdt iTCO_vendor_support snd_hwdep snd_pcm snd_timer snd soundcore e1000e ptp parport_pc pps_core mei_me lpc_ich usbhid dell_wmi 8250_fintek mfd_core coretemp kvm_intel sparse_keymap video i2c_i801 pcspkr tpm_tis edac_core tpm shpchp parport pcmcia_core mei kvm wmi dcdbas button irqbypass crc32c_intel serio_raw sr_mod cdrom ehci_pci ata_generic ehci_hcd usbcore usb_common sg [ 130.489637] CPU: 5 PID: 1665 Comm: rm Not tainted 4.5.0-1-default #1 [ 130.489639] Hardware name: Dell Inc. OptiPlex 980 /0D441T, BIOS A16 05/28/2014 [ 130.489642] 0000000000000000 ffff880215edba30 ffffffff81395921 0000000000000000 [ 130.489647] ffffffffa098234b ffff880215edba68 ffffffff8107d912 ffff880212b15700 [ 130.489651] 0000000000000008 ffff880212b15700 ffff880215edbb58 0000000000000000 [ 130.489656] Call Trace: [ 130.489670] [] try_stack_unwind+0x175/0x190 [ 130.489681] [] dump_trace+0x69/0x3a0 [ 130.489687] [] show_trace_log_lvl+0x4b/0x60 [ 130.489693] [] show_stack_log_lvl+0x10c/0x180 [ 130.489698] [] show_stack+0x25/0x50 [ 130.489707] [] dump_stack+0x63/0x82 [ 130.489715] [] warn_slowpath_common+0x82/0xc0 [ 130.489722] [] warn_slowpath_null+0x1a/0x20 [ 130.489766] [] _xfs_buf_find+0x350/0x3b0 [xfs] [ 130.489824] [] xfs_buf_get_map+0x2a/0x2c0 [xfs] [ 130.489876] [] xfs_trans_get_buf_map+0x11a/0x1c0 [xfs] [ 130.489923] [] xfs_btree_get_bufs+0x50/0x60 [xfs] [ 130.489961] [] xfs_alloc_fix_freelist+0x20f/0x3c0 [xfs] [ 130.489999] [] xfs_free_extent+0x8d/0x110 [xfs] [ 130.490050] [] xfs_trans_free_extent+0x26/0x60 [xfs] [ 130.490096] [] xfs_bmap_finish+0x115/0x130 [xfs] [ 130.490147] [] xfs_itruncate_extents+0xef/0x240 [xfs] [ 130.490196] [] xfs_inactive_truncate+0x86/0xf0 [xfs] [ 130.490244] [] xfs_inactive+0x102/0x120 [xfs] [ 130.490294] [] xfs_fs_evict_inode+0xa5/0x110 [xfs] [ 130.490303] [] evict+0xc5/0x190 [ 130.490308] [] iput+0x1d9/0x260 [ 130.490316] [] do_unlinkat+0x184/0x2b0 [ 130.490325] [] SyS_unlinkat+0x1b/0x30 [ 130.490333] [] entry_SYSCALL_64_fastpath+0x16/0x71 [ 130.494236] DWARF2 unwinder stuck at entry_SYSCALL_64_fastpath+0x16/0x71 [ 130.494240] Leftover inexact backtrace: [ 130.494265] ---[ end trace c49eaff485dec326 ]--- [ 130.494271] XFS (sdb1): _xfs_buf_find: Block out of range: block 0x81ffff3f8, EOFS 0x7fffd000 [ 130.494350] ------------[ cut here ]------------ [ 130.494394] WARNING: CPU: 5 PID: 1665 at ../fs/xfs/xfs_buf.c:472 _xfs_buf_find+0x350/0x3b0 [xfs]() [ 130.494396] Modules linked in: af_packet iscsi_ibft iscsi_boot_sysfs xfs libcrc32c arc4 b43 bcma mac80211 cfg80211 rfkill ssb mmc_core pcmcia snd_hda_codec_realtek amdkfd amd_iommu_v2 radeon ttm drm_kms_helper drm fb_sys_fops syscopyarea snd_hda_codec_generic sysfillrect sysimgblt acpi_cpufreq i2c_algo_bit snd_hda_intel snd_hda_codec snd_hda_core ppdev i7core_edac hid_generic gpio_ich iTCO_wdt iTCO_vendor_support snd_hwdep snd_pcm snd_timer snd soundcore e1000e ptp parport_pc pps_core mei_me lpc_ich usbhid dell_wmi 8250_fintek mfd_core coretemp kvm_intel sparse_keymap video i2c_i801 pcspkr tpm_tis edac_core tpm shpchp parport pcmcia_core mei kvm wmi dcdbas button irqbypass crc32c_intel serio_raw sr_mod cdrom ehci_pci ata_generic ehci_hcd usbcore usb_common sg [ 130.494462] CPU: 5 PID: 1665 Comm: rm Tainted: G W 4.5.0-1-default #1 [ 130.494464] Hardware name: Dell Inc. OptiPlex 980 /0D441T, BIOS A16 05/28/2014 [ 130.494466] 0000000000000000 ffff880215edba30 ffffffff81395921 0000000000000000 [ 130.494470] ffffffffa098234b ffff880215edba68 ffffffff8107d912 ffff880212b15700 [ 130.494474] 0000000000000008 ffff880212b15700 ffff880215edbb58 ffff88020bf649c0 [ 130.494478] Call Trace: [ 130.494486] [] try_stack_unwind+0x175/0x190 [ 130.494495] [] dump_trace+0x69/0x3a0 [ 130.494500] [] show_trace_log_lvl+0x4b/0x60 [ 130.494506] [] show_stack_log_lvl+0x10c/0x180 [ 130.494511] [] show_stack+0x25/0x50 [ 130.494517] [] dump_stack+0x63/0x82 [ 130.494524] [] warn_slowpath_common+0x82/0xc0 [ 130.494530] [] warn_slowpath_null+0x1a/0x20 [ 130.494574] [] _xfs_buf_find+0x350/0x3b0 [xfs] [ 130.494624] [] xfs_buf_get_map+0x1db/0x2c0 [xfs] [ 130.494678] [] xfs_trans_get_buf_map+0x11a/0x1c0 [xfs] [ 130.494725] [] xfs_btree_get_bufs+0x50/0x60 [xfs] [ 130.494761] [] xfs_alloc_fix_freelist+0x20f/0x3c0 [xfs] [ 130.494799] [] xfs_free_extent+0x8d/0x110 [xfs] [ 130.494851] [] xfs_trans_free_extent+0x26/0x60 [xfs] [ 130.494896] [] xfs_bmap_finish+0x115/0x130 [xfs] [ 130.494947] [] xfs_itruncate_extents+0xef/0x240 [xfs] [ 130.494995] [] xfs_inactive_truncate+0x86/0xf0 [xfs] [ 130.495043] [] xfs_inactive+0x102/0x120 [xfs] [ 130.495093] [] xfs_fs_evict_inode+0xa5/0x110 [xfs] [ 130.495100] [] evict+0xc5/0x190 [ 130.495105] [] iput+0x1d9/0x260 [ 130.495113] [] do_unlinkat+0x184/0x2b0 [ 130.495121] [] SyS_unlinkat+0x1b/0x30 [ 130.495126] [] entry_SYSCALL_64_fastpath+0x16/0x71 [ 130.498992] DWARF2 unwinder stuck at entry_SYSCALL_64_fastpath+0x16/0x71 [ 130.498995] Leftover inexact backtrace: [ 130.499026] ---[ end trace c49eaff485dec327 ]--- [ 130.499037] BUG: unable to handle kernel NULL pointer dereference at 00000000000000f8 [ 130.499109] IP: [] xfs_trans_binval+0x16/0x120 [xfs] [ 130.499171] PGD 0 [ 130.499188] Oops: 0000 [#1] PREEMPT SMP [ 130.499228] Modules linked in: af_packet iscsi_ibft iscsi_boot_sysfs xfs libcrc32c arc4 b43 bcma mac80211 cfg80211 rfkill ssb mmc_core pcmcia snd_hda_codec_realtek amdkfd amd_iommu_v2 radeon ttm drm_kms_helper drm fb_sys_fops syscopyarea snd_hda_codec_generic sysfillrect sysimgblt acpi_cpufreq i2c_algo_bit snd_hda_intel snd_hda_codec snd_hda_core ppdev i7core_edac hid_generic gpio_ich iTCO_wdt iTCO_vendor_support snd_hwdep snd_pcm snd_timer snd soundcore e1000e ptp parport_pc pps_core mei_me lpc_ich usbhid dell_wmi 8250_fintek mfd_core coretemp kvm_intel sparse_keymap video i2c_i801 pcspkr tpm_tis edac_core tpm shpchp parport pcmcia_core mei kvm wmi dcdbas button irqbypass crc32c_intel serio_raw sr_mod cdrom ehci_pci ata_generic ehci_hcd usbcore usb_common sg [ 130.499902] CPU: 5 PID: 1665 Comm: rm Tainted: G W 4.5.0-1-default #1 [ 130.499940] Hardware name: Dell Inc. OptiPlex 980 /0D441T, BIOS A16 05/28/2014 [ 130.499981] task: ffff8800d37fe340 ti: ffff880215ed8000 task.ti: ffff880215ed8000 [ 130.500018] RIP: 0010:[] [] xfs_trans_binval+0x16/0x120 [xfs] [ 130.500090] RSP: 0018:ffff880215edbb48 EFLAGS: 00010292 [ 130.500118] RAX: 0000000000000000 RBX: ffff880215edbc50 RCX: 0000000000000003 [ 130.500153] RDX: 0000000000000002 RSI: 0000000000000000 RDI: ffff8800376c8880 [ 130.500187] RBP: ffff880215edbb68 R08: 0000000000000002 R09: 0000000000000282 [ 130.500222] R10: 000000000000000f R11: 00000000000003f5 R12: ffff8800376c8880 [ 130.500257] R13: 0000000000000005 R14: 0000000000000000 R15: ffff880215ee8000 [ 130.500292] FS: 00007f13ed4cc700(0000) GS:ffff88021fd40000(0000) knlGS:0000000000000000 [ 130.500332] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b [ 130.500361] CR2: 00000000000000f8 CR3: 000000020c2eb000 CR4: 00000000000006e0 [ 130.500395] Stack: [ 130.500408] ffff880215edbc50 ffff8800376c8880 0000000000000005 ffff88021fe997c0 [ 130.500460] ffff880215edbc40 ffffffffa090284a ffff8802123cd240 0000000200000000 [ 130.500512] ffffffff376c8850 ffff8802123cd240 0000000000000000 0000000000000000 [ 130.500564] Call Trace: [ 130.500600] [] xfs_alloc_fix_freelist+0x21a/0x3c0 [xfs] [ 130.500655] [] xfs_free_extent+0x8d/0x110 [xfs] [ 130.500713] [] xfs_trans_free_extent+0x26/0x60 [xfs] [ 130.500769] [] xfs_bmap_finish+0x115/0x130 [xfs] [ 130.500827] [] xfs_itruncate_extents+0xef/0x240 [xfs] [ 130.500886] [] xfs_inactive_truncate+0x86/0xf0 [xfs] [ 130.500944] [] xfs_inactive+0x102/0x120 [xfs] [ 130.501000] [] xfs_fs_evict_inode+0xa5/0x110 [xfs] [ 130.501035] [] evict+0xc5/0x190 [ 130.501062] [] iput+0x1d9/0x260 [ 130.501090] [] do_unlinkat+0x184/0x2b0 [ 130.501121] [] SyS_unlinkat+0x1b/0x30 [ 130.501150] [] entry_SYSCALL_64_fastpath+0x16/0x71 [ 130.503229] DWARF2 unwinder stuck at entry_SYSCALL_64_fastpath+0x16/0x71 [ 130.503274] Leftover inexact backtrace: [ 130.503302] Code: 5f 74 05 e9 52 ff ff ff e8 5c 25 69 e0 e9 48 ff ff ff 0f 1f 00 66 66 66 66 90 55 48 89 e5 41 56 41 55 49 89 f6 41 54 49 89 fc 53 <4c> 8b ae f8 00 00 00 66 66 66 66 90 41 f6 45 78 04 74 5a 5b 41 [ 130.503738] RIP [] xfs_trans_binval+0x16/0x120 [xfs] [ 130.503800] RSP [ 130.503819] CR2: 00000000000000f8 [ 130.503844] ---[ end trace c49eaff485dec328 ]--- --azLHFNyN32YCQGCU-- From olaf@aepfle.de Tue Mar 29 12:34:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 F3A327CA7 for ; Tue, 29 Mar 2016 12:34:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id BE7798F8035 for ; Tue, 29 Mar 2016 10:34:23 -0700 (PDT) X-ASG-Debug-ID: 1459272860-04cb6c245f1077f0001-NocioJ Received: from mo4-p00-ob.smtp.rzone.de (mo4-p00-ob.smtp.rzone.de [81.169.146.160]) by cuda.sgi.com with ESMTP id uxrOQQVhKG7CBdy5 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 29 Mar 2016 10:34:21 -0700 (PDT) X-Barracuda-Envelope-From: olaf@aepfle.de X-Barracuda-Apparent-Source-IP: 81.169.146.160 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; t=1459272859; l=1609; s=domk; d=aepfle.de; h=In-Reply-To:Content-Disposition:Content-Type:MIME-Version: References:Subject:To:From:Date; bh=/DU4rZaLzk+9716q7WON63U9SFHvDre3aRdbLvj0Jpc=; b=LCNg5MTlFhC3kW3tu7XwBprcdBS1OoNnmr1gTOsYA/aEZ7i0awnSYIk+td7TgiykQvA ctByVHpn15WC4S9etPrk2hMqpYtD7V9I95Zw9jmZEHoeEV2JNvuPskbWj+PO9Uqq1cKhv JLH8hkXJsXkAA2u7U2WEk9/IQIQ6P2JT6LI= X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+yackYocTD1iAi8x+OWtqWFmrC5F/k8z92rfvkQ== X-RZG-CLASS-ID: mo00 Received: from probook (aftr-185-17-206-254.dynamic.mnet-online.de [185.17.206.254]) by smtp.strato.de (RZmta 37.22 DYNA|AUTH) with ESMTPSA id 602a6as2THYJtXP (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (curve secp521r1 with 521 ECDH bits, eq. 15360 bits RSA)) (Client did not present a certificate) for ; Tue, 29 Mar 2016 19:34:19 +0200 (CEST) Received: by probook (Postfix, from userid 1000) id 83542508B4; Tue, 29 Mar 2016 19:34:19 +0200 (CEST) Date: Tue, 29 Mar 2016 19:34:19 +0200 From: Olaf Hering To: xfs@oss.sgi.com Subject: Re: BUG in xfs_trans_binval Message-ID: <20160329173419.GA18970@aepfle.de> X-ASG-Orig-Subj: Re: BUG in xfs_trans_binval References: <20160329171553.GA17885@aepfle.de> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20160329171553.GA17885@aepfle.de> User-Agent: Mutt/1.5.24 (6598) X-Barracuda-Connect: mo4-p00-ob.smtp.rzone.de[81.169.146.160] X-Barracuda-Start-Time: 1459272860 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28271 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Mar 29, Olaf Hering wrote: > "_xfs_buf_find: Block out of range: block 0x81ffff3f8, EOFS 0x7fffd000" root@optiplex:~ # env -i /sbin/xfs_repair -n /dev/disk/by-label/WD15_optiplx Phase 1 - find and verify superblock... Phase 2 - using internal log - zero log... - scan filesystem freespace and inode maps... agi unlinked bucket 0 is 40829376 in ag 1 (inode=577700288) sb_icount 3932864, counted 4365696 sb_ifree 3488, counted 96 sb_fdblocks 55910963, counted 53073251 - found root inode chunk Phase 3 - for each AG... - scan (but don't clear) agi unlinked lists... - process known inodes and perform inode discovery... - agno = 0 - agno = 1 - agno = 2 - agno = 3 entry contains illegal value in attribute named SGI_ACL_FILE or SGI_ACL_DEFAULT bad security value for attribute entry 0 in attr block 0, inode 1710299980 problem with attribute contents in inode 1710299980 would clear attr fork bad nblocks 2 for inode 1710299980, would reset to 1 bad anextents 1 for inode 1710299980, would reset to 0 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno = 0 - agno = 1 - agno = 2 - agno = 3 No modify flag set, skipping phase 5 Phase 6 - check inode connectivity... - traversing filesystem ... - traversal finished ... - moving disconnected inodes to lost+found ... disconnected inode 577700288, would move to lost+found Phase 7 - verify link counts... No modify flag set, skipping filesystem flush and exiting. Olaf From victoriaangelinaus@gmail.com Tue Mar 29 13:24:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_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 8958A7CB1 for ; Tue, 29 Mar 2016 13:24:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4CE67304059 for ; Tue, 29 Mar 2016 11:24:13 -0700 (PDT) X-ASG-Debug-ID: 1459275850-04cbb07ad810a230001-NocioJ Received: from mail-pa0-f65.google.com (mail-pa0-f65.google.com [209.85.220.65]) by cuda.sgi.com with ESMTP id FnREK0MMgaVEsJnb (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 29 Mar 2016 11:24:10 -0700 (PDT) X-Barracuda-Envelope-From: victoriaangelinaus@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.65 Received: by mail-pa0-f65.google.com with SMTP id q6so3432099pav.0 for ; Tue, 29 Mar 2016 11:24:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:subject:date:message-id:reply-to:user-agent:mime-version; bh=PyH6DkmmNHw8zvdUt/+bGjl4ONIsdfmhPNccFILMsmE=; b=kTcnHLBehRt1yeWYhG59Pepa0K0iZ2ONlFbSeqyozbfnk7PJkBVmV6YWwCQmbANNqj VD+SPBsd4txx/4MlxiHlu4Q9viGJEsa5rQxpRarceNFgpZKpPhEHzDLF+BKCehyxcC7n Mshw87TEqs7t+C4RmnHBMMOAmHz2WnBX1wirC2kRCS2rquSHqehOyPMzls3w/x4lvvC1 +k3W0S8v6uCsYj7xHMNRev0ekG59ywlrL2WQMCqAxLKmEYgXv79Jk2UXZuUqmOLd9Qyu WS0oqYfIc00dMVJYagsjY4Hcg4GtEf00OnVooetgU8cFn63oV7fbMp4YYXVMgxK0n4Vq JFRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id:reply-to :user-agent:mime-version; bh=PyH6DkmmNHw8zvdUt/+bGjl4ONIsdfmhPNccFILMsmE=; b=Ue5YMb3btSJtXWWevteMCEPgaBemPYS3ucAICksFG94xnONxw0FW49tjafuAxtnFrV iMGZIAgoEwcDJqi0GajPHRdmAYqwk7/XKwKnIsghsxORPz96hBOtizQxxNseFlVcGe7U qKBA0goitr2cm7smicDMrMiNZT/yMYzNi5y+PhHNMKtgOxD4x7HtqfN0GjBKYINIVHcy uSk0m3TrD1FEn0knLSgIIrkIp5thS/K1lda4LcFhZVdErsj14KWc89lMAEpFUEEaXTv+ UxzbmC2RbPXuf0LyIM4Y3sMTLhQeitH2B0sl3avL7ZI0G7wun86qzxRmlV1hBYkVEAn8 jKkg== X-Gm-Message-State: AD7BkJLR5EqHiphcu9OWHLefV9nL38HCZHNkoKMt4hilB/dbNXYIaTh9IDMdWbqP25M7YQ== X-Received: by 10.66.100.196 with SMTP id fa4mr5739176pab.37.1459275849915; Tue, 29 Mar 2016 11:24:09 -0700 (PDT) Received: from [192.168.2.110] ([106.51.30.83]) by smtp.gmail.com with ESMTPSA id ud5sm36638424pac.11.2016.03.29.11.24.08 for (version=TLS1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 29 Mar 2016 11:24:09 -0700 (PDT) From: victoria To: xfs@oss.sgi.com Subject: Red Hat Customer DB Date: Tue, 29 Mar 2016 18:21:52 +0000 X-ASG-Orig-Subj: Red Hat Customer DB Message-Id: Reply-To: victoria User-Agent: eM_Client/6.0.24928.0 Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="------=_MB4103608A-7FEC-4D95-A70E-BB8648BF81EF" X-Barracuda-Connect: mail-pa0-f65.google.com[209.85.220.65] X-Barracuda-Start-Time: 1459275850 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28274 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 --------=_MB4103608A-7FEC-4D95-A70E-BB8648BF81EF Content-Type: text/plain; format=flowed; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi, Would you be interested in Red Hat users email list for your email=20 campaigns? We provide the Database across North America, EMEA, APAC and=20 Latin America. We also have other technology users like Cisco, HP Networking, IBM,=20 Brocade, Fortinet, Aruba Networks, EMC, Avaya, Hitachi, Netgear, Netapp=20 and many more=E2=80=A6 IT contacts: IT Security Head, Network and Systems Administrator,=20 Information Technology & Network Consultant, Security Specialist, Data=20 Center Support Specialist, Chief Technology Officer, Chief Information=20 Officer, Computer and Information Systems Manager, Director of IT,=20 Network Engineer, Senior Applications Engineer, Database Administrator,=20 Network Architect, Infrastructure Architect, Director of IT=20 Infrastructure etc. Information Fields =E2=80=93 Name, Title, Email, Phone Numbers, Company = Name,=20 and Company Details like, Physical Address, Web Address, Revenue Size,=20 Employee Size and industry. Please review and let me know what technology users you are interested=20 in and I will get back to you with more information for the same. Thanks, Victoria Specialist To Opt Out, please respond =E2=80=9CLeave Out= =E2=80=9D in=20 the Subject line. --------=_MB4103608A-7FEC-4D95-A70E-BB8648BF81EF Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: quoted-printable

<= SPAN style=3D"FONT-FAMILY: 'Arial',sans-serif; COLOR: #1f4e79; FONT-SIZE:= 10pt; mso-fareast-font-family: 'Times New Roman'">Hi,

 

Would you be interested in&nb= sp;Red Hat users email list for your email campaigns?= We provide the Database across North America, EMEA, APAC and Latin America= .

 

We also have other technology= users like Cisco, HP Networking, IBM, Brocade, Fortinet, Aruba = Networks, EMC, Avaya, Hitachi, Netgear, Netapp and many more=E2= =80=A6<= /SPAN>

 

<= SPAN style=3D"FONT-FAMILY: 'Arial',sans-serif; COLOR: #1f4e79; FONT-SIZE:= 10pt; mso-fareast-font-family: 'Times New Roman'">IT contacts: IT Security Head,= Network and Systems Administrator, Information Technology & Network= Consultant, Security Specialist, Data Center Support Specialist, Chief = Technology Officer, Chief Information Officer, Computer and Information = Systems Manager, Director of IT, Network Engineer, Senior Applications Engi= neer, Database Administrator, Network Architect, Infrastructure Architect,= Director of IT Infrastructure etc.

 

<= SPAN style=3D"FONT-FAMILY: 'Arial',sans-serif; COLOR: #1f4e79; FONT-SIZE:= 10pt; mso-fareast-font-family: 'Times New Roman'">Information Fields =E2=80=93 Name= , Title, Email, Phone Numbers, Company Name, and Company Details like, Phys= ical Address, Web Address, Revenue Size, Employee Size and industry.=

 

Please review and let me know= what technology users you are interested in and I will get back to you = with more information for the same.

 

Thanks,

<= SPAN style=3D"FONT-FAMILY: 'Arial',sans-serif; COLOR: #1f4e79; FONT-SIZE:= 10pt; mso-fareast-font-family: 'Times New Roman'">Victoria

Specialist

           &nb= sp;            =  

           &nb= sp;            =     To Opt Out, please respond =E2=80=9CLeave Out=E2= =80=9D in the Subject line.

 

 

 

 

--------=_MB4103608A-7FEC-4D95-A70E-BB8648BF81EF-- From vishal.l.verma@intel.com Tue Mar 29 13:57:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 456447CA4 for ; Tue, 29 Mar 2016 13:57:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0410F304062 for ; Tue, 29 Mar 2016 11:57:21 -0700 (PDT) X-ASG-Debug-ID: 1459277840-04bdf01104bbef0001-NocioJ Received: from mga04.intel.com ([192.55.52.120]) by cuda.sgi.com with ESMTP id skN4frLI7uuKEcZQ for ; Tue, 29 Mar 2016 11:57:21 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.120 X-ASG-Whitelist: Client Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga104.fm.intel.com with ESMTP; 29 Mar 2016 11:57:20 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,412,1455004800"; d="scan'208";a="934145623" Received: from fmsmsx107.amr.corp.intel.com ([10.18.124.205]) by fmsmga001.fm.intel.com with ESMTP; 29 Mar 2016 11:57:20 -0700 Received: from fmsmsx113.amr.corp.intel.com ([169.254.13.211]) by fmsmsx107.amr.corp.intel.com ([169.254.6.237]) with mapi id 14.03.0248.002; Tue, 29 Mar 2016 11:57:17 -0700 From: "Verma, Vishal L" To: "Williams, Dan J" CC: "linux-block@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "axboe@fb.com" , "akpm@linux-foundation.org" , "linux-nvdimm@lists.01.org" , "linux-fsdevel@vger.kernel.org" , "ross.zwisler@linux.intel.com" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" , "david@fromorbit.com" , "jack@suse.cz" Subject: Re: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors Thread-Topic: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors X-ASG-Orig-Subj: Re: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors Thread-Index: AQHRhiNvKoQhiC/aYEiTGtqXM3Dgv59q9p4AgAAl9ACAAATbgIAEoN8AgAA7dACAAUTogA== Date: Tue, 29 Mar 2016 18:57:16 +0000 Message-ID: <1459277829.6412.3.camel@intel.com> References: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> <1458861450-17705-5-git-send-email-vishal.l.verma@intel.com> <1458939796.5501.8.camel@intel.com> <1459195288.15523.3.camel@intel.com> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.232.112.171] Content-Type: text/plain; charset="utf-8" Content-ID: <64C5EAC5F614C94A96594C71EC7AFD03@intel.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-Barracuda-Connect: UNKNOWN[192.55.52.120] X-Barracuda-Start-Time: 1459277841 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 T24gTW9uLCAyMDE2LTAzLTI4IGF0IDE2OjM0IC0wNzAwLCBEYW4gV2lsbGlhbXMgd3JvdGU6DQoN Cjw+DQoNCj4gU2VlbXMga2luZCBvZiBzYWQgdG8gZmFpbCB0aGUgZmF1bHQgZHVlIHRvIGEgYmFk IGJsb2NrIHdoZW4gd2Ugd2VyZQ0KPiBnb2luZyB0byB6ZXJvIGl0IGFueXdheSwgcmlnaHQ/wqDC oEknbSBub3Qgc2VlaW5nIGEgY29tcGVsbGluZyByZWFzb24gdG8NCj4ga2VlcCBhbnkgemVyb2lu ZyBpbiBmcy9kYXguYy4NCg0KQWdyZWVkIC0gYnV0IGhvdyBkbyB3ZSBkbyB0aGlzPyBjbGVhcl9w bWVtIG5lZWRzIHRvIGJlIGFibGUgdG8gY2xlYXIgYW4NCmFyYml0cmFyeSBudW1iZXIgb2YgYnl0 ZXMsIGJ1dCB0byBnbyB0aHJvdWdoIHRoZSBkcml2ZXIsIHdlJ2QgbmVlZCB0bw0Kc2VuZCBkb3du IGEgYmlvPyBJZiBvbmx5IHRoZSBkcml2ZXIgaGFkIGFuIHJ3X2J5dGVzIGxpa2UgaW50ZXJmYWNl IHRoYXQNCmNvdWxkIGJlIHVzZWQgYnkgYW55b25lLi4uIDop From sandeen@redhat.com Tue Mar 29 14:28:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2821D7CA0 for ; Tue, 29 Mar 2016 14:28:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id CD582304062 for ; Tue, 29 Mar 2016 12:28:30 -0700 (PDT) X-ASG-Debug-ID: 1459279709-04bdf01102be770001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 4rGwkFNFd7CZrEXq (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 29 Mar 2016 12:28:30 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 9D43746201 for ; Tue, 29 Mar 2016 19:28:29 +0000 (UTC) Received: from Liberator.local (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2TJSR6W015119 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 29 Mar 2016 15:28:29 -0400 To: xfs-oss From: Eric Sandeen Subject: [PATCH] xfs: disallow rw remount on fs with unknown ro-compat features Message-ID: <56FAD75C.80502@redhat.com> X-ASG-Orig-Subj: [PATCH] xfs: disallow rw remount on fs with unknown ro-compat features Date: Tue, 29 Mar 2016 14:28:28 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.0 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1459279709 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Today, a kernel which refuses to mount a filesystem read-write due to unknown ro-compat features can still transition to read-write via the remount path. The old kernel is most likely none the wiser, because it's unaware of the new feature, and isn't using it. However, writing to the filesystem may well corrupt metadata related to that new feature, and moving to a newer kernel which understand the feature will have problems. Right now the only ro-compat feature we have is the free inode btree, which showed up in v3.16. It would be good to push this back to all the active stable kernels, I think, so that if anyone is using newer mkfs (which enables the finobt feature) with older kernel releases, they'll be protected. Signed-off-by: Eric Sandeen Cc: stable@vger.kernel.org --- diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index d760934..ca058a1 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1276,6 +1276,16 @@ xfs_fs_remount( return -EINVAL; } + if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 && + xfs_sb_has_ro_compat_feature(sbp, + XFS_SB_FEAT_RO_COMPAT_UNKNOWN)) { + xfs_warn(mp, +"ro->rw transition prohibited on unknown (0x%x) ro-compat filesystem", + (sbp->sb_features_ro_compat & + XFS_SB_FEAT_RO_COMPAT_UNKNOWN)); + return -EINVAL; + } + mp->m_flags &= ~XFS_MOUNT_RDONLY; /* From dan.j.williams@intel.com Tue Mar 29 14:38:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 306C97CA1 for ; Tue, 29 Mar 2016 14:38:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id CA4F2304053 for ; Tue, 29 Mar 2016 12:38:43 -0700 (PDT) X-ASG-Debug-ID: 1459280321-04bdf01102bf5d0001-NocioJ Received: from mail-ob0-f169.google.com (mail-ob0-f169.google.com [209.85.214.169]) by cuda.sgi.com with ESMTP id CrFjg0ANZCZ8EIqR (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 29 Mar 2016 12:38:41 -0700 (PDT) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Apparent-Source-IP: 209.85.214.169 Received: by mail-ob0-f169.google.com with SMTP id kf9so23816189obc.1 for ; Tue, 29 Mar 2016 12:38:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=z0Ms0gCgscjwqSPLnLMQY7Kz25oxG922XLyjvVHio/U=; b=w+A5V/7RyCk7rz9zKFIOi8GKuULeIxiIa4gGOYR1Y4WDCsENtgx0Ze1p0V627CmjUt MoTq/rvf6Z0RaL2kjkkticVzNs8+3zgqxjAvDZWmMj6RBxp/I9Fadgq6k6Vc+wX+LV8y YYd/a24EOABwUH4XtRMQfC1+lSMYW+C4/KAnqKPGdcX0ghitI1dJNrCS8aQiGgwou1+N aKNLL4QHk7axmOkxSDmtgCxrEpxTkl3UpUkWEPcDG3djGpvfpRWkE9FItXKZ74A5Ss8/ pBvEYCrT9bLxmYucIhEAbogoVspXH3K/ljQ0umDyrgBcn7ep6uEdCyn5/yKMi3Kil+NL WygA== 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; bh=z0Ms0gCgscjwqSPLnLMQY7Kz25oxG922XLyjvVHio/U=; b=AhQYtIh9ms8qCOsJjpMW6xixn2RVdtmNrWpFlj6qKxxxM+tLjc5aJMXUiSCUoAwIQ8 4lUaWsKdN7HYGBYyGC+OdABn+95tUr6E0xJeRS98lR7KvBpvlzAVP6SCAEMww25822wH Ohm4WMwQ88B8OA0Ll+pbz/pEYWBpHJg8yV0u5FlfGpYjyiAZMnkl1OpKzbwCMrp/hHE9 zBumwW2VptlOmxVJqPe93gGcSOsxf4yZDxtfvMFAi1rQ3JALGorpLYFy+OBK5s3IaCN4 eumQyBmWTlmuL2Suj/prS1S8Bnj+u7hjei6e9pNRsGQqw5v2XputcJNNkDWhH8zZjOgO H9DA== X-Gm-Message-State: AD7BkJKL9o3iFvW9S6VDJq1o+Tt4shvcbjUszVzzQ2ufZ6I5NTYDzJ/Z0hyNTbVly2SspfdkmWaJzD1SOf5DO9Di MIME-Version: 1.0 X-Received: by 10.60.15.165 with SMTP id y5mr2368196oec.52.1459280234957; Tue, 29 Mar 2016 12:37:14 -0700 (PDT) Received: by 10.157.62.230 with HTTP; Tue, 29 Mar 2016 12:37:14 -0700 (PDT) In-Reply-To: <1459277829.6412.3.camel@intel.com> References: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> <1458861450-17705-5-git-send-email-vishal.l.verma@intel.com> <1458939796.5501.8.camel@intel.com> <1459195288.15523.3.camel@intel.com> <1459277829.6412.3.camel@intel.com> Date: Tue, 29 Mar 2016 12:37:14 -0700 Message-ID: Subject: Re: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors From: Dan Williams X-ASG-Orig-Subj: Re: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors To: "Verma, Vishal L" Cc: "linux-block@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "axboe@fb.com" , "akpm@linux-foundation.org" , "linux-nvdimm@lists.01.org" , "linux-fsdevel@vger.kernel.org" , "ross.zwisler@linux.intel.com" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" , "david@fromorbit.com" , "jack@suse.cz" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ob0-f169.google.com[209.85.214.169] X-Barracuda-Start-Time: 1459280321 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/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, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28276 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain On Tue, Mar 29, 2016 at 11:57 AM, Verma, Vishal L wrote: > On Mon, 2016-03-28 at 16:34 -0700, Dan Williams wrote: > > <> > >> Seems kind of sad to fail the fault due to a bad block when we were >> going to zero it anyway, right? I'm not seeing a compelling reason to >> keep any zeroing in fs/dax.c. > > Agreed - but how do we do this? clear_pmem needs to be able to clear an > arbitrary number of bytes, but to go through the driver, we'd need to > send down a bio? If only the driver had an rw_bytes like interface that > could be used by anyone... :) I think we're ok because clear_pmem() will always happen on PAGE_SIZE, or HPAGE_SIZE boundaries. From admin211@z211.najnx.com Tue Mar 29 14:49:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 F1B727CA1 for ; Tue, 29 Mar 2016 14:49:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C27CA304059 for ; Tue, 29 Mar 2016 12:49:23 -0700 (PDT) X-ASG-Debug-ID: 1459280955-04cbb07ad810e620001-NocioJ Received: from z211.najnx.com (z211.najnx.com [161.123.213.211]) by cuda.sgi.com with ESMTP id a6Fo3epLA9lpu5qB for ; Tue, 29 Mar 2016 12:49:16 -0700 (PDT) X-Barracuda-Envelope-From: admin211@z211.najnx.com X-Barracuda-Apparent-Source-IP: 161.123.213.211 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=najnx; d=z211.najnx.com; h=Date:From:To:Subject:Message-ID:Mime-Version:Content-Type; i=admin211@z211.najnx.com; bh=JSRr7KvNa6J8xZn44OuZ2/j12vM=; b=IPwNNr5Cw/B7eXbu+4w5N9uLkHsbdGqACoMHn6kwS4CmJI+kdgq3uF+rKXj+1Di4ndODWcPX3m7Z bYGcKN3/zDRn8M3UO4BkKU9zJ1XNY9fZHzWtcvNILGRQK/P91eDxleF8eHkjYaF1JEYuG7c/4tZl sfrHidw7/oMZwnAKnqg= DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=najnx; d=z211.najnx.com; b=qZsYsBW5DSe7sVyzMAQ3nAfI/UVCb1XCR6X9jUMcsqbDxRKVtelV57Icv6tJVQKoiBcUJmpq2xF6 PlTwhIZl5w/ivP1Bc8AKu0Rcf9x0Zy60CnpS7zEcND6gD2kw3mqehBOLhz+MJ5Qq6vlS0UVIqz30 09V1r0gx9yTI7sUIgfM=; Date: Wed, 30 Mar 2016 03:49:36 +0800 From: "Rayban" To: Subject: Your special offer from Factory Direct Sale Message-ID: <20160330034947182565@z211.najnx.com> X-ASG-Orig-Subj: Your special offer from Factory Direct Sale X-mailer: Foxmail 6, 13, 102, 15 [cn] Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="=====003_Dragon624826683231_=====" X-Barracuda-Connect: z211.najnx.com[161.123.213.211] X-Barracuda-Start-Time: 1459280955 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.40 X-Barracuda-Spam-Status: No, SCORE=2.40 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA100a, BSF_SC2_TG119a, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28276 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.40 BSF_SC0_SA100a Custom Rule SA100a -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_SC2_TG119a Custom Rule TG119a This is a multi-part message in MIME format. --=====003_Dragon624826683231_===== Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 DQoNCllvdSdyZSByZWNlaXZpbmcgdGhpcyBuZXdzbGV0dGVyIGJlY2F1c2UgeW91IHN1YnNjcmli ZWQgZnJvbSBvdXIgd2Vic2l0ZS4NCkhhdmluZyB0cm91YmxlIHJlYWRpbmcgdGhpcyBlbWFpbD8g VmlldyBpdCBpbiB5b3VyIGJyb3dzZXIuIE5vdCBpbnRlcmVzdGVkIGFueW1vcmU/IFVuc3Vic2Ny aWJlIGluc3RhbnRseS4gDQoNCiAgRlJFRSBTSElQUElORyAqICBGcmVlIFJldHVybiAqIA0KDQoN CkJlc3QgU2VsbGVycyBDb2xsZWN0aW9ucyBKdWxpZXQgT3ZhbCBGcmFtZSBUeXBlcyBDb21taXQg U3EgRmFzdCBKYWNrZXQgTmV3IEFycml2YWxzIA0KDQpEaXNjb3VudCBSYXkgQmFuIFN1bmdsYXNz ZXMgDQpXZWxjb21lIHRvIG15IHN1bmdsYXNzZXMgc3RvcmUgDQo4MCANCg0KRVZFUllUSElORyAN CiVPRkYgDQoNClBMVVMgJDgwRlJFRSBTSElQSU5HIE9OIEFMTE9SREVSUyANCk9ha2xleSBTdW5n bGFzcyANClJheSBCYW4gU3VuZ2xhc3MgDQoNCg0KDQoNClByaXZhY3kgUG9saWN5IFNoaXBwaW5n IFJldHVybnMgQ29uZGl0aW9ucyBvZiBVc2UgDQoNCg0KDQpUbyBiZSBzdXJlIHRoYXQgeW91IHdp bGwgcmVjZWl2ZSBvdXIgb2ZmZXJzLCB3ZSBzdWdnZXN0IHRoYXQgeW91IGFkZCBvdXIgZW1haWwg YWRkcmVzcywgY3VzdG9tZXJzZXJ2aWNlMjRob3VyQGhvdG1haWwuY29tIHRvIHlvdXIgYWRkcmVz cyBib29rLiBJbiBhY2NvcmRhbmNlIHdpdGggdGhlIEZyZW5jaCBsYXcgb2YgSmFudWFyeSA2LCAx OTc4LCBjb3JyZWN0IGFueSBpbmZvcm1hdGlvbiBoZWxkIGJ5IDIwMTVzdW5nbGFzc3ZpcC5jb20g dGhhdCBjb25jZXJucyB5b3UuIA0KDQpPdXIgcHJvbWlzZXM6DQoNCi0gMTAwIGRheXMgdG8gcmV0 dXJuIG9yIGV4Y2hhbmdlIGFuIGl0ZW0NCi0gU2FtZS1kYXkgZGlzcGF0Y2ggZm9yIG9yZGVycyBw bGFjZWQgYmVmb3JlIDcgRGF5cy4qDQotIEN1c3RvbWVyIHNhdGlzZmFjdGlvbiBpcyBvdXIgdG9w IHByaW9yaXR5IA0KDQpidXlpbmcgYSBnaWZ0LCBvciBsb29raW5nIGZvciBhIHByYWN0aWNhbCBw YWlyIG9mIHN1bmdsYXNzZXMsIHlvdSdyZSBzdXJlIHRvIGZpbmQgd2hhdCB5b3UncmUgYWZ0ZXIg aW4gUkIgb25saW5lIHN0b3JlIGh1Z2Ugc2VsZWN0aW9uLiB0b3AgZmFzaGlvbiBzZWxlY3Rpb24u IFdoZXRoZXIgeW91J3JlIGxvb2tpbmcgZm9yIHRoZSBsYXRlc3QgdHJlbmRzIG9yIHRpbWVsZXNz IGNsYXNzaWNzLCAyMDE1c3VuZ2xhc3N2aXAgb2ZmZXJzIGh1bmRyZWRzIG9mIGVzdGFibGlzaGVk IHByb2R1Y3QgbGlrZSBzdW5nbGFzc2VzIGp1c3QgZm9yIHlvdS4gDQoNCipUd2VudHktZm91ciBo b3VycyBhIGRheSwgZGVwZW5kZW50IHVwb24gcGF5bWVudCB2YWxpZGF0aW9uDQoqU2VlIHRlcm1z IGFuZCBjb25kaXRpb25zIA0KDQoNCkNvcHlyaWdodCAyMDA5LTIwMTUgUmF5IEJhbiBTdW5nbGFz c2VzIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIA== --=====003_Dragon624826683231_===== Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVu dD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCjxTVFlMRSB0eXBlPXRleHQvY3NzPg0KCQkJ CQk8L1NUWUxFPg0KDQo8TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4zNzkwLjM5NTkiIG5hbWU9 R0VORVJBVE9SPjwvSEVBRD4NCjxCT0RZPg0KPFRBQkxFIGNsYXNzPWtlLXplcm9ib3JkZXIgY2Vs bFNwYWNpbmc9MCBjZWxsUGFkZGluZz0wIHdpZHRoPSIxMDAlIiBhbGlnbj1jZW50ZXIgDQpib3Jk ZXI9MD4NCiAgPFRCT0RZPg0KICA8VFI+DQogICAgPFREIGhlaWdodD0yNT48QlI+PC9URD48L1RS Pg0KICA8VFI+DQogICAgPFREIHZBbGlnbj10b3AgYWxpZ249bWlkZGxlPg0KICAgICAgPFRBQkxF IGNsYXNzPWtlLXplcm9ib3JkZXIgDQogICAgICBzdHlsZT0iQk9SREVSLVJJR0hUOiAjYmJiYmJi IDBweCBzb2xpZDsgQk9SREVSLVRPUDogI2JiYmJiYiAwcHggc29saWQ7IEJBQ0tHUk9VTkQ6ICNm ZmZmZmY7IEJPUkRFUi1MRUZUOiAjYmJiYmJiIDBweCBzb2xpZDsgQk9SREVSLUJPVFRPTTogI2Ji YmJiYiAwcHggc29saWQ7IEZPTlQtRkFNSUxZOiBBcmlhbCIgDQogICAgICBjZWxsU3BhY2luZz0w IGNlbGxQYWRkaW5nPTAgd2lkdGg9NjQ1IGJvcmRlcj0wPg0KICAgICAgICA8VEJPRFk+DQogICAg ICAgIDxUUj4NCiAgICAgICAgICA8VEQ+DQogICAgICAgICAgICA8VEFCTEUgY2xhc3M9a2UtemVy b2JvcmRlciBjZWxsU3BhY2luZz0wIGNlbGxQYWRkaW5nPTAgd2lkdGg9IjEwMCUiIA0KICAgICAg ICAgICAgYm9yZGVyPTA+DQogICAgICAgICAgICAgIDxUQk9EWT4NCiAgICAgICAgICAgICAgPFRS Pg0KICAgICAgICAgICAgICAgIDxURCANCiAgICAgICAgICAgICAgICBzdHlsZT0iUEFERElORy1S SUdIVDogMHB4OyBQQURESU5HLUxFRlQ6IDBweDsgUEFERElORy1CT1RUT006IDEwcHg7IFBBRERJ TkctVE9QOiAwcHg7IEJPUkRFUi1CT1RUT006ICNlMGUwZTAgMXB4IHNvbGlkIiANCiAgICAgICAg ICAgICAgICBhbGlnbj1taWRkbGU+DQogICAgICAgICAgICAgICAgICA8VEFCTEUgY2xhc3M9a2Ut emVyb2JvcmRlciBjZWxsU3BhY2luZz0wIGNlbGxQYWRkaW5nPTAgDQogICAgICAgICAgICAgICAg ICB3aWR0aD02NDUgYm9yZGVyPTA+DQogICAgICAgICAgICAgICAgICAgIDxUQk9EWT4NCiAgICAg ICAgICAgICAgICAgICAgPFRSPg0KICAgICAgICAgICAgICAgICAgICAgIDxURCBzdHlsZT0iRk9O VC1TSVpFOiAxMnB4OyBDT0xPUjogIzY2NiIgDQogICAgICAgICAgICAgICAgICAgICAgICBoZWln aHQ9MzA+WW91J3JlIHJlY2VpdmluZyB0aGlzIG5ld3NsZXR0ZXIgYmVjYXVzZSB5b3UgDQogICAg ICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVkIGZyb20gb3VyIHdlYnNpdGUuPEJSPkhhdmlu ZyB0cm91YmxlIHJlYWRpbmcgDQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGVtYWlsPyA8 QSBzdHlsZT0iQ09MT1I6ICMwMDAiIA0KICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj0iaHR0 cDovL2JpdC5seS8xTTZ4Z2tkIiB0YXJnZXQ9X2JsYW5rPlZpZXcgaXQgaW4gDQogICAgICAgICAg ICAgICAgICAgICAgICB5b3VyIGJyb3dzZXI8L0E+LiBOb3QgaW50ZXJlc3RlZCBhbnltb3JlPyA8 QSANCiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJDT0xPUjogIzAwMCIgaHJlZj0iaHR0 cDovL2JpdC5seS8xTTZ4Z2tkIiANCiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1fYmxh bms+VW5zdWJzY3JpYmUgaW5zdGFudGx5PC9BPi4gDQogICAgICAgICAgICAgICAgICA8L1REPjwv VFI+PC9UQk9EWT48L1RBQkxFPjwvVEQ+PC9UUj4NCiAgICAgICAgICAgICAgPFRSPg0KICAgICAg ICAgICAgICAgIDxURCBhbGlnbj1taWRkbGU+DQogICAgICAgICAgICAgICAgICA8VEFCTEUgY2xh c3M9a2UtemVyb2JvcmRlciBjZWxsU3BhY2luZz0wIGNlbGxQYWRkaW5nPTAgDQogICAgICAgICAg ICAgICAgICB3aWR0aD02NDUgYm9yZGVyPTA+DQogICAgICAgICAgICAgICAgICAgIDxUQk9EWT4N CiAgICAgICAgICAgICAgICAgICAgPFRSPg0KICAgICAgICAgICAgICAgICAgICAgIDxURCBoZWln aHQ9NjA+PEEgdGl0bGU9IjIwMTZuZXcgU3VuZ2xhc3NlcyIgDQogICAgICAgICAgICAgICAgICAg ICAgICBocmVmPSJodHRwOi8vYml0Lmx5LzFNNnhna2QiIHRhcmdldD1fYmxhbms+PElNRyBhbHQ9 SG9tZSANCiAgICAgICAgICAgICAgICAgICAgICAgIHNyYz0iIiBib3JkZXI9MD48L0E+IDwvVEQ+ DQogICAgICAgICAgICAgICAgICAgICAgPFREIGFsaWduPXJpZ2h0Pg0KICAgICAgICAgICAgICAg ICAgICAgICAgPFRBQkxFIGNsYXNzPWtlLXplcm9ib3JkZXIgDQogICAgICAgICAgICAgICAgICAg ICAgICBzdHlsZT0iRk9OVC1TSVpFOiAxMXB4OyBURVhULVRSQU5TRk9STTogdXBwZXJjYXNlIiAN CiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MCB3aWR0 aD0yODUgYm9yZGVyPTA+DQogICAgICAgICAgICAgICAgICAgICAgICAgIDxUQk9EWT4NCiAgICAg ICAgICAgICAgICAgICAgICAgICAgPFRSPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxU RCB3aWR0aD0zOD48SU1HIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkZP TlQtU0laRTogMTBweDsgQkFDS0dST1VORDogI2ZmZmZmZjsgQ09MT1I6ICMzMzMzMzMiIA0KICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PTI2IHNyYz0iIiB3aWR0aD0zMiBib3Jk ZXI9MD4gPC9URD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VEQgdkFsaWduPWNlbnRl ciB3aWR0aD0xMTQ+RlJFRSBTSElQUElORyAqIDwvVEQ+DQogICAgICAgICAgICAgICAgICAgICAg ICAgICAgPFREIGFsaWduPWxlZnQgd2lkdGg9MzY+PElNRyANCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHN0eWxlPSJGT05ULVNJWkU6IDEwcHg7IEJBQ0tHUk9VTkQ6ICNmZmZmZmY7IENP TE9SOiAjMzMzMzMzIiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD0yNiBz cmM9IiIgYm9yZGVyPTA+IDwvVEQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPFREIGFs aWduPWxlZnQgd2lkdGg9MTAwPkZyZWUgUmV0dXJuICogDQogICAgICAgICAgICAgICAgICAgICAg ICAgIDwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT48 L1REPjwvVFI+DQogICAgICAgICAgICAgIDxUUj4NCiAgICAgICAgICAgICAgICA8VEQgc3R5bGU9 IkJPUkRFUi1UT1A6ICNlMGUwZTAgMXB4IHNvbGlkIiBhbGlnbj1taWRkbGUgDQpoZWlnaHQ9MzU+ DQogICAgICAgICAgICAgICAgICA8VEFCTEUgY2xhc3M9a2UtemVyb2JvcmRlciANCiAgICAgICAg ICAgICAgICAgIHN0eWxlPSJGT05UOiAxMXB4LzE0cHggQXJpYWwsIEhlbHZldGljYSwgc2Fucy1z ZXJpZjsgVEVYVC1UUkFOU0ZPUk06IHVwcGVyY2FzZSIgDQogICAgICAgICAgICAgICAgICBoZWln aHQ9MjggY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0wIHdpZHRoPSIxMDAlIiBib3JkZXI9MD4N CiAgICAgICAgICAgICAgICAgICAgPFRCT0RZPg0KICAgICAgICAgICAgICAgICAgICA8VFI+DQog ICAgICAgICAgICAgICAgICAgICAgPFREIGFsaWduPW1pZGRsZT48QSANCiAgICAgICAgICAgICAg ICAgICAgICAgIHN0eWxlPSJDT0xPUjogIzIyMjIyMjsgVEVYVC1ERUNPUkFUSU9OOiBub25lIiAN CiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly9iaXQubHkvMU02eGdrZCIgdGFy Z2V0PV9ibGFuaz5CZXN0IA0KICAgICAgICAgICAgICAgICAgICAgICAgU2VsbGVyczwvQT4gPC9U RD4NCiAgICAgICAgICAgICAgICAgICAgICA8VEQgYWxpZ249bWlkZGxlPjxBIA0KICAgICAgICAg ICAgICAgICAgICAgICAgc3R5bGU9IkNPTE9SOiAjMjIyMjIyOyBURVhULURFQ09SQVRJT046IG5v bmUiIA0KICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj0iaHR0cDovL2JpdC5seS8xTTZ4Z2tk IiANCiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1fYmxhbms+Q29sbGVjdGlvbnM8L0E+ IDwvVEQ+DQogICAgICAgICAgICAgICAgICAgICAgPFREIGFsaWduPW1pZGRsZT48QSANCiAgICAg ICAgICAgICAgICAgICAgICAgIHN0eWxlPSJDT0xPUjogIzIyMjIyMjsgVEVYVC1ERUNPUkFUSU9O OiBub25lIiANCiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly9iaXQubHkvMU02 eGdrZCIgdGFyZ2V0PV9ibGFuaz5KdWxpZXQgDQogICAgICAgICAgICAgICAgICAgICAgICBPdmFs PC9BPiA8L1REPg0KICAgICAgICAgICAgICAgICAgICAgIDxURCBhbGlnbj1taWRkbGU+PEEgDQog ICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQ09MT1I6ICMyMjIyMjI7IFRFWFQtREVDT1JB VElPTjogbm9uZSIgDQogICAgICAgICAgICAgICAgICAgICAgICBocmVmPSJodHRwOi8vYml0Lmx5 LzFNNnhna2QiIHRhcmdldD1fYmxhbms+RnJhbWUgDQogICAgICAgICAgICAgICAgICAgICAgICBU eXBlczwvQT4gPC9URD4NCiAgICAgICAgICAgICAgICAgICAgICA8VEQgYWxpZ249bWlkZGxlPjxB IA0KICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkNPTE9SOiAjMjIyMjIyOyBURVhULURF Q09SQVRJT046IG5vbmUiIA0KICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj0iaHR0cDovL2Jp dC5seS8xTTZ4Z2tkIiB0YXJnZXQ9X2JsYW5rPkNvbW1pdCBTcTwvQT4gDQogICAgICAgICAgICAg ICAgICAgICAgPC9URD4NCiAgICAgICAgICAgICAgICAgICAgICA8VEQgYWxpZ249bWlkZGxlPjxB IA0KICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkNPTE9SOiAjMjIyMjIyOyBURVhULURF Q09SQVRJT046IG5vbmUiIA0KICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj0iaHR0cDovL2Jp dC5seS8xTTZ4Z2tkIiB0YXJnZXQ9X2JsYW5rPkZhc3QgDQogICAgICAgICAgICAgICAgICAgICAg ICBKYWNrZXQ8L0E+IDwvVEQ+DQogICAgICAgICAgICAgICAgICAgICAgPFREIGFsaWduPW1pZGRs ZT48QSANCiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJESVNQTEFZOiBibG9jazsgRk9O VC1XRUlHSFQ6IGJvbGQ7IENPTE9SOiAjY2MwMDAwOyBURVhULURFQ09SQVRJT046IG5vbmUiIA0K ICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj0iaHR0cDovL2JpdC5seS8xTTZ4Z2tkIiB0YXJn ZXQ9X2JsYW5rPk5ldyBBcnJpdmFscyANCiAgICAgICAgICAgICAgICAgICAgICAgIDwvQT48L1RE PjwvVFI+PC9UQk9EWT48L1RBQkxFPjwvVEQ+PC9UUj4NCiAgICAgICAgICAgICAgPFRSPg0KICAg ICAgICAgICAgICAgIDxURD4NCiAgICAgICAgICAgICAgICAgIDxUQUJMRSBjbGFzcz1rZS16ZXJv Ym9yZGVyIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MCANCiAgICAgICAgICAgICAgICAgIHdp ZHRoPTY0NSBhbGlnbj1jZW50ZXIgYm9yZGVyPTA+DQogICAgICAgICAgICAgICAgICAgIDxUQk9E WT4NCiAgICAgICAgICAgICAgICAgICAgPFRSPg0KICAgICAgICAgICAgICAgICAgICAgIDxURCAN CiAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iRk9OVC1XRUlHSFQ6IGJvbGQ7IEZPTlQtU0la RTogMzBweDsgQ09MT1I6ICNmZmY7IEZPTlQtRkFNSUxZOiAnVGltZXMgTmV3IFJvbWFuJywgVGlt ZXMsIHNlcmlmIiANCiAgICAgICAgICAgICAgICAgICAgICB2QWxpZ249Ym90dG9tIGFsaWduPW1p ZGRsZSBiZ0NvbG9yPSNjYzAwMDAgY29sU3Bhbj0yIA0KICAgICAgICAgICAgICAgICAgICAgIGhl aWdodD04MD48QSBzdHlsZT0iQ09MT1I6ICNmZmY7IFRFWFQtREVDT1JBVElPTjogbm9uZSIgDQog ICAgICAgICAgICAgICAgICAgICAgICBocmVmPSJodHRwOi8vYml0Lmx5LzFNNnhna2QiIHRhcmdl dD1fYmxhbms+RGlzY291bnQgUmF5IA0KICAgICAgICAgICAgICAgICAgICAgICAgQmFuIFN1bmds YXNzZXM8L0E+IDwvVEQ+PC9UUj4NCiAgICAgICAgICAgICAgICAgICAgPFRSPg0KICAgICAgICAg ICAgICAgICAgICAgIDxURCANCiAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iRk9OVC1XRUlH SFQ6IGJvbGQ7IEZPTlQtU0laRTogMThweDsgQ09MT1I6ICNmZmY7IEZPTlQtRkFNSUxZOiAnVGlt ZXMgTmV3IFJvbWFuJywgVGltZXMsIHNlcmlmIiANCiAgICAgICAgICAgICAgICAgICAgICB2QWxp Z249Ym90dG9tIGFsaWduPW1pZGRsZSBiZ0NvbG9yPSNjYzAwMDAgY29sU3Bhbj0yIA0KICAgICAg ICAgICAgICAgICAgICAgIGhlaWdodD0zMD48QSBzdHlsZT0iQ09MT1I6ICNmZmY7IFRFWFQtREVD T1JBVElPTjogbm9uZSIgDQogICAgICAgICAgICAgICAgICAgICAgICBocmVmPSJodHRwOi8vYml0 Lmx5LzFNNnhna2QiIA0KICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PV9ibGFuaz48U1RS T05HPjxJPldlbGNvbWUgdG8gbXkgc3VuZ2xhc3NlcyANCiAgICAgICAgICAgICAgICAgICAgICAg IHN0b3JlPC9JPjwvU1RST05HPjwvQT4gPC9URD48L1RSPg0KICAgICAgICAgICAgICAgICAgICA8 VFI+DQogICAgICAgICAgICAgICAgICAgICAgPFREIA0KICAgICAgICAgICAgICAgICAgICAgIHN0 eWxlPSJGT05ULVdFSUdIVDogYm9sZDsgRk9OVC1TSVpFOiAyMDBweDsgQ09MT1I6ICNmZmYiIA0K ICAgICAgICAgICAgICAgICAgICAgIHZBbGlnbj10b3AgYWxpZ249cmlnaHQgYmdDb2xvcj0jY2Mw MDAwPjxBIA0KICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkNPTE9SOiAjZmZmOyBURVhU LURFQ09SQVRJT046IG5vbmUiIA0KICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj0iaHR0cDov L2JpdC5seS8xTTZ4Z2tkIiB0YXJnZXQ9X2JsYW5rPjgwPC9BPiA8L1REPg0KICAgICAgICAgICAg ICAgICAgICAgIDxURCB2QWxpZ249dG9wIGJnQ29sb3I9I2NjMDAwMD4NCiAgICAgICAgICAgICAg ICAgICAgICAgIDxUQUJMRSBjbGFzcz1rZS16ZXJvYm9yZGVyIGNlbGxTcGFjaW5nPTAgY2VsbFBh ZGRpbmc9MCANCiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPSIxMDAlIiBib3JkZXI9MD4N CiAgICAgICAgICAgICAgICAgICAgICAgICAgPFRCT0RZPg0KICAgICAgICAgICAgICAgICAgICAg ICAgICA8VFI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPFREIGhlaWdodD00MD48QlI+ PC9URD48L1RSPg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8VFI+DQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgPFREIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJG T05ULVdFSUdIVDogYm9sZDsgRk9OVC1TSVpFOiA0NHB4OyBDT0xPUjogI2ZmZiI+PEEgDQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQ09MT1I6ICNmZmY7IFRFWFQtREVDT1JB VElPTjogbm9uZSIgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmPSJodHRwOi8v Yml0Lmx5LzFNNnhna2QiIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PV9i bGFuaz5FVkVSWVRISU5HPC9BPiA8L1REPjwvVFI+DQogICAgICAgICAgICAgICAgICAgICAgICAg IDxUUj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VEQgDQogICAgICAgICAgICAgICAg ICAgICAgICAgICAgc3R5bGU9IkZPTlQtV0VJR0hUOiBib2xkOyBGT05ULVNJWkU6IDEwMHB4OyBD T0xPUjogI2ZmZiI+PEEgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQ09M T1I6ICNmZmY7IFRFWFQtREVDT1JBVElPTjogbm9uZSIgDQogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBocmVmPSJodHRwOi8vYml0Lmx5LzFNNnhna2QiIA0KICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgdGFyZ2V0PV9ibGFuaz4lT0ZGPC9BPiA8L1REPjwvVFI+PC9UQk9EWT48L1RB QkxFPjwvVEQ+PC9UUj4NCiAgICAgICAgICAgICAgICAgICAgPFRSPg0KICAgICAgICAgICAgICAg ICAgICAgIDxURCANCiAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iRk9OVC1XRUlHSFQ6IGJv bGQ7IEZPTlQtU0laRTogMjhweDsgQ09MT1I6ICNmZmY7IEZPTlQtRkFNSUxZOiAnVGltZXMgTmV3 IFJvbWFuJywgVGltZXMsIHNlcmlmIiANCiAgICAgICAgICAgICAgICAgICAgICB2QWxpZ249dG9w IGFsaWduPW1pZGRsZSBiZ0NvbG9yPSNjYzAwMDAgY29sU3Bhbj0yPjxBIA0KICAgICAgICAgICAg ICAgICAgICAgICAgc3R5bGU9IkNPTE9SOiAjZmZmOyBURVhULURFQ09SQVRJT046IG5vbmUiIA0K ICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj0iaHR0cDovL2JpdC5seS8xTTZ4Z2tkIiB0YXJn ZXQ9X2JsYW5rPlBMVVMgJDgwRlJFRSANCiAgICAgICAgICAgICAgICAgICAgICAgIFNISVBJTkcg T04gQUxMT1JERVJTPC9BPiA8L1REPjwvVFI+DQogICAgICAgICAgICAgICAgICAgIDxUUj4NCiAg ICAgICAgICAgICAgICAgICAgICA8VEQgc3R5bGU9IkZPTlQtU0laRTogMjhweCIgYWxpZ249bWlk ZGxlIGJnQ29sb3I9I2NjMDAwMCANCiAgICAgICAgICAgICAgICAgICAgICBjb2xTcGFuPTIgaGVp Z2h0PTEwMD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxUQUJMRSBjbGFzcz1rZS16ZXJvYm9y ZGVyIGNlbGxTcGFjaW5nPTUgY2VsbFBhZGRpbmc9MCANCiAgICAgICAgICAgICAgICAgICAgICAg IGJvcmRlcj0wPg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8VEJPRFk+DQogICAgICAgICAg ICAgICAgICAgICAgICAgIDxUUj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VEQgYWxp Z249bWlkZGxlPjxBIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkJPUkRF Ui1SSUdIVDogI2ZmZiAxcHggc29saWQ7IFBBRERJTkctUklHSFQ6IDE1cHg7IEJPUkRFUi1UT1A6 ICNmZmYgMXB4IHNvbGlkOyBESVNQTEFZOiBibG9jazsgUEFERElORy1MRUZUOiAxNXB4OyBCQUNL R1JPVU5EOiAjMDAwOyBCT1JERVItTEVGVDogI2ZmZiAxcHggc29saWQ7IENPTE9SOiAjZmZmOyBM SU5FLUhFSUdIVDogMzVweDsgQk9SREVSLUJPVFRPTTogI2ZmZiAxcHggc29saWQ7IEhFSUdIVDog MzVweDsgVEVYVC1ERUNPUkFUSU9OOiBub25lIiANCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGhyZWY9Imh0dHA6Ly9iaXQubHkvMU02eGdrZCIgdGFyZ2V0PV9ibGFuaz5PYWtsZXkgDQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdW5nbGFzczwvQT4gPC9URD4NCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICA8VEQ+PEJSPjwvVEQ+DQogICAgICAgICAgICAgICAgICAgICAg ICAgICAgPFREPjxBIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkJPUkRF Ui1SSUdIVDogI2ZmZiAxcHggc29saWQ7IFBBRERJTkctUklHSFQ6IDE1cHg7IEJPUkRFUi1UT1A6 ICNmZmYgMXB4IHNvbGlkOyBESVNQTEFZOiBibG9jazsgUEFERElORy1MRUZUOiAxNXB4OyBCQUNL R1JPVU5EOiAjMDAwOyBCT1JERVItTEVGVDogI2ZmZiAxcHggc29saWQ7IENPTE9SOiAjZmZmOyBM SU5FLUhFSUdIVDogMzVweDsgQk9SREVSLUJPVFRPTTogI2ZmZiAxcHggc29saWQ7IEhFSUdIVDog MzVweDsgVEVYVC1ERUNPUkFUSU9OOiBub25lIiANCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGhyZWY9Imh0dHA6Ly9iaXQubHkvMU02eGdrZCIgdGFyZ2V0PV9ibGFuaz5SYXkgQmFuIA0K ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VuZ2xhc3M8L0E+IA0KICAgICAgICAgICAg ICAgICAgPC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxF PjwvVEQ+PC9UUj4NCiAgICAgICAgICAgICAgPFRSPg0KICAgICAgICAgICAgICAgIDxURCBhbGln bj1taWRkbGU+PEJSPjwvVEQ+PC9UUj4NCiAgICAgICAgICAgICAgPFRSPg0KICAgICAgICAgICAg ICAgIDxURCBhbGlnbj1taWRkbGU+DQogICAgICAgICAgICAgICAgICA8VEFCTEUgY2xhc3M9a2Ut emVyb2JvcmRlciBjZWxsU3BhY2luZz0wIGNlbGxQYWRkaW5nPTAgDQogICAgICAgICAgICAgICAg ICB3aWR0aD02NDUgYm9yZGVyPTA+DQogICAgICAgICAgICAgICAgICAgIDxUQk9EWT4NCiAgICAg ICAgICAgICAgICAgICAgPFRSPg0KICAgICAgICAgICAgICAgICAgICAgIDxURD4NCiAgICAgICAg ICAgICAgICAgICAgICAgIDxUQUJMRSBjbGFzcz1rZS16ZXJvYm9yZGVyIHN0eWxlPSJGT05ULVNJ WkU6IDEycHgiIA0KICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFNwYWNpbmc9MCBjZWxsUGFk ZGluZz01IHdpZHRoPSIxMDAlIiBib3JkZXI9MD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAg PFRCT0RZPg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8VFI+DQogICAgICAgICAgICAgICAg ICAgICAgICAgICAgPFREIGFsaWduPW1pZGRsZSB3aWR0aD0iMzMlIiBiZ0NvbG9yPSM2NjYgDQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9MzU+PEEgDQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBzdHlsZT0iRElTUExBWTogYmxvY2s7IEZPTlQtU0laRTogMTRweDsg Q09MT1I6ICNmZmY7IExJTkUtSEVJR0hUOiAzNXB4OyBIRUlHSFQ6IDM1cHg7IFRFWFQtREVDT1JB VElPTjogbm9uZSIgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmPSJodHRwOi8v Yml0Lmx5LzFNNnhna2QiIHRhcmdldD1fYmxhbms+UHJpdmFjeSANCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFBvbGljeTwvQT4gPC9URD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICA8VEQgc3R5bGU9IkJPUkRFUi1MRUZUOiAjZmZmIDFweCBzb2xpZCIgYWxpZ249bWlkZGxlIA0K ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJnQ29sb3I9IzY2Nj48QSANCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHN0eWxlPSJESVNQTEFZOiBibG9jazsgRk9OVC1TSVpFOiAxNHB4 OyBDT0xPUjogI2ZmZjsgTElORS1IRUlHSFQ6IDM1cHg7IEhFSUdIVDogMzVweDsgVEVYVC1ERUNP UkFUSU9OOiBub25lIiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9Imh0dHA6 Ly9iaXQubHkvMU02eGdrZCIgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9 X2JsYW5rPlNoaXBwaW5nIFJldHVybnM8L0E+IDwvVEQ+DQogICAgICAgICAgICAgICAgICAgICAg ICAgICAgPFREIHN0eWxlPSJCT1JERVItTEVGVDogI2ZmZiAxcHggc29saWQiIGFsaWduPW1pZGRs ZSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD0iMzMlIiBiZ0NvbG9yPSM2NjY+ PEEgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iRElTUExBWTogYmxvY2s7 IEZPTlQtU0laRTogMTRweDsgQ09MT1I6ICNmZmY7IExJTkUtSEVJR0hUOiAzNXB4OyBIRUlHSFQ6 IDM1cHg7IFRFWFQtREVDT1JBVElPTjogbm9uZSIgDQogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBocmVmPSJodHRwOi8vYml0Lmx5LzFNNnhna2QiIA0KICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgdGFyZ2V0PV9ibGFuaz5Db25kaXRpb25zIG9mIFVzZTwvQT4gDQogICAgICAgICAg ICAgICAgICAgICAgICA8L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPjwvVEQ+PC9UUj4NCiAgICAg ICAgICAgICAgICAgICAgPFRSPg0KICAgICAgICAgICAgICAgICAgICAgIDxURD48QlI+PC9URD48 L1RSPg0KICAgICAgICAgICAgICAgICAgICA8VFI+DQogICAgICAgICAgICAgICAgICAgICAgPFRE Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPFAgDQogICAgICAgICAgICAgICAgICAgICAgICBz dHlsZT0iRk9OVC1TSVpFOiAxMXB4OyBDT0xPUjogIzMzMzsgRk9OVC1GQU1JTFk6IEFyaWFsLEhl bHZldGljYSxzYW5zLXNlcmlmOyBCQUNLR1JPVU5ELUNPTE9SOiAjZmZmOyBURVhULUFMSUdOOiBs ZWZ0OyBXT1JELVdSQVA6IGJyZWFrLXdvcmQiPlRvIA0KICAgICAgICAgICAgICAgICAgICAgICAg YmUgc3VyZSB0aGF0IHlvdSB3aWxsIHJlY2VpdmUgb3VyIG9mZmVycywgd2Ugc3VnZ2VzdCANCiAg ICAgICAgICAgICAgICAgICAgICAgIHRoYXQgeW91IGFkZCBvdXIgZW1haWwgYWRkcmVzcywgPFNQ QU4gDQogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQ09MT1I6ICM4MDgwODA7IFRFWFQt REVDT1JBVElPTjogdW5kZXJsaW5lIj5jdXN0b21lcnNlcnZpY2UyNGhvdXJAaG90bWFpbC5jb208 L1NQQU4+IA0KICAgICAgICAgICAgICAgICAgICAgICAgdG8geW91ciBhZGRyZXNzIGJvb2suIElu IGFjY29yZGFuY2Ugd2l0aCB0aGUgRnJlbmNoIGxhdyANCiAgICAgICAgICAgICAgICAgICAgICAg IG9mIEphbnVhcnkgNiwgMTk3OCwgY29ycmVjdCBhbnkgaW5mb3JtYXRpb24gaGVsZCBieSANCiAg ICAgICAgICAgICAgICAgICAgICAgIDIwMTVzdW5nbGFzc3ZpcC5jb20gdGhhdCBjb25jZXJucyB5 b3UuIA0KICAgICAgICAgICAgICAgICAgICAgICAgPEJSPjxCUj48U1RST05HPk91ciBwcm9taXNl czo8L1NUUk9ORz48QlI+PEJSPi0gDQogICAgICAgICAgICAgICAgICAgICAgICA8U1RST05HPjEw MCBkYXlzIHRvIHJldHVybiBvciBleGNoYW5nZSBhbiANCiAgICAgICAgICAgICAgICAgICAgICAg IGl0ZW08L1NUUk9ORz48QlI+LSA8U1RST05HPlNhbWUtZGF5IGRpc3BhdGNoIGZvciBvcmRlcnMg DQogICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWQgYmVmb3JlIDcgRGF5cy4qPC9TVFJPTkc+ PEJSPi0gPFNUUk9ORz5DdXN0b21lciANCiAgICAgICAgICAgICAgICAgICAgICAgIHNhdGlzZmFj dGlvbiBpcyBvdXIgdG9wIHByaW9yaXR5PC9TVFJPTkc+IDxCUj48QlI+YnV5aW5nIA0KICAgICAg ICAgICAgICAgICAgICAgICAgYSBnaWZ0LCBvciBsb29raW5nIGZvciBhIHByYWN0aWNhbCBwYWly IG9mIHN1bmdsYXNzZXMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgeW91J3JlIHN1cmUgdG8g ZmluZCB3aGF0IHlvdSdyZSBhZnRlciBpbiBSQiBvbmxpbmUgc3RvcmUgDQogICAgICAgICAgICAg ICAgICAgICAgICBodWdlIHNlbGVjdGlvbi4gdG9wIGZhc2hpb24gc2VsZWN0aW9uLiBXaGV0aGVy IHlvdSdyZSANCiAgICAgICAgICAgICAgICAgICAgICAgIGxvb2tpbmcgZm9yIHRoZSBsYXRlc3Qg dHJlbmRzIG9yIHRpbWVsZXNzIGNsYXNzaWNzLCANCiAgICAgICAgICAgICAgICAgICAgICAgIDIw MTVzdW5nbGFzc3ZpcCBvZmZlcnMgaHVuZHJlZHMgb2YgZXN0YWJsaXNoZWQgcHJvZHVjdCANCiAg ICAgICAgICAgICAgICAgICAgICAgIGxpa2Ugc3VuZ2xhc3NlcyBqdXN0IGZvciB5b3UuIDxCUj48 QlI+KlR3ZW50eS1mb3VyIGhvdXJzIA0KICAgICAgICAgICAgICAgICAgICAgICAgYSBkYXksIGRl cGVuZGVudCB1cG9uIHBheW1lbnQgdmFsaWRhdGlvbjxCUj4qU2VlIHRlcm1zIA0KICAgICAgICAg ICAgICAgICAgICAgICAgYW5kIGNvbmRpdGlvbnMgPC9QPjwvVEQ+PC9UUj4NCiAgICAgICAgICAg ICAgICAgICAgPFRSPg0KICAgICAgICAgICAgICAgICAgICAgIDxURD48QlI+PC9URD48L1RSPg0K ICAgICAgICAgICAgICAgICAgICA8VFI+DQogICAgICAgICAgICAgICAgICAgICAgPFREIA0KICAg ICAgICAgICAgICAgICAgICAgIHN0eWxlPSJCT1JERVItVE9QOiAjZTBlMGUwIDFweCBzb2xpZDsg Rk9OVC1TSVpFOiAxMXB4OyBDT0xPUjogIzMzMzsgUEFERElORy1UT1A6IDEwcHg7IEZPTlQtRkFN SUxZOiBBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjsgVEVYVC1BTElHTjogbGVmdDsgV09SRC1X UkFQOiBicmVhay13b3JkIj5Db3B5cmlnaHQgDQogICAgICAgICAgICAgICAgICAgICAgICAyMDA5 LTIwMTUgUmF5IEJhbiBTdW5nbGFzc2VzIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIA0KICAgICAgICAg ICAgICAgICAgICA8L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPjwvVEQ+PC9UUj48L1RCT0RZPjwv VEFCTEU+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT48L1REPjwvVFI+DQogIDxUUj4NCiAgICA8 VEQgdkFsaWduPXRvcCBhbGlnbj1taWRkbGUgDQpoZWlnaHQ9MjU+PEJSPjwvVEQ+PC9UUj48L1RC T0RZPjwvVEFCTEU+PC9CT0RZPjwvSFRNTD4NCg== --=====003_Dragon624826683231_=====-- From billodo@redhat.com Tue Mar 29 15:40:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 43D407CA2 for ; Tue, 29 Mar 2016 15:40:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id EEACB30405F for ; Tue, 29 Mar 2016 13:40:38 -0700 (PDT) X-ASG-Debug-ID: 1459284037-04bdf01103c4120001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id mouAKm8QesQRDc5D (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 29 Mar 2016 13:40:37 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 9C18585542 for ; Tue, 29 Mar 2016 20:40:37 +0000 (UTC) Received: from redhat.com (vpn-49-86.rdu2.redhat.com [10.10.49.86]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2TKeZfj008012 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Tue, 29 Mar 2016 16:40:37 -0400 Date: Tue, 29 Mar 2016 15:40:35 -0500 From: "Bill O'Donnell" To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfs: disallow rw remount on fs with unknown ro-compat features Message-ID: <20160329204035.GA7633@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: disallow rw remount on fs with unknown ro-compat features References: <56FAD75C.80502@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56FAD75C.80502@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1459284037 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Mar 29, 2016 at 02:28:28PM -0500, Eric Sandeen wrote: > Today, a kernel which refuses to mount a filesystem read-write > due to unknown ro-compat features can still transition to read-write > via the remount path. The old kernel is most likely none the wiser, > because it's unaware of the new feature, and isn't using it. However, > writing to the filesystem may well corrupt metadata related to that > new feature, and moving to a newer kernel which understand the feature > will have problems. > > Right now the only ro-compat feature we have is the free inode btree, > which showed up in v3.16. It would be good to push this back to > all the active stable kernels, I think, so that if anyone is using > newer mkfs (which enables the finobt feature) with older kernel > releases, they'll be protected. > > Signed-off-by: Eric Sandeen > Cc: stable@vger.kernel.org > --- Reviewed-by: Bill O'Donnell > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index d760934..ca058a1 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -1276,6 +1276,16 @@ xfs_fs_remount( > return -EINVAL; > } > > + if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 && > + xfs_sb_has_ro_compat_feature(sbp, > + XFS_SB_FEAT_RO_COMPAT_UNKNOWN)) { > + xfs_warn(mp, > +"ro->rw transition prohibited on unknown (0x%x) ro-compat filesystem", > + (sbp->sb_features_ro_compat & > + XFS_SB_FEAT_RO_COMPAT_UNKNOWN)); > + return -EINVAL; > + } > + > mp->m_flags &= ~XFS_MOUNT_RDONLY; > > /* > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Tue Mar 29 18:54:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 386607CA2 for ; Tue, 29 Mar 2016 18:54:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id F14D98F8037 for ; Tue, 29 Mar 2016 16:54:41 -0700 (PDT) X-ASG-Debug-ID: 1459295675-04cb6c245f123100001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id k6OXWSsQypRPm1Qw for ; Tue, 29 Mar 2016 16:54:36 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DrCADuFPtWPDGaLHldgzOBUIZooA4BAQEGjA+DTIYjhgcCAgEBAoE+TQEBAQEBAQcBAQEBQUCEQQEBAQMBOhwjBQsIAxgJJQ8FJQMHGhOIHwfAVwEBAQEGAgEdGYU8hQyEBCODQYIrBZdsjX2BcId1hTJEjkuCZRmBXSgwhwOBPAEBAQ Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail05.adl6.internode.on.net with ESMTP; 30 Mar 2016 10:24:17 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1al3Sh-0003Df-KY; Wed, 30 Mar 2016 10:54:15 +1100 Date: Wed, 30 Mar 2016 10:54:15 +1100 From: Dave Chinner To: Olaf Hering Cc: xfs@oss.sgi.com Subject: Re: BUG in xfs_trans_binval Message-ID: <20160329235415.GF30721@dastard> X-ASG-Orig-Subj: Re: BUG in xfs_trans_binval References: <20160329171553.GA17885@aepfle.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160329171553.GA17885@aepfle.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1459295675 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28284 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Mar 29, 2016 at 07:15:53PM +0200, Olaf Hering wrote: > During receiving a backup stream (netcal -l 12345 | tar xf -) the host > crashed and rebooted, no idea why. That's the likely cause of your problems, because.... > After reboot I tried to remove the received directory (rm -rf dir) and > got this BUG: > > "_xfs_buf_find: Block out of range: block 0x81ffff3f8, EOFS 0x7fffd000" This will be caused by a corrupt block.... > Kernel is 4.5.0 from openSUSE Tumbleweed. > dmesg is attached, I just realized it has the backtrace. > > [ 1.883626] sd 4:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA So, write cache is enabled on the drive. > [ 20.083397] XFS (sdb1): Mounting V5 Filesystem > [ 20.291900] XFS (sdb1): Starting recovery (logdev: internal) > [ 25.285846] XFS (sdb1): Bad dir block magic! > [ 26.448027] XFS (sdb1): Ending recovery (logdev: internal) And that's a big clue that something went badly wrong at the storage level. Basically, after recovering a buffer from the log, it had an invalid magic number for the type of buffer information being recovered. In this case, the journal entry being recovered was for a directory block in "single block" format. The magic number foundi in the block after recovery of the transaction was not that of a directory block in single block format. The only way this can happen is if there is an underlying corruption in the block prior to recovery starting. Given that the system crashed and rebooted, it's entirely possible that initialisation of the block never made it to persistent storage, or it was corrupted on the way to disk by whatever caused the crash and reboot. > [ 130.489414] XFS (sdb1): _xfs_buf_find: Block out of range: block 0x81ffff3f8, EOFS 0x7fffd000 > [ 130.494271] XFS (sdb1): _xfs_buf_find: Block out of range: block 0x81ffff3f8, EOFS 0x7fffd000 These occur because a bad sector address is being detected. > [ 130.489707] [] dump_stack+0x63/0x82 > [ 130.489715] [] warn_slowpath_common+0x82/0xc0 > [ 130.489722] [] warn_slowpath_null+0x1a/0x20 > [ 130.489766] [] _xfs_buf_find+0x350/0x3b0 [xfs] > [ 130.489824] [] xfs_buf_get_map+0x2a/0x2c0 [xfs] > [ 130.489876] [] xfs_trans_get_buf_map+0x11a/0x1c0 [xfs] > [ 130.489923] [] xfs_btree_get_bufs+0x50/0x60 [xfs] > [ 130.489961] [] xfs_alloc_fix_freelist+0x20f/0x3c0 [xfs] And this location generating the out-of-range disk address indicates that there may be a bad block number on the AGFL. Given that none of these have triggered verifier failures on read from disk, it makes me think that whatever has gone wrong in this filesystem occurred before the crash and reboot, and smells somewhat of memory corruption and/or misdirected writes. Given that xfs_repair didn't warn about blocks on the AGFL being out of range (which is checked), nor any other metadata linkage in the filesystem pointing to a block out of range, nor did it warn about directory blocks cwbeing corrupted or having invalid formats, this is starting to look like an in-memory problem. Perhaps there is still memory corruption occurring - the block out of range has a single high bit set that puts it out of range. i.e. when we mask of the single bit that is out of range, 0x1ffff3f8 is a valid sector address. Can you run a memory tester on the machine? Cheers, Dave. -- Dave Chinner david@fromorbit.com From darrick.wong@oracle.com Tue Mar 29 19:09:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 83DFE7CA2 for ; Tue, 29 Mar 2016 19:09:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DDD9BAC001 for ; Tue, 29 Mar 2016 17:08:57 -0700 (PDT) X-ASG-Debug-ID: 1459296529-04cbb07ad8118d50001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id DxwOMpaxDExJc2b7 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 29 Mar 2016 17:08:50 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u2U08kFG026884 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 30 Mar 2016 00:08:46 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u2U08kS2011431 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 30 Mar 2016 00:08:46 GMT Received: from abhmp0010.oracle.com (abhmp0010.oracle.com [141.146.116.16]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u2U08hjO019911; Wed, 30 Mar 2016 00:08:44 GMT Received: from localhost (/10.159.179.60) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 29 Mar 2016 17:08:43 -0700 Date: Tue, 29 Mar 2016 17:08:42 -0700 From: "Darrick J. Wong" To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: don't hand out pNFS layouts for reflink inodes Message-ID: <20160330000842.GD5822@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: don't hand out pNFS layouts for reflink inodes References: <1456936485-21940-1-git-send-email-hch@lst.de> <20160328195140.GB5360@birch.djwong.org> <20160329072128.GA14940@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160329072128.GA14940@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1459296530 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28284 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Tue, Mar 29, 2016 at 09:21:28AM +0200, Christoph Hellwig wrote: > On Mon, Mar 28, 2016 at 12:51:40PM -0700, Darrick J. Wong wrote: > > > /* > > > + * The pNFS block layout spec actually supports reflink like > > > + * functionality, but the Linux pNFS server doesn't implement it yet. > > > + */ > > > + if (!xfs_is_reflink_inode(ip)) > > > + return -ENXIO; > > > > /me isn't familiar with pNFS, but doesn't this make it so that > > xfs_fs_map_blocks /only/ works on reflinked files? Maybe I'm misreading the > > comment, but it sounds to me like Linux doesn't support reflinked files over > > pNFS and therefore we want to disable this iomapping functionality any time we > > find a reflinked file. > > > > But maybe there's a subtlety here that I'm missing? > > You jsut missed me fat fingering the check :) Fair enough, I'll integrate this patch, but with: if (xfs_is_reflink_inode(ip)) return -ENXIO; > Btw, we'll need something similar to prevent swapfiles which just use > ->bmap, but unfortunately swap just checks for the existences of method, > so I'll probably have to do some VFS changes to properly support that. Yes, please. ocfs2 will gladly let you call swapon on a reflinked file, and totally fails to CoW it properly. :) --D > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Tue Mar 29 19:22:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1E18C7CA2 for ; Tue, 29 Mar 2016 19:22:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E6AF4304053 for ; Tue, 29 Mar 2016 17:22:21 -0700 (PDT) X-ASG-Debug-ID: 1459297339-04cbb07ad5119170001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id Gcafrkq9eMtKG128 for ; Tue, 29 Mar 2016 17:22: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: A2CSCAAQG/tWPDGaLHldgzOBUIZooA4BAQEGjA+FYoQNhgcEAgKBP00BAQEBAQEHAQEBAUFAhEIBAQQ6HCMQCAMYCSUPBSUDBxoTiCbAXAEBCAIeGYU8hQyKEwWXbI19gXCHdYUyjw+EWygwiD8BAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail05.adl6.internode.on.net with ESMTP; 30 Mar 2016 10:46:09 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1al3ns-0003FW-I2; Wed, 30 Mar 2016 11:16:08 +1100 Date: Wed, 30 Mar 2016 11:16:08 +1100 From: Dave Chinner To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfs: disallow rw remount on fs with unknown ro-compat features Message-ID: <20160330001608.GG30721@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: disallow rw remount on fs with unknown ro-compat features References: <56FAD75C.80502@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56FAD75C.80502@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1459297339 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28285 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Mar 29, 2016 at 02:28:28PM -0500, Eric Sandeen wrote: > Today, a kernel which refuses to mount a filesystem read-write > due to unknown ro-compat features can still transition to read-write > via the remount path. The old kernel is most likely none the wiser, > because it's unaware of the new feature, and isn't using it. However, > writing to the filesystem may well corrupt metadata related to that > new feature, and moving to a newer kernel which understand the feature > will have problems. > > Right now the only ro-compat feature we have is the free inode btree, > which showed up in v3.16. It would be good to push this back to > all the active stable kernels, I think, so that if anyone is using > newer mkfs (which enables the finobt feature) with older kernel > releases, they'll be protected. Ok, so the bug was introduced with the original extended feature masks in commit e721f50 ("xfs: implement extended feature masks"), which was introduced in 3.10. So it will need to go back to stable kernels all the way back to 3.10, right? Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@redhat.com Tue Mar 29 19:27:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 78FF97CA2 for ; Tue, 29 Mar 2016 19:27:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id F07C3AC004 for ; Tue, 29 Mar 2016 17:27:18 -0700 (PDT) X-ASG-Debug-ID: 1459297637-04bdf01105d3220001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id WrVOfuC6NK1kJugv (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 29 Mar 2016 17:27:18 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id A9BB5627D0; Wed, 30 Mar 2016 00:27:17 +0000 (UTC) Received: from [IPv6:::1] (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2U0RGc5014716 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 29 Mar 2016 20:27:17 -0400 Subject: Re: [PATCH] xfs: disallow rw remount on fs with unknown ro-compat features To: Dave Chinner X-ASG-Orig-Subj: Re: [PATCH] xfs: disallow rw remount on fs with unknown ro-compat features References: <56FAD75C.80502@redhat.com> <20160330001608.GG30721@dastard> Cc: xfs-oss From: Eric Sandeen Message-ID: <56FB1D64.1080700@redhat.com> Date: Tue, 29 Mar 2016 19:27:16 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.0 MIME-Version: 1.0 In-Reply-To: <20160330001608.GG30721@dastard> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Wed, 30 Mar 2016 00:27:17 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1459297638 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com On 3/29/16 7:16 PM, Dave Chinner wrote: > On Tue, Mar 29, 2016 at 02:28:28PM -0500, Eric Sandeen wrote: >> Today, a kernel which refuses to mount a filesystem read-write >> due to unknown ro-compat features can still transition to read-write >> via the remount path. The old kernel is most likely none the wiser, >> because it's unaware of the new feature, and isn't using it. However, >> writing to the filesystem may well corrupt metadata related to that >> new feature, and moving to a newer kernel which understand the feature >> will have problems. >> >> Right now the only ro-compat feature we have is the free inode btree, >> which showed up in v3.16. It would be good to push this back to >> all the active stable kernels, I think, so that if anyone is using >> newer mkfs (which enables the finobt feature) with older kernel >> releases, they'll be protected. > > Ok, so the bug was introduced with the original extended feature > masks in commit e721f50 ("xfs: implement extended feature masks"), > which was introduced in 3.10. So it will need to go back to stable > kernels all the way back to 3.10, right? > > Cheers, > > Dave. > Yeah, that seems right; it's not when the first ro-compat feature was introduced, it was when the handling was introduced, right? If you need to massage the cc:stable line feel free, of course. ie: Cc: # 3.10.x- I think. -Eric From vishal.l.verma@intel.com Tue Mar 29 21:00:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 16F017CA2 for ; Tue, 29 Mar 2016 21:00:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CFC1F8F8039 for ; Tue, 29 Mar 2016 19:00:23 -0700 (PDT) X-ASG-Debug-ID: 1459303222-04bdf01103d4f90001-NocioJ Received: from mga14.intel.com ([192.55.52.115]) by cuda.sgi.com with ESMTP id yymAv6T6zKuJRCtw for ; Tue, 29 Mar 2016 19:00:22 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.115 X-ASG-Whitelist: Client Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga103.fm.intel.com with ESMTP; 29 Mar 2016 19:00:22 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,414,1455004800"; d="scan'208";a="75601552" Received: from omniknight.lm.intel.com ([10.232.112.171]) by fmsmga004.fm.intel.com with ESMTP; 29 Mar 2016 19:00:16 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Dan Williams , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton , linux-kernel@vger.kernel.org, Christoph Hellwig Subject: [PATCH v2 2/5] dax: fallback from pmd to pte on error Date: Tue, 29 Mar 2016 19:59:47 -0600 X-ASG-Orig-Subj: [PATCH v2 2/5] dax: fallback from pmd to pte on error Message-Id: <1459303190-20072-3-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> X-Barracuda-Connect: UNKNOWN[192.55.52.115] X-Barracuda-Start-Time: 1459303222 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dan Williams In preparation for consulting a badblocks list in pmem_direct_access(), teach dax_pmd_fault() to fallback rather than fail immediately upon encountering an error. The thought being that reducing the span of the dax request may avoid the error region. Signed-off-by: Dan Williams --- fs/dax.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/dax.c b/fs/dax.c index 90322eb..ec6417b 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -945,8 +945,8 @@ int __dax_pmd_fault(struct vm_area_struct *vma, unsigned long address, long length = dax_map_atomic(bdev, &dax); if (length < 0) { - result = VM_FAULT_SIGBUS; - goto out; + dax_pmd_dbg(&bh, address, "dax-error fallback"); + goto fallback; } if (length < PMD_SIZE) { dax_pmd_dbg(&bh, address, "dax-length too small"); -- 2.5.5 From vishal.l.verma@intel.com Tue Mar 29 21:00:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id ED7497CAE for ; Tue, 29 Mar 2016 21:00:26 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5D641AC007 for ; Tue, 29 Mar 2016 19:00:26 -0700 (PDT) X-ASG-Debug-ID: 1459303223-04cb6c2462125620002-NocioJ Received: from mga14.intel.com ([192.55.52.115]) by cuda.sgi.com with ESMTP id SnGHNSsTkxoGCGdV for ; Tue, 29 Mar 2016 19:00:24 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.115 X-ASG-Whitelist: Client Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga103.fm.intel.com with ESMTP; 29 Mar 2016 19:00:24 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,414,1455004800"; d="scan'208";a="75601566" Received: from omniknight.lm.intel.com ([10.232.112.171]) by fmsmga004.fm.intel.com with ESMTP; 29 Mar 2016 19:00:21 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Vishal Verma , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dan Williams , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton , linux-kernel@vger.kernel.org, Christoph Hellwig Subject: [PATCH v2 5/5] dax: handle media errors in dax_do_io Date: Tue, 29 Mar 2016 19:59:50 -0600 X-ASG-Orig-Subj: [PATCH v2 5/5] dax: handle media errors in dax_do_io Message-Id: <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> X-Barracuda-Connect: UNKNOWN[192.55.52.115] X-Barracuda-Start-Time: 1459303224 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 dax_do_io (called for read() or write() for a dax file system) may fail in the presence of bad blocks or media errors. Since we expect that a write should clear media errors on nvdimms, make dax_do_io fall back to the direct_IO path, which will send down a bio to the driver, which can then attempt to clear the error. Cc: Matthew Wilcox Cc: Dan Williams Cc: Ross Zwisler Cc: Dave Chinner Cc: Jan Kara Cc: Jens Axboe Cc: Al Viro Cc: Christoph Hellwig Signed-off-by: Vishal Verma --- fs/block_dev.c | 17 ++++++++++++++--- fs/ext2/inode.c | 22 +++++++++++++++------- fs/ext4/indirect.c | 18 +++++++++++++----- fs/ext4/inode.c | 21 ++++++++++++++------- fs/xfs/xfs_aops.c | 14 ++++++++++++-- 5 files changed, 68 insertions(+), 24 deletions(-) diff --git a/fs/block_dev.c b/fs/block_dev.c index c5837fa..d6113b9 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -166,13 +166,24 @@ blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) { struct file *file = iocb->ki_filp; struct inode *inode = bdev_file_inode(file); + ssize_t ret, ret_saved = 0; - if (IS_DAX(inode)) - return dax_do_io(iocb, inode, iter, offset, blkdev_get_block, + if (IS_DAX(inode)) { + ret = dax_do_io(iocb, inode, iter, offset, blkdev_get_block, NULL, DIO_SKIP_DIO_COUNT); - return __blockdev_direct_IO(iocb, inode, I_BDEV(inode), iter, offset, + if (ret == -EIO && (iov_iter_rw(iter) == WRITE)) + ret_saved = ret; + else + return ret; + } + + ret = __blockdev_direct_IO(iocb, inode, I_BDEV(inode), iter, offset, blkdev_get_block, NULL, NULL, DIO_SKIP_DIO_COUNT); + if (ret < 0 && ret_saved) + return ret_saved; + + return ret; } int __sync_blockdev(struct block_device *bdev, int wait) diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index 824f249..64792c6 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c @@ -859,14 +859,22 @@ ext2_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) struct address_space *mapping = file->f_mapping; struct inode *inode = mapping->host; size_t count = iov_iter_count(iter); - ssize_t ret; + ssize_t ret, ret_saved = 0; - if (IS_DAX(inode)) - ret = dax_do_io(iocb, inode, iter, offset, ext2_get_block, NULL, - DIO_LOCKING); - else - ret = blockdev_direct_IO(iocb, inode, iter, offset, - ext2_get_block); + if (IS_DAX(inode)) { + ret = dax_do_io(iocb, inode, iter, offset, ext2_get_block, + NULL, DIO_LOCKING | DIO_SKIP_HOLES); + if (ret == -EIO && iov_iter_rw(iter) == WRITE) + ret_saved = ret; + else + goto out; + } + + ret = blockdev_direct_IO(iocb, inode, iter, offset, ext2_get_block); + if (ret < 0 && ret_saved) + ret = ret_saved; + + out: if (ret < 0 && iov_iter_rw(iter) == WRITE) ext2_write_failed(mapping, offset + count); return ret; diff --git a/fs/ext4/indirect.c b/fs/ext4/indirect.c index 3027fa6..798f341 100644 --- a/fs/ext4/indirect.c +++ b/fs/ext4/indirect.c @@ -716,14 +716,22 @@ retry: NULL, NULL, 0); inode_dio_end(inode); } else { + ssize_t ret_saved = 0; + locked: - if (IS_DAX(inode)) + if (IS_DAX(inode)) { ret = dax_do_io(iocb, inode, iter, offset, ext4_dio_get_block, NULL, DIO_LOCKING); - else - ret = blockdev_direct_IO(iocb, inode, iter, offset, - ext4_dio_get_block); - + if (ret == -EIO && iov_iter_rw(iter) == WRITE) + ret_saved = ret; + else + goto skip_dio; + } + ret = blockdev_direct_IO(iocb, inode, iter, offset, + ext4_get_block); + if (ret < 0 && ret_saved) + ret = ret_saved; +skip_dio: if (unlikely(iov_iter_rw(iter) == WRITE && ret < 0)) { loff_t isize = i_size_read(inode); loff_t end = offset + count; diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index dab84a2..27f07c2 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -3341,7 +3341,7 @@ static ssize_t ext4_ext_direct_IO(struct kiocb *iocb, struct iov_iter *iter, { struct file *file = iocb->ki_filp; struct inode *inode = file->f_mapping->host; - ssize_t ret; + ssize_t ret, ret_saved = 0; size_t count = iov_iter_count(iter); int overwrite = 0; get_block_t *get_block_func = NULL; @@ -3401,15 +3401,22 @@ static ssize_t ext4_ext_direct_IO(struct kiocb *iocb, struct iov_iter *iter, #ifdef CONFIG_EXT4_FS_ENCRYPTION BUG_ON(ext4_encrypted_inode(inode) && S_ISREG(inode->i_mode)); #endif - if (IS_DAX(inode)) + if (IS_DAX(inode)) { ret = dax_do_io(iocb, inode, iter, offset, get_block_func, ext4_end_io_dio, dio_flags); - else - ret = __blockdev_direct_IO(iocb, inode, - inode->i_sb->s_bdev, iter, offset, - get_block_func, - ext4_end_io_dio, NULL, dio_flags); + if (ret == -EIO && iov_iter_rw(iter) == WRITE) + ret_saved = ret; + else + goto skip_dio; + } + ret = __blockdev_direct_IO(iocb, inode, + inode->i_sb->s_bdev, iter, offset, + get_block_func, + ext4_end_io_dio, NULL, dio_flags); + if (ret < 0 && ret_saved) + ret = ret_saved; + skip_dio: if (ret > 0 && !overwrite && ext4_test_inode_state(inode, EXT4_STATE_DIO_UNWRITTEN)) { int err; diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index d445a64..7cfcf86 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -1413,6 +1413,7 @@ xfs_vm_direct_IO( dio_iodone_t *endio = NULL; int flags = 0; struct block_device *bdev; + ssize_t ret, ret_saved = 0; if (iov_iter_rw(iter) == WRITE) { endio = xfs_end_io_direct_write; @@ -1420,13 +1421,22 @@ xfs_vm_direct_IO( } if (IS_DAX(inode)) { - return dax_do_io(iocb, inode, iter, offset, + ret = dax_do_io(iocb, inode, iter, offset, xfs_get_blocks_direct, endio, 0); + if (ret == -EIO && iov_iter_rw(iter) == WRITE) + ret_saved = ret; + else + return ret; } bdev = xfs_find_bdev_for_inode(inode); - return __blockdev_direct_IO(iocb, inode, bdev, iter, offset, + ret = __blockdev_direct_IO(iocb, inode, bdev, iter, offset, xfs_get_blocks_direct, endio, NULL, flags); + + if (ret < 0 && ret_saved) + ret = ret_saved; + + return ret; } /* -- 2.5.5 From vishal.l.verma@intel.com Tue Mar 29 21:00:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0E1B57CB1 for ; Tue, 29 Mar 2016 21:00:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C40C4304032 for ; Tue, 29 Mar 2016 19:00:24 -0700 (PDT) X-ASG-Debug-ID: 1459303222-04bdf01103d4f90002-NocioJ Received: from mga14.intel.com ([192.55.52.115]) by cuda.sgi.com with ESMTP id QIlyBOfUm7osiFiT for ; Tue, 29 Mar 2016 19:00:23 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.115 X-ASG-Whitelist: Client Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga103.fm.intel.com with ESMTP; 29 Mar 2016 19:00:22 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,414,1455004800"; d="scan'208";a="75601556" Received: from omniknight.lm.intel.com ([10.232.112.171]) by fmsmga004.fm.intel.com with ESMTP; 29 Mar 2016 19:00:18 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Dan Williams , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton , linux-kernel@vger.kernel.org, Christoph Hellwig Subject: [PATCH v2 3/5] dax: enable dax in the presence of known media errors (badblocks) Date: Tue, 29 Mar 2016 19:59:48 -0600 X-ASG-Orig-Subj: [PATCH v2 3/5] dax: enable dax in the presence of known media errors (badblocks) Message-Id: <1459303190-20072-4-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> X-Barracuda-Connect: UNKNOWN[192.55.52.115] X-Barracuda-Start-Time: 1459303223 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dan Williams 1/ If a mapping overlaps a bad sector fail the request. 2/ Do not opportunistically report more dax-capable capacity than is requested when errors present. [vishal: fix a conflict with system RAM collision patches] Signed-off-by: Dan Williams --- block/ioctl.c | 9 --------- drivers/nvdimm/pmem.c | 8 ++++++++ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/block/ioctl.c b/block/ioctl.c index d8996bb..cd7f392 100644 --- a/block/ioctl.c +++ b/block/ioctl.c @@ -423,15 +423,6 @@ bool blkdev_dax_capable(struct block_device *bdev) || (bdev->bd_part->nr_sects % (PAGE_SIZE / 512))) return false; - /* - * If the device has known bad blocks, force all I/O through the - * driver / page cache. - * - * TODO: support finer grained dax error handling - */ - if (disk->bb && disk->bb->count) - return false; - return true; } #endif diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c index da10554..eac5f93 100644 --- a/drivers/nvdimm/pmem.c +++ b/drivers/nvdimm/pmem.c @@ -174,9 +174,17 @@ static long pmem_direct_access(struct block_device *bdev, struct pmem_device *pmem = bdev->bd_disk->private_data; resource_size_t offset = sector * 512 + pmem->data_offset; + if (unlikely(is_bad_pmem(&pmem->bb, sector, dax->size))) + return -EIO; dax->addr = pmem->virt_addr + offset; dax->pfn = phys_to_pfn_t(pmem->phys_addr + offset, pmem->pfn_flags); + /* + * If badblocks are present, limit known good range to the + * requested range. + */ + if (unlikely(pmem->bb.count)) + return dax->size; return pmem->size - pmem->pfn_pad - offset; } -- 2.5.5 From vishal.l.verma@intel.com Tue Mar 29 21:00:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CFBCC7CAE for ; Tue, 29 Mar 2016 21:00:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3B691AC005 for ; Tue, 29 Mar 2016 19:00:25 -0700 (PDT) X-ASG-Debug-ID: 1459303222-04bdf01103d4f90003-NocioJ Received: from mga14.intel.com ([192.55.52.115]) by cuda.sgi.com with ESMTP id xPDALQ9j9mLSoZkV for ; Tue, 29 Mar 2016 19:00:24 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.115 X-ASG-Whitelist: Client Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga103.fm.intel.com with ESMTP; 29 Mar 2016 19:00:22 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,414,1455004800"; d="scan'208";a="75601558" Received: from omniknight.lm.intel.com ([10.232.112.171]) by fmsmga004.fm.intel.com with ESMTP; 29 Mar 2016 19:00:19 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Vishal Verma , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dan Williams , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton , linux-kernel@vger.kernel.org, Christoph Hellwig Subject: [PATCH v2 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors Date: Tue, 29 Mar 2016 19:59:49 -0600 X-ASG-Orig-Subj: [PATCH v2 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors Message-Id: <1459303190-20072-5-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> X-Barracuda-Connect: UNKNOWN[192.55.52.115] X-Barracuda-Start-Time: 1459303223 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Matthew Wilcox dax_clear_sectors() cannot handle poisoned blocks. These must be zeroed using the BIO interface instead. Convert ext2 and XFS to use only sb_issue_zerout(). Signed-off-by: Matthew Wilcox [vishal: Also remove the dax_clear_sectors function entirely] Signed-off-by: Vishal Verma --- fs/dax.c | 32 -------------------------------- fs/ext2/inode.c | 7 +++---- fs/xfs/xfs_bmap_util.c | 15 ++++----------- include/linux/dax.h | 1 - 4 files changed, 7 insertions(+), 48 deletions(-) diff --git a/fs/dax.c b/fs/dax.c index ec6417b..f4ac5f2 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -78,38 +78,6 @@ struct page *read_dax_sector(struct block_device *bdev, sector_t n) return page; } -/* - * dax_clear_sectors() is called from within transaction context from XFS, - * and hence this means the stack from this point must follow GFP_NOFS - * semantics for all operations. - */ -int dax_clear_sectors(struct block_device *bdev, sector_t _sector, long _size) -{ - struct blk_dax_ctl dax = { - .sector = _sector, - .size = _size, - }; - - might_sleep(); - do { - long count, sz; - - count = dax_map_atomic(bdev, &dax); - if (count < 0) - return count; - sz = min_t(long, count, SZ_128K); - clear_pmem(dax.addr, sz); - dax.size -= sz; - dax.sector += sz / 512; - dax_unmap_atomic(bdev, &dax); - cond_resched(); - } while (dax.size); - - wmb_pmem(); - return 0; -} -EXPORT_SYMBOL_GPL(dax_clear_sectors); - /* the clear_pmem() calls are ordered by a wmb_pmem() in the caller */ static void dax_new_buf(void __pmem *addr, unsigned size, unsigned first, loff_t pos, loff_t end) diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index 6bd58e6..824f249 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -737,10 +738,8 @@ static int ext2_get_blocks(struct inode *inode, * so that it's not found by another thread before it's * initialised */ - err = dax_clear_sectors(inode->i_sb->s_bdev, - le32_to_cpu(chain[depth-1].key) << - (inode->i_blkbits - 9), - 1 << inode->i_blkbits); + err = sb_issue_zeroout(inode->i_sb, + le32_to_cpu(chain[depth-1].key), 1, GFP_NOFS); if (err) { mutex_unlock(&ei->truncate_mutex); goto cleanup; diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index a32c1dc..5b4351a 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -72,18 +72,11 @@ xfs_zero_extent( struct xfs_mount *mp = ip->i_mount; xfs_daddr_t sector = xfs_fsb_to_db(ip, start_fsb); sector_t block = XFS_BB_TO_FSBT(mp, sector); - ssize_t size = XFS_FSB_TO_B(mp, count_fsb); - - if (IS_DAX(VFS_I(ip))) - return dax_clear_sectors(xfs_find_bdev_for_inode(VFS_I(ip)), - sector, size); - - /* - * let the block layer decide on the fastest method of - * implementing the zeroing. - */ - return sb_issue_zeroout(mp->m_super, block, count_fsb, GFP_NOFS); + return blkdev_issue_zeroout(xfs_find_bdev_for_inode(VFS_I(ip)), + block << (mp->m_super->s_blocksize_bits - 9), + count_fsb << (mp->m_super->s_blocksize_bits - 9), + GFP_NOFS, true); } /* diff --git a/include/linux/dax.h b/include/linux/dax.h index 636dd59..933198a 100644 --- a/include/linux/dax.h +++ b/include/linux/dax.h @@ -7,7 +7,6 @@ ssize_t dax_do_io(struct kiocb *, struct inode *, struct iov_iter *, loff_t, get_block_t, dio_iodone_t, int flags); -int dax_clear_sectors(struct block_device *bdev, sector_t _sector, long _size); int dax_zero_page_range(struct inode *, loff_t from, unsigned len, get_block_t); int dax_truncate_page(struct inode *, loff_t from, get_block_t); int dax_fault(struct vm_area_struct *, struct vm_fault *, get_block_t, -- 2.5.5 From vishal.l.verma@intel.com Tue Mar 29 21:00:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id F02EA7CB2 for ; Tue, 29 Mar 2016 21:00:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 578F7AC007 for ; Tue, 29 Mar 2016 19:00:25 -0700 (PDT) X-ASG-Debug-ID: 1459303223-04cb6c2462125620001-NocioJ Received: from mga14.intel.com ([192.55.52.115]) by cuda.sgi.com with ESMTP id xn6C2meIpCJKkp1O for ; Tue, 29 Mar 2016 19:00:23 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.115 X-ASG-Whitelist: Client Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga103.fm.intel.com with ESMTP; 29 Mar 2016 19:00:22 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,414,1455004800"; d="scan'208";a="75601546" Received: from omniknight.lm.intel.com ([10.232.112.171]) by fmsmga004.fm.intel.com with ESMTP; 29 Mar 2016 19:00:15 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Dan Williams , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton , linux-kernel@vger.kernel.org, Christoph Hellwig Subject: [PATCH v2 1/5] block, dax: pass blk_dax_ctl through to drivers Date: Tue, 29 Mar 2016 19:59:46 -0600 X-ASG-Orig-Subj: [PATCH v2 1/5] block, dax: pass blk_dax_ctl through to drivers Message-Id: <1459303190-20072-2-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> X-Barracuda-Connect: UNKNOWN[192.55.52.115] X-Barracuda-Start-Time: 1459303223 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dan Williams This is in preparation for doing badblocks checking against the requested sector range in the driver. Currently we opportunistically return as much data that can be "dax'd" starting at the given sector. When errors are present we want to limit that range to the first encountered error, or fail the dax request if the range encompasses an error. Signed-off-by: Dan Williams --- arch/powerpc/sysdev/axonram.c | 10 +++++----- drivers/block/brd.c | 9 +++++---- drivers/nvdimm/pmem.c | 9 +++++---- drivers/s390/block/dcssblk.c | 12 ++++++------ fs/block_dev.c | 2 +- include/linux/blkdev.h | 3 +-- 6 files changed, 23 insertions(+), 22 deletions(-) diff --git a/arch/powerpc/sysdev/axonram.c b/arch/powerpc/sysdev/axonram.c index 0d112b9..d85673f 100644 --- a/arch/powerpc/sysdev/axonram.c +++ b/arch/powerpc/sysdev/axonram.c @@ -139,17 +139,17 @@ axon_ram_make_request(struct request_queue *queue, struct bio *bio) /** * axon_ram_direct_access - direct_access() method for block device - * @device, @sector, @data: see block_device_operations method + * @dax: see block_device_operations method */ static long -axon_ram_direct_access(struct block_device *device, sector_t sector, - void __pmem **kaddr, pfn_t *pfn) +axon_ram_direct_access(struct block_device *device, struct blk_dax_ctl *dax) { + sector_t sector = get_start_sect(device) + dax->sector; struct axon_ram_bank *bank = device->bd_disk->private_data; loff_t offset = (loff_t)sector << AXON_RAM_SECTOR_SHIFT; - *kaddr = (void __pmem __force *) bank->io_addr + offset; - *pfn = phys_to_pfn_t(bank->ph_addr + offset, PFN_DEV); + dax->addr = (void __pmem __force *) bank->io_addr + offset; + dax->pfn = phys_to_pfn_t(bank->ph_addr + offset, PFN_DEV); return bank->size - offset; } diff --git a/drivers/block/brd.c b/drivers/block/brd.c index f7ecc28..e3e4780 100644 --- a/drivers/block/brd.c +++ b/drivers/block/brd.c @@ -380,9 +380,10 @@ static int brd_rw_page(struct block_device *bdev, sector_t sector, } #ifdef CONFIG_BLK_DEV_RAM_DAX -static long brd_direct_access(struct block_device *bdev, sector_t sector, - void __pmem **kaddr, pfn_t *pfn) +static long brd_direct_access(struct block_device *bdev, + struct blk_dax_ctl *dax) { + sector_t sector = get_start_sect(bdev) + dax->sector; struct brd_device *brd = bdev->bd_disk->private_data; struct page *page; @@ -391,8 +392,8 @@ static long brd_direct_access(struct block_device *bdev, sector_t sector, page = brd_insert_page(brd, sector); if (!page) return -ENOSPC; - *kaddr = (void __pmem *)page_address(page); - *pfn = page_to_pfn_t(page); + dax->addr = (void __pmem *)page_address(page); + dax->pfn = page_to_pfn_t(page); return PAGE_SIZE; } diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c index ca5721c..da10554 100644 --- a/drivers/nvdimm/pmem.c +++ b/drivers/nvdimm/pmem.c @@ -167,14 +167,15 @@ static int pmem_rw_page(struct block_device *bdev, sector_t sector, return rc; } -static long pmem_direct_access(struct block_device *bdev, sector_t sector, - void __pmem **kaddr, pfn_t *pfn) +static long pmem_direct_access(struct block_device *bdev, + struct blk_dax_ctl *dax) { + sector_t sector = get_start_sect(bdev) + dax->sector; struct pmem_device *pmem = bdev->bd_disk->private_data; resource_size_t offset = sector * 512 + pmem->data_offset; - *kaddr = pmem->virt_addr + offset; - *pfn = phys_to_pfn_t(pmem->phys_addr + offset, pmem->pfn_flags); + dax->addr = pmem->virt_addr + offset; + dax->pfn = phys_to_pfn_t(pmem->phys_addr + offset, pmem->pfn_flags); return pmem->size - pmem->pfn_pad - offset; } diff --git a/drivers/s390/block/dcssblk.c b/drivers/s390/block/dcssblk.c index 1bce9cf..5719c30 100644 --- a/drivers/s390/block/dcssblk.c +++ b/drivers/s390/block/dcssblk.c @@ -30,8 +30,8 @@ static int dcssblk_open(struct block_device *bdev, fmode_t mode); static void dcssblk_release(struct gendisk *disk, fmode_t mode); static blk_qc_t dcssblk_make_request(struct request_queue *q, struct bio *bio); -static long dcssblk_direct_access(struct block_device *bdev, sector_t secnum, - void __pmem **kaddr, pfn_t *pfn); +static long dcssblk_direct_access(struct block_device *bdev, + struct blk_dax_ctl *dax) static char dcssblk_segments[DCSSBLK_PARM_LEN] = "\0"; @@ -882,9 +882,9 @@ fail: } static long -dcssblk_direct_access (struct block_device *bdev, sector_t secnum, - void __pmem **kaddr, pfn_t *pfn) +dcssblk_direct_access(struct block_device *bdev, struct blk_dax_ctl *dax) { + sector_t secnum = get_start_sect(bdev) + dax->sector; struct dcssblk_dev_info *dev_info; unsigned long offset, dev_sz; @@ -893,8 +893,8 @@ dcssblk_direct_access (struct block_device *bdev, sector_t secnum, return -ENODEV; dev_sz = dev_info->end - dev_info->start; offset = secnum * 512; - *kaddr = (void __pmem *) (dev_info->start + offset); - *pfn = __pfn_to_pfn_t(PFN_DOWN(dev_info->start + offset), PFN_DEV); + dax->addr = (void __pmem *) (dev_info->start + offset); + dax->pfn = __pfn_to_pfn_t(PFN_DOWN(dev_info->start + offset), PFN_DEV); return dev_sz - offset; } diff --git a/fs/block_dev.c b/fs/block_dev.c index 3172c4e..c5837fa 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -488,7 +488,7 @@ long bdev_direct_access(struct block_device *bdev, struct blk_dax_ctl *dax) sector += get_start_sect(bdev); if (sector % (PAGE_SIZE / 512)) return -EINVAL; - avail = ops->direct_access(bdev, sector, &dax->addr, &dax->pfn); + avail = ops->direct_access(bdev, dax); if (!avail) return -ERANGE; if (avail > 0 && avail & ~PAGE_MASK) diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 7e5d7e0..92f8a1f 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -1656,8 +1656,7 @@ struct block_device_operations { int (*rw_page)(struct block_device *, sector_t, struct page *, int rw); int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); - long (*direct_access)(struct block_device *, sector_t, void __pmem **, - pfn_t *); + long (*direct_access)(struct block_device *, struct blk_dax_ctl *dax); unsigned int (*check_events) (struct gendisk *disk, unsigned int clearing); /* ->media_changed() is DEPRECATED, use ->check_events() instead */ -- 2.5.5 From vishal.l.verma@intel.com Tue Mar 29 21:00:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 057587CB0 for ; Tue, 29 Mar 2016 21:00:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C9694304059 for ; Tue, 29 Mar 2016 19:00:24 -0700 (PDT) X-ASG-Debug-ID: 1459303220-04cb6c2460125610001-NocioJ Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by cuda.sgi.com with ESMTP id qErb9flZ0MApx55I for ; Tue, 29 Mar 2016 19:00:20 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Apparent-Source-IP: 134.134.136.65 X-ASG-Whitelist: Client Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga103.jf.intel.com with ESMTP; 29 Mar 2016 19:00:11 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,414,1455004800"; d="scan'208";a="75601504" Received: from omniknight.lm.intel.com ([10.232.112.171]) by fmsmga004.fm.intel.com with ESMTP; 29 Mar 2016 19:00:11 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Vishal Verma , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dan Williams , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton , linux-kernel@vger.kernel.org, Christoph Hellwig Subject: [PATCH v2 0/5] dax: handling of media errors Date: Tue, 29 Mar 2016 19:59:45 -0600 X-ASG-Orig-Subj: [PATCH v2 0/5] dax: handling of media errors Message-Id: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 X-Barracuda-Connect: mga03.intel.com[134.134.136.65] X-Barracuda-Start-Time: 1459303220 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Until now, dax has been disabled if media errors were found on any device. This series attempts to address that. The first three patches from Dan re-enable dax even when media errors are present. The fourth patch from Matthew removes the zeroout path from dax entirely, making zeroout operations always go through the driver (The motivation is that if a backing device has media errors, and we create a sparse file on it, we don't want the initial zeroing to happen via dax, we want to give the block driver a chance to clear the errors). One pending item is addressing clear_pmem usages in dax.c. clear_pmem is 'unsafe' as it attempts to simply memcpy, and does not go through the driver. We have a few options of solving this: 1. Remove all usages of clear_pmem that are not sector-aligned. For the ones that are aligned, replace them with a bio submission that goes through the driver to clear errors. 2. Export from the block layer, either an API to zero sub-sector ranges, or in general, clear errors in a range. The dax attempts to clear_pmem can then use either of these and not be hit be media errors. I'll send out a v3 with a crack at option 1, but I wanted to get these changes (especially the ones in xfs) out for review. The fifth patch changes all the callers of dax_do_io to check for EIO, and fallback to direct_IO as needed. This forces the IO to go through the block driver, and can attempt to clear the error. v2: - Use blockdev_issue_zeroout in xfs instead of sb_issue_zeroout (Christoph) - Un-wrapper-ize dax_do_io and leave the fallback to direct_IO to callers (Christoph) - Rebase to v4.6-rc1 (fixup a couple of conflicts in ext4 and xfs) Dan Williams (3): block, dax: pass blk_dax_ctl through to drivers dax: fallback from pmd to pte on error dax: enable dax in the presence of known media errors (badblocks) Vishal Verma (2): dax: use sb_issue_zerout instead of calling dax_clear_sectors dax: handle media errors in dax_do_io arch/powerpc/sysdev/axonram.c | 10 +++++----- block/ioctl.c | 9 --------- drivers/block/brd.c | 9 +++++---- drivers/nvdimm/pmem.c | 17 +++++++++++++---- drivers/s390/block/dcssblk.c | 12 ++++++------ fs/block_dev.c | 19 +++++++++++++++---- fs/dax.c | 36 ++---------------------------------- fs/ext2/inode.c | 29 ++++++++++++++++++----------- fs/ext4/indirect.c | 18 +++++++++++++----- fs/ext4/inode.c | 21 ++++++++++++++------- fs/xfs/xfs_aops.c | 14 ++++++++++++-- fs/xfs/xfs_bmap_util.c | 15 ++++----------- include/linux/blkdev.h | 3 +-- include/linux/dax.h | 1 - 14 files changed, 108 insertions(+), 105 deletions(-) -- 2.5.5 From fengguang.wu@intel.com Tue Mar 29 22:01:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=FAKE_REPLY_C 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 3B77A7CA2 for ; Tue, 29 Mar 2016 22:01:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C794530404E for ; Tue, 29 Mar 2016 20:01:36 -0700 (PDT) X-ASG-Debug-ID: 1459306894-04bdf01103d68a0001-NocioJ Received: from mga04.intel.com ([192.55.52.120]) by cuda.sgi.com with ESMTP id POYybtVKbBv7Y3Xk for ; Tue, 29 Mar 2016 20:01:34 -0700 (PDT) X-Barracuda-Envelope-From: fengguang.wu@intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.120 X-ASG-Whitelist: Client Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga104.fm.intel.com with ESMTP; 29 Mar 2016 20:01:35 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,414,1455004800"; d="gz'50?scan'50,208,50";a="944161602" Received: from bee.sh.intel.com (HELO bee) ([10.239.97.14]) by orsmga002.jf.intel.com with ESMTP; 29 Mar 2016 20:01:31 -0700 Received: from kbuild by bee with local (Exim 4.83) (envelope-from ) id 1al6Nr-000Vl3-4h; Wed, 30 Mar 2016 11:01:27 +0800 Date: Wed, 30 Mar 2016 11:00:12 +0800 From: kbuild test robot To: Vishal Verma Cc: kbuild-all@01.org, linux-nvdimm@lists.01.org, Vishal Verma , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dan Williams , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton , linux-kernel@vger.kernel.org, Christoph Hellwig Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Message-ID: <201603301035.IXzhGMnJ%fengguang.wu@intel.com> X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="0OAP2g/MAC+5xKAE" Content-Disposition: inline In-Reply-To: <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: fengguang.wu@intel.com X-SA-Exim-Scanned: No (on bee); SAEximRunCond expanded to false X-Barracuda-Connect: UNKNOWN[192.55.52.120] X-Barracuda-Start-Time: 1459306894 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 --0OAP2g/MAC+5xKAE Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi Vishal, [auto build test WARNING on linux-nvdimm/libnvdimm-for-next] [also build test WARNING on v4.6-rc1 next-20160329] [cannot apply to xfs/for-next] [if your patch is applied to the wrong git tree, please drop us a note to help improving the system] url: https://github.com/0day-ci/linux/commits/Vishal-Verma/dax-handling-of-media-errors/20160330-100409 base: https://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm libnvdimm-for-next config: x86_64-randconfig-i0-03300245 (attached as .config) reproduce: # save the attached .config to linux build tree make ARCH=x86_64 Note: it may well be a FALSE warning. FWIW you are at least aware of it now. http://gcc.gnu.org/wiki/Better_Uninitialized_Warnings All warnings (new ones prefixed by >>): fs/ext4/indirect.c: In function 'ext4_ind_direct_IO': >> fs/ext4/indirect.c:719:11: warning: 'ret_saved' may be used uninitialized in this function [-Wmaybe-uninitialized] ssize_t ret_saved = 0; ^ vim +/ret_saved +719 fs/ext4/indirect.c 703 smp_mb(); 704 if (unlikely(ext4_test_inode_state(inode, 705 EXT4_STATE_DIOREAD_LOCK))) { 706 inode_dio_end(inode); 707 goto locked; 708 } 709 if (IS_DAX(inode)) 710 ret = dax_do_io(iocb, inode, iter, offset, 711 ext4_dio_get_block, NULL, 0); 712 else 713 ret = __blockdev_direct_IO(iocb, inode, 714 inode->i_sb->s_bdev, iter, 715 offset, ext4_dio_get_block, 716 NULL, NULL, 0); 717 inode_dio_end(inode); 718 } else { > 719 ssize_t ret_saved = 0; 720 721 locked: 722 if (IS_DAX(inode)) { 723 ret = dax_do_io(iocb, inode, iter, offset, 724 ext4_dio_get_block, NULL, DIO_LOCKING); 725 if (ret == -EIO && iov_iter_rw(iter) == WRITE) 726 ret_saved = ret; 727 else --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation --0OAP2g/MAC+5xKAE Content-Type: application/octet-stream Content-Disposition: attachment; filename=".config.gz" Content-Transfer-Encoding: base64 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 vsF4siRtKPzt/750YrcOyAEA --0OAP2g/MAC+5xKAE-- From fengguang.wu@intel.com Tue Mar 29 23:21:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=FAKE_REPLY_C 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 71BFE7CA3 for ; Tue, 29 Mar 2016 23:21:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 33E708F8035 for ; Tue, 29 Mar 2016 21:21:00 -0700 (PDT) X-ASG-Debug-ID: 1459311659-04cb6c2464128950001-NocioJ Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by cuda.sgi.com with ESMTP id xanFoIIQD5fcfMfv for ; Tue, 29 Mar 2016 21:20:59 -0700 (PDT) X-Barracuda-Envelope-From: fengguang.wu@intel.com X-Barracuda-Apparent-Source-IP: 134.134.136.20 X-ASG-Whitelist: Client Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga101.jf.intel.com with ESMTP; 29 Mar 2016 21:20:58 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,414,1455004800"; d="gz'50?scan'50,208,50";a="944194412" Received: from bee.sh.intel.com (HELO bee) ([10.239.97.14]) by orsmga002.jf.intel.com with ESMTP; 29 Mar 2016 21:20:55 -0700 Received: from kbuild by bee with local (Exim 4.83) (envelope-from ) id 1al7cg-000LVp-Su; Wed, 30 Mar 2016 12:20:50 +0800 Date: Wed, 30 Mar 2016 12:19:44 +0800 From: kbuild test robot To: Vishal Verma Cc: kbuild-all@01.org, linux-nvdimm@lists.01.org, Dan Williams , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton , linux-kernel@vger.kernel.org, Christoph Hellwig Subject: Re: [PATCH v2 1/5] block, dax: pass blk_dax_ctl through to drivers Message-ID: <201603301229.Pj7DWz3a%fengguang.wu@intel.com> X-ASG-Orig-Subj: Re: [PATCH v2 1/5] block, dax: pass blk_dax_ctl through to drivers MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="ew6BAiZeqk4r7MaW" Content-Disposition: inline In-Reply-To: <1459303190-20072-2-git-send-email-vishal.l.verma@intel.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: fengguang.wu@intel.com X-SA-Exim-Scanned: No (on bee); SAEximRunCond expanded to false X-Barracuda-Connect: mga02.intel.com[134.134.136.20] X-Barracuda-Start-Time: 1459311659 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 --ew6BAiZeqk4r7MaW Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi Dan, [auto build test ERROR on linux-nvdimm/libnvdimm-for-next] [also build test ERROR on v4.6-rc1 next-20160329] [cannot apply to xfs/for-next] [if your patch is applied to the wrong git tree, please drop us a note to help improving the system] url: https://github.com/0day-ci/linux/commits/Vishal-Verma/dax-handling-of-media-errors/20160330-100409 base: https://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm libnvdimm-for-next config: s390-default_defconfig (attached as .config) reproduce: wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=s390 All error/warnings (new ones prefixed by >>): drivers/s390/block/dcssblk.c: In function 'dcssblk_direct_access': >> drivers/s390/block/dcssblk.c:36:13: error: storage class specified for parameter 'dcssblk_segments' static char dcssblk_segments[DCSSBLK_PARM_LEN] = "\0"; ^ >> drivers/s390/block/dcssblk.c:36:1: error: parameter 'dcssblk_segments' is initialized static char dcssblk_segments[DCSSBLK_PARM_LEN] = "\0"; ^ >> drivers/s390/block/dcssblk.c:38:12: error: storage class specified for parameter 'dcssblk_major' static int dcssblk_major; ^ >> drivers/s390/block/dcssblk.c:39:45: error: storage class specified for parameter 'dcssblk_devops' static const struct block_device_operations dcssblk_devops = { ^ >> drivers/s390/block/dcssblk.c:39:21: error: parameter 'dcssblk_devops' is initialized static const struct block_device_operations dcssblk_devops = { ^ >> drivers/s390/block/dcssblk.c:46:1: warning: empty declaration struct dcssblk_dev_info { ^ drivers/s390/block/dcssblk.c:62:1: warning: empty declaration struct segment_info { ^ >> drivers/s390/block/dcssblk.c:70:16: error: storage class specified for parameter 'dcssblk_add_store' static ssize_t dcssblk_add_store(struct device * dev, struct device_attribute *attr, const char * buf, ^ >> drivers/s390/block/dcssblk.c:72:16: error: storage class specified for parameter 'dcssblk_remove_store' static ssize_t dcssblk_remove_store(struct device * dev, struct device_attribute *attr, const char * buf, ^ In file included from include/linux/genhd.h:63:0, from include/linux/blkdev.h:9, from drivers/s390/block/dcssblk.c:16: >> include/linux/device.h:575:26: error: storage class specified for parameter 'dev_attr_add' struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store) ^ >> drivers/s390/block/dcssblk.c:75:8: note: in expansion of macro 'DEVICE_ATTR' static DEVICE_ATTR(add, S_IWUSR, NULL, dcssblk_add_store); ^ >> include/linux/device.h:575:9: error: parameter 'dev_attr_add' is initialized struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store) ^ >> drivers/s390/block/dcssblk.c:75:8: note: in expansion of macro 'DEVICE_ATTR' static DEVICE_ATTR(add, S_IWUSR, NULL, dcssblk_add_store); ^ >> include/linux/device.h:575:26: error: storage class specified for parameter 'dev_attr_remove' struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store) ^ drivers/s390/block/dcssblk.c:76:8: note: in expansion of macro 'DEVICE_ATTR' static DEVICE_ATTR(remove, S_IWUSR, NULL, dcssblk_remove_store); ^ >> include/linux/device.h:575:9: error: parameter 'dev_attr_remove' is initialized struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store) ^ drivers/s390/block/dcssblk.c:76:8: note: in expansion of macro 'DEVICE_ATTR' static DEVICE_ATTR(remove, S_IWUSR, NULL, dcssblk_remove_store); ^ >> drivers/s390/block/dcssblk.c:78:23: error: storage class specified for parameter 'dcssblk_root_dev' static struct device *dcssblk_root_dev; ^ In file included from include/linux/module.h:9:0, from drivers/s390/block/dcssblk.c:10: >> drivers/s390/block/dcssblk.c:80:18: error: storage class specified for parameter 'dcssblk_devices' static LIST_HEAD(dcssblk_devices); ^ include/linux/list.h:23:19: note: in definition of macro 'LIST_HEAD' struct list_head name = LIST_HEAD_INIT(name) ^ >> include/linux/list.h:23:9: error: parameter 'dcssblk_devices' is initialized struct list_head name = LIST_HEAD_INIT(name) ^ >> drivers/s390/block/dcssblk.c:80:8: note: in expansion of macro 'LIST_HEAD' static LIST_HEAD(dcssblk_devices); ^ >> drivers/s390/block/dcssblk.c:81:28: error: storage class specified for parameter 'dcssblk_devices_sem' static struct rw_semaphore dcssblk_devices_sem; ^ >> drivers/s390/block/dcssblk.c:88:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token { ^ drivers/s390/block/dcssblk.c:109:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token { ^ drivers/s390/block/dcssblk.c:136:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token { ^ drivers/s390/block/dcssblk.c:154:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token { ^ drivers/s390/block/dcssblk.c:172:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token { ^ drivers/s390/block/dcssblk.c:189:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token { ^ drivers/s390/block/dcssblk.c:213:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token { ^ drivers/s390/block/dcssblk.c:279:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token { ^ drivers/s390/block/dcssblk.c:315:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token { ^ drivers/s390/block/dcssblk.c:324:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token { ^ In file included from include/linux/genhd.h:63:0, from include/linux/blkdev.h:9, from drivers/s390/block/dcssblk.c:16: vim +/dcssblk_segments +36 drivers/s390/block/dcssblk.c ^1da177e Linus Torvalds 2005-04-16 23 ^1da177e Linus Torvalds 2005-04-16 24 #define DCSSBLK_NAME "dcssblk" ^1da177e Linus Torvalds 2005-04-16 25 #define DCSSBLK_MINORS_PER_DISK 1 ^1da177e Linus Torvalds 2005-04-16 26 #define DCSSBLK_PARM_LEN 400 98df67b3 Kay Sievers 2008-12-25 27 #define DCSS_BUS_ID_SIZE 20 ^1da177e Linus Torvalds 2005-04-16 28 46d74326 Al Viro 2008-03-02 @29 static int dcssblk_open(struct block_device *bdev, fmode_t mode); db2a144b Al Viro 2013-05-05 @30 static void dcssblk_release(struct gendisk *disk, fmode_t mode); dece1635 Jens Axboe 2015-11-05 31 static blk_qc_t dcssblk_make_request(struct request_queue *q, dece1635 Jens Axboe 2015-11-05 32 struct bio *bio); e3cb53fb Dan Williams 2016-03-29 @33 static long dcssblk_direct_access(struct block_device *bdev, e3cb53fb Dan Williams 2016-03-29 34 struct blk_dax_ctl *dax) ^1da177e Linus Torvalds 2005-04-16 35 ^1da177e Linus Torvalds 2005-04-16 @36 static char dcssblk_segments[DCSSBLK_PARM_LEN] = "\0"; ^1da177e Linus Torvalds 2005-04-16 37 ^1da177e Linus Torvalds 2005-04-16 @38 static int dcssblk_major; 83d5cde4 Alexey Dobriyan 2009-09-21 @39 static const struct block_device_operations dcssblk_devops = { ^1da177e Linus Torvalds 2005-04-16 40 .owner = THIS_MODULE, 46d74326 Al Viro 2008-03-02 41 .open = dcssblk_open, 46d74326 Al Viro 2008-03-02 42 .release = dcssblk_release, 420edbcc Carsten Otte 2005-06-23 43 .direct_access = dcssblk_direct_access, ^1da177e Linus Torvalds 2005-04-16 44 }; ^1da177e Linus Torvalds 2005-04-16 45 b2300b9e Hongjie Yang 2008-10-10 @46 struct dcssblk_dev_info { b2300b9e Hongjie Yang 2008-10-10 47 struct list_head lh; b2300b9e Hongjie Yang 2008-10-10 48 struct device dev; 98df67b3 Kay Sievers 2008-12-25 49 char segment_name[DCSS_BUS_ID_SIZE]; b2300b9e Hongjie Yang 2008-10-10 50 atomic_t use_count; b2300b9e Hongjie Yang 2008-10-10 51 struct gendisk *gd; b2300b9e Hongjie Yang 2008-10-10 52 unsigned long start; b2300b9e Hongjie Yang 2008-10-10 53 unsigned long end; b2300b9e Hongjie Yang 2008-10-10 54 int segment_type; b2300b9e Hongjie Yang 2008-10-10 55 unsigned char save_pending; b2300b9e Hongjie Yang 2008-10-10 56 unsigned char is_shared; b2300b9e Hongjie Yang 2008-10-10 57 struct request_queue *dcssblk_queue; b2300b9e Hongjie Yang 2008-10-10 58 int num_of_segments; b2300b9e Hongjie Yang 2008-10-10 59 struct list_head seg_list; b2300b9e Hongjie Yang 2008-10-10 60 }; b2300b9e Hongjie Yang 2008-10-10 61 b2300b9e Hongjie Yang 2008-10-10 62 struct segment_info { b2300b9e Hongjie Yang 2008-10-10 63 struct list_head lh; 98df67b3 Kay Sievers 2008-12-25 64 char segment_name[DCSS_BUS_ID_SIZE]; b2300b9e Hongjie Yang 2008-10-10 65 unsigned long start; b2300b9e Hongjie Yang 2008-10-10 66 unsigned long end; b2300b9e Hongjie Yang 2008-10-10 67 int segment_type; b2300b9e Hongjie Yang 2008-10-10 68 }; b2300b9e Hongjie Yang 2008-10-10 69 e404e274 Yani Ioannou 2005-05-17 @70 static ssize_t dcssblk_add_store(struct device * dev, struct device_attribute *attr, const char * buf, ^1da177e Linus Torvalds 2005-04-16 71 size_t count); e404e274 Yani Ioannou 2005-05-17 @72 static ssize_t dcssblk_remove_store(struct device * dev, struct device_attribute *attr, const char * buf, ^1da177e Linus Torvalds 2005-04-16 73 size_t count); ^1da177e Linus Torvalds 2005-04-16 74 ^1da177e Linus Torvalds 2005-04-16 @75 static DEVICE_ATTR(add, S_IWUSR, NULL, dcssblk_add_store); ^1da177e Linus Torvalds 2005-04-16 @76 static DEVICE_ATTR(remove, S_IWUSR, NULL, dcssblk_remove_store); ^1da177e Linus Torvalds 2005-04-16 77 ^1da177e Linus Torvalds 2005-04-16 @78 static struct device *dcssblk_root_dev; ^1da177e Linus Torvalds 2005-04-16 79 c11ca97e Denis Cheng 2008-01-26 @80 static LIST_HEAD(dcssblk_devices); ^1da177e Linus Torvalds 2005-04-16 @81 static struct rw_semaphore dcssblk_devices_sem; ^1da177e Linus Torvalds 2005-04-16 82 ^1da177e Linus Torvalds 2005-04-16 83 /* ^1da177e Linus Torvalds 2005-04-16 84 * release function for segment device. ^1da177e Linus Torvalds 2005-04-16 85 */ ^1da177e Linus Torvalds 2005-04-16 86 static void ^1da177e Linus Torvalds 2005-04-16 87 dcssblk_release_segment(struct device *dev) ^1da177e Linus Torvalds 2005-04-16 @88 { b2300b9e Hongjie Yang 2008-10-10 89 struct dcssblk_dev_info *dev_info; b2300b9e Hongjie Yang 2008-10-10 90 struct segment_info *entry, *temp; b2300b9e Hongjie Yang 2008-10-10 91 :::::: The code at line 36 was first introduced by commit :::::: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 Linux-2.6.12-rc2 :::::: TO: Linus Torvalds :::::: CC: Linus Torvalds --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation --ew6BAiZeqk4r7MaW Content-Type: application/octet-stream Content-Disposition: attachment; filename=".config.gz" Content-Transfer-Encoding: base64 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 --ew6BAiZeqk4r7MaW-- From BATV+ce0ae62d478fb9371428+4602+infradead.org+hch@bombadil.srs.infradead.org Wed Mar 30 01:34:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 800757CA7 for ; Wed, 30 Mar 2016 01:34:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5068030404E for ; Tue, 29 Mar 2016 23:34:23 -0700 (PDT) X-ASG-Debug-ID: 1459319661-04cbb07ad6122cc0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id S2KBh6gPydubsAt7 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 29 Mar 2016 23:34:21 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ce0ae62d478fb9371428+4602+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 1al9hn-0000Yx-E4; Wed, 30 Mar 2016 06:34:15 +0000 Date: Tue, 29 Mar 2016 23:34:15 -0700 From: Christoph Hellwig To: Vishal Verma Cc: linux-nvdimm@ml01.01.org, linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dan Williams , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton , linux-kernel@vger.kernel.org, Christoph Hellwig Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Message-ID: <20160330063415.GA2132@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1459319661 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28291 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Hi Vishal, still NAK to calling the direct I/O code directly from the dax code. From vishal@kernel.org Wed Mar 30 01:54:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C26357CB0 for ; Wed, 30 Mar 2016 01:54:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 81A9F8F8037 for ; Tue, 29 Mar 2016 23:54:43 -0700 (PDT) X-ASG-Debug-ID: 1459320881-04cb6c246212bb00001-NocioJ Received: from mail.kernel.org ([198.145.29.136]) by cuda.sgi.com with ESMTP id dH7qtPPb2CBiNcmv (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 29 Mar 2016 23:54:41 -0700 (PDT) X-Barracuda-Envelope-From: vishal@kernel.org X-Barracuda-Apparent-Source-IP: 198.145.29.136 Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 8F2F02035B; Wed, 30 Mar 2016 06:54:40 +0000 (UTC) Received: from gamestarV3L (184-99-237-189.hlrn.qwest.net [184.99.237.189]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id DEDC420357; Wed, 30 Mar 2016 06:54:38 +0000 (UTC) Message-ID: <1459320877.4102.3.camel@kernel.org> Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io From: Vishal Verma X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io To: Christoph Hellwig , Vishal Verma Cc: Jens Axboe , Jan Kara , Andrew Morton , linux-nvdimm@ml01.01.org, Dave Chinner , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-block@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, Al Viro Date: Wed, 30 Mar 2016 00:54:37 -0600 In-Reply-To: <20160330063415.GA2132@infradead.org> References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <20160330063415.GA2132@infradead.org> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.18.5.1 (3.18.5.1-1.fc23) Mime-Version: 1.0 Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV using ClamSMTP X-Barracuda-Connect: UNKNOWN[198.145.29.136] X-Barracuda-Start-Time: 1459320881 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28292 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, 2016-03-29 at 23:34 -0700, Christoph Hellwig wrote: > Hi Vishal, > > still NAK to calling the direct I/O code directly from the dax code. Hm, I thought this was what you meant -- do the fallback/retry attempts at the callers of dax_do_io instead of the new dax wrapper function.. Did I misunderstand you? From BATV+ce0ae62d478fb9371428+4602+infradead.org+hch@bombadil.srs.infradead.org Wed Mar 30 01:56:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B07E67CB2 for ; Wed, 30 Mar 2016 01:56:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 42128AC005 for ; Tue, 29 Mar 2016 23:56:52 -0700 (PDT) X-ASG-Debug-ID: 1459321010-04bdf01103db8c0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id dYj3HUPDAO1pyIq0 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 29 Mar 2016 23:56:50 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ce0ae62d478fb9371428+4602+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 1alA3a-0003WE-FT; Wed, 30 Mar 2016 06:56:46 +0000 Date: Tue, 29 Mar 2016 23:56:46 -0700 From: Christoph Hellwig To: Vishal Verma Cc: Christoph Hellwig , Vishal Verma , linux-block@vger.kernel.org, Jan Kara , linux-nvdimm@ml01.01.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Jens Axboe , linux-mm@kvack.org, Matthew Wilcox , linux-fsdevel@vger.kernel.org, Andrew Morton , linux-ext4@vger.kernel.org, Al Viro Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Message-ID: <20160330065646.GA13123@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <20160330063415.GA2132@infradead.org> <1459320877.4102.3.camel@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459320877.4102.3.camel@kernel.org> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1459321010 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28292 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Mar 30, 2016 at 12:54:37AM -0600, Vishal Verma wrote: > On Tue, 2016-03-29 at 23:34 -0700, Christoph Hellwig wrote: > > Hi Vishal, > > > > still NAK to calling the direct I/O code directly from the dax code. > > Hm, I thought this was what you meant -- do the fallback/retry attempts > at the callers of dax_do_io instead of the new dax wrapper function.. > Did I misunderstand you? Sorry, it is. I misread fs/block_dev.c as fs/dax.c before my first coffee this morning. I'll properly review the series in the afternoon.. From jack@suse.cz Wed Mar 30 02:49:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id ECFF07CB4 for ; Wed, 30 Mar 2016 02:49:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id BF4178F8039 for ; Wed, 30 Mar 2016 00:49:03 -0700 (PDT) X-ASG-Debug-ID: 1459324137-04cbb07ad61247b0001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id aHqB0nZA2lipOXSE (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 30 Mar 2016 00:48:58 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 3DD69AB9D; Wed, 30 Mar 2016 07:48:55 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id EA5508251E; Wed, 30 Mar 2016 09:49:26 +0200 (CEST) Date: Wed, 30 Mar 2016 09:49:26 +0200 From: Jan Kara To: "Verma, Vishal L" Cc: "Williams, Dan J" , "linux-block@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "axboe@fb.com" , "akpm@linux-foundation.org" , "linux-nvdimm@lists.01.org" , "linux-fsdevel@vger.kernel.org" , "ross.zwisler@linux.intel.com" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" , "david@fromorbit.com" , "jack@suse.cz" Subject: Re: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors Message-ID: <20160330074926.GC12776@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors References: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> <1458861450-17705-5-git-send-email-vishal.l.verma@intel.com> <1458939796.5501.8.camel@intel.com> <1459195288.15523.3.camel@intel.com> <1459277829.6412.3.camel@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1459277829.6412.3.camel@intel.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1459324137 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28293 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue 29-03-16 18:57:16, Verma, Vishal L wrote: > On Mon, 2016-03-28 at 16:34 -0700, Dan Williams wrote: > > <> > > > Seems kind of sad to fail the fault due to a bad block when we were > > going to zero it anyway, right?  I'm not seeing a compelling reason to > > keep any zeroing in fs/dax.c. > > Agreed - but how do we do this? clear_pmem needs to be able to clear an > arbitrary number of bytes, but to go through the driver, we'd need to > send down a bio? If only the driver had an rw_bytes like interface that > could be used by anyone... :) Actually, my patches for page fault locking remove zeroing from dax_insert_mapping() and __dax_pmd_fault() - the zeroing now happens from the filesystem only and the zeroing in those two functions is just a dead code... Honza -- Jan Kara SUSE Labs, CR From eguan@redhat.com Wed Mar 30 02:57:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 924DF7CB0 for ; Wed, 30 Mar 2016 02:57:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 51081304062 for ; Wed, 30 Mar 2016 00:57:08 -0700 (PDT) X-ASG-Debug-ID: 1459324626-04bdf01104dcc70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id KbqQ0GELgPV8FD4C (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 30 Mar 2016 00:57:07 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id AE10678224; Wed, 30 Mar 2016 07:57:06 +0000 (UTC) Received: from localhost (dhcp-12-128.nay.redhat.com [10.66.12.128]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2U7v31R001475; Wed, 30 Mar 2016 03:57:04 -0400 From: Eryu Guan To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com, darrick.wong@oracle.com, Eryu Guan Subject: [PATCH] xfs/206: filter out reflink related outputs Date: Wed, 30 Mar 2016 15:56:49 +0800 X-ASG-Orig-Subj: [PATCH] xfs/206: filter out reflink related outputs Message-Id: <1459324609-5531-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1459324627 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Commit 13717ffc96fe ("xfs/206: fix output when mkfs knows about reflink") added extra lines to xfs/206.out to fit the mkfs output with reflink support, but broke tests without reflink support. Fix it by filtering out reflink related outputs, just like filtering out crc related outputs in the test. Signed-off-by: Eryu Guan --- Tested with v4.5 xfsprogs as well as Darrick's xfsprogs (for-dave-for-4.6 branch) with reflink support. https://github.com/djwong/xfsprogs.git tests/xfs/206 | 2 +- tests/xfs/206.out | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/xfs/206 b/tests/xfs/206 index 24e690a..d549a4c 100755 --- a/tests/xfs/206 +++ b/tests/xfs/206 @@ -80,7 +80,7 @@ mkfs_filter() -e "s/\(^log.*blocks=\)\([0-9]*,\)/\1XXXXX,/" \ -e "s/, projid32bit=[0-9]//" \ -e "s/ ftype=[0-9]//" \ - -e "s/ reflink=[0-9]//" \ + -e "/.*reflink=/d" \ -e "s/\(sectsz\)\(=[0-9]* *\)/\1=512 /" \ -e "s/\(sunit=\)\([0-9]* blks,\)/\10 blks,/" \ -e "s/, lazy-count=[0-9]//" \ diff --git a/tests/xfs/206.out b/tests/xfs/206.out index e73a954..2db839d 100644 --- a/tests/xfs/206.out +++ b/tests/xfs/206.out @@ -12,7 +12,6 @@ realtime =none extsz=4096 blocks=0, rtextents=0 === xfs_growfs === meta-data=FILE isize=N agcount=52, agsize=76288719 blks = sectsz=512 attr=2 - = data = bsize=4096 blocks=3905982455, imaxpct=5 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 @@ -23,7 +22,6 @@ data blocks changed from 3905982455 to 4882478016 === xfs_info === meta-data=FILE isize=N agcount=64, agsize=76288719 blks = sectsz=512 attr=2 - = data = bsize=4096 blocks=4882478016, imaxpct=5 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 -- 2.5.5 From eguan@redhat.com Wed Mar 30 04:58:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 565A67CA2 for ; Wed, 30 Mar 2016 04:58:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9B7C5AC005 for ; Wed, 30 Mar 2016 02:58:11 -0700 (PDT) X-ASG-Debug-ID: 1459331888-04cb6c2460131090001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id iTPpmGkRGABNJvx8 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 30 Mar 2016 02:58:09 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 8296985542; Wed, 30 Mar 2016 09:58:08 +0000 (UTC) Received: from localhost (dhcp-12-128.nay.redhat.com [10.66.12.128]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2U9w6Q5031630; Wed, 30 Mar 2016 05:58:07 -0400 From: Eryu Guan To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com, darrick.wong@oracle.com, Eryu Guan Subject: [PATCH] xfs/030: link .out file according to reflink support status Date: Wed, 30 Mar 2016 17:57:41 +0800 X-ASG-Orig-Subj: [PATCH] xfs/030: link .out file according to reflink support status Message-Id: <1459331861-15025-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1459331889 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Commit 31f48569c353 ("xfs/030: fix output on newer filesystems") added more lines to .out file to match the output from XFS with reflink support, but it broke test on older XFS. Fix it by introducing new .out file 030.out.reflink.linux to match the reflink case, so old XFS still compares .out file against 030.out.linux. In order to do this, a new helper is introduced, _fs_has_reflink() accepts mount point as argument and returns if the underlying fs supports reflink or not. Signed-off-by: Eryu Guan --- I didn't test this patch on newer XFS, but it did pass for me on current 4.6-rc1 kernel. common/reflink | 18 +++ tests/xfs/030 | 12 +- tests/xfs/030.cfg | 1 + tests/xfs/030.out.linux | 2 - tests/xfs/030.out.reflink.linux | 252 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 280 insertions(+), 5 deletions(-) create mode 100644 tests/xfs/030.out.reflink.linux diff --git a/common/reflink b/common/reflink index 4ec390d..bdfc01c 100644 --- a/common/reflink +++ b/common/reflink @@ -156,6 +156,24 @@ _cp_reflink() { cp --reflink=always -p "$file1" "$file2" } +# given a mount point and test the underlying fs supports reflink or not +_fs_has_reflink() +{ + if [ -z $1 ] || [ ! -d $1 ]; then + echo "Missing mount point argument for _fs_has_reflink()" + exit 1 + fi + local src=$1/_fs_has_reflink_testfile + local tgt=$src.reflink + local ret=0 + + echo "reflink test" > $src + _cp_reflink $src $tgt >/dev/null 2>&1 + ret=$? + rm -f $src $tgt >/dev/null 2>&1 + return $ret +} + # Reflink some file1 into file2 _reflink() { file1="$1" diff --git a/tests/xfs/030 b/tests/xfs/030 index 33c906c..d171a39 100755 --- a/tests/xfs/030 +++ b/tests/xfs/030 @@ -44,9 +44,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common/rc . ./common/filter . ./common/repair - -# link correct .out file -_link_out_file +. ./common/reflink # nuke the superblock, AGI, AGF, AGFL; then try repair the damage # @@ -90,6 +88,14 @@ else _notrun "GQuota are enabled, test needs controlled sb recovery" src/feature -P $SCRATCH_DEV && \ _notrun "PQuota are enabled, test needs controlled sb recovery" + + # link correct .out file + features=`_get_os_name` + if _fs_has_reflink $SCRATCH_MNT; then + features=$feature,reflink + fi + _link_out_file_named $seqfull.out "$features" + _scratch_unmount fi clear="" diff --git a/tests/xfs/030.cfg b/tests/xfs/030.cfg index 7ffdfc0..1eacdc1 100644 --- a/tests/xfs/030.cfg +++ b/tests/xfs/030.cfg @@ -1,2 +1,3 @@ irix: irix +linux,reflink: reflink.linux linux: linux diff --git a/tests/xfs/030.out.linux b/tests/xfs/030.out.linux index 14b9b35..cf3259f 100644 --- a/tests/xfs/030.out.linux +++ b/tests/xfs/030.out.linux @@ -231,8 +231,6 @@ bad agbno AGBNO in agfl, agno 0 bad agbno AGBNO in agfl, agno 0 bad agbno AGBNO in agfl, agno 0 bad agbno AGBNO in agfl, agno 0 -bad agbno AGBNO in agfl, agno 0 -bad agbno AGBNO in agfl, agno 0 - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... diff --git a/tests/xfs/030.out.reflink.linux b/tests/xfs/030.out.reflink.linux new file mode 100644 index 0000000..14b9b35 --- /dev/null +++ b/tests/xfs/030.out.reflink.linux @@ -0,0 +1,252 @@ +QA output created by 030 +meta-data=DDEV isize=XXX agcount=N, agsize=XXX blks +data = bsize=XXX blocks=XXX, imaxpct=PCT + = sunit=XXX swidth=XXX, unwritten=X +naming =VERN bsize=XXX +log =LDEV bsize=XXX blocks=XXX +realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX +Corrupting sb 0 - setting bits to 0 +Wrote X.XXKb (value 0x0) +Phase 1 - find and verify superblock... +bad primary superblock - bad magic number !!! + +attempting to find secondary superblock... +found candidate secondary superblock... +verified secondary superblock... +writing modified primary superblock +sb root inode value INO inconsistent with calculated value INO +resetting superblock root inode pointer to INO +sb realtime bitmap inode INO inconsistent with calculated value INO +resetting superblock realtime bitmap ino pointer to INO +sb realtime summary inode INO inconsistent with calculated value INO +resetting superblock realtime summary ino pointer to INO +Phase 2 - using 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... + - process newly discovered inodes... +Phase 4 - check for duplicate blocks... + - setting up duplicate extent list... + - check for inodes claiming duplicate blocks... +Phase 5 - rebuild AG headers and trees... + - reset superblock... +Phase 6 - check inode connectivity... + - resetting contents of realtime bitmap and summary inodes + - traversing filesystem ... + - traversal finished ... + - moving disconnected inodes to lost+found ... +Phase 7 - verify and correct link counts... +Note - stripe unit (0) and width (0) fields have been reset. +Please set with mount -o sunit=,swidth= +done +Corrupting agf 0 - setting bits to 0 +Wrote X.XXKb (value 0x0) +Phase 1 - find and verify superblock... +Phase 2 - using log + - zero log... + - scan filesystem freespace and inode maps... +bad magic # 0x0 for agf 0 +bad version # 0 for agf 0 +bad length 0 for agf 0, should be LENGTH +reset bad agf for ag 0 +bad agbno AGBNO for btbno root, agno 0 +bad agbno AGBNO for btbcnt root, agno 0 + - found root inode chunk +Phase 3 - for each AG... + - scan and clear agi unlinked lists... + - process known inodes and perform inode discovery... + - process newly discovered inodes... +Phase 4 - check for duplicate blocks... + - setting up duplicate extent list... + - check for inodes claiming duplicate blocks... +Phase 5 - rebuild AG headers and trees... + - reset superblock... +Phase 6 - check inode connectivity... + - resetting contents of realtime bitmap and summary inodes + - traversing filesystem ... + - traversal finished ... + - moving disconnected inodes to lost+found ... +Phase 7 - verify and correct link counts... +done +Corrupting agi 0 - setting bits to 0 +Wrote X.XXKb (value 0x0) +Phase 1 - find and verify superblock... +Phase 2 - using log + - zero log... + - scan filesystem freespace and inode maps... +bad magic # 0x0 for agi 0 +bad version # 0 for agi 0 +bad length # 0 for agi 0, should be LENGTH +reset bad agi for ag 0 +bad agbno AGBNO for inobt root, agno 0 +root inode chunk not found +Phase 3 - for each AG... + - scan and clear agi unlinked lists... + - process known inodes and perform inode discovery... + - process newly discovered inodes... +Phase 4 - check for duplicate blocks... + - setting up duplicate extent list... + - check for inodes claiming duplicate blocks... +Phase 5 - rebuild AG headers and trees... + - reset superblock... +Phase 6 - check inode connectivity... + - resetting contents of realtime bitmap and summary inodes + - traversing filesystem ... + - traversal finished ... + - moving disconnected inodes to lost+found ... +Phase 7 - verify and correct link counts... +done +Corrupting agfl 0 - setting bits to 0 +Wrote X.XXKb (value 0x0) +Phase 1 - find and verify superblock... +Phase 2 - using 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... + - process newly discovered inodes... +Phase 4 - check for duplicate blocks... + - setting up duplicate extent list... + - check for inodes claiming duplicate blocks... +Phase 5 - rebuild AG headers and trees... + - reset superblock... +Phase 6 - check inode connectivity... + - resetting contents of realtime bitmap and summary inodes + - traversing filesystem ... + - traversal finished ... + - moving disconnected inodes to lost+found ... +Phase 7 - verify and correct link counts... +done +Corrupting sb 0 - setting bits to -1 +Wrote X.XXKb (value 0xffffffff) +Phase 1 - find and verify superblock... +bad primary superblock - bad magic number !!! + +attempting to find secondary superblock... +found candidate secondary superblock... +verified secondary superblock... +writing modified primary superblock +sb root inode value INO inconsistent with calculated value INO +resetting superblock root inode pointer to INO +sb realtime bitmap inode INO inconsistent with calculated value INO +resetting superblock realtime bitmap ino pointer to INO +sb realtime summary inode INO inconsistent with calculated value INO +resetting superblock realtime summary ino pointer to INO +Phase 2 - using 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... + - process newly discovered inodes... +Phase 4 - check for duplicate blocks... + - setting up duplicate extent list... + - check for inodes claiming duplicate blocks... +Phase 5 - rebuild AG headers and trees... + - reset superblock... +Phase 6 - check inode connectivity... + - resetting contents of realtime bitmap and summary inodes + - traversing filesystem ... + - traversal finished ... + - moving disconnected inodes to lost+found ... +Phase 7 - verify and correct link counts... +Note - stripe unit (0) and width (0) fields have been reset. +Please set with mount -o sunit=,swidth= +done +Corrupting agf 0 - setting bits to -1 +Wrote X.XXKb (value 0xffffffff) +Phase 1 - find and verify superblock... +Phase 2 - using log + - zero log... + - scan filesystem freespace and inode maps... +bad magic # 0xffffffff for agf 0 +bad version # -1 for agf 0 +bad sequence # -1 for agf 0 +bad length -1 for agf 0, should be LENGTH +flfirst -1 in agf 0 too large (max = MAX) +fllast -1 in agf 0 too large (max = MAX) +reset bad agf for ag 0 +freeblk count 1 != flcount -1 in ag 0 +bad agbno AGBNO for btbno root, agno 0 +bad agbno AGBNO for btbcnt root, agno 0 + - found root inode chunk +Phase 3 - for each AG... + - scan and clear agi unlinked lists... + - process known inodes and perform inode discovery... + - process newly discovered inodes... +Phase 4 - check for duplicate blocks... + - setting up duplicate extent list... + - check for inodes claiming duplicate blocks... +Phase 5 - rebuild AG headers and trees... + - reset superblock... +Phase 6 - check inode connectivity... + - resetting contents of realtime bitmap and summary inodes + - traversing filesystem ... + - traversal finished ... + - moving disconnected inodes to lost+found ... +Phase 7 - verify and correct link counts... +done +Corrupting agi 0 - setting bits to -1 +Wrote X.XXKb (value 0xffffffff) +Phase 1 - find and verify superblock... +Phase 2 - using log + - zero log... + - scan filesystem freespace and inode maps... +bad magic # 0xffffffff for agi 0 +bad version # -1 for agi 0 +bad sequence # -1 for agi 0 +bad length # -1 for agi 0, should be LENGTH +reset bad agi for ag 0 +bad agbno AGBNO for inobt root, agno 0 +root inode chunk not found +Phase 3 - for each AG... + - scan and clear agi unlinked lists... + - process known inodes and perform inode discovery... + - process newly discovered inodes... +Phase 4 - check for duplicate blocks... + - setting up duplicate extent list... + - check for inodes claiming duplicate blocks... +Phase 5 - rebuild AG headers and trees... + - reset superblock... +Phase 6 - check inode connectivity... + - resetting contents of realtime bitmap and summary inodes + - traversing filesystem ... + - traversal finished ... + - moving disconnected inodes to lost+found ... +Phase 7 - verify and correct link counts... +done +Corrupting agfl 0 - setting bits to -1 +Wrote X.XXKb (value 0xffffffff) +Phase 1 - find and verify superblock... +Phase 2 - using log + - zero log... + - scan filesystem freespace and inode maps... +bad agbno AGBNO in agfl, agno 0 +bad agbno AGBNO in agfl, agno 0 +bad agbno AGBNO in agfl, agno 0 +bad agbno AGBNO in agfl, agno 0 +bad agbno AGBNO in agfl, agno 0 +bad agbno AGBNO in agfl, agno 0 + - found root inode chunk +Phase 3 - for each AG... + - scan and clear agi unlinked lists... + - process known inodes and perform inode discovery... + - process newly discovered inodes... +Phase 4 - check for duplicate blocks... + - setting up duplicate extent list... + - check for inodes claiming duplicate blocks... +Phase 5 - rebuild AG headers and trees... + - reset superblock... +Phase 6 - check inode connectivity... + - resetting contents of realtime bitmap and summary inodes + - traversing filesystem ... + - traversal finished ... + - moving disconnected inodes to lost+found ... +Phase 7 - verify and correct link counts... +done -- 2.5.5 From bningermas@yandex.com Wed Mar 30 08:15:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.4 required=5.0 tests=DATE_IN_PAST_03_06, FREEMAIL_FROM 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 90FEC7CA2 for ; Wed, 30 Mar 2016 08:15:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 56B8F8F804C for ; Wed, 30 Mar 2016 06:15:46 -0700 (PDT) X-ASG-Debug-ID: 1459343742-04bdf01105e9120002-NocioJ Received: from qiangxiansong.com (qiangxiansong.com [104.223.8.111]) by cuda.sgi.com with ESMTP id wwGQh5RKholMpwWP for ; Wed, 30 Mar 2016 06:15:44 -0700 (PDT) X-Barracuda-Envelope-From: bningermas@yandex.com X-Barracuda-Apparent-Source-IP: 104.223.8.111 To: xfs@oss.sgi.com Subject: U.S. Manufacturer seeks Distributors Worldwide Message-ID: X-ASG-Orig-Subj: U.S. Manufacturer seeks Distributors Worldwide Date: Wed, 30 Mar 2016 09:39:38 +0200 From: "Todd Jackson" Reply-To: godbelly@aliyun.com MIME-Version: 1.0 X-Mailer-LID: 3 X-Mailer-RecptId: 4686092 X-Mailer-SID: 1312 X-Mailer-Sent-By: 1 Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: qiangxiansong.com[104.223.8.111] X-Barracuda-Start-Time: 1459343744 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.09 X-Barracuda-Spam-Status: No, SCORE=1.09 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DATE_IN_PAST_03_06, DATE_IN_PAST_03_06_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28298 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 DATE_IN_PAST_03_06 Date: is 3 to 6 hours before Received: date 1.08 DATE_IN_PAST_03_06_2 DATE_IN_PAST_03_06_2 26 Year Old U.S. Manufacturer Needs Additional Distributors Worldwide Proven, Unique Floor Safety Products Used by McDonalds, Burger King, KFC, Hilton, Sheraton, Holiday Inn, Mercedes, BMW, Toyota, Pfizer, etc. Required - $3,000 USD - $5,000 USD Inventory Investment Send for Website Address. Include your name and country of residence. Thanks, Todd Jackson Email: beauisuy@sina.com From BATV+ce0ae62d478fb9371428+4602+infradead.org+hch@bombadil.srs.infradead.org Wed Mar 30 08:43:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 170507CA2 for ; Wed, 30 Mar 2016 08:43:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 98A52AC007 for ; Wed, 30 Mar 2016 06:43:33 -0700 (PDT) X-ASG-Debug-ID: 1459345408-04bdf01104ea4f0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id kMssR1EBsERK3OTf (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 30 Mar 2016 06:43:28 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ce0ae62d478fb9371428+4602+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 1alGP9-0004oU-VH; Wed, 30 Mar 2016 13:43:27 +0000 Date: Wed, 30 Mar 2016 06:43:27 -0700 From: Christoph Hellwig To: Eryu Guan Cc: fstests@vger.kernel.org, xfs@oss.sgi.com, darrick.wong@oracle.com Subject: Re: [PATCH] xfs/206: filter out reflink related outputs Message-ID: <20160330134327.GA16392@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs/206: filter out reflink related outputs References: <1459324609-5531-1-git-send-email-eguan@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459324609-5531-1-git-send-email-eguan@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1459345408 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28299 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Mar 30, 2016 at 03:56:49PM +0800, Eryu Guan wrote: > Commit 13717ffc96fe ("xfs/206: fix output when mkfs knows about > reflink") added extra lines to xfs/206.out to fit the mkfs output with > reflink support, but broke tests without reflink support. > > Fix it by filtering out reflink related outputs, just like filtering out > crc related outputs in the test. > > Signed-off-by: Eryu Guan Looks fine, Reviewed-by: Christoph Hellwig From mguzik@redhat.com Wed Mar 30 09:35:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 552327CA2 for ; Wed, 30 Mar 2016 09:35:17 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 25C65304064 for ; Wed, 30 Mar 2016 07:35:13 -0700 (PDT) X-ASG-Debug-ID: 1459348512-04cbb07ad7135c20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id o09qwg4dF9SSL1s6 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 30 Mar 2016 07:35:13 -0700 (PDT) X-Barracuda-Envelope-From: mguzik@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 5DFD115558; Wed, 30 Mar 2016 14:35:12 +0000 (UTC) Received: from mguzik.localdomain (ovpn-116-95.ams2.redhat.com [10.36.116.95]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2UEZ9G0013444; Wed, 30 Mar 2016 10:35:10 -0400 From: Mateusz Guzik To: xfs@oss.sgi.com Cc: Andreas Gruenbacher , Al Viro Subject: [PATCH] xfs: fix a memory leak in xfs_get_acl on error Date: Wed, 30 Mar 2016 16:35:07 +0200 X-ASG-Orig-Subj: [PATCH] xfs: fix a memory leak in xfs_get_acl on error Message-Id: <1459348507-20406-1-git-send-email-mguzik@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: 1459348513 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Signed-off-by: Mateusz Guzik --- fs/xfs/xfs_acl.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c index 2dad2b5..ce10c4c 100644 --- a/fs/xfs/xfs_acl.c +++ b/fs/xfs/xfs_acl.c @@ -162,10 +162,11 @@ xfs_get_acl(struct inode *inode, int type) */ if (error != -ENOATTR) acl = ERR_PTR(error); - return acl; + goto out; } acl = xfs_acl_from_disk(xfs_acl, len, XFS_ACL_MAX_ENTRIES(ip->i_mount)); +out: kmem_free(xfs_acl); return acl; } -- 1.8.3.1 From tom.leiming@gmail.com Wed Mar 30 11:17:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9B3917CA2 for ; Wed, 30 Mar 2016 11:17:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 43BD3304053 for ; Wed, 30 Mar 2016 09:17:32 -0700 (PDT) X-ASG-Debug-ID: 1459354646-04bdf01102f7a40001-NocioJ Received: from mail-pf0-f193.google.com (mail-pf0-f193.google.com [209.85.192.193]) by cuda.sgi.com with ESMTP id ppZAPpEnxRXNfrpI (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 30 Mar 2016 09:17:27 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.193 Received: by mail-pf0-f193.google.com with SMTP id q129so7981615pfb.3 for ; Wed, 30 Mar 2016 09:17:27 -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; bh=wOeY2f+4ENCMMiqQ81h/wIQt7q9iIbfyr+B7FBYmIw8=; b=HKCphZM11Nqw3lAka9ZOzyujzFmJy9Ocu3ZQJpr5QyS2A/cbSe1q1IDeqXsSoz2Wj4 Yqpwsh4IU5j2EJcrWY5FMTZbep/HpKHf6jWo8VEaZf3zXGc5fUDaawLQDT9oBJVoZvcC fgPiUiIreDgUR0P7FCS2S+JuY5+hv+kKoP0gBSn63vj+h2odiEZqAq8Ex2URZlFaMUIh P4jiqqfMDP7gni13QFdwmwTifvJ/rZ5PG8FJWmyK2kySUi5nrLdzEI6vliyuulfd5Mio eB0ubvtH9cLPjBPLJNWYB2O60djFjyslL1fninAph1rdh6BqHAZG4houR5zx8U/aNiuY IM4g== X-Gm-Message-State: AD7BkJKOavMtGSfZiSDwgBpWCi6kgtPnDERgOOdf26V2adzJtUypvWB925t+onZf8MVXBw== X-Received: by 10.98.72.141 with SMTP id q13mr14559063pfi.152.1459354646466; Wed, 30 Mar 2016 09:17:26 -0700 (PDT) Received: from localhost (45-125-195-13.ip4.readyserver.sg. [45.125.195.13]) by smtp.gmail.com with ESMTPSA id b74sm7045822pfd.24.2016.03.30.09.17.25 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Wed, 30 Mar 2016 09:17:25 -0700 (PDT) From: Ming Lei To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh Subject: [PATCH v1 0/8] block: prepare for multipage bvecs Date: Thu, 31 Mar 2016 00:17:09 +0800 X-ASG-Orig-Subj: [PATCH v1 0/8] block: prepare for multipage bvecs Message-Id: <1459354637-17415-1-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 X-Barracuda-Connect: mail-pf0-f193.google.com[209.85.192.193] X-Barracuda-Start-Time: 1459354646 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28301 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi, Interests[1] have been shown in multipage bvecs, so this patchset try to prepare for the support and do two things: 1) the 1st 4 patches use bvec iterator to implement iterate_bvec(), then we can drop the non-standard way for iterating bvec, which can be thought as a good cleanup for lib/iov_iter.c 2) remove BIO_MAX_SECTORS & BIO_MAX_SIZE, and now there is only one user for each. Once multipage bvecs is introduced, one bio may hold lots of sectors, and we should always use sort of BIO_MAX_VECS which should be introduced in future and is similiar with current BIO_MAX_PAGES. xfstests(-a auto) have been run and no regression found by this patchset against linus v4.6-rc1-next-20160329. V1: - don't move BIO_MAX_* to bvec_iter.h as pointed out by Christoph - run xfstests against v4.6-rc1-next-20160329 - add Reviewed-by - for 1,4 and 5, Reviewd-by not added, Christoph still expressed 'this looks fine to me.' drivers/block/drbd/drbd_int.h | 4 ++-- fs/xfs/xfs_buf.c | 4 +--- include/linux/bio.h | 53 +---------------------------------------- include/linux/blk_types.h | 4 ++-- include/linux/bvec_iter.h | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/iov_iter.c | 31 +++++++++--------------- 6 files changed, 92 insertions(+), 79 deletions(-) Thanks, Ming From tom.leiming@gmail.com Wed Mar 30 11:17:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9B6027CAE for ; Wed, 30 Mar 2016 11:17:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5CE7C304053 for ; Wed, 30 Mar 2016 09:17:40 -0700 (PDT) X-ASG-Debug-ID: 1459354651-04cb6c246013f930001-NocioJ Received: from mail-pf0-f196.google.com (mail-pf0-f196.google.com [209.85.192.196]) by cuda.sgi.com with ESMTP id s5zzI7EaoGztkpfJ (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 30 Mar 2016 09:17:31 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.196 Received: by mail-pf0-f196.google.com with SMTP id x3so7872995pfb.0 for ; Wed, 30 Mar 2016 09:17:31 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=i0hW+7/r3tCVcC0hPxQjGXrRR3r0YMTPUqHcLT6GqhY=; b=HjCC2qBxFFsvag9N8uV7wj+fjOMcn4qcx0yGqhrfnYOn6VOkGEMnfCdoCt7V+jHdiO TzvQuT+NYm0ASiD+J+/c47qamXPhm1KNb2XmgKXQxEwoXBKMatE/fR2nH9XgAQAsy+3/ 4OvhawSmR/ORAanISBzYZg/5hwxgHuCJed5eK+o5ZjPhHfNYtPMa26AN9BZs4Da89Rtb TkBzcNMeCl293uyW9p67Ob9t4EZp0zCdwFRr2eoICZBSYGQ4nvqhTUiCX9sfRA7DOlKf f+kdjZj4fHqHF4j0T75wfA1ZzC5en3X+QcBieJeCTs6fA8utOQw4yYAMWwJApWRF6G5x /qQA== X-Gm-Message-State: AD7BkJIPkuHXISPMaY9oa2ebVQgGiffdPwoZmGc71Sp5oVM0HJB+Y+Mka6sg+37wgaMohA== X-Received: by 10.98.71.149 with SMTP id p21mr14568080pfi.133.1459354651258; Wed, 30 Mar 2016 09:17:31 -0700 (PDT) Received: from localhost (45-125-195-13.ip4.readyserver.sg. [45.125.195.13]) by smtp.gmail.com with ESMTPSA id 20sm7005540pfj.80.2016.03.30.09.17.29 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Wed, 30 Mar 2016 09:17:30 -0700 (PDT) From: Ming Lei To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH v1 1/8] block: move bvec iterator into include/linux/bvec_iter.h Date: Thu, 31 Mar 2016 00:17:10 +0800 X-ASG-Orig-Subj: [PATCH v1 1/8] block: move bvec iterator into include/linux/bvec_iter.h Message-Id: <1459354637-17415-2-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1459354637-17415-1-git-send-email-ming.lei@canonical.com> References: <1459354637-17415-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pf0-f196.google.com[209.85.192.196] X-Barracuda-Start-Time: 1459354651 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28302 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header bvec iterator helpers should be used to implement by iterate_bvec():lib/iov_iter.c too, and move them into one header, so that we can keep bvec iterator header out of CONFIG_BLOCK. Then we can remove the reinventing of wheel in iterate_bvec(). Signed-off-by: Ming Lei --- include/linux/bio.h | 51 +------------------------------- include/linux/bvec_iter.h | 74 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 50 deletions(-) create mode 100644 include/linux/bvec_iter.h diff --git a/include/linux/bio.h b/include/linux/bio.h index 88bc64f..12d8957 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -31,6 +31,7 @@ /* struct bio, bio_vec and BIO_* flags are defined in blk_types.h */ #include +#include #define BIO_DEBUG @@ -57,29 +58,6 @@ (bio)->bi_rw |= ((unsigned long) (prio) << BIO_PRIO_SHIFT); \ } while (0) -/* - * various member access, note that bio_data should of course not be used - * on highmem page vectors - */ -#define __bvec_iter_bvec(bvec, iter) (&(bvec)[(iter).bi_idx]) - -#define bvec_iter_page(bvec, iter) \ - (__bvec_iter_bvec((bvec), (iter))->bv_page) - -#define bvec_iter_len(bvec, iter) \ - min((iter).bi_size, \ - __bvec_iter_bvec((bvec), (iter))->bv_len - (iter).bi_bvec_done) - -#define bvec_iter_offset(bvec, iter) \ - (__bvec_iter_bvec((bvec), (iter))->bv_offset + (iter).bi_bvec_done) - -#define bvec_iter_bvec(bvec, iter) \ -((struct bio_vec) { \ - .bv_page = bvec_iter_page((bvec), (iter)), \ - .bv_len = bvec_iter_len((bvec), (iter)), \ - .bv_offset = bvec_iter_offset((bvec), (iter)), \ -}) - #define bio_iter_iovec(bio, iter) \ bvec_iter_bvec((bio)->bi_io_vec, (iter)) @@ -193,33 +171,6 @@ static inline void *bio_data(struct bio *bio) #define bio_for_each_segment_all(bvl, bio, i) \ for (i = 0, bvl = (bio)->bi_io_vec; i < (bio)->bi_vcnt; i++, bvl++) -static inline void bvec_iter_advance(struct bio_vec *bv, struct bvec_iter *iter, - unsigned bytes) -{ - WARN_ONCE(bytes > iter->bi_size, - "Attempted to advance past end of bvec iter\n"); - - while (bytes) { - unsigned len = min(bytes, bvec_iter_len(bv, *iter)); - - bytes -= len; - iter->bi_size -= len; - iter->bi_bvec_done += len; - - if (iter->bi_bvec_done == __bvec_iter_bvec(bv, *iter)->bv_len) { - iter->bi_bvec_done = 0; - iter->bi_idx++; - } - } -} - -#define for_each_bvec(bvl, bio_vec, iter, start) \ - for (iter = (start); \ - (iter).bi_size && \ - ((bvl = bvec_iter_bvec((bio_vec), (iter))), 1); \ - bvec_iter_advance((bio_vec), &(iter), (bvl).bv_len)) - - static inline void bio_advance_iter(struct bio *bio, struct bvec_iter *iter, unsigned bytes) { diff --git a/include/linux/bvec_iter.h b/include/linux/bvec_iter.h new file mode 100644 index 0000000..29c459d --- /dev/null +++ b/include/linux/bvec_iter.h @@ -0,0 +1,74 @@ +/* + * bvec iterator + * + * Copyright (C) 2001 Ming Lei + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public Licens + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111- + */ +#ifndef __LINUX_BVEC_ITER_H +#define __LINUX_BVEC_ITER_H + +#include + +/* + * various member access, note that bio_data should of course not be used + * on highmem page vectors + */ +#define __bvec_iter_bvec(bvec, iter) (&(bvec)[(iter).bi_idx]) + +#define bvec_iter_page(bvec, iter) \ + (__bvec_iter_bvec((bvec), (iter))->bv_page) + +#define bvec_iter_len(bvec, iter) \ + min((iter).bi_size, \ + __bvec_iter_bvec((bvec), (iter))->bv_len - (iter).bi_bvec_done) + +#define bvec_iter_offset(bvec, iter) \ + (__bvec_iter_bvec((bvec), (iter))->bv_offset + (iter).bi_bvec_done) + +#define bvec_iter_bvec(bvec, iter) \ +((struct bio_vec) { \ + .bv_page = bvec_iter_page((bvec), (iter)), \ + .bv_len = bvec_iter_len((bvec), (iter)), \ + .bv_offset = bvec_iter_offset((bvec), (iter)), \ +}) + +static inline void bvec_iter_advance(struct bio_vec *bv, struct bvec_iter *iter, + unsigned bytes) +{ + WARN_ONCE(bytes > iter->bi_size, + "Attempted to advance past end of bvec iter\n"); + + while (bytes) { + unsigned len = min(bytes, bvec_iter_len(bv, *iter)); + + bytes -= len; + iter->bi_size -= len; + iter->bi_bvec_done += len; + + if (iter->bi_bvec_done == __bvec_iter_bvec(bv, *iter)->bv_len) { + iter->bi_bvec_done = 0; + iter->bi_idx++; + } + } +} + +#define for_each_bvec(bvl, bio_vec, iter, start) \ + for (iter = (start); \ + (iter).bi_size && \ + ((bvl = bvec_iter_bvec((bio_vec), (iter))), 1); \ + bvec_iter_advance((bio_vec), &(iter), (bvl).bv_len)) + +#endif /* __LINUX_BVEC_ITER_H */ -- 1.9.1 From tom.leiming@gmail.com Wed Mar 30 11:17:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 040397CB0 for ; Wed, 30 Mar 2016 11:17:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6C0A5AC008 for ; Wed, 30 Mar 2016 09:17:40 -0700 (PDT) X-ASG-Debug-ID: 1459354654-04cb6c246413f940001-NocioJ Received: from mail-pa0-f65.google.com (mail-pa0-f65.google.com [209.85.220.65]) by cuda.sgi.com with ESMTP id jVqP3JPTLtfOsdiZ (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 30 Mar 2016 09:17:35 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.65 Received: by mail-pa0-f65.google.com with SMTP id hn5so5332729pac.2 for ; Wed, 30 Mar 2016 09:17: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:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ft4a0elYSx7gLwtvBVcMm39fJDfnyirAtpVFTId38Q4=; b=aEtm90D+icSCxIhiYkuhjhDEr6SPRcE8UZfgwPAmuyLPj1rZ/UQwnMc9iqPPh7VlwN YGmPZ5kX0ShFnPz9u4uU6LNf7+2B3TjdXKJSBBs8VM31It7HJTu7xJe0kDTmbObjRmVo dbMMIM0Oru2kY6XhHqSmOsV1TzxSGxv0QOM/BiXsd7vPFCJk3hSo/5dBxiSkslRwDeQ/ jmhdKAo1WJXX1zAOvqPox++o5ROjSQZUxMGj+X0pJzP5eta7hwk3uCno/seAGBNRczR7 5RMu7Z/M7wxIna6YnDEXjc4MZ23NgzMy5arUiMCwUGpc+iOYPkKCHFrpSQjLV6+NBlbe lH5w== X-Gm-Message-State: AD7BkJINrTTtLjAL5/2B7RDCXZ13CUBhrtcyISiaPTSs2Frm7zLGXGIY6qcsRVo2eGXE+w== X-Received: by 10.66.221.167 with SMTP id qf7mr14596567pac.94.1459354654675; Wed, 30 Mar 2016 09:17:34 -0700 (PDT) Received: from localhost (45-125-195-13.ip4.readyserver.sg. [45.125.195.13]) by smtp.gmail.com with ESMTPSA id x18sm7042585pfi.42.2016.03.30.09.17.33 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Wed, 30 Mar 2016 09:17:33 -0700 (PDT) From: Ming Lei To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH v1 2/8] block: make 'struct bvec_iter' not depend on CONFIG_BLOCK Date: Thu, 31 Mar 2016 00:17:11 +0800 X-ASG-Orig-Subj: [PATCH v1 2/8] block: make 'struct bvec_iter' not depend on CONFIG_BLOCK Message-Id: <1459354637-17415-3-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1459354637-17415-1-git-send-email-ming.lei@canonical.com> References: <1459354637-17415-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pa0-f65.google.com[209.85.220.65] X-Barracuda-Start-Time: 1459354655 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28302 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header We will use bvec iterator to implement iterate_bvec(): lib/iov_iter.c. Reviewed-by: Christoph Hellwig Signed-off-by: Ming Lei --- include/linux/blk_types.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index 86a38ea..fd8527b 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h @@ -26,8 +26,6 @@ struct bio_vec { unsigned int bv_offset; }; -#ifdef CONFIG_BLOCK - struct bvec_iter { sector_t bi_sector; /* device address in 512 byte sectors */ @@ -39,6 +37,8 @@ struct bvec_iter { current bvec */ }; +#ifdef CONFIG_BLOCK + /* * main unit of I/O for the block layer and lower layers (ie drivers and * stacking drivers) -- 1.9.1 From tom.leiming@gmail.com Wed Mar 30 11:17:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1B5007CB1 for ; Wed, 30 Mar 2016 11:17:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D40A7304059 for ; Wed, 30 Mar 2016 09:17:40 -0700 (PDT) X-ASG-Debug-ID: 1459354658-04cbb07ad6139cc0001-NocioJ Received: from mail-pf0-f196.google.com (mail-pf0-f196.google.com [209.85.192.196]) by cuda.sgi.com with ESMTP id 1dQkdxQiAF65umsq (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 30 Mar 2016 09:17:39 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.196 Received: by mail-pf0-f196.google.com with SMTP id x3so7873421pfb.0 for ; Wed, 30 Mar 2016 09:17:39 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=bi6a8o/PD6akuFyjGEaMm/KwUTSIumee1hWQNbEYRbI=; b=KBGbP9v4UZsw5z9y2DFyAqbJhyqBGhS6megaFVIZcOAn18vq+IwqAonewP8F28emzj CcBVdZX24uFHSbmmOpSHJqe7xprllHjO9BzB/uYe7rLn/mttV2Mac1eRdKnGzgYw+dlZ Q0OETHNsJr+u3tEX6pOezC+HBsjebShkXbMdhb9z93Bnf4Scey3NjHJluqDReF3cUiSL nW3VzYqfe/y7CjLjpTtY/eNoeWmYiDXhk7fPBVF7yWA3iYvZ5Fq8p31IKO5rcRUFTtWB Q2ZH/VMJsicXeFiMhOUQRGyp6kQr1TUnTPYsY0VMBqJnsuhkTVUqwGABJydO3pU9O3er Vd6w== X-Gm-Message-State: AD7BkJKSaaiubx3rzSYUTPVllpHoAQuD8TeA8CJHDBnEngWJ/qZAiY/M0rk2JU1RS+vTtw== X-Received: by 10.98.10.147 with SMTP id 19mr14509092pfk.87.1459354658522; Wed, 30 Mar 2016 09:17:38 -0700 (PDT) Received: from localhost (45-125-195-13.ip4.readyserver.sg. [45.125.195.13]) by smtp.gmail.com with ESMTPSA id q20sm7027219pfi.63.2016.03.30.09.17.37 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Wed, 30 Mar 2016 09:17:37 -0700 (PDT) From: Ming Lei To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH v1 3/8] block: mark 1st parameter of bvec_iter_advance as const Date: Thu, 31 Mar 2016 00:17:12 +0800 X-ASG-Orig-Subj: [PATCH v1 3/8] block: mark 1st parameter of bvec_iter_advance as const Message-Id: <1459354637-17415-4-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1459354637-17415-1-git-send-email-ming.lei@canonical.com> References: <1459354637-17415-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pf0-f196.google.com[209.85.192.196] X-Barracuda-Start-Time: 1459354659 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28301 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header bvec_iter_advance() only writes the parameter of iterator, so the base address of bvec can be marked as const safely. Without the change, we can see compiling warning in the following patch for implementing iterate_bvec(): lib/iov_iter.c with bvec iterator. Reviewed-by: Christoph Hellwig Signed-off-by: Ming Lei --- include/linux/bvec_iter.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/linux/bvec_iter.h b/include/linux/bvec_iter.h index 29c459d..9f0dcb2 100644 --- a/include/linux/bvec_iter.h +++ b/include/linux/bvec_iter.h @@ -45,7 +45,8 @@ .bv_offset = bvec_iter_offset((bvec), (iter)), \ }) -static inline void bvec_iter_advance(struct bio_vec *bv, struct bvec_iter *iter, +static inline void bvec_iter_advance(const struct bio_vec *bv, + struct bvec_iter *iter, unsigned bytes) { WARN_ONCE(bytes > iter->bi_size, -- 1.9.1 From tom.leiming@gmail.com Wed Mar 30 11:17:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0D4977CBB for ; Wed, 30 Mar 2016 11:17:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C346F304059 for ; Wed, 30 Mar 2016 09:17:45 -0700 (PDT) X-ASG-Debug-ID: 1459354663-04cbb07ad7139cd0001-NocioJ Received: from mail-pf0-f193.google.com (mail-pf0-f193.google.com [209.85.192.193]) by cuda.sgi.com with ESMTP id 4pB3vUnymuwiSZqB (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 30 Mar 2016 09:17:44 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.193 Received: by mail-pf0-f193.google.com with SMTP id t66so4197984pfb.2 for ; Wed, 30 Mar 2016 09:17:44 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=sqH+M04IB5voUIBmOkvSetipqppS8wuuKQ8USkT2zHY=; b=VoUrP+wVeNegPaVqx8iwxIGM5Ak3FjZ3WkCQfImE+rBVUqwQFlsa8HTSBMBs0ixeP8 q1BI3E+Msq8uNZ3iHO3XCy8CzOpjgOMe7JVT95ifKd67t9oAAtsVV2olKAeiXoxsALfe C3KEaY0c6JaA7PWq5xhc/X3NRCTCv9BX8+lUjvqcvYFG8sNl4JAOY/wzTGNwklPKKac3 7eQo6Z3wwVThuCaFf3cHP5pfB71L90q52PQAGDqf+y9Kum8hQIGBBnt13qVulDLi328G vnZSpNJWDzDcdFw6p50aBwX4E76FaT/D8rWleCQaio6wLbeJ56f/kdyrcZZ3t5As2mxJ +oXA== X-Gm-Message-State: AD7BkJK1D6gBBvZ3e6x2k/xxnB6BKUbO05jOFkuW/Uo8qWuD2M+YzF585iBNWml74MKHPA== X-Received: by 10.98.32.211 with SMTP id m80mr14576287pfj.3.1459354663628; Wed, 30 Mar 2016 09:17:43 -0700 (PDT) Received: from localhost (45-125-195-13.ip4.readyserver.sg. [45.125.195.13]) by smtp.gmail.com with ESMTPSA id q2sm7009496pfq.88.2016.03.30.09.17.42 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Wed, 30 Mar 2016 09:17:42 -0700 (PDT) From: Ming Lei To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH v1 4/8] iov_iter: use bvec iterator to implement iterate_bvec() Date: Thu, 31 Mar 2016 00:17:13 +0800 X-ASG-Orig-Subj: [PATCH v1 4/8] iov_iter: use bvec iterator to implement iterate_bvec() Message-Id: <1459354637-17415-5-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1459354637-17415-1-git-send-email-ming.lei@canonical.com> References: <1459354637-17415-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pf0-f193.google.com[209.85.192.193] X-Barracuda-Start-Time: 1459354664 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28301 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header bvec has provided one iterator already, so not necessary to invent a new wheel for this job. Signed-off-by: Ming Lei --- lib/iov_iter.c | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/lib/iov_iter.c b/lib/iov_iter.c index 5fecddc..5e1b224 100644 --- a/lib/iov_iter.c +++ b/lib/iov_iter.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #define iterate_iovec(i, n, __v, __p, skip, STEP) { \ @@ -57,35 +58,25 @@ } #define iterate_bvec(i, n, __v, __p, skip, STEP) { \ - size_t wanted = n; \ + struct bvec_iter __bi, __start; \ + __start.bi_size = n; \ + __start.bi_bvec_done = skip; \ + __start.bi_idx = 0; \ __p = i->bvec; \ - __v.bv_len = min_t(size_t, n, __p->bv_len - skip); \ - if (likely(__v.bv_len)) { \ - __v.bv_page = __p->bv_page; \ - __v.bv_offset = __p->bv_offset + skip; \ + for_each_bvec(__v, __p, __bi, __start) { \ (void)(STEP); \ - skip += __v.bv_len; \ - n -= __v.bv_len; \ } \ - while (unlikely(n)) { \ - __p++; \ - __v.bv_len = min_t(size_t, n, __p->bv_len); \ - if (unlikely(!__v.bv_len)) \ - continue; \ - __v.bv_page = __p->bv_page; \ - __v.bv_offset = __p->bv_offset; \ - (void)(STEP); \ + if (!__bi.bi_idx) \ + skip += __v.bv_len; \ + else \ skip = __v.bv_len; \ - n -= __v.bv_len; \ - } \ - n = wanted; \ } #define iterate_all_kinds(i, n, v, I, B, K) { \ size_t skip = i->iov_offset; \ if (unlikely(i->type & ITER_BVEC)) { \ const struct bio_vec *bvec; \ - struct bio_vec v; \ + struct bio_vec v = { 0 }; \ iterate_bvec(i, n, v, bvec, skip, (B)) \ } else if (unlikely(i->type & ITER_KVEC)) { \ const struct kvec *kvec; \ @@ -102,7 +93,7 @@ size_t skip = i->iov_offset; \ if (unlikely(i->type & ITER_BVEC)) { \ const struct bio_vec *bvec; \ - struct bio_vec v; \ + struct bio_vec v = { 0 }; \ iterate_bvec(i, n, v, bvec, skip, (B)) \ if (skip == bvec->bv_len) { \ bvec++; \ -- 1.9.1 From tom.leiming@gmail.com Wed Mar 30 11:17:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5023E7CC7 for ; Wed, 30 Mar 2016 11:17:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A7FC0AC008 for ; Wed, 30 Mar 2016 09:17:50 -0700 (PDT) X-ASG-Debug-ID: 1459354668-04cbb07ad6139ce0001-NocioJ Received: from mail-pa0-f68.google.com (mail-pa0-f68.google.com [209.85.220.68]) by cuda.sgi.com with ESMTP id hmo6vWpUGy8ADFHu (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 30 Mar 2016 09:17:48 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.68 Received: by mail-pa0-f68.google.com with SMTP id 1so7116669pal.3 for ; Wed, 30 Mar 2016 09:17:48 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=xXUdvjLtowonlrbju5ek6j4VIGdC6GChTRig76zBevk=; b=Yhd0MaMx90GHI5fLtByrO+wwrn5JjarJXRaX5crpyDKYIgowoWGmk75OLGVjVBYm/b LIkQ0p5f4iKCX/wzz+Mgjs5X8nCn8x5muHALIumGFSTM0GUqRl9ALS6oiVwRm40qZF76 seGqGhEECNHb+uaC5NbVzC8ckdPx40zac8ylWxPrHXxhfNfIa6B8gtaSE9Aq+hBrp67w b3PG6eh7OIDBeztPTmqoyeDX4uHXiuauEOJq1ouRNwEodbO/e32kOGmdJ+c+KyRbRb2O SHyMkpVGFp8CgTBZY9veNmLiw6ACtNf/eFIWb1iD98JPc2BFmsikIjmcRAvMzENQ7lWb hcQQ== X-Gm-Message-State: AD7BkJIYiKzWa8jAN4VHJJ3B0evL1nc5ASark7fBg/mKLlLWcAcr0x/Ff6FXfW2eFe2A3Q== X-Received: by 10.66.118.106 with SMTP id kl10mr14425048pab.78.1459354667865; Wed, 30 Mar 2016 09:17:47 -0700 (PDT) Received: from localhost (45-125-195-13.ip4.readyserver.sg. [45.125.195.13]) by smtp.gmail.com with ESMTPSA id g28sm7057717pfd.25.2016.03.30.09.17.46 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Wed, 30 Mar 2016 09:17:47 -0700 (PDT) From: Ming Lei To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH v1 5/8] fs: xfs: replace BIO_MAX_SECTORS with BIO_MAX_PAGES Date: Thu, 31 Mar 2016 00:17:14 +0800 X-ASG-Orig-Subj: [PATCH v1 5/8] fs: xfs: replace BIO_MAX_SECTORS with BIO_MAX_PAGES Message-Id: <1459354637-17415-6-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1459354637-17415-1-git-send-email-ming.lei@canonical.com> References: <1459354637-17415-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pa0-f68.google.com[209.85.220.68] X-Barracuda-Start-Time: 1459354668 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28301 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header BIO_MAX_PAGES is used as maximum count of bvecs, so replace BIO_MAX_SECTORS with BIO_MAX_PAGES since BIO_MAX_SECTORS is to be removed. Signed-off-by: Ming Lei --- fs/xfs/xfs_buf.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 9a2191b..b9ecb2d 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1161,9 +1161,7 @@ xfs_buf_ioapply_map( next_chunk: atomic_inc(&bp->b_io_remaining); - nr_pages = BIO_MAX_SECTORS >> (PAGE_SHIFT - BBSHIFT); - if (nr_pages > total_nr_pages) - nr_pages = total_nr_pages; + nr_pages = min(total_nr_pages, BIO_MAX_PAGES); bio = bio_alloc(GFP_NOIO, nr_pages); bio->bi_bdev = bp->b_target->bt_bdev; -- 1.9.1 From tom.leiming@gmail.com Wed Mar 30 11:17:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 469917CA2 for ; Wed, 30 Mar 2016 11:17:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6D855AC007 for ; Wed, 30 Mar 2016 09:17:54 -0700 (PDT) X-ASG-Debug-ID: 1459354672-04cbb07ad5139cf0001-NocioJ Received: from mail-pf0-f195.google.com (mail-pf0-f195.google.com [209.85.192.195]) by cuda.sgi.com with ESMTP id 5LAxEPffR2ZmUleQ (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 30 Mar 2016 09:17:52 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.195 Received: by mail-pf0-f195.google.com with SMTP id q129so7983073pfb.3 for ; Wed, 30 Mar 2016 09:17:52 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ur+qsVX9VHvup42N87VNWacerfT5IVdUsSm53mtrnGc=; b=QZRrYDBxWS3YT46jDdYdknYD3GGAwGS2V2VmpOr3sK+HiyJ9SCaRlHL63lWGkAr5nv xX3F1odv/K+0TJ2F+D4A7MXhdtCTfT5vxcILHYogvg/Ivw8jXHLFt01FHnJ5AG6QZ5sC NbbhVBabKTj1VYhuLq6mtIWTigINlAWlENOV1tAnCLAlQkHiK5xLqwQoWuhkan8F1Aj5 d0UyxJeo8nxB1VnRvJlo31uEL3a+xj0WTl4FMAAQLgthu4XrU2yga9D3KN4e4tTp4o4r 2o0ZVePlQ4/IpgGLMX/t47nmmrSeXFV6Mny+s1qozNfbmwjATONMsq5heJB+pmFKALYr n88w== X-Gm-Message-State: AD7BkJL6RIBSRrIUg58d3Pdos9ZApnl9mAR8Yx+7AvfuqidGaDp/wT6GJCOK6+7drHFE6Q== X-Received: by 10.98.80.10 with SMTP id e10mr14552917pfb.141.1459354672091; Wed, 30 Mar 2016 09:17:52 -0700 (PDT) Received: from localhost (45-125-195-13.ip4.readyserver.sg. [45.125.195.13]) by smtp.gmail.com with ESMTPSA id e6sm7017981pfj.71.2016.03.30.09.17.50 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Wed, 30 Mar 2016 09:17:51 -0700 (PDT) From: Ming Lei To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH v1 6/8] block: bio: remove BIO_MAX_SECTORS Date: Thu, 31 Mar 2016 00:17:15 +0800 X-ASG-Orig-Subj: [PATCH v1 6/8] block: bio: remove BIO_MAX_SECTORS Message-Id: <1459354637-17415-7-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1459354637-17415-1-git-send-email-ming.lei@canonical.com> References: <1459354637-17415-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pf0-f195.google.com[209.85.192.195] X-Barracuda-Start-Time: 1459354672 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28301 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header No one need this macro, so remove it. The motivation is for supporting multipage bvecs, in which we only know what the max count of bvecs is supported in the bio, instead of max size or max sectors. Reviewed-by: Christoph Hellwig Signed-off-by: Ming Lei --- include/linux/bio.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/linux/bio.h b/include/linux/bio.h index 12d8957..4f76252 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -43,7 +43,6 @@ #define BIO_MAX_PAGES 256 #define BIO_MAX_SIZE (BIO_MAX_PAGES << PAGE_CACHE_SHIFT) -#define BIO_MAX_SECTORS (BIO_MAX_SIZE >> 9) /* * upper 16 bits of bi_rw define the io priority of this bio -- 1.9.1 From tom.leiming@gmail.com Wed Mar 30 11:18:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5D0BB7CCD for ; Wed, 30 Mar 2016 11:18:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 00A648F8059 for ; Wed, 30 Mar 2016 09:17:58 -0700 (PDT) X-ASG-Debug-ID: 1459354676-04bdf01103f7ac0001-NocioJ Received: from mail-pf0-f194.google.com (mail-pf0-f194.google.com [209.85.192.194]) by cuda.sgi.com with ESMTP id 3qceAqUVxfMWWKxX (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 30 Mar 2016 09:17:57 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.194 Received: by mail-pf0-f194.google.com with SMTP id n5so7839143pfn.1 for ; Wed, 30 Mar 2016 09:17: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:from:to:cc:subject:date:message-id:in-reply-to :references; bh=f8RnSXiS0Ltm1s1Wqzt4C04rE3FJ1OU0KmBxRNLnWV4=; b=QTI6PFjXMOsIxDspvQY5Wu8MnHeYi5cF8b7yvI+eTeTTW94TQQm2FZsfQXOhzFpNI9 s+ItXn0yNGV3HVMBnZMUXGHXMCFv7wsUTgty2bEOMMMCqgRtT2b+nUUCX8LQHmjDVODP TNBX5t0MByCeZiXgC0Kzj5gds9NnzcL75B1D85zewsC6mgiTdY1h1IEvtLBEWZ0+ZkZz Ub6eb/uxIf/1clXcUZe4AmHmU6HtRfmmc+lfVS/F+luqc4ptcfKw4pSOJXvozzRii/4N MzCq8b2KtZCt7Xpwy3ffrH+QZuiXtiClJxeLKZ30UKo5dTOsg6TDP8/O0AFqcpK5wgDL SPPQ== X-Gm-Message-State: AD7BkJK25Mo4XqxrMP1ws1xAW9fPF7x1YuKxhMpKXtHzFlxD7HBrLJME7/HgoQ3YUPVGyw== X-Received: by 10.98.71.203 with SMTP id p72mr14552935pfi.165.1459354676704; Wed, 30 Mar 2016 09:17:56 -0700 (PDT) Received: from localhost (45-125-195-13.ip4.readyserver.sg. [45.125.195.13]) by smtp.gmail.com with ESMTPSA id ux2sm7018063pac.46.2016.03.30.09.17.55 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Wed, 30 Mar 2016 09:17:56 -0700 (PDT) From: Ming Lei To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH v1 7/8] block: drbd: avoid to use BIO_MAX_SIZE Date: Thu, 31 Mar 2016 00:17:16 +0800 X-ASG-Orig-Subj: [PATCH v1 7/8] block: drbd: avoid to use BIO_MAX_SIZE Message-Id: <1459354637-17415-8-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1459354637-17415-1-git-send-email-ming.lei@canonical.com> References: <1459354637-17415-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pf0-f194.google.com[209.85.192.194] X-Barracuda-Start-Time: 1459354677 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28301 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header drbd is the only user of BIO_MAX_SIZE, so use BIO_MAX_PAGES instead. Reviewed-by: Christoph Hellwig Signed-off-by: Ming Lei --- drivers/block/drbd/drbd_int.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index c227fd4..10bfff1 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h @@ -1327,14 +1327,14 @@ struct bm_extent { #endif #endif -/* BIO_MAX_SIZE is 256 * PAGE_CACHE_SIZE, +/* Estimate max bio size as 256 * PAGE_CACHE_SIZE, * so for typical PAGE_CACHE_SIZE of 4k, that is (1<<20) Byte. * Since we may live in a mixed-platform cluster, * we limit us to a platform agnostic constant here for now. * A followup commit may allow even bigger BIO sizes, * once we thought that through. */ #define DRBD_MAX_BIO_SIZE (1U << 20) -#if DRBD_MAX_BIO_SIZE > BIO_MAX_SIZE +#if DRBD_MAX_BIO_SIZE > (BIO_MAX_PAGES << PAGE_CACHE_SHIFT) #error Architecture not supported: DRBD_MAX_BIO_SIZE > BIO_MAX_SIZE #endif #define DRBD_MAX_BIO_SIZE_SAFE (1U << 12) /* Works always = 4k */ -- 1.9.1 From tom.leiming@gmail.com Wed Mar 30 11:18:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2E1787CAE for ; Wed, 30 Mar 2016 11:18:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 00B998F8054 for ; Wed, 30 Mar 2016 09:18:03 -0700 (PDT) X-ASG-Debug-ID: 1459354681-04cb6c246013f980001-NocioJ Received: from mail-pf0-f194.google.com (mail-pf0-f194.google.com [209.85.192.194]) by cuda.sgi.com with ESMTP id LgruQ0cocMiQNhxi (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 30 Mar 2016 09:18:01 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.194 Received: by mail-pf0-f194.google.com with SMTP id q129so7983634pfb.3 for ; Wed, 30 Mar 2016 09:18: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:from:to:cc:subject:date:message-id:in-reply-to :references; bh=2Rqd7WvUNnNxllombc3mHRC/aO1XzKKDLhPt1++MKUA=; b=hoA3xLojnWCt+hm95k06ThEJ3Ssp7dCBo/NJioWqX/okPHNwzKSdOespKfxgQGvPhG TJZinHaWLF7F0JnxSWBm54ryPs1yy3C/v7uw66AW4InIvV2YPM02CqPMCfJeKLU6BJUE +O2kDzdrPcbZqFvszzDbrstuNTCf1/g5dPLakttNjCbHDK996BDhoHISu/M6EJwcnHSn CxYI4PCmnpEbKzfiHGH8jjkMvGpvhfivDzITWBBy4rfWtYMerjlGzRQ/duXjAPhVNoG1 4wzPtXaHTOYu9lTkhrFu+sc6KgONADaHpSK3CqgK2AcVzoaHPo44Opg/NTC9Cg5aPtcX FWkw== X-Gm-Message-State: AD7BkJLTtlq2Km+MetNfvFpDi8Od05ej5yVVeI8PYLI2NySbVVFTvSOvpjyWs7XLZAmZnQ== X-Received: by 10.98.93.155 with SMTP id n27mr14575127pfj.88.1459354680977; Wed, 30 Mar 2016 09:18:00 -0700 (PDT) Received: from localhost (45-125-195-13.ip4.readyserver.sg. [45.125.195.13]) by smtp.gmail.com with ESMTPSA id q26sm7036141pfi.57.2016.03.30.09.17.59 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Wed, 30 Mar 2016 09:18:00 -0700 (PDT) From: Ming Lei To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH v1 8/8] block: bio: remove BIO_MAX_SIZE Date: Thu, 31 Mar 2016 00:17:17 +0800 X-ASG-Orig-Subj: [PATCH v1 8/8] block: bio: remove BIO_MAX_SIZE Message-Id: <1459354637-17415-9-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1459354637-17415-1-git-send-email-ming.lei@canonical.com> References: <1459354637-17415-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pf0-f194.google.com[209.85.192.194] X-Barracuda-Start-Time: 1459354681 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28302 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header No one need this macro now, so remove it. The motivation is for supporting multipage bvecs, in which we only know what the max count of bvecs is supported in the bio, instead of max bio size. Reviewed-by: Christoph Hellwig Signed-off-by: Ming Lei --- include/linux/bio.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/linux/bio.h b/include/linux/bio.h index 4f76252..c6d13db 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -42,7 +42,6 @@ #endif #define BIO_MAX_PAGES 256 -#define BIO_MAX_SIZE (BIO_MAX_PAGES << PAGE_CACHE_SHIFT) /* * upper 16 bits of bi_rw define the io priority of this bio -- 1.9.1 From gileshp01@gmail.com Wed Mar 30 11:56:51 2016 Return-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=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,HTML_MESSAGE,IP_LINK_PLUS,MPART_ALT_DIFF,NORMAL_HTTP_TO_IP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 27FD07CAE for ; Wed, 30 Mar 2016 11:56:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9552BAC001 for ; Wed, 30 Mar 2016 09:56:50 -0700 (PDT) X-ASG-Debug-ID: 1459357005-04bdf01104f93a0001-NocioJ Received: from infy.supermail.co.in (vps.supermail.co.in [23.227.96.103]) by cuda.sgi.com with ESMTP id EL78KP42vTtPDeFU (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 30 Mar 2016 09:56:45 -0700 (PDT) X-Barracuda-Envelope-From: gileshp01@gmail.com X-Barracuda-Apparent-Source-IP: 23.227.96.103 Received: from superma by infy.supermail.co.in with local (Exim 4.86_1) (envelope-from ) id 1alJQB-00031w-HQ for xfs@oss.sgi.com; Wed, 30 Mar 2016 16:56:43 +0000 To: xfs@oss.sgi.com Subject: At price of 3 star Message-ID: <54be4139ae6fe1d025f99bce726349c2@infinity.supermail.co.in> X-ASG-Orig-Subj: At price of 3 star Date: Wed, 30 Mar 2016 14:35:20 +0000 From: "Book 5 Star" Reply-To: admin@supermail.co.in MIME-Version: 1.0 X-Mailer-LID: 13,11,9 List-Unsubscribe: X-Mailer-RecptId: 176164 X-Mailer-SID: 50 X-Mailer-Sent-By: 1 Content-Type: multipart/alternative; charset="UTF-8"; boundary="b1_2655d17eac71614164239a4fc296c6fa" Content-Transfer-Encoding: 8bit X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - infy.supermail.co.in X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [501 513] / [47 12] X-AntiAbuse: Sender Address Domain - gmail.com X-Get-Message-Sender-Via: infy.supermail.co.in: authenticated_id: superma/from_h X-Authenticated-Sender: infy.supermail.co.in: admin@supermail.co.in X-Barracuda-Connect: vps.supermail.co.in[23.227.96.103] X-Barracuda-Start-Time: 1459357005 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.15 X-Barracuda-Spam-Status: No, SCORE=0.15 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, IP_LINK_PLUS, MPART_ALT_DIFF, NORMAL_HTTP_TO_IP X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28304 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NORMAL_HTTP_TO_IP URI: Uses a dotted-decimal IP address in URL 0.00 IP_LINK_PLUS URI: Dotted-decimal IP address followed by CGI 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different --b1_2655d17eac71614164239a4fc296c6fa 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://infinity.supermail.co.in/email/display.php?M=176164&C=4a177894421f04f4c69d510d31c71a92&S=50&L=9&N=17 To stop receiving these emails:http://infinity.supermail.co.in/email/unsubscribe.php?M=176164&C=4a177894421f04f4c69d510d31c71a92&L=9&N=50 --b1_2655d17eac71614164239a4fc296c6fa Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 8bit
Click here to unsubscribe --b1_2655d17eac71614164239a4fc296c6fa-- From BATV+ce0ae62d478fb9371428+4602+infradead.org+hch@bombadil.srs.infradead.org Wed Mar 30 12:19:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9E1287CB0 for ; Wed, 30 Mar 2016 12:19:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1E12DAC001 for ; Wed, 30 Mar 2016 10:19:41 -0700 (PDT) X-ASG-Debug-ID: 1459358377-04cb6c2460141aa0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id zWEphgXttGzA0wfm (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 30 Mar 2016 10:19:38 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ce0ae62d478fb9371428+4602+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 1alJmB-0007pq-Ka; Wed, 30 Mar 2016 17:19:27 +0000 Date: Wed, 30 Mar 2016 10:19:27 -0700 From: Christoph Hellwig To: Ming Lei Cc: Jens Axboe , linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh Subject: Re: [PATCH v1 2/8] block: make 'struct bvec_iter' not depend on CONFIG_BLOCK Message-ID: <20160330171927.GA13320@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v1 2/8] block: make 'struct bvec_iter' not depend on CONFIG_BLOCK References: <1459354637-17415-1-git-send-email-ming.lei@canonical.com> <1459354637-17415-3-git-send-email-ming.lei@canonical.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459354637-17415-3-git-send-email-ming.lei@canonical.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1459358377 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28304 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Mar 31, 2016 at 12:17:11AM +0800, Ming Lei wrote: > We will use bvec iterator to implement iterate_bvec(): lib/iov_iter.c. > > Reviewed-by: Christoph Hellwig > Signed-off-by: Ming Lei > --- > include/linux/blk_types.h | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h > index 86a38ea..fd8527b 100644 > --- a/include/linux/blk_types.h > +++ b/include/linux/blk_types.h > @@ -26,8 +26,6 @@ struct bio_vec { > unsigned int bv_offset; > }; > > -#ifdef CONFIG_BLOCK > - > struct bvec_iter { > sector_t bi_sector; /* device address in 512 byte > sectors */ > @@ -39,6 +37,8 @@ struct bvec_iter { > current bvec */ > }; I didn't catch this earlier, but shouldn't this also move to bvec_iter.h? Or maybe just create a linux/bvec.h for the bvec, bvec_iter and bvec iter macros given that those are the types used outside the block layer as well. From darrick.wong@oracle.com Wed Mar 30 12:24:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 94F167CB0 for ; Wed, 30 Mar 2016 12:24:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6624830404E for ; Wed, 30 Mar 2016 10:24:50 -0700 (PDT) X-ASG-Debug-ID: 1459358686-04cbb07ad813c360001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id d3169MHys8MtkBpx (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 30 Mar 2016 10:24:47 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u2UHOjR9010194 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 30 Mar 2016 17:24:46 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u2UHOjmi006811 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 30 Mar 2016 17:24:45 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u2UHOi1g003951; Wed, 30 Mar 2016 17:24:45 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 30 Mar 2016 10:24:44 -0700 Date: Wed, 30 Mar 2016 10:24:43 -0700 From: "Darrick J. Wong" To: Eryu Guan Cc: fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs/030: link .out file according to reflink support status Message-ID: <20160330172443.GF5822@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH] xfs/030: link .out file according to reflink support status References: <1459331861-15025-1-git-send-email-eguan@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459331861-15025-1-git-send-email-eguan@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1459358686 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28304 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Wed, Mar 30, 2016 at 05:57:41PM +0800, Eryu Guan wrote: > Commit 31f48569c353 ("xfs/030: fix output on newer filesystems") added > more lines to .out file to match the output from XFS with reflink > support, but it broke test on older XFS. > > Fix it by introducing new .out file 030.out.reflink.linux to match the > reflink case, so old XFS still compares .out file against 030.out.linux. > > In order to do this, a new helper is introduced, _fs_has_reflink() > accepts mount point as argument and returns if the underlying fs > supports reflink or not. > > Signed-off-by: Eryu Guan > --- > > I didn't test this patch on newer XFS, but it did pass for me on current > 4.6-rc1 kernel. > > common/reflink | 18 +++ > tests/xfs/030 | 12 +- > tests/xfs/030.cfg | 1 + > tests/xfs/030.out.linux | 2 - > tests/xfs/030.out.reflink.linux | 252 ++++++++++++++++++++++++++++++++++++++++ > 5 files changed, 280 insertions(+), 5 deletions(-) > create mode 100644 tests/xfs/030.out.reflink.linux > > diff --git a/common/reflink b/common/reflink > index 4ec390d..bdfc01c 100644 > --- a/common/reflink > +++ b/common/reflink > @@ -156,6 +156,24 @@ _cp_reflink() { > cp --reflink=always -p "$file1" "$file2" > } > > +# given a mount point and test the underlying fs supports reflink or not > +_fs_has_reflink() > +{ > + if [ -z $1 ] || [ ! -d $1 ]; then > + echo "Missing mount point argument for _fs_has_reflink()" > + exit 1 > + fi > + local src=$1/_fs_has_reflink_testfile > + local tgt=$src.reflink > + local ret=0 > + > + echo "reflink test" > $src > + _cp_reflink $src $tgt >/dev/null 2>&1 > + ret=$? > + rm -f $src $tgt >/dev/null 2>&1 > + return $ret > +} Patch looks ok, though I wonder if _require_*_reflink ought to be refactored to use this? --D > + > # Reflink some file1 into file2 > _reflink() { > file1="$1" > diff --git a/tests/xfs/030 b/tests/xfs/030 > index 33c906c..d171a39 100755 > --- a/tests/xfs/030 > +++ b/tests/xfs/030 > @@ -44,9 +44,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 > . ./common/rc > . ./common/filter > . ./common/repair > - > -# link correct .out file > -_link_out_file > +. ./common/reflink > > # nuke the superblock, AGI, AGF, AGFL; then try repair the damage > # > @@ -90,6 +88,14 @@ else > _notrun "GQuota are enabled, test needs controlled sb recovery" > src/feature -P $SCRATCH_DEV && \ > _notrun "PQuota are enabled, test needs controlled sb recovery" > + > + # link correct .out file > + features=`_get_os_name` > + if _fs_has_reflink $SCRATCH_MNT; then > + features=$feature,reflink > + fi > + _link_out_file_named $seqfull.out "$features" > + > _scratch_unmount > fi > clear="" > diff --git a/tests/xfs/030.cfg b/tests/xfs/030.cfg > index 7ffdfc0..1eacdc1 100644 > --- a/tests/xfs/030.cfg > +++ b/tests/xfs/030.cfg > @@ -1,2 +1,3 @@ > irix: irix > +linux,reflink: reflink.linux > linux: linux > diff --git a/tests/xfs/030.out.linux b/tests/xfs/030.out.linux > index 14b9b35..cf3259f 100644 > --- a/tests/xfs/030.out.linux > +++ b/tests/xfs/030.out.linux > @@ -231,8 +231,6 @@ bad agbno AGBNO in agfl, agno 0 > bad agbno AGBNO in agfl, agno 0 > bad agbno AGBNO in agfl, agno 0 > bad agbno AGBNO in agfl, agno 0 > -bad agbno AGBNO in agfl, agno 0 > -bad agbno AGBNO in agfl, agno 0 > - found root inode chunk > Phase 3 - for each AG... > - scan and clear agi unlinked lists... > diff --git a/tests/xfs/030.out.reflink.linux b/tests/xfs/030.out.reflink.linux > new file mode 100644 > index 0000000..14b9b35 > --- /dev/null > +++ b/tests/xfs/030.out.reflink.linux > @@ -0,0 +1,252 @@ > +QA output created by 030 > +meta-data=DDEV isize=XXX agcount=N, agsize=XXX blks > +data = bsize=XXX blocks=XXX, imaxpct=PCT > + = sunit=XXX swidth=XXX, unwritten=X > +naming =VERN bsize=XXX > +log =LDEV bsize=XXX blocks=XXX > +realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX > +Corrupting sb 0 - setting bits to 0 > +Wrote X.XXKb (value 0x0) > +Phase 1 - find and verify superblock... > +bad primary superblock - bad magic number !!! > + > +attempting to find secondary superblock... > +found candidate secondary superblock... > +verified secondary superblock... > +writing modified primary superblock > +sb root inode value INO inconsistent with calculated value INO > +resetting superblock root inode pointer to INO > +sb realtime bitmap inode INO inconsistent with calculated value INO > +resetting superblock realtime bitmap ino pointer to INO > +sb realtime summary inode INO inconsistent with calculated value INO > +resetting superblock realtime summary ino pointer to INO > +Phase 2 - using 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... > + - process newly discovered inodes... > +Phase 4 - check for duplicate blocks... > + - setting up duplicate extent list... > + - check for inodes claiming duplicate blocks... > +Phase 5 - rebuild AG headers and trees... > + - reset superblock... > +Phase 6 - check inode connectivity... > + - resetting contents of realtime bitmap and summary inodes > + - traversing filesystem ... > + - traversal finished ... > + - moving disconnected inodes to lost+found ... > +Phase 7 - verify and correct link counts... > +Note - stripe unit (0) and width (0) fields have been reset. > +Please set with mount -o sunit=,swidth= > +done > +Corrupting agf 0 - setting bits to 0 > +Wrote X.XXKb (value 0x0) > +Phase 1 - find and verify superblock... > +Phase 2 - using log > + - zero log... > + - scan filesystem freespace and inode maps... > +bad magic # 0x0 for agf 0 > +bad version # 0 for agf 0 > +bad length 0 for agf 0, should be LENGTH > +reset bad agf for ag 0 > +bad agbno AGBNO for btbno root, agno 0 > +bad agbno AGBNO for btbcnt root, agno 0 > + - found root inode chunk > +Phase 3 - for each AG... > + - scan and clear agi unlinked lists... > + - process known inodes and perform inode discovery... > + - process newly discovered inodes... > +Phase 4 - check for duplicate blocks... > + - setting up duplicate extent list... > + - check for inodes claiming duplicate blocks... > +Phase 5 - rebuild AG headers and trees... > + - reset superblock... > +Phase 6 - check inode connectivity... > + - resetting contents of realtime bitmap and summary inodes > + - traversing filesystem ... > + - traversal finished ... > + - moving disconnected inodes to lost+found ... > +Phase 7 - verify and correct link counts... > +done > +Corrupting agi 0 - setting bits to 0 > +Wrote X.XXKb (value 0x0) > +Phase 1 - find and verify superblock... > +Phase 2 - using log > + - zero log... > + - scan filesystem freespace and inode maps... > +bad magic # 0x0 for agi 0 > +bad version # 0 for agi 0 > +bad length # 0 for agi 0, should be LENGTH > +reset bad agi for ag 0 > +bad agbno AGBNO for inobt root, agno 0 > +root inode chunk not found > +Phase 3 - for each AG... > + - scan and clear agi unlinked lists... > + - process known inodes and perform inode discovery... > + - process newly discovered inodes... > +Phase 4 - check for duplicate blocks... > + - setting up duplicate extent list... > + - check for inodes claiming duplicate blocks... > +Phase 5 - rebuild AG headers and trees... > + - reset superblock... > +Phase 6 - check inode connectivity... > + - resetting contents of realtime bitmap and summary inodes > + - traversing filesystem ... > + - traversal finished ... > + - moving disconnected inodes to lost+found ... > +Phase 7 - verify and correct link counts... > +done > +Corrupting agfl 0 - setting bits to 0 > +Wrote X.XXKb (value 0x0) > +Phase 1 - find and verify superblock... > +Phase 2 - using 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... > + - process newly discovered inodes... > +Phase 4 - check for duplicate blocks... > + - setting up duplicate extent list... > + - check for inodes claiming duplicate blocks... > +Phase 5 - rebuild AG headers and trees... > + - reset superblock... > +Phase 6 - check inode connectivity... > + - resetting contents of realtime bitmap and summary inodes > + - traversing filesystem ... > + - traversal finished ... > + - moving disconnected inodes to lost+found ... > +Phase 7 - verify and correct link counts... > +done > +Corrupting sb 0 - setting bits to -1 > +Wrote X.XXKb (value 0xffffffff) > +Phase 1 - find and verify superblock... > +bad primary superblock - bad magic number !!! > + > +attempting to find secondary superblock... > +found candidate secondary superblock... > +verified secondary superblock... > +writing modified primary superblock > +sb root inode value INO inconsistent with calculated value INO > +resetting superblock root inode pointer to INO > +sb realtime bitmap inode INO inconsistent with calculated value INO > +resetting superblock realtime bitmap ino pointer to INO > +sb realtime summary inode INO inconsistent with calculated value INO > +resetting superblock realtime summary ino pointer to INO > +Phase 2 - using 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... > + - process newly discovered inodes... > +Phase 4 - check for duplicate blocks... > + - setting up duplicate extent list... > + - check for inodes claiming duplicate blocks... > +Phase 5 - rebuild AG headers and trees... > + - reset superblock... > +Phase 6 - check inode connectivity... > + - resetting contents of realtime bitmap and summary inodes > + - traversing filesystem ... > + - traversal finished ... > + - moving disconnected inodes to lost+found ... > +Phase 7 - verify and correct link counts... > +Note - stripe unit (0) and width (0) fields have been reset. > +Please set with mount -o sunit=,swidth= > +done > +Corrupting agf 0 - setting bits to -1 > +Wrote X.XXKb (value 0xffffffff) > +Phase 1 - find and verify superblock... > +Phase 2 - using log > + - zero log... > + - scan filesystem freespace and inode maps... > +bad magic # 0xffffffff for agf 0 > +bad version # -1 for agf 0 > +bad sequence # -1 for agf 0 > +bad length -1 for agf 0, should be LENGTH > +flfirst -1 in agf 0 too large (max = MAX) > +fllast -1 in agf 0 too large (max = MAX) > +reset bad agf for ag 0 > +freeblk count 1 != flcount -1 in ag 0 > +bad agbno AGBNO for btbno root, agno 0 > +bad agbno AGBNO for btbcnt root, agno 0 > + - found root inode chunk > +Phase 3 - for each AG... > + - scan and clear agi unlinked lists... > + - process known inodes and perform inode discovery... > + - process newly discovered inodes... > +Phase 4 - check for duplicate blocks... > + - setting up duplicate extent list... > + - check for inodes claiming duplicate blocks... > +Phase 5 - rebuild AG headers and trees... > + - reset superblock... > +Phase 6 - check inode connectivity... > + - resetting contents of realtime bitmap and summary inodes > + - traversing filesystem ... > + - traversal finished ... > + - moving disconnected inodes to lost+found ... > +Phase 7 - verify and correct link counts... > +done > +Corrupting agi 0 - setting bits to -1 > +Wrote X.XXKb (value 0xffffffff) > +Phase 1 - find and verify superblock... > +Phase 2 - using log > + - zero log... > + - scan filesystem freespace and inode maps... > +bad magic # 0xffffffff for agi 0 > +bad version # -1 for agi 0 > +bad sequence # -1 for agi 0 > +bad length # -1 for agi 0, should be LENGTH > +reset bad agi for ag 0 > +bad agbno AGBNO for inobt root, agno 0 > +root inode chunk not found > +Phase 3 - for each AG... > + - scan and clear agi unlinked lists... > + - process known inodes and perform inode discovery... > + - process newly discovered inodes... > +Phase 4 - check for duplicate blocks... > + - setting up duplicate extent list... > + - check for inodes claiming duplicate blocks... > +Phase 5 - rebuild AG headers and trees... > + - reset superblock... > +Phase 6 - check inode connectivity... > + - resetting contents of realtime bitmap and summary inodes > + - traversing filesystem ... > + - traversal finished ... > + - moving disconnected inodes to lost+found ... > +Phase 7 - verify and correct link counts... > +done > +Corrupting agfl 0 - setting bits to -1 > +Wrote X.XXKb (value 0xffffffff) > +Phase 1 - find and verify superblock... > +Phase 2 - using log > + - zero log... > + - scan filesystem freespace and inode maps... > +bad agbno AGBNO in agfl, agno 0 > +bad agbno AGBNO in agfl, agno 0 > +bad agbno AGBNO in agfl, agno 0 > +bad agbno AGBNO in agfl, agno 0 > +bad agbno AGBNO in agfl, agno 0 > +bad agbno AGBNO in agfl, agno 0 > + - found root inode chunk > +Phase 3 - for each AG... > + - scan and clear agi unlinked lists... > + - process known inodes and perform inode discovery... > + - process newly discovered inodes... > +Phase 4 - check for duplicate blocks... > + - setting up duplicate extent list... > + - check for inodes claiming duplicate blocks... > +Phase 5 - rebuild AG headers and trees... > + - reset superblock... > +Phase 6 - check inode connectivity... > + - resetting contents of realtime bitmap and summary inodes > + - traversing filesystem ... > + - traversal finished ... > + - moving disconnected inodes to lost+found ... > +Phase 7 - verify and correct link counts... > +done > -- > 2.5.5 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From hch@lst.de Wed Mar 30 12:26:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B80BC7CB0 for ; Wed, 30 Mar 2016 12:26:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8A65B30404E for ; Wed, 30 Mar 2016 10:26:40 -0700 (PDT) X-ASG-Debug-ID: 1459358795-04cb6c2462141db0001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id Lq9HTunmHTUGTaqA (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 30 Mar 2016 10:26:36 -0700 (PDT) X-Barracuda-Envelope-From: hch@lst.de X-Barracuda-Apparent-Source-IP: 213.95.11.211 Received: by newverein.lst.de (Postfix, from userid 2407) id 0FC3968C70; Wed, 30 Mar 2016 19:26:35 +0200 (CEST) Date: Wed, 30 Mar 2016 19:26:34 +0200 From: Christoph Hellwig To: "Darrick J. Wong" Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: don't hand out pNFS layouts for reflink inodes Message-ID: <20160330172634.GA22951@lst.de> X-ASG-Orig-Subj: Re: [PATCH] xfs: don't hand out pNFS layouts for reflink inodes References: <1456936485-21940-1-git-send-email-hch@lst.de> <20160328195140.GB5360@birch.djwong.org> <20160329072128.GA14940@lst.de> <20160330000842.GD5822@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160330000842.GD5822@birch.djwong.org> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1459358796 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28304 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Mar 29, 2016 at 05:08:42PM -0700, Darrick J. Wong wrote: > > Btw, we'll need something similar to prevent swapfiles which just use > > ->bmap, but unfortunately swap just checks for the existences of method, > > so I'll probably have to do some VFS changes to properly support that. > > Yes, please. ocfs2 will gladly let you call swapon on a reflinked file, > and totally fails to CoW it properly. :) Ouch. Time to add a test for that to xfstests.. From darrick.wong@oracle.com Wed Mar 30 12:40:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C523F7CA1 for ; Wed, 30 Mar 2016 12:40:34 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 843E230405F for ; Wed, 30 Mar 2016 10:40:34 -0700 (PDT) X-ASG-Debug-ID: 1459359632-04cb6c245f142630001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id JgNq4RMrfTlOBKrb (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 30 Mar 2016 10:40:32 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u2UHeTri028700 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 30 Mar 2016 17:40:30 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u2UHeTOX014413 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 30 Mar 2016 17:40:29 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u2UHeSUW027349; Wed, 30 Mar 2016 17:40:28 GMT Received: from localhost (/10.159.154.78) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 30 Mar 2016 10:40:27 -0700 Date: Wed, 30 Mar 2016 10:40:26 -0700 From: "Darrick J. Wong" To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: don't hand out pNFS layouts for reflink inodes Message-ID: <20160330174026.GB2236@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: don't hand out pNFS layouts for reflink inodes References: <1456936485-21940-1-git-send-email-hch@lst.de> <20160328195140.GB5360@birch.djwong.org> <20160329072128.GA14940@lst.de> <20160330000842.GD5822@birch.djwong.org> <20160330172634.GA22951@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160330172634.GA22951@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1459359632 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28304 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Wed, Mar 30, 2016 at 07:26:34PM +0200, Christoph Hellwig wrote: > On Tue, Mar 29, 2016 at 05:08:42PM -0700, Darrick J. Wong wrote: > > > Btw, we'll need something similar to prevent swapfiles which just use > > > ->bmap, but unfortunately swap just checks for the existences of method, > > > so I'll probably have to do some VFS changes to properly support that. > > > > Yes, please. ocfs2 will gladly let you call swapon on a reflinked file, > > and totally fails to CoW it properly. :) > > Ouch. Time to add a test for that to xfstests.. Swap/reflink tests will appear as generic/92[34] the next time I post xfstests patches. --D From darrick.wong@oracle.com Wed Mar 30 13:28:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 27D7D7CA3 for ; Wed, 30 Mar 2016 13:28:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id ED81E8F8050 for ; Wed, 30 Mar 2016 11:28:24 -0700 (PDT) X-ASG-Debug-ID: 1459362502-04cb6c2464144ae0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id Z4XwFazUjFGRr25S (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 30 Mar 2016 11:28:22 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u2UIRvGK031457 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 30 Mar 2016 18:27:58 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u2UIRvGs019355 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 30 Mar 2016 18:27:57 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u2UIRunU009371; Wed, 30 Mar 2016 18:27:56 GMT Received: from localhost (/10.159.154.78) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 30 Mar 2016 11:27:56 -0700 Date: Wed, 30 Mar 2016 11:27:55 -0700 From: "Darrick J. Wong" To: Christoph Hellwig Cc: xfs@oss.sgi.com, linux-fsdevel , linux-btrfs , linux-api@vger.kernel.org Subject: fallocate mode flag for "unshare blocks"? Message-ID: <20160330182755.GC2236@birch.djwong.org> X-ASG-Orig-Subj: fallocate mode flag for "unshare blocks"? References: <20160302155007.GB7125@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160302155007.GB7125@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1459362502 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28306 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Hi all, Christoph and I have been working on adding reflink and CoW support to XFS recently. Since the purpose of (mode 0) fallocate is to make sure that future file writes cannot ENOSPC, I extended the XFS fallocate handler to unshare any shared blocks via the copy on write mechanism I built for it. However, Christoph shared the following concerns with me about that interpretation: > I know that I suggested unsharing blocks on fallocate, but it turns out > this is causing problems. Applications expect falloc to be a fast > metadata operation, and copying a potentially large number of blocks > is against that expextation. This is especially bad for the NFS > server, which should not be blocked for a long time in a synchronous > operation. > > I think we'll have to remove the unshare and just fail the fallocate > for a reflinked region for now. I still think it makes sense to expose > an unshare operation, and we probably should make that another > fallocate mode. With that in mind, how do you all think we ought to resolve this? Should we add a new fallocate mode flag that means "unshare the shared blocks"? Obviously, this unshare flag cannot be used in conjunction with hole punching, zero range, insert range, or collapse range. This breaks the expectation that writing to a file after fallocate won't ENOSPC. Or is it ok that fallocate could block, potentially for a long time as we stream cows through the page cache (or however unshare works internally)? Those same programs might not be expecting fallocate to take a long time. Can we do better than either solution? It occurs to me that XFS does unshare by reading the file data into the pagecache, marking the pages dirty, and flushing the dirty pages; performance could be improved by skipping the flush at the end. We won't ENOSPC, because the XFS delalloc system is careful enough to check that there are enough free blocks to handle both the allocation and the metadata updates. The only gap in this scheme that I can see is if we fallocate, crash, and upon restart the program then tries to write without retrying the fallocate. Can we trade some performance for the added requirement that we must fallocate -> write -> fsync, and retry the trio if we crash before the fsync returns? I think that's already an implicit requirement, so we might be ok here. Opinions? I rather like the last option, though I've only just thought of it and have not had time to examine it thoroughly, and it's specific to XFS. :) --D From ahferroin7@gmail.com Wed Mar 30 13:59:46 2016 Return-Path: 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 4FC117CA1 for ; Wed, 30 Mar 2016 13:59:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0786D8F8059 for ; Wed, 30 Mar 2016 11:59:45 -0700 (PDT) X-ASG-Debug-ID: 1459364379-04bdf01105fd8a0001-NocioJ Received: from mail-qg0-f45.google.com (mail-qg0-f45.google.com [209.85.192.45]) by cuda.sgi.com with ESMTP id eGBehdSTX0N8iF40 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 30 Mar 2016 11:59:40 -0700 (PDT) X-Barracuda-Envelope-From: ahferroin7@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.45 Received: by mail-qg0-f45.google.com with SMTP id y89so47452578qge.2 for ; Wed, 30 Mar 2016 11:59:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=subject:to:references:cc:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding; bh=yh6N9oLkIofClR4Ok58O/qYfy1mfnaX2up22u9jqTkM=; b=Mn3z+A1dd9HoqbRzRu0GVhJshASlLVeZlUsoll3ab8Tz6NsQJOu99yGHFafvAhrYcH XxfzAnVsJAUcLXcdmVNlDX63/U8NFbuqsIFIL3Y7IZ4wA/rAE1kpVuGtz0QdmeqeKLsZ 0/qt9ancSU4Prddk6qUoq9TA6PYN+hJ2OvKce2Y3zPFW+dzj4tniiDB3RVHr6ighbA+7 wAphukUE1RMjpcwiR7ZhQyUc10E/tw/OBR+eSlAn2eWaqgUTnBNuhWmJFtCQ28ND2dFv hcPuj9lf1xf9GnL0k67UGGLEJwuG3/xQ/YY9pJidgSP4+zx+ydJYjFmOJ9IppHWDZvaR A6rg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:subject:to:references:cc:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=yh6N9oLkIofClR4Ok58O/qYfy1mfnaX2up22u9jqTkM=; b=Doi1i2/ezFjHDGxpoF/DugfvRetUUPAlbePW90cLqftOb+55NjnHb0Yfe6UGow1ono 0Ge+dmqNISw5kaW7tomPH7hcnvnar83kcpgCaOp3u5M97dZD++3+ANLYaJPPTpHcdG32 9rZQPMa3wTcuB0BQJbRFLLAMPKmUXqWQgMf982X/e8yBxjKz3jIj6vCKIhuq7mkf7e5y 9dTluMtbdFv97lBojimwDriQsaG+1atguTNXBXhEDsdkW5lLSPQoWZqJ7N1DvabMdFam yh7DPl0675mivaftS1kGUs62AOGpOLJoKgk96JwETLWUf8kZAc09VICG6mxXgUHEZQsr u+yA== X-Gm-Message-State: AD7BkJKebdNJJCwZcdI3kMrIOpQkHVR2Z4sC+2cyZOZL9RnWUBgL1JOdZy1w9vPhex9h2g== X-Received: by 10.140.237.204 with SMTP id i195mr12783840qhc.55.1459364379199; Wed, 30 Mar 2016 11:59:39 -0700 (PDT) Received: from [127.0.0.1] (rrcs-70-62-41-24.central.biz.rr.com. [70.62.41.24]) by smtp.gmail.com with ESMTPSA id z65sm2367149qhb.36.2016.03.30.11.59.38 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 30 Mar 2016 11:59:38 -0700 (PDT) Subject: Re: fallocate mode flag for "unshare blocks"? To: "Darrick J. Wong" , Christoph Hellwig X-ASG-Orig-Subj: Re: fallocate mode flag for "unshare blocks"? References: <20160302155007.GB7125@infradead.org> <20160330182755.GC2236@birch.djwong.org> Cc: xfs@oss.sgi.com, linux-fsdevel , linux-btrfs , linux-api@vger.kernel.org From: "Austin S. Hemmelgarn" Message-ID: <56FC21DE.7090308@gmail.com> Date: Wed, 30 Mar 2016 14:58:38 -0400 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.7.0 MIME-Version: 1.0 In-Reply-To: <20160330182755.GC2236@birch.djwong.org> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Antivirus: avast! (VPS 160330-3, 2016-03-30), Outbound message X-Antivirus-Status: Clean X-Barracuda-Connect: mail-qg0-f45.google.com[209.85.192.45] X-Barracuda-Start-Time: 1459364380 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28307 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On 2016-03-30 14:27, Darrick J. Wong wrote: > Hi all, > > Christoph and I have been working on adding reflink and CoW support to > XFS recently. Since the purpose of (mode 0) fallocate is to make sure > that future file writes cannot ENOSPC, I extended the XFS fallocate > handler to unshare any shared blocks via the copy on write mechanism I > built for it. However, Christoph shared the following concerns with > me about that interpretation: > >> I know that I suggested unsharing blocks on fallocate, but it turns out >> this is causing problems. Applications expect falloc to be a fast >> metadata operation, and copying a potentially large number of blocks >> is against that expextation. This is especially bad for the NFS >> server, which should not be blocked for a long time in a synchronous >> operation. >> >> I think we'll have to remove the unshare and just fail the fallocate >> for a reflinked region for now. I still think it makes sense to expose >> an unshare operation, and we probably should make that another >> fallocate mode. > > With that in mind, how do you all think we ought to resolve this? > Should we add a new fallocate mode flag that means "unshare the shared > blocks"? Obviously, this unshare flag cannot be used in conjunction > with hole punching, zero range, insert range, or collapse range. This > breaks the expectation that writing to a file after fallocate won't > ENOSPC. > > Or is it ok that fallocate could block, potentially for a long time as > we stream cows through the page cache (or however unshare works > internally)? Those same programs might not be expecting fallocate to > take a long time. Nothing that I can find in the man-pages or API documentation for Linux's fallocate explicitly says that it will be fast. There are bits that say it should be efficient, but that is not itself well defined (given context, I would assume it to mean that it doesn't use as much I/O as writing out that many bytes of zero data, not necessarily that it will return quickly). We may have done a lot to make it fast, but that doesn't mean by any measure that we guarantee it anywhere (at least, we don't guarantee it anywhere I can find). > > Can we do better than either solution? It occurs to me that XFS does > unshare by reading the file data into the pagecache, marking the pages > dirty, and flushing the dirty pages; performance could be improved by > skipping the flush at the end. We won't ENOSPC, because the XFS > delalloc system is careful enough to check that there are enough free > blocks to handle both the allocation and the metadata updates. The > only gap in this scheme that I can see is if we fallocate, crash, and > upon restart the program then tries to write without retrying the > fallocate. Can we trade some performance for the added requirement > that we must fallocate -> write -> fsync, and retry the trio if we > crash before the fsync returns? I think that's already an implicit > requirement, so we might be ok here. Most of the software I've seen that doesn't use fallocate like this is either doing odd things otherwise, or is just making sure it has space for temporary files, so I think it is probably safe to require this. > > Opinions? I rather like the last option, though I've only just > thought of it and have not had time to examine it thoroughly, and it's > specific to XFS. :) Personally I'm indifferent about how we handle it, as long as it still maintains the normal semantics, and it works for reflinked ranges (seemingly arbitrary failures for a range in a file should be handled properly by an application, but that doesn't mean we shouldn't try to reduce their occurrence). I would like to comment that it would be nice to have an fallocate option to force a range to become unshared, but I personally feel we should have that alongside the regular functionality, not in-place of it. It's probably also worth noting that reflinks technically break expectations WRT FALLOC_FL_PUNCH_HOLE already. Most apps I see that use PUNCH_HOLE seem to expect it to free space, which won't happen if the range is reflinked elsewhere. There is of course nothing that says that it will free space, but that doesn't change user expectations. From olaf@aepfle.de Wed Mar 30 14:33:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 5BFD57CA2 for ; Wed, 30 Mar 2016 14:33:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2F036304059 for ; Wed, 30 Mar 2016 12:33:55 -0700 (PDT) X-ASG-Debug-ID: 1459366432-04cb6c2464146d20001-NocioJ Received: from mo4-p00-ob.smtp.rzone.de (mo4-p00-ob.smtp.rzone.de [81.169.146.216]) by cuda.sgi.com with ESMTP id D4YE0ezzdtWw91eB (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 30 Mar 2016 12:33:53 -0700 (PDT) X-Barracuda-Envelope-From: olaf@aepfle.de X-Barracuda-Apparent-Source-IP: 81.169.146.216 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; t=1459366432; l=243; s=domk; d=aepfle.de; h=In-Reply-To:Content-Disposition:Content-Type:MIME-Version: References:Subject:Cc:To:From:Date; bh=iP1L48+9QgBTdiV6mq4DO2YUyZftQhFEvBIVj0IWHzM=; b=eZXYyl431hgPiigiw1fVdZVoIecS3TMxeGh/DtPdumnL34vbvcxXoQkYXyXxOdYC1OD 9WklZ7oovkxN+h24FS49iDXKhj7ZCZ0LWU8Jk/fq1+dJVytMwm6HjyK7bXCRD/x7/QCb1 B0WRATSfF+8Nj9YIlGtSJ4r/xKNdIK3l5ec= X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+yackYocTD1iAi8x+OWi/zfN1cLnDYUgpR1SBw9S9SIeW5nLQOqLO07QxZoXHFqaCpz1EAQ== X-RZG-CLASS-ID: mo00 Received: from probook ([2001:a62:1280:ddff:edb7:8005:716d:ed7c]) by smtp.strato.de (RZmta 37.22 AUTH) with ESMTPSA id z00824s2UJXqlIQ (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (curve secp521r1 with 521 ECDH bits, eq. 15360 bits RSA)) (Client did not present a certificate); Wed, 30 Mar 2016 21:33:52 +0200 (CEST) Received: by probook (Postfix, from userid 1000) id 6AEF4508B4; Wed, 30 Mar 2016 21:33:51 +0200 (CEST) Date: Wed, 30 Mar 2016 21:33:51 +0200 From: Olaf Hering To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: BUG in xfs_trans_binval Message-ID: <20160330193351.GA18130@aepfle.de> X-ASG-Orig-Subj: Re: BUG in xfs_trans_binval References: <20160329171553.GA17885@aepfle.de> <20160329235415.GF30721@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20160329235415.GF30721@dastard> User-Agent: Mutt/1.5.24 (6598) X-Barracuda-Connect: mo4-p00-ob.smtp.rzone.de[81.169.146.216] X-Barracuda-Start-Time: 1459366433 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28307 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Wed, Mar 30, Dave Chinner wrote: > Can you run a memory tester on the machine? Thanks for taking time to respond. memtest did not find anything. Since it is essentially a scratch partition doing a mkfs would work for me. Olaf From david@fromorbit.com Wed Mar 30 15:27:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 305247CA3 for ; Wed, 30 Mar 2016 15:27:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 947ABAC001 for ; Wed, 30 Mar 2016 13:27:00 -0700 (PDT) X-ASG-Debug-ID: 1459369617-04cbb07ad7143540001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id KTsJd5cxlzPNAUsZ for ; Wed, 30 Mar 2016 13:26:58 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AlCADrNfxWPDGaLHldgzSBUIZooAoBAQEGjBCFY4QNhgcCAgEBAoFNTQEBAQEBAQcBAQEBQUCEQgEBBCcTHCMQCAMOCgklDwUlAwcaE4gmwXwBAQEHAh4ZhT2FDYQMhggBBJMPhF+NfY8XRI5MhF0oMIcCgT0BAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail06.adl2.internode.on.net with ESMTP; 31 Mar 2016 06:56:56 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1alMhb-0005Xb-An; Thu, 31 Mar 2016 07:26:55 +1100 Date: Thu, 31 Mar 2016 07:26:55 +1100 From: Dave Chinner To: Mateusz Guzik Cc: xfs@oss.sgi.com, Andreas Gruenbacher , Al Viro Subject: Re: [PATCH] xfs: fix a memory leak in xfs_get_acl on error Message-ID: <20160330202655.GH30721@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix a memory leak in xfs_get_acl on error References: <1459348507-20406-1-git-send-email-mguzik@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459348507-20406-1-git-send-email-mguzik@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1459369617 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28308 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Mar 30, 2016 at 04:35:07PM +0200, Mateusz Guzik wrote: > Signed-off-by: Mateusz Guzik > --- > fs/xfs/xfs_acl.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c > index 2dad2b5..ce10c4c 100644 > --- a/fs/xfs/xfs_acl.c > +++ b/fs/xfs/xfs_acl.c > @@ -162,10 +162,11 @@ xfs_get_acl(struct inode *inode, int type) > */ > if (error != -ENOATTR) > acl = ERR_PTR(error); > - return acl; > + goto out; > } > > acl = xfs_acl_from_disk(xfs_acl, len, XFS_ACL_MAX_ENTRIES(ip->i_mount)); > +out: > kmem_free(xfs_acl); > return acl; > } Hi Mateusz, It looks like we've already fixed this problem - can you check 4.6-rc1 and if the leak is still there post an updated patch? Cheers, Dave. -- Dave Chinner david@fromorbit.com From mguzik@redhat.com Wed Mar 30 15:41:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C730F7CA3 for ; Wed, 30 Mar 2016 15:41:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7BAF48F8037 for ; Wed, 30 Mar 2016 13:41:29 -0700 (PDT) X-ASG-Debug-ID: 1459370487-04bdf011021041b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id InXAh52DzG6Vu2Mb (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 30 Mar 2016 13:41:27 -0700 (PDT) X-Barracuda-Envelope-From: mguzik@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 43E3D15558; Wed, 30 Mar 2016 20:41:27 +0000 (UTC) Received: from mguzik (ovpn-116-95.ams2.redhat.com [10.36.116.95]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2UKfLMl006855 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 30 Mar 2016 16:41:25 -0400 Date: Wed, 30 Mar 2016 22:41:20 +0200 From: Mateusz Guzik To: Dave Chinner Cc: xfs@oss.sgi.com, Andreas Gruenbacher , Al Viro Subject: Re: [PATCH] xfs: fix a memory leak in xfs_get_acl on error Message-ID: <20160330204119.GA8032@mguzik> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix a memory leak in xfs_get_acl on error References: <1459348507-20406-1-git-send-email-mguzik@redhat.com> <20160330202655.GH30721@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20160330202655.GH30721@dastard> User-Agent: Mutt/1.5.23.1 (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: 1459370487 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Mar 31, 2016 at 07:26:55AM +1100, Dave Chinner wrote: > On Wed, Mar 30, 2016 at 04:35:07PM +0200, Mateusz Guzik wrote: > > Signed-off-by: Mateusz Guzik > > --- > > fs/xfs/xfs_acl.c | 3 ++- > > 1 file changed, 2 insertions(+), 1 deletion(-) > > > > diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c > > index 2dad2b5..ce10c4c 100644 > > --- a/fs/xfs/xfs_acl.c > > +++ b/fs/xfs/xfs_acl.c > > @@ -162,10 +162,11 @@ xfs_get_acl(struct inode *inode, int type) > > */ > > if (error != -ENOATTR) > > acl = ERR_PTR(error); > > - return acl; > > + goto out; > > } > > > > acl = xfs_acl_from_disk(xfs_acl, len, XFS_ACL_MAX_ENTRIES(ip->i_mount)); > > +out: > > kmem_free(xfs_acl); > > return acl; > > } > > Hi Mateusz, > > It looks like we've already fixed this problem - can you check > 4.6-rc1 and if the leak is still there post an updated patch? > The patch which introuced the bug is not present in 4.6-rc1. The patch is against next-20160330, the bug was introduced in: commit ae4e84be32ef6fdf97f10852778597b1a2be3cba Author: Andreas Gruenbacher Date: Thu Mar 24 14:38:37 2016 +0100 posix_acl: Inode acl caching fixes Apologies if this should have been handled differently (by replying to the original patch?) -- Mateusz Guzik From david@fromorbit.com Wed Mar 30 17:06:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7C7317CAE for ; Wed, 30 Mar 2016 17:06:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E300CAC004 for ; Wed, 30 Mar 2016 15:06:41 -0700 (PDT) X-ASG-Debug-ID: 1459375592-04cb6c245f14a920001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id pDdh2BWgq7zstdkK for ; Wed, 30 Mar 2016 15:06:35 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AVCgBHTfxWPDGaLHldgzSBUIJxg3mgCgEBAQEBAQaMEIVjhA2GBwICAQECgU5NAQEBAQEBBwEBAQFBQIRCAQEEJxMcIxAIAw4GBAklDwUlAwcaE4gmwg4BAQEHAgEdGYU9hQ2EDIYIBZdujX2PF0SOTIRdKDCHMIE9AQEB Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail06.adl2.internode.on.net with ESMTP; 31 Mar 2016 08:35:23 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1alOEl-0005ju-Qu; Thu, 31 Mar 2016 09:05:15 +1100 Date: Thu, 31 Mar 2016 09:05:15 +1100 From: Dave Chinner To: Mateusz Guzik Cc: xfs@oss.sgi.com, Andreas Gruenbacher , Al Viro Subject: Re: [PATCH] xfs: fix a memory leak in xfs_get_acl on error Message-ID: <20160330220515.GI30721@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix a memory leak in xfs_get_acl on error References: <1459348507-20406-1-git-send-email-mguzik@redhat.com> <20160330202655.GH30721@dastard> <20160330204119.GA8032@mguzik> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160330204119.GA8032@mguzik> 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: 1459375592 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28311 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Mar 30, 2016 at 10:41:20PM +0200, Mateusz Guzik wrote: > On Thu, Mar 31, 2016 at 07:26:55AM +1100, Dave Chinner wrote: > > On Wed, Mar 30, 2016 at 04:35:07PM +0200, Mateusz Guzik wrote: > > > Signed-off-by: Mateusz Guzik > > > --- > > > fs/xfs/xfs_acl.c | 3 ++- > > > 1 file changed, 2 insertions(+), 1 deletion(-) > > > > > > diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c > > > index 2dad2b5..ce10c4c 100644 > > > --- a/fs/xfs/xfs_acl.c > > > +++ b/fs/xfs/xfs_acl.c > > > @@ -162,10 +162,11 @@ xfs_get_acl(struct inode *inode, int type) > > > */ > > > if (error != -ENOATTR) > > > acl = ERR_PTR(error); > > > - return acl; > > > + goto out; > > > } > > > > > > acl = xfs_acl_from_disk(xfs_acl, len, XFS_ACL_MAX_ENTRIES(ip->i_mount)); > > > +out: > > > kmem_free(xfs_acl); > > > return acl; > > > } > > > > Hi Mateusz, > > > > It looks like we've already fixed this problem - can you check > > 4.6-rc1 and if the leak is still there post an updated patch? > > > > The patch which introuced the bug is not present in 4.6-rc1. > > The patch is against next-20160330, the bug was introduced in: > > commit ae4e84be32ef6fdf97f10852778597b1a2be3cba > Author: Andreas Gruenbacher > Date: Thu Mar 24 14:38:37 2016 +0100 > > posix_acl: Inode acl caching fixes > > Apologies if this should have been handled differently (by replying to the > original patch?) You need to put this information in the patch description so we don't have to guess at what it applies to. Most maintainers assume that if it is not mentioned, the patch should apply to their current top of tree.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From agruenba@redhat.com Wed Mar 30 17:11:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C2F1F7CAE for ; Wed, 30 Mar 2016 17:11:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 91B3630404E for ; Wed, 30 Mar 2016 15:11:17 -0700 (PDT) X-ASG-Debug-ID: 1459375874-04cb6c246214aa10001-NocioJ Received: from mail-vk0-f46.google.com (mail-vk0-f46.google.com [209.85.213.46]) by cuda.sgi.com with ESMTP id EIH8zvK0JuQQ9GCO (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 30 Mar 2016 15:11:15 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.85.213.46 Received: by mail-vk0-f46.google.com with SMTP id e185so79987280vkb.1 for ; Wed, 30 Mar 2016 15:11:15 -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; bh=oc+7vxH+UozdCEwKO+WzTm9p23N1n1ijYbuc6lTGu5k=; b=hIqM2lQQDPpEYGfyYtDQWCS19mWxTAJShNaCKWuzWkiZbY31/biwpjEtU5psmdLrBE 7eEHCYRpbzCy7A67NI/qkiaeYaDb4rFUKS9BykS6xVp9N1owr42lFCLEuVq7Q48tZ9qe +J1X5ptS/qFiSAuxRAyiNkYDnNNGwcCOyf85wwFVBukQafDzr67vIIHodowawPc6/avv yh1YYwthVKkklRZRZndeHLybYCldruUUD9D9TTHHACzWYBl2HZBRnsDn1ePJXbmh/6ut 9Gq17ZQKf9hL7W5wWfw0+4zuEw1dNznFQl9UCZsTpT3+Td/nXZthFiRgD/LBDirt15y5 FEDQ== X-Gm-Message-State: AD7BkJL9zPMDbLgfWaj/Y2k9dYL0kKj1U8KJ/CdSLYr4GT4JAFo34PG8kNOiszTUWYz+4b8P8YsUGr31IzCwacMO MIME-Version: 1.0 X-Received: by 10.159.36.120 with SMTP id 111mr6067270uaq.29.1459375874421; Wed, 30 Mar 2016 15:11:14 -0700 (PDT) Received: by 10.176.65.40 with HTTP; Wed, 30 Mar 2016 15:11:14 -0700 (PDT) In-Reply-To: <20160330204119.GA8032@mguzik> References: <1459348507-20406-1-git-send-email-mguzik@redhat.com> <20160330202655.GH30721@dastard> <20160330204119.GA8032@mguzik> Date: Thu, 31 Mar 2016 00:11:14 +0200 Message-ID: Subject: Re: [PATCH] xfs: fix a memory leak in xfs_get_acl on error From: Andreas Gruenbacher X-ASG-Orig-Subj: Re: [PATCH] xfs: fix a memory leak in xfs_get_acl on error To: Mateusz Guzik Cc: Dave Chinner , XFS Developers , Al Viro Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-vk0-f46.google.com[209.85.213.46] X-Barracuda-Start-Time: 1459375875 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28311 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain On Wed, Mar 30, 2016 at 10:41 PM, Mateusz Guzik wrote: > On Thu, Mar 31, 2016 at 07:26:55AM +1100, Dave Chinner wrote: >> On Wed, Mar 30, 2016 at 04:35:07PM +0200, Mateusz Guzik wrote: >> > Signed-off-by: Mateusz Guzik >> > --- >> > fs/xfs/xfs_acl.c | 3 ++- >> > 1 file changed, 2 insertions(+), 1 deletion(-) >> > >> > diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c >> > index 2dad2b5..ce10c4c 100644 >> > --- a/fs/xfs/xfs_acl.c >> > +++ b/fs/xfs/xfs_acl.c >> > @@ -162,10 +162,11 @@ xfs_get_acl(struct inode *inode, int type) >> > */ >> > if (error != -ENOATTR) >> > acl = ERR_PTR(error); >> > - return acl; >> > + goto out; >> > } >> > >> > acl = xfs_acl_from_disk(xfs_acl, len, XFS_ACL_MAX_ENTRIES(ip->i_mount)); >> > +out: >> > kmem_free(xfs_acl); >> > return acl; >> > } >> >> Hi Mateusz, >> >> It looks like we've already fixed this problem - can you check >> 4.6-rc1 and if the leak is still there post an updated patch? >> > > The patch which introuced the bug is not present in 4.6-rc1. The patch is on the work.acl branch of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs.git. Thanks, Andreas From agruenba@redhat.com Wed Mar 30 17:13:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6E1057CA3 for ; Wed, 30 Mar 2016 17:13:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 33CE28F8039 for ; Wed, 30 Mar 2016 15:13:54 -0700 (PDT) X-ASG-Debug-ID: 1459376031-04bdf01105107dd0001-NocioJ Received: from mail-vk0-f47.google.com (mail-vk0-f47.google.com [209.85.213.47]) by cuda.sgi.com with ESMTP id RkoBw42Z2U9BalgW (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 30 Mar 2016 15:13:52 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Apparent-Source-IP: 209.85.213.47 Received: by mail-vk0-f47.google.com with SMTP id z68so80139952vkg.3 for ; Wed, 30 Mar 2016 15:13:52 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=myJ1I9H6YXte7pm8FQFghJLImwACx7Md9I7fbbxbLZc=; b=E3xznkfN9u55fP9xwNzd2WrpenxAQ49zFtYo9hUpKLSLNQIblmHzUoAZoCFAdropo+ p6BiCHAQT4LAefIXEE2cvb/CPtUpy+59Q+cabF6wEi1wLuqFFovKbAF18s/fNAT+T0hU B1GLqgonoZWbwKuNqAupM/ryf4SDQFKQcLnOCW5jfTtOTC+4JPSs+ntdKnCpypFvIPkC KczClHIAHKqmr0/CLSOKZC0Ga2egZxFEbFxUVhMhZjEtzzWV0lvHWNMnFBJQXNuvvG2s UkV+XSMGvm0gYV7XsNBOgWGdLDqhiTmXmcagTKP9T4L9DWcIqlkAsQVt+rNmnz0V8CQj PHvw== X-Gm-Message-State: AD7BkJK5z16lsx8DBW8/3tHywV8/2gVAcUJaxbkNCGWuX4aFVsCgl4xx87j00ZG0wKU719t+ii2T7fiB4Y2vuDsM MIME-Version: 1.0 X-Received: by 10.31.167.195 with SMTP id q186mr6766914vke.113.1459376031455; Wed, 30 Mar 2016 15:13:51 -0700 (PDT) Received: by 10.176.65.40 with HTTP; Wed, 30 Mar 2016 15:13:51 -0700 (PDT) In-Reply-To: <1459348507-20406-1-git-send-email-mguzik@redhat.com> References: <1459348507-20406-1-git-send-email-mguzik@redhat.com> Date: Thu, 31 Mar 2016 00:13:51 +0200 Message-ID: Subject: Re: [PATCH] xfs: fix a memory leak in xfs_get_acl on error From: Andreas Gruenbacher X-ASG-Orig-Subj: Re: [PATCH] xfs: fix a memory leak in xfs_get_acl on error To: Mateusz Guzik Cc: XFS Developers , Al Viro Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-vk0-f47.google.com[209.85.213.47] X-Barracuda-Start-Time: 1459376032 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28312 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain On Wed, Mar 30, 2016 at 4:35 PM, Mateusz Guzik wrote: > Signed-off-by: Mateusz Guzik Reviewed-by: Andreas Gruenbacher > --- > fs/xfs/xfs_acl.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c > index 2dad2b5..ce10c4c 100644 > --- a/fs/xfs/xfs_acl.c > +++ b/fs/xfs/xfs_acl.c > @@ -162,10 +162,11 @@ xfs_get_acl(struct inode *inode, int type) > */ > if (error != -ENOATTR) > acl = ERR_PTR(error); > - return acl; > + goto out; > } > > acl = xfs_acl_from_disk(xfs_acl, len, XFS_ACL_MAX_ENTRIES(ip->i_mount)); > +out: > kmem_free(xfs_acl); > return acl; > } > -- > 1.8.3.1 > From bo.li.liu@oracle.com Wed Mar 30 19:29:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EAAC67CA3 for ; Wed, 30 Mar 2016 19:29:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id BD0268F8037 for ; Wed, 30 Mar 2016 17:29:31 -0700 (PDT) X-ASG-Debug-ID: 1459384169-04cbb07ad814bdf0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id oOjmGUYc18Ad7QYY (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 30 Mar 2016 17:29:29 -0700 (PDT) X-Barracuda-Envelope-From: bo.li.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u2V0Sx3o011128 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 31 Mar 2016 00:29:00 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u2V0SwFT002611 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 31 Mar 2016 00:28:59 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u2V0SwfG016810; Thu, 31 Mar 2016 00:28:58 GMT Received: from localhost.localdomain (/10.211.47.181) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 30 Mar 2016 17:28:58 -0700 Date: Wed, 30 Mar 2016 17:32:42 -0700 From: Liu Bo To: "Darrick J. Wong" Cc: Christoph Hellwig , xfs@oss.sgi.com, linux-fsdevel , linux-btrfs , linux-api@vger.kernel.org Subject: Re: fallocate mode flag for "unshare blocks"? Message-ID: <20160331003242.GA5813@localhost.localdomain> X-ASG-Orig-Subj: Re: fallocate mode flag for "unshare blocks"? Reply-To: bo.li.liu@oracle.com References: <20160302155007.GB7125@infradead.org> <20160330182755.GC2236@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160330182755.GC2236@birch.djwong.org> User-Agent: Mutt/1.5.23 (2015-06-09) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1459384169 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28317 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain On Wed, Mar 30, 2016 at 11:27:55AM -0700, Darrick J. Wong wrote: > Hi all, > > Christoph and I have been working on adding reflink and CoW support to > XFS recently. Since the purpose of (mode 0) fallocate is to make sure > that future file writes cannot ENOSPC, I extended the XFS fallocate > handler to unshare any shared blocks via the copy on write mechanism I > built for it. However, Christoph shared the following concerns with > me about that interpretation: > > > I know that I suggested unsharing blocks on fallocate, but it turns out > > this is causing problems. Applications expect falloc to be a fast > > metadata operation, and copying a potentially large number of blocks > > is against that expextation. This is especially bad for the NFS > > server, which should not be blocked for a long time in a synchronous > > operation. > > > > I think we'll have to remove the unshare and just fail the fallocate > > for a reflinked region for now. I still think it makes sense to expose > > an unshare operation, and we probably should make that another > > fallocate mode. I'm expecting fallocate to be fast, too. Well, btrfs fallocate doesn't allocate space if it's a shared one because it thinks the space is already allocated. So a later overwrite over this shared extent may hit enospc errors. > > With that in mind, how do you all think we ought to resolve this? > Should we add a new fallocate mode flag that means "unshare the shared > blocks"? Obviously, this unshare flag cannot be used in conjunction > with hole punching, zero range, insert range, or collapse range. This > breaks the expectation that writing to a file after fallocate won't > ENOSPC. > > Or is it ok that fallocate could block, potentially for a long time as > we stream cows through the page cache (or however unshare works > internally)? Those same programs might not be expecting fallocate to > take a long time. > > Can we do better than either solution? It occurs to me that XFS does > unshare by reading the file data into the pagecache, marking the pages > dirty, and flushing the dirty pages; performance could be improved by > skipping the flush at the end. We won't ENOSPC, because the XFS > delalloc system is careful enough to check that there are enough free > blocks to handle both the allocation and the metadata updates. The > only gap in this scheme that I can see is if we fallocate, crash, and > upon restart the program then tries to write without retrying the > fallocate. Can we trade some performance for the added requirement > that we must fallocate -> write -> fsync, and retry the trio if we > crash before the fsync returns? I think that's already an implicit > requirement, so we might be ok here. > > Opinions? I rather like the last option, though I've only just > thought of it and have not had time to examine it thoroughly, and it's > specific to XFS. :) I'd vote for another mode for 'unshare the shared blocks'. Thanks, -liubo From ming.lei@canonical.com Wed Mar 30 20:03:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E7C7C7CA3 for ; Wed, 30 Mar 2016 20:03:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 81B3830405F for ; Wed, 30 Mar 2016 18:03:10 -0700 (PDT) X-ASG-Debug-ID: 1459386180-04bdf0110410cd00001-NocioJ Received: from youngberry.canonical.com (youngberry.canonical.com [91.189.89.112]) by cuda.sgi.com with ESMTP id 5PzL7ObZ3QGcVQst (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 30 Mar 2016 18:03:02 -0700 (PDT) X-Barracuda-Envelope-From: ming.lei@canonical.com X-Barracuda-Apparent-Source-IP: 91.189.89.112 Received: from mail-yw0-f176.google.com ([209.85.161.176]) by youngberry.canonical.com with esmtpsa (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.76) (envelope-from ) id 1alR0m-0002TE-FW for xfs@oss.sgi.com; Thu, 31 Mar 2016 01:03:00 +0000 Received: by mail-yw0-f176.google.com with SMTP id g3so79848616ywa.3 for ; Wed, 30 Mar 2016 18:03:00 -0700 (PDT) X-Gm-Message-State: AD7BkJI0pZXvB5jlN3JAJ3lJrG+RTaqjxhd1DMJklMWRUvV0URjR2NrF9z/iyWaBH507e2KCNpErJX4MnDUnzw== MIME-Version: 1.0 X-Received: by 10.37.74.202 with SMTP id x193mr6243491yba.24.1459386179593; Wed, 30 Mar 2016 18:02:59 -0700 (PDT) Received: by 10.37.207.145 with HTTP; Wed, 30 Mar 2016 18:02:59 -0700 (PDT) In-Reply-To: <20160330171927.GA13320@infradead.org> References: <1459354637-17415-1-git-send-email-ming.lei@canonical.com> <1459354637-17415-3-git-send-email-ming.lei@canonical.com> <20160330171927.GA13320@infradead.org> Date: Thu, 31 Mar 2016 09:02:59 +0800 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH v1 2/8] block: make 'struct bvec_iter' not depend on CONFIG_BLOCK From: Ming Lei X-ASG-Orig-Subj: Re: [PATCH v1 2/8] block: make 'struct bvec_iter' not depend on CONFIG_BLOCK To: Christoph Hellwig Cc: Jens Axboe , Linux Kernel Mailing List , linux-block@vger.kernel.org, Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: youngberry.canonical.com[91.189.89.112] X-Barracuda-Start-Time: 1459386182 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28318 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Mar 31, 2016 at 1:19 AM, Christoph Hellwig wrote: > On Thu, Mar 31, 2016 at 12:17:11AM +0800, Ming Lei wrote: >> We will use bvec iterator to implement iterate_bvec(): lib/iov_iter.c. >> >> Reviewed-by: Christoph Hellwig >> Signed-off-by: Ming Lei >> --- >> include/linux/blk_types.h | 4 ++-- >> 1 file changed, 2 insertions(+), 2 deletions(-) >> >> diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h >> index 86a38ea..fd8527b 100644 >> --- a/include/linux/blk_types.h >> +++ b/include/linux/blk_types.h >> @@ -26,8 +26,6 @@ struct bio_vec { >> unsigned int bv_offset; >> }; >> >> -#ifdef CONFIG_BLOCK >> - >> struct bvec_iter { >> sector_t bi_sector; /* device address in 512 byte >> sectors */ >> @@ -39,6 +37,8 @@ struct bvec_iter { >> current bvec */ >> }; > > I didn't catch this earlier, but shouldn't this also move to > bvec_iter.h? Or maybe just create a linux/bvec.h for the bvec, bvec_iter > and bvec iter macros given that those are the types used outside the > block layer as well. That way may cause trouble to blk_type.h because it needs bvec_iter, then looks not good to always include bvec_iter.h into blk_type.h. Thanks, Ming From david@fromorbit.com Wed Mar 30 20:20:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 27B7B7CA3 for ; Wed, 30 Mar 2016 20: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 E855F304082 for ; Wed, 30 Mar 2016 18:20:42 -0700 (PDT) X-ASG-Debug-ID: 1459387236-04cb6c245f14f070001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 25p85I1pglEUl7LQ for ; Wed, 30 Mar 2016 18:20:36 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CvCQARevxWPDGaLHldgzSBUIJxg3mgEAEBAQEBAQaMEIlwhgcEAgKBR00BAQEBAQEHAQEBAUFAhEIBAQQ6HCMQCAMYCSUPBSUDBxoTiCbBcQELHhmFPYUNihQBBJdujX2BWo09jxCEXSgwiG0BAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail06.adl2.internode.on.net with ESMTP; 31 Mar 2016 11:48:15 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1alRFV-00063a-Ce; Thu, 31 Mar 2016 12:18:13 +1100 Date: Thu, 31 Mar 2016 12:18:13 +1100 From: Dave Chinner To: "Darrick J. Wong" Cc: Christoph Hellwig , xfs@oss.sgi.com, linux-fsdevel , linux-btrfs , linux-api@vger.kernel.org Subject: Re: fallocate mode flag for "unshare blocks"? Message-ID: <20160331011813.GJ30721@dastard> X-ASG-Orig-Subj: Re: fallocate mode flag for "unshare blocks"? References: <20160302155007.GB7125@infradead.org> <20160330182755.GC2236@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160330182755.GC2236@birch.djwong.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1459387236 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28318 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Mar 30, 2016 at 11:27:55AM -0700, Darrick J. Wong wrote: > Or is it ok that fallocate could block, potentially for a long time as > we stream cows through the page cache (or however unshare works > internally)? Those same programs might not be expecting fallocate to > take a long time. Yes, it's perfectly fine for fallocate to block for long periods of time. See what gfs2 does during preallocation of blocks - it ends up calling sb_issue_zerout() because it doesn't have unwritten extents, and hence can block for long periods of time.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Mar 30 23:27:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0AA517CA3 for ; Wed, 30 Mar 2016 23:27:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D2367304053 for ; Wed, 30 Mar 2016 21:27:03 -0700 (PDT) X-ASG-Debug-ID: 1459398420-04cbb07ad7151fd0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 46l87oTdXEaDctoA for ; Wed, 30 Mar 2016 21:27:01 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DvBwCepvxW/zGaLHldgzOBUIJxpAkBAQEBAQEGjBKFY4QNhgcEAgKBQk0BAQEBAQFmJ4RCAQEEOhwjEAgDDgoJJQ8FJQMhE4gmwWgBAQEHAgEdGYU9hQ6KFAWXb4hlhRmPF48TYoN7KDCIbQEBAQ Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail07.adl2.internode.on.net with ESMTP; 31 Mar 2016 14:56:57 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1alUBw-0006LA-7Y; Thu, 31 Mar 2016 15:26:44 +1100 Date: Thu, 31 Mar 2016 15:26:44 +1100 From: Dave Chinner To: Eryu Guan Cc: fstests@vger.kernel.org, darrick.wong@oracle.com, xfs@oss.sgi.com Subject: Re: [PATCH] xfs/030: link .out file according to reflink support status Message-ID: <20160331042644.GK30721@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs/030: link .out file according to reflink support status References: <1459331861-15025-1-git-send-email-eguan@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459331861-15025-1-git-send-email-eguan@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1459398420 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28321 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Mar 30, 2016 at 05:57:41PM +0800, Eryu Guan wrote: > Commit 31f48569c353 ("xfs/030: fix output on newer filesystems") added > more lines to .out file to match the output from XFS with reflink > support, but it broke test on older XFS. > > Fix it by introducing new .out file 030.out.reflink.linux to match the > reflink case, so old XFS still compares .out file against 030.out.linux. > > In order to do this, a new helper is introduced, _fs_has_reflink() > accepts mount point as argument and returns if the underlying fs > supports reflink or not. Let's not go down this path. This is a filtering issue, not a problem we solve by playing "let's add a golden image file for every different filesystem format we can create". The problem here is that reflink triggers a change in the initial population of the AGFL - from 4 blocks to 6 blocks, and so repair warns 6 times instead of 4. After filtering, that gives 6 indentical output lines instead of 4. Doing something as simple as collapsing repeated identical lines (e.g filtering through uniq) will work for all filesystem formats and any future changes that modify the initial AGFL population... Cheers, Dave. -- Dave Chinner david@fromorbit.com From eguan@redhat.com Thu Mar 31 00:57:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7BC637CA3 for ; Thu, 31 Mar 2016 00:57:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 33E148F8037 for ; Wed, 30 Mar 2016 22:57:02 -0700 (PDT) X-ASG-Debug-ID: 1459403821-04bdf01104114b80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id h8V3Ira3sUxBD1dO (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 30 Mar 2016 22:57:02 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 891DEA78B; Thu, 31 Mar 2016 05:57:01 +0000 (UTC) Received: from localhost (dhcp-12-128.nay.redhat.com [10.66.12.128]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2V5v0Jv003480; Thu, 31 Mar 2016 01:57:00 -0400 Date: Thu, 31 Mar 2016 13:56:59 +0800 From: Eryu Guan To: Dave Chinner Cc: xfs@oss.sgi.com, fstests@vger.kernel.org, darrick.wong@oracle.com Subject: Re: [PATCH] xfs/030: link .out file according to reflink support status Message-ID: <20160331055658.GK19986@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs/030: link .out file according to reflink support status References: <1459331861-15025-1-git-send-email-eguan@redhat.com> <20160331042644.GK30721@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160331042644.GK30721@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1459403822 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Mar 31, 2016 at 03:26:44PM +1100, Dave Chinner wrote: > On Wed, Mar 30, 2016 at 05:57:41PM +0800, Eryu Guan wrote: > > Commit 31f48569c353 ("xfs/030: fix output on newer filesystems") added > > more lines to .out file to match the output from XFS with reflink > > support, but it broke test on older XFS. > > > > Fix it by introducing new .out file 030.out.reflink.linux to match the > > reflink case, so old XFS still compares .out file against 030.out.linux. > > > > In order to do this, a new helper is introduced, _fs_has_reflink() > > accepts mount point as argument and returns if the underlying fs > > supports reflink or not. > > Let's not go down this path. This is a filtering issue, not a > problem we solve by playing "let's add a golden image file for every > different filesystem format we can create". > > The problem here is that reflink triggers a change in the initial > population of the AGFL - from 4 blocks to 6 blocks, and so repair > warns 6 times instead of 4. After filtering, that gives 6 indentical > output lines instead of 4. > > Doing something as simple as collapsing repeated identical lines > (e.g filtering through uniq) will work for all filesystem formats > and any future changes that modify the initial AGFL population... I thought about filtering at first, but didn't find a way to filter out the extra two lines easily. Collapsing repeaded lines into one will do. I'll send out v2 shortly. Thanks for reviewing! Eryu From eguan@redhat.com Thu Mar 31 01:12:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4D6E37CA3 for ; Thu, 31 Mar 2016 01:12:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 014FF30404E for ; Wed, 30 Mar 2016 23:11:56 -0700 (PDT) X-ASG-Debug-ID: 1459404715-04bdf01102115170001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id olNBUVarfYLq15sW (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 30 Mar 2016 23:11:55 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 7745264373; Thu, 31 Mar 2016 06:11:55 +0000 (UTC) Received: from localhost (dhcp-12-128.nay.redhat.com [10.66.12.128]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2V6Bsr9010707; Thu, 31 Mar 2016 02:11:54 -0400 From: Eryu Guan To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com, darrick.wong@oracle.com, Eryu Guan Subject: [PATCH v2] xfs/030: filter out repeated lines from .out files Date: Thu, 31 Mar 2016 14:11:22 +0800 X-ASG-Orig-Subj: [PATCH v2] xfs/030: filter out repeated lines from .out files Message-Id: <1459404682-12282-1-git-send-email-eguan@redhat.com> In-Reply-To: <1459331861-15025-1-git-send-email-eguan@redhat.com> References: <1459331861-15025-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 31 Mar 2016 06:11:55 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1459404715 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Commit 31f48569c353 ("xfs/030: fix output on newer filesystems") added more lines to .out file to match the output from XFS with reflink support, but it broke test on older XFS. Dave explained the reason and pointed out the correct way to fix it, so I just quote Dave's mail here: "The problem here is that reflink triggers a change in the initial population of the AGFL - from 4 blocks to 6 blocks, and so repair warns 6 times instead of 4. After filtering, that gives 6 indentical output lines instead of 4. Doing something as simple as collapsing repeated identical lines (e.g filtering through uniq) will work for all filesystem formats and any future changes that modify the initial AGFL population." Suggested-by: Dave Chinner Signed-off-by: Eryu Guan --- tests/xfs/030 | 2 +- tests/xfs/030.out.irix | 3 --- tests/xfs/030.out.linux | 5 ----- 3 files changed, 1 insertion(+), 9 deletions(-) diff --git a/tests/xfs/030 b/tests/xfs/030 index 33c906c..5c99d9e 100755 --- a/tests/xfs/030 +++ b/tests/xfs/030 @@ -55,7 +55,7 @@ _check_ag() for structure in 'sb 0' 'agf 0' 'agi 0' 'agfl 0' do echo "Corrupting $structure - setting bits to $1" - _check_repair $1 "$structure" | + _check_repair $1 "$structure" | uniq | sed -e '/^error following ag 0 unlinked list$/d' \ -e '/^bad agbno AGBNO for finobt/d' \ -e '/^bad agbno AGBNO for rmapbt/d' \ diff --git a/tests/xfs/030.out.irix b/tests/xfs/030.out.irix index 6378c73..56adfd0 100644 --- a/tests/xfs/030.out.irix +++ b/tests/xfs/030.out.irix @@ -263,9 +263,6 @@ Phase 1 - find and verify superblock... Phase 2 - zero log... - scan filesystem freespace and inode maps... bad agbno AGBNO in agfl, agno 0 -bad agbno AGBNO in agfl, agno 0 -bad agbno AGBNO in agfl, agno 0 -bad agbno AGBNO in agfl, agno 0 - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... diff --git a/tests/xfs/030.out.linux b/tests/xfs/030.out.linux index 14b9b35..722cabf 100644 --- a/tests/xfs/030.out.linux +++ b/tests/xfs/030.out.linux @@ -228,11 +228,6 @@ Phase 2 - using log - zero log... - scan filesystem freespace and inode maps... bad agbno AGBNO in agfl, agno 0 -bad agbno AGBNO in agfl, agno 0 -bad agbno AGBNO in agfl, agno 0 -bad agbno AGBNO in agfl, agno 0 -bad agbno AGBNO in agfl, agno 0 -bad agbno AGBNO in agfl, agno 0 - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... -- 2.5.5 From BATV+34c1510e3b25446cd58d+4603+infradead.org+hch@bombadil.srs.infradead.org Thu Mar 31 02:06:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1F0B57CA3 for ; Thu, 31 Mar 2016 02:06:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A5CABAC004 for ; Thu, 31 Mar 2016 00:06:05 -0700 (PDT) X-ASG-Debug-ID: 1459407959-04bdf011041165f0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 9YmyiccuEh6IBjTC (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 31 Mar 2016 00:05:59 -0700 (PDT) X-Barracuda-Envelope-From: BATV+34c1510e3b25446cd58d+4603+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 1alWg2-0000ax-VP; Thu, 31 Mar 2016 07:05:58 +0000 Date: Thu, 31 Mar 2016 00:05:58 -0700 From: Christoph Hellwig To: Eryu Guan Cc: fstests@vger.kernel.org, xfs@oss.sgi.com, darrick.wong@oracle.com Subject: Re: [PATCH v2] xfs/030: filter out repeated lines from .out files Message-ID: <20160331070558.GA1505@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2] xfs/030: filter out repeated lines from .out files References: <1459331861-15025-1-git-send-email-eguan@redhat.com> <1459404682-12282-1-git-send-email-eguan@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459404682-12282-1-git-send-email-eguan@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1459407959 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/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=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28325 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+34c1510e3b25446cd58d+4603+infradead.org+hch@bombadil.srs.infradead.org Thu Mar 31 02:52:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B19EB7CA3 for ; Thu, 31 Mar 2016 02:52:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 80CF08F8037 for ; Thu, 31 Mar 2016 00:52:34 -0700 (PDT) X-ASG-Debug-ID: 1459410752-04cbb07ad7159670001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id eXTrY0a8EvXv3jTP (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 31 Mar 2016 00:52:33 -0700 (PDT) X-Barracuda-Envelope-From: BATV+34c1510e3b25446cd58d+4603+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 1alXP2-00013a-Kj; Thu, 31 Mar 2016 07:52:28 +0000 Date: Thu, 31 Mar 2016 00:52:28 -0700 From: Christoph Hellwig To: Ming Lei Cc: Christoph Hellwig , linux-block@vger.kernel.org, Boaz Harrosh , Linux Kernel Mailing List , xfs@oss.sgi.com, Jens Axboe , Al Viro , Lars Ellenberg , Philipp Reisner , Anton Altaparmakov , drbd-dev@lists.linbit.com Subject: Re: [PATCH v1 2/8] block: make 'struct bvec_iter' not depend on CONFIG_BLOCK Message-ID: <20160331075228.GA2491@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v1 2/8] block: make 'struct bvec_iter' not depend on CONFIG_BLOCK References: <1459354637-17415-1-git-send-email-ming.lei@canonical.com> <1459354637-17415-3-git-send-email-ming.lei@canonical.com> <20160330171927.GA13320@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1459410752 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28326 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Mar 31, 2016 at 09:02:59AM +0800, Ming Lei wrote: > That way may cause trouble to blk_type.h because it needs bvec_iter, > then looks not good to always include bvec_iter.h into blk_type.h. I'd expect bvec.h to be always included in blk_types.h, and replace the inclusion of blk_types.h in fs.h eventually. From BATV+34c1510e3b25446cd58d+4603+infradead.org+hch@bombadil.srs.infradead.org Thu Mar 31 02:54:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C05C67CA7 for ; Thu, 31 Mar 2016 02:54:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8FEA630404E for ; Thu, 31 Mar 2016 00:54:43 -0700 (PDT) X-ASG-Debug-ID: 1459410881-04cb6c24641581a0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id MjZk6cfYJ2vVUpn5 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 31 Mar 2016 00:54:41 -0700 (PDT) X-Barracuda-Envelope-From: BATV+34c1510e3b25446cd58d+4603+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 1alXRA-0001gh-FY; Thu, 31 Mar 2016 07:54:40 +0000 Date: Thu, 31 Mar 2016 00:54:40 -0700 From: Christoph Hellwig To: Dave Chinner Cc: "Darrick J. Wong" , Christoph Hellwig , xfs@oss.sgi.com, linux-fsdevel , linux-btrfs , linux-api@vger.kernel.org Subject: Re: fallocate mode flag for "unshare blocks"? Message-ID: <20160331075440.GA4209@infradead.org> X-ASG-Orig-Subj: Re: fallocate mode flag for "unshare blocks"? References: <20160302155007.GB7125@infradead.org> <20160330182755.GC2236@birch.djwong.org> <20160331011813.GJ30721@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160331011813.GJ30721@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1459410881 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28326 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Mar 31, 2016 at 12:18:13PM +1100, Dave Chinner wrote: > On Wed, Mar 30, 2016 at 11:27:55AM -0700, Darrick J. Wong wrote: > > Or is it ok that fallocate could block, potentially for a long time as > > we stream cows through the page cache (or however unshare works > > internally)? Those same programs might not be expecting fallocate to > > take a long time. > > Yes, it's perfectly fine for fallocate to block for long periods of > time. See what gfs2 does during preallocation of blocks - it ends up > calling sb_issue_zerout() because it doesn't have unwritten > extents, and hence can block for long periods of time.... gfs2 fallocate is an implementation that will cause all but the most trivial users real pain. Even the initial XFS implementation just marking the transactions synchronous made it unusable for all kinds of applications, and this is much worse. E.g. a NFS ALLOCATE operation to gfs2 will probab;ly hand your connection for extended periods of time. If we need to support something like what gfs2 does we should have a separate flag for it. From BATV+34c1510e3b25446cd58d+4603+infradead.org+hch@bombadil.srs.infradead.org Thu Mar 31 02:55:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C5EE77CB0 for ; Thu, 31 Mar 2016 02:55:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E70C3AC005 for ; Thu, 31 Mar 2016 00:55:34 -0700 (PDT) X-ASG-Debug-ID: 1459410929-04cb6c245f158200001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id px2Qjp0wLKbPtccE (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 31 Mar 2016 00:55:30 -0700 (PDT) X-Barracuda-Envelope-From: BATV+34c1510e3b25446cd58d+4603+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 1alXRx-0003BW-DF; Thu, 31 Mar 2016 07:55:29 +0000 Date: Thu, 31 Mar 2016 00:55:29 -0700 From: Christoph Hellwig To: Liu Bo Cc: "Darrick J. Wong" , Christoph Hellwig , xfs@oss.sgi.com, linux-fsdevel , linux-btrfs , linux-api@vger.kernel.org Subject: Re: fallocate mode flag for "unshare blocks"? Message-ID: <20160331075529.GB4209@infradead.org> X-ASG-Orig-Subj: Re: fallocate mode flag for "unshare blocks"? References: <20160302155007.GB7125@infradead.org> <20160330182755.GC2236@birch.djwong.org> <20160331003242.GA5813@localhost.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160331003242.GA5813@localhost.localdomain> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1459410930 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28326 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Mar 30, 2016 at 05:32:42PM -0700, Liu Bo wrote: > Well, btrfs fallocate doesn't allocate space if it's a shared one > because it thinks the space is already allocated. So a later overwrite > over this shared extent may hit enospc errors. And this makes it an incorrect implementation of posix_fallocate, which glibcs implements using fallocate if available. From BATV+34c1510e3b25446cd58d+4603+infradead.org+hch@bombadil.srs.infradead.org Thu Mar 31 02:58:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B91F07CB2 for ; Thu, 31 Mar 2016 02:58:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 36198AC005 for ; Thu, 31 Mar 2016 00:58:04 -0700 (PDT) X-ASG-Debug-ID: 1459411082-04bdf01103117b70001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id ryiRvaKpSKLxWiJ0 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 31 Mar 2016 00:58:02 -0700 (PDT) X-Barracuda-Envelope-From: BATV+34c1510e3b25446cd58d+4603+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 1alXUP-0004VO-U1; Thu, 31 Mar 2016 07:58:01 +0000 Date: Thu, 31 Mar 2016 00:58:01 -0700 From: Christoph Hellwig To: "Austin S. Hemmelgarn" Cc: "Darrick J. Wong" , Christoph Hellwig , xfs@oss.sgi.com, linux-fsdevel , linux-btrfs , linux-api@vger.kernel.org Subject: Re: fallocate mode flag for "unshare blocks"? Message-ID: <20160331075801.GC4209@infradead.org> X-ASG-Orig-Subj: Re: fallocate mode flag for "unshare blocks"? References: <20160302155007.GB7125@infradead.org> <20160330182755.GC2236@birch.djwong.org> <56FC21DE.7090308@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56FC21DE.7090308@gmail.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1459411082 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28326 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Mar 30, 2016 at 02:58:38PM -0400, Austin S. Hemmelgarn wrote: > Nothing that I can find in the man-pages or API documentation for Linux's > fallocate explicitly says that it will be fast. There are bits that say it > should be efficient, but that is not itself well defined (given context, I > would assume it to mean that it doesn't use as much I/O as writing out that > many bytes of zero data, not necessarily that it will return quickly). And that's pretty much as narrow as an defintion we get. But apparently gfs2 already breaks that expectation :( > >delalloc system is careful enough to check that there are enough free > >blocks to handle both the allocation and the metadata updates. The > >only gap in this scheme that I can see is if we fallocate, crash, and > >upon restart the program then tries to write without retrying the > >fallocate. Can we trade some performance for the added requirement > >that we must fallocate -> write -> fsync, and retry the trio if we > >crash before the fsync returns? I think that's already an implicit > >requirement, so we might be ok here. > Most of the software I've seen that doesn't use fallocate like this is > either doing odd things otherwise, or is just making sure it has space for > temporary files, so I think it is probably safe to require this. posix_fallocate gurantees you that you don't get ENOSPC from the write, and there is plenty of software relying on that or crashing / cause data integrity problems that way. From guaneryu@gmail.com Thu Mar 31 04:13:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 1D9277CA3 for ; Thu, 31 Mar 2016 04:13:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id DFCC48F8049 for ; Thu, 31 Mar 2016 02:13:46 -0700 (PDT) X-ASG-Debug-ID: 1459415624-04cb6c245f159f10001-NocioJ Received: from mail-pf0-f193.google.com (mail-pf0-f193.google.com [209.85.192.193]) by cuda.sgi.com with ESMTP id T7Q9tC2EyvK22TxX (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 31 Mar 2016 02:13:45 -0700 (PDT) X-Barracuda-Envelope-From: guaneryu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.193 Received: by mail-pf0-f193.google.com with SMTP id x3so10428365pfb.0 for ; Thu, 31 Mar 2016 02:13:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=cXL1VJ4oFeXOcnpbuzMRMeOjbFq7Gh0XCz9fDiRZ+JA=; b=MTcqAnt1JhwHIueU0OGwPV4+8UajmgIB3CStCs4F+lMjiracy2VuVghVzbcW+4dmr6 nBSJCUeMwAN/dG1UDtBjq8ZXsV6s+VBDGTfjwyPTep3Ffw9XrYNYptkg8vhrjWyWWCUT +IahL6IR7wtKXzOj/muNTSdR6jd2oWeG4m/At5UCoHn6gM2+1kgveMFb22t3XhGfOz1i RZ06+nbkH3yg9A0+hCBAZe4694ggshMB3/5ebaLFz8GdsbtVSv+IjKr+e7uRcHrHy2BL D9RxGAeNc1HQeXPt2wmtgM8dYjVkoFY/GxM8IPTdM2l9bL0JllqpY86lpSKsr8soWWUs MVUQ== 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; bh=cXL1VJ4oFeXOcnpbuzMRMeOjbFq7Gh0XCz9fDiRZ+JA=; b=iw+7zDPtD7pqs+R6PBcP8Ox1ZFqZOH53BAqzrWSv8OzMg7EDhOt6VKDjzBc9OqJ/4l 4NAit/JPTKiNdn5RAJ01Bh/QGvJDGcJtMTP6RCwNuOiNSC1Xn0Sp4zg9IVkZgSZxMaOG xjCFuyImB7J19y6oM7UFNepqPKnnqre8klnFlOVqRuklCOTEU//jJynL75B+JCy11z7e OtZMQxV7yHVfOO7vFGH1+2VAZaC0XR4mxUqDINSb9yXzW3bzhSy+QtGOgtXPkl74qMoW s/8p7W6ajuYpWzEv6OA5t2DmvVWRbDC8vgj3UtUqV7/4vMXJTeCa7yF5fT7MXK3Wn/53 cH7g== X-Gm-Message-State: AD7BkJKLmpf/fI9d0Jhow1ANfkXVQGcwqOMlZy0hCEnEH0Ps7NvBwsmKqJ1Df/q9PMOMJg== X-Received: by 10.98.44.70 with SMTP id s67mr20342578pfs.59.1459415624754; Thu, 31 Mar 2016 02:13:44 -0700 (PDT) Received: from localhost ([128.199.137.77]) by smtp.gmail.com with ESMTPSA id l4sm11744370pfi.73.2016.03.31.02.13.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 31 Mar 2016 02:13:44 -0700 (PDT) From: Eryu Guan To: xfs@oss.sgi.com Cc: esandeen@redhat.com, Eryu Guan Subject: [PATCH] xfs: add missing break in xfs_parseargs() Date: Thu, 31 Mar 2016 17:13:03 +0800 X-ASG-Orig-Subj: [PATCH] xfs: add missing break in xfs_parseargs() Message-Id: <1459415583-26981-1-git-send-email-guaneryu@gmail.com> X-Mailer: git-send-email 2.5.5 X-Barracuda-Connect: mail-pf0-f193.google.com[209.85.192.193] X-Barracuda-Start-Time: 1459415625 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28327 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 Commit 2e74af0e1189 ("xfs: convert mount option parsing to tokens") missed a 'break;' in xfs_parseargs() which causes mount to fail with "-o pqnoenforce" option. xfs/050 catches this failure. XFS (vda6): Super block does not support project and group quota together Fixes: 2e74af0e1189 ("xfs: convert mount option parsing to tokens") Signed-off-by: Eryu Guan --- fs/xfs/xfs_super.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index d760934..361564e 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -350,6 +350,7 @@ xfs_parseargs( case Opt_pqnoenforce: mp->m_qflags |= (XFS_PQUOTA_ACCT | XFS_PQUOTA_ACTIVE); mp->m_qflags &= ~XFS_PQUOTA_ENFD; + break; case Opt_gquota: case Opt_grpquota: mp->m_qflags |= (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE | -- 2.5.5 From guaneryu@gmail.com Thu Mar 31 06:14:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 225677CA3 for ; Thu, 31 Mar 2016 06:14:39 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 97E1DAC004 for ; Thu, 31 Mar 2016 04:14:35 -0700 (PDT) X-ASG-Debug-ID: 1459422873-04bdf0110211e000001-NocioJ Received: from mail-pa0-f68.google.com (mail-pa0-f68.google.com [209.85.220.68]) by cuda.sgi.com with ESMTP id h7FS2LYj6xSo2JZQ (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 31 Mar 2016 04:14:34 -0700 (PDT) X-Barracuda-Envelope-From: guaneryu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.68 Received: by mail-pa0-f68.google.com with SMTP id hn5so7956413pac.2 for ; Thu, 31 Mar 2016 04:14:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=35od9YsLMV8OuzlsondqWvTer9Iv0k68e4dZnlVJ7bI=; b=dThYT3PhFH3DDUdMX1j5/L5Eko5Bo+soj5+oVXBJRdPfuErWGLvpDESyO2osZw44Ef Oq4+TqSKVDRmUKx5MtCwBB5q+XybcvPhe/1X0RWMWhd4j1xIQroD9JKky7rXVAYQ+iQO FGO8fRFWicLosn3HFQgrxLz3rofCPRQUyvDpJuexTBVVRNFYh5IJzbgu3vUFd0u8WX2q 4wjSv5qYC4wcxCtIfz2d9sE72d91ATr675CW3/ATZUZm/zrj1xz1L9HldNWEA+4zEV9/ QXLxAUZaOrIDggY02BCoUKRArU7GpVW1UcyVZce9BsXY9cBFYaokZyTOvyYagmVgEqBr gXQg== 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-disposition:in-reply-to:user-agent; bh=35od9YsLMV8OuzlsondqWvTer9Iv0k68e4dZnlVJ7bI=; b=d/i1HBFYUbdNBFJ4jEfVMojcs2FzEzhnOYPR5NyhX6bgOOLnBOUdvavKLrgova3ALW BeTlLVrgFEtY5wssXbTCuDQStA7/sKrDbO5u5o0WX/rL1pLPALGzO2IISBw9lrAMejRk IJKIpZjeeh8oF0nNcPtWWe6Gi2QoHMWk8tGUUL8UiXieXTbudpg92XjwjnIKgtOnzVUw FetcC9SgQAUq1XH1jTxG1Eml3wmrCFxtUvYfIJmKqSYoPVqNmKqqjjgVmB0ABHMOo/ro 6zJAunYoDH482KSCo8itv236HXPw0DUfDhyuzuxfoM7lKjJDDGIsWw9gEpIf/QAF3MQo dg0A== X-Gm-Message-State: AD7BkJJSioT+SzVafoG8xDx9UY3AXkyTlr/D8putMVsQIfNmYpWvoBbgXXlXuC2quhY1iw== X-Received: by 10.66.159.232 with SMTP id xf8mr21221429pab.71.1459422873507; Thu, 31 Mar 2016 04:14:33 -0700 (PDT) Received: from localhost ([128.199.137.77]) by smtp.gmail.com with ESMTPSA id n66sm12765679pfj.39.2016.03.31.04.14.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 31 Mar 2016 04:14:32 -0700 (PDT) Date: Thu, 31 Mar 2016 19:14:30 +0800 From: Eryu Guan To: xfs@oss.sgi.com Cc: esandeen@redhat.com Subject: Re: [PATCH] xfs: add missing break in xfs_parseargs() Message-ID: <20160331111046.GA2059@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: add missing break in xfs_parseargs() References: <1459415583-26981-1-git-send-email-guaneryu@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459415583-26981-1-git-send-email-guaneryu@gmail.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Barracuda-Connect: mail-pa0-f68.google.com[209.85.220.68] X-Barracuda-Start-Time: 1459422874 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28329 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, Mar 31, 2016 at 05:13:03PM +0800, Eryu Guan wrote: > Commit 2e74af0e1189 ("xfs: convert mount option parsing to tokens") > missed a 'break;' in xfs_parseargs() which causes mount to fail with > "-o pqnoenforce" option. xfs/050 catches this failure. > > XFS (vda6): Super block does not support project and group quota together Forgot to mention that it only fails for v4 xfs, but v5 xfs enables group quota automatically in this case. Thanks, Eryu > > Fixes: 2e74af0e1189 ("xfs: convert mount option parsing to tokens") > Signed-off-by: Eryu Guan > --- > fs/xfs/xfs_super.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index d760934..361564e 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -350,6 +350,7 @@ xfs_parseargs( > case Opt_pqnoenforce: > mp->m_qflags |= (XFS_PQUOTA_ACCT | XFS_PQUOTA_ACTIVE); > mp->m_qflags &= ~XFS_PQUOTA_ENFD; > + break; > case Opt_gquota: > case Opt_grpquota: > mp->m_qflags |= (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE | > -- > 2.5.5 > From ahferroin7@gmail.com Thu Mar 31 06:14:57 2016 Return-Path: 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 4C0B97CA3 for ; Thu, 31 Mar 2016 06:14:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A89AEAC005 for ; Thu, 31 Mar 2016 04:14:56 -0700 (PDT) X-ASG-Debug-ID: 1459422894-04cb6c246415e510001-NocioJ Received: from mail-qk0-f178.google.com (mail-qk0-f178.google.com [209.85.220.178]) by cuda.sgi.com with ESMTP id TTCOtNGa9GBOmd5c (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 31 Mar 2016 04:14:54 -0700 (PDT) X-Barracuda-Envelope-From: ahferroin7@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.178 Received: by mail-qk0-f178.google.com with SMTP id o6so30597170qkc.2 for ; Thu, 31 Mar 2016 04:14:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=subject:to:references:cc:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding; bh=frvdznmFZvI/oSL6k5xqlwzJiYGHVJakC925qcYxMHs=; b=t+KHm8MD9g76R6Sd3+FEAJ8fmKPp6Y1EnBLmsCdF7+s8sNbVrRDhTGIh6tsoA3xEid +uNo6+Gkv+R+RfaMJGKu5KSycvUOpEquVNYghH93CvgxOYG5RBGpYolAHZRckb8HMLsn dviOVwNO4i/pF0GJKb9iSF4vl/O8q4YYAAYuJalNkbisiWY1AGFxWVnnMiIPZplLAXAc oHM4jGn1b17+SxMvj2mxnhC5slDiL8F+qPl7T0IWLrPgOktmlGMoVvEoVChO6tN/hS+U C1i0/521RMXUfHWlbE8U0cKdsoPMv+HcWcBHW2m+U+VQGBL34NRGBoKiK3ajK/bgsCa8 WZ4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:subject:to:references:cc:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=frvdznmFZvI/oSL6k5xqlwzJiYGHVJakC925qcYxMHs=; b=gJ9Vxb4SM6sgVgYJO1mqwvTm/p3YzYOCm7mgWRyK+gba4er6cbzUas2rnrZoeQl+GR zvlq0yxmdRLoz0PtT6wgYcUyZdAlL+K4OZhdrW882Tm7zyiCynbLE5EaCpHjN5ZQ3yyJ OiUBWE3nFmDHUp55v8pG7qfCS8vciH98qzRg8RO5Ox+1ZmnxPwzY3LV/EVApwgaGEBHU i9bXJCUD1DhV8TvsOcODxuETbdudFGxtpoOoZyUFgo8Vr0HfZbvQJvjYTwB8ds1yLrAS Ecuy/hhteTtdGXnoEmGdMMOseGRCnW+pzuLxNPb0rr91DQQ3YVuOmAB0U6n+tDblGVze 4umA== X-Gm-Message-State: AD7BkJLsUGAooKqxDY6GC4VbXO4Hum8CsdBf66TPyKN77/kqz4FfazgQ27mo4d+kn+pORw== X-Received: by 10.55.24.208 with SMTP id 77mr15851374qky.45.1459422894173; Thu, 31 Mar 2016 04:14:54 -0700 (PDT) Received: from [127.0.0.1] (rrcs-70-62-41-24.central.biz.rr.com. [70.62.41.24]) by smtp.gmail.com with ESMTPSA id g6sm3720877qge.0.2016.03.31.04.14.53 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 31 Mar 2016 04:14:53 -0700 (PDT) Subject: Re: fallocate mode flag for "unshare blocks"? To: Christoph Hellwig X-ASG-Orig-Subj: Re: fallocate mode flag for "unshare blocks"? References: <20160302155007.GB7125@infradead.org> <20160330182755.GC2236@birch.djwong.org> <56FC21DE.7090308@gmail.com> <20160331075801.GC4209@infradead.org> Cc: "Darrick J. Wong" , xfs@oss.sgi.com, linux-fsdevel , linux-btrfs , linux-api@vger.kernel.org From: "Austin S. Hemmelgarn" Message-ID: <56FD066E.4080204@gmail.com> Date: Thu, 31 Mar 2016 07:13:50 -0400 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.7.0 MIME-Version: 1.0 In-Reply-To: <20160331075801.GC4209@infradead.org> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Antivirus: avast! (VPS 160331-1, 2016-03-31), Outbound message X-Antivirus-Status: Clean X-Barracuda-Connect: mail-qk0-f178.google.com[209.85.220.178] X-Barracuda-Start-Time: 1459422894 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28329 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On 2016-03-31 03:58, Christoph Hellwig wrote: > On Wed, Mar 30, 2016 at 02:58:38PM -0400, Austin S. Hemmelgarn wrote: >> Nothing that I can find in the man-pages or API documentation for Linux's >> fallocate explicitly says that it will be fast. There are bits that say it >> should be efficient, but that is not itself well defined (given context, I >> would assume it to mean that it doesn't use as much I/O as writing out that >> many bytes of zero data, not necessarily that it will return quickly). > > And that's pretty much as narrow as an defintion we get. But apparently > gfs2 already breaks that expectation :( GFS2 breaks other expectations as well (mostly stuff with locking) in arguably more significant ways, so I would not personally consider it to be precedent for breaking this on other filesystems. > >>> delalloc system is careful enough to check that there are enough free >>> blocks to handle both the allocation and the metadata updates. The >>> only gap in this scheme that I can see is if we fallocate, crash, and >>> upon restart the program then tries to write without retrying the >>> fallocate. Can we trade some performance for the added requirement >>> that we must fallocate -> write -> fsync, and retry the trio if we >>> crash before the fsync returns? I think that's already an implicit >>> requirement, so we might be ok here. >> Most of the software I've seen that doesn't use fallocate like this is >> either doing odd things otherwise, or is just making sure it has space for >> temporary files, so I think it is probably safe to require this. > > posix_fallocate gurantees you that you don't get ENOSPC from the write, > and there is plenty of software relying on that or crashing / cause data > integrity problems that way. > posix_fallocate is not the same thing as the fallocate syscall. It's there for compatibility, it has less functionality, and most importantly, it _can_ be slow (because at least glibc will emulate it if the underlying FS doesn't support fallocate, which means it's no faster than just using dd). From david@fromorbit.com Thu Mar 31 06:18:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6A6CC7CA3 for ; Thu, 31 Mar 2016 06:18:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C1CBCAC001 for ; Thu, 31 Mar 2016 04:18:57 -0700 (PDT) X-ASG-Debug-ID: 1459423133-04cbb07ad6160670001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id XU5VA7Sz9vDTdZpw for ; Thu, 31 Mar 2016 04:18: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: A2ArDAAFB/1WPDGaLHldgzSBUIJxg3mgIQaMEolwhgcEAgKBP00BAQEBAQEHAQEBAUJAhEIBAQQ6HCMQCAMOCgklDwUlAwcaE4gmwXoBCx4ZhT2FDoQmhW4Fl3KNfo8XjxWEXSgwiG0BAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail05.adl6.internode.on.net with ESMTP; 31 Mar 2016 21:48:51 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1alack-0007EG-Ju; Thu, 31 Mar 2016 22:18:50 +1100 Date: Thu, 31 Mar 2016 22:18:50 +1100 From: Dave Chinner To: Christoph Hellwig Cc: "Darrick J. Wong" , xfs@oss.sgi.com, linux-fsdevel , linux-btrfs , linux-api@vger.kernel.org Subject: Re: fallocate mode flag for "unshare blocks"? Message-ID: <20160331111850.GP11812@dastard> X-ASG-Orig-Subj: Re: fallocate mode flag for "unshare blocks"? References: <20160302155007.GB7125@infradead.org> <20160330182755.GC2236@birch.djwong.org> <20160331011813.GJ30721@dastard> <20160331075440.GA4209@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160331075440.GA4209@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: 1459423133 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28329 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Mar 31, 2016 at 12:54:40AM -0700, Christoph Hellwig wrote: > On Thu, Mar 31, 2016 at 12:18:13PM +1100, Dave Chinner wrote: > > On Wed, Mar 30, 2016 at 11:27:55AM -0700, Darrick J. Wong wrote: > > > Or is it ok that fallocate could block, potentially for a long time as > > > we stream cows through the page cache (or however unshare works > > > internally)? Those same programs might not be expecting fallocate to > > > take a long time. > > > > Yes, it's perfectly fine for fallocate to block for long periods of > > time. See what gfs2 does during preallocation of blocks - it ends up > > calling sb_issue_zerout() because it doesn't have unwritten > > extents, and hence can block for long periods of time.... > > gfs2 fallocate is an implementation that will cause all but the most > trivial users real pain. Even the initial XFS implementation just > marking the transactions synchronous made it unusable for all kinds > of applications, and this is much worse. E.g. a NFS ALLOCATE operation > to gfs2 will probab;ly hand your connection for extended periods of > time. > > If we need to support something like what gfs2 does we should have a > separate flag for it. Using fallocate() for preallocation was always intended to be a faster, more efficient method allocating zeroed space than having userspace write blocks of data. Faster, more efficient does not mean instantaneous, and gfs2 using sb_issue_zerout() means that if the hardware has zeroing offloads (deterministic trim, write same, etc) it will use them, and that will be much faster than writing zeros from userspace. IMO, what gfs2 is definitely within the intended usage of fallocate() for accelerating the preallocation of blocks. Yes, it may not be optimal for things like NFS servers which haven't considered that a fallocate based offload operation might take some time to execute, but that's not a problem with fallocate. i.e. that's a problem with the nfs server ALLOCATE implementation not being prepared to return NFSERR_JUKEBOX to prevent client side hangs and timeouts while the operation is run.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From ahferroin7@gmail.com Thu Mar 31 06:20:06 2016 Return-Path: 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 AF7A67CA3 for ; Thu, 31 Mar 2016 06:20:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 854238F804C for ; Thu, 31 Mar 2016 04:20:03 -0700 (PDT) X-ASG-Debug-ID: 1459423201-04cbb07ad8160700001-NocioJ Received: from mail-qg0-f43.google.com (mail-qg0-f43.google.com [209.85.192.43]) by cuda.sgi.com with ESMTP id MCKYHMrbA73tFPiD (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 31 Mar 2016 04:20:02 -0700 (PDT) X-Barracuda-Envelope-From: ahferroin7@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.43 Received: by mail-qg0-f43.google.com with SMTP id w104so56297990qge.3 for ; Thu, 31 Mar 2016 04:20:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=subject:to:references:cc:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding; bh=/RGHvvSWdqiROlxyeVHHLIGvX76DrsyFA5l1/90V8HE=; b=LoZFsbcjLmmuyCAon5UdkudqPHXG9c2rZdxrZ7RRAgZv/SrG0sMM1jw64mCKUfz8Ev 5UAsLhmJ+KnFslnmBfQkSiMPZWz/mpReegQVgZh73MQs7sjJkfFDU9HrxY6ftefVD6gR 5TaWioMyU4ZQXToZo6s2DcOT8zF6Chgb7kU4IHbjXs50m9VZ67w6GcROsY/r7ugOCwaz anrJM4KQ4k/ZneUKXDoeFVSudrwI7nPR2meQw81vgLoHr/SUBXczmcC5exaMC3NI5fLV wDzI9Hfq5e2ErEowhZmMOGJae5/f64GlU9GU3RLg0vVUi/Xy/2ANuLisL9S0kUhJjtZg QXtA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:subject:to:references:cc:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=/RGHvvSWdqiROlxyeVHHLIGvX76DrsyFA5l1/90V8HE=; b=UXcUjxDf8yK1S11hiaMP81XCOSWvjR92kbmMEeKn146k9WuZfmOiiibrG84E4vYgrK Dly4yQcN0MvxHODh89SJujI5bmtaZ0OOlUb7QK2ZGs2sGNVMWlXComQafO9v4052zdFF HW9KottqI8ZHR6Aw4TNGb85fe5DwLCL0a59rg7RSjPMRFX/2K4dmogsp7zmUi/v1561b 7Y24wAOV/DrzjqQieHa+NlzfsAq1cpG52DC7HsDMCPIA1G0d4veChuVCX/QDkZ8AQP8d Xmee4SSBQ7K8g91LXPdyNmsY1VbTbltOgWs3g5HKZ3SqXRZI2a5UliuHNPFQzY0iQlM5 NOGQ== X-Gm-Message-State: AD7BkJLCdRbaoCeGQWVQtozFI2078lgPUQYYtvAFTKh+hYvTaPfoF+ufAZRjrExUmCAgJg== X-Received: by 10.140.160.214 with SMTP id g205mr16402292qhg.88.1459423201661; Thu, 31 Mar 2016 04:20:01 -0700 (PDT) Received: from [127.0.0.1] (rrcs-70-62-41-24.central.biz.rr.com. [70.62.41.24]) by smtp.gmail.com with ESMTPSA id q94sm3728223qgq.14.2016.03.31.04.20.00 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 31 Mar 2016 04:20:01 -0700 (PDT) Subject: Re: fallocate mode flag for "unshare blocks"? To: bo.li.liu@oracle.com, "Darrick J. Wong" X-ASG-Orig-Subj: Re: fallocate mode flag for "unshare blocks"? References: <20160302155007.GB7125@infradead.org> <20160330182755.GC2236@birch.djwong.org> <20160331003242.GA5813@localhost.localdomain> Cc: Christoph Hellwig , xfs@oss.sgi.com, linux-fsdevel , linux-btrfs , linux-api@vger.kernel.org From: "Austin S. Hemmelgarn" Message-ID: <56FD079F.3060606@gmail.com> Date: Thu, 31 Mar 2016 07:18:55 -0400 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.7.0 MIME-Version: 1.0 In-Reply-To: <20160331003242.GA5813@localhost.localdomain> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Antivirus: avast! (VPS 160331-1, 2016-03-31), Outbound message X-Antivirus-Status: Clean X-Barracuda-Connect: mail-qg0-f43.google.com[209.85.192.43] X-Barracuda-Start-Time: 1459423202 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28329 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On 2016-03-30 20:32, Liu Bo wrote: > On Wed, Mar 30, 2016 at 11:27:55AM -0700, Darrick J. Wong wrote: >> Hi all, >> >> Christoph and I have been working on adding reflink and CoW support to >> XFS recently. Since the purpose of (mode 0) fallocate is to make sure >> that future file writes cannot ENOSPC, I extended the XFS fallocate >> handler to unshare any shared blocks via the copy on write mechanism I >> built for it. However, Christoph shared the following concerns with >> me about that interpretation: >> >>> I know that I suggested unsharing blocks on fallocate, but it turns out >>> this is causing problems. Applications expect falloc to be a fast >>> metadata operation, and copying a potentially large number of blocks >>> is against that expextation. This is especially bad for the NFS >>> server, which should not be blocked for a long time in a synchronous >>> operation. >>> >>> I think we'll have to remove the unshare and just fail the fallocate >>> for a reflinked region for now. I still think it makes sense to expose >>> an unshare operation, and we probably should make that another >>> fallocate mode. > > I'm expecting fallocate to be fast, too. > > Well, btrfs fallocate doesn't allocate space if it's a shared one > because it thinks the space is already allocated. So a later overwrite > over this shared extent may hit enospc errors. And this _really_ should get fixed, otherwise glibc will add a check for running posix_fallocate against BTRFS and force emulation, and people _will_ complain about performance. From ahferroin7@gmail.com Thu Mar 31 06:40:09 2016 Return-Path: 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 6DE7F7CA3 for ; Thu, 31 Mar 2016 06:40:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 34D1130404E for ; Thu, 31 Mar 2016 04:40:09 -0700 (PDT) X-ASG-Debug-ID: 1459424406-04cb6c246015ee20001-NocioJ Received: from mail-qg0-f45.google.com (mail-qg0-f45.google.com [209.85.192.45]) by cuda.sgi.com with ESMTP id 7emio6p382t7r6Go (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 31 Mar 2016 04:40:06 -0700 (PDT) X-Barracuda-Envelope-From: ahferroin7@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.45 Received: by mail-qg0-f45.google.com with SMTP id j35so62291231qge.0 for ; Thu, 31 Mar 2016 04:40:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=subject:to:references:cc:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding; bh=xhji1YkpbQ0QsbMygtABJ+xqJvICIDgPREwqKw5DPfY=; b=q7yesuOSE3lHfXS2fgQ6PQ4kwm+KYCYo/waA03Z5WECqBpJGx5XgFA7QIIWeOPsYQZ RogYkeCOwuY/X44BRXa/WYGqd5nkImB7V6PIhs3hMah2c3XZH+PeE0/efdBJhKhJyvnH NiFVnIsSylEg/b0QsV+u/Yn4yNn2zGR6SHkUAuThlv0S2DqS0I38WGEAHrYnVusmgrdp GbqcHYn7u3Op5qd4HbN4tNfmNx14QlXCxjr4PqINeJYDz3ZOHiNuXapE9lfbbl49gBLr +eeUsUxU6baibzOGRfVVjHnfIroHqGumg2V5nCGSFZO+AXPIjYr80WAPJk7vzSU3Y6ti 46Iw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:subject:to:references:cc:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=xhji1YkpbQ0QsbMygtABJ+xqJvICIDgPREwqKw5DPfY=; b=jdRITxhj7eOgVtOurLOiEChNTytQxUKijd80qTjdTLZ0ftl9zoH2PNz1klbwijfVzB cL5pCI6cEHAhqNaUcI6iSKM9T9450huPVDjOOS8YTLrKnBScFLUXhGECgAfweJdLmD/U QCtczgtXr2z70dM1ehaWymUT7Q8EwE+s2XnM9oeNhQlLlOHRo/BKxRsTv6a6akskYMR7 mooJpnuAvMKsNcz3txONa5ZGDkXzUoERMCg1JD4yVn9xPdx+Dnl4X3WBpWrkqAbc8TQ7 wF56+BMi8OUKlUgmFhe0g0NkV+GmaL7MgJJR1sZxyrxdh4y7104WuBofI5MtVuhjOH5E xCXg== X-Gm-Message-State: AD7BkJLZ1zCdEShvCOpvCmoffrQOpwPytEIAMNPi7svpjXrmmQLmqB1ilQs4H8wiT/k4pw== X-Received: by 10.140.216.212 with SMTP id m203mr16487555qhb.37.1459424406026; Thu, 31 Mar 2016 04:40:06 -0700 (PDT) Received: from [127.0.0.1] (rrcs-70-62-41-24.central.biz.rr.com. [70.62.41.24]) by smtp.gmail.com with ESMTPSA id w66sm3746968qgd.26.2016.03.31.04.40.05 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 31 Mar 2016 04:40:05 -0700 (PDT) Subject: Re: fallocate mode flag for "unshare blocks"? To: bo.li.liu@oracle.com X-ASG-Orig-Subj: Re: fallocate mode flag for "unshare blocks"? References: <20160302155007.GB7125@infradead.org> <20160330182755.GC2236@birch.djwong.org> <20160331003242.GA5813@localhost.localdomain> <56FD079F.3060606@gmail.com> Cc: "Darrick J. Wong" , Christoph Hellwig , xfs@oss.sgi.com, linux-fsdevel , linux-btrfs , linux-api@vger.kernel.org From: "Austin S. Hemmelgarn" Message-ID: <56FD0C49.7040308@gmail.com> Date: Thu, 31 Mar 2016 07:38:49 -0400 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.7.0 MIME-Version: 1.0 In-Reply-To: <56FD079F.3060606@gmail.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Antivirus: avast! (VPS 160331-1, 2016-03-31), Outbound message X-Antivirus-Status: Clean X-Barracuda-Connect: mail-qg0-f45.google.com[209.85.192.45] X-Barracuda-Start-Time: 1459424406 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28329 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On 2016-03-31 07:18, Austin S. Hemmelgarn wrote: > On 2016-03-30 20:32, Liu Bo wrote: >> On Wed, Mar 30, 2016 at 11:27:55AM -0700, Darrick J. Wong wrote: >>> Hi all, >>> >>> Christoph and I have been working on adding reflink and CoW support to >>> XFS recently. Since the purpose of (mode 0) fallocate is to make sure >>> that future file writes cannot ENOSPC, I extended the XFS fallocate >>> handler to unshare any shared blocks via the copy on write mechanism I >>> built for it. However, Christoph shared the following concerns with >>> me about that interpretation: >>> >>>> I know that I suggested unsharing blocks on fallocate, but it turns out >>>> this is causing problems. Applications expect falloc to be a fast >>>> metadata operation, and copying a potentially large number of blocks >>>> is against that expextation. This is especially bad for the NFS >>>> server, which should not be blocked for a long time in a synchronous >>>> operation. >>>> >>>> I think we'll have to remove the unshare and just fail the fallocate >>>> for a reflinked region for now. I still think it makes sense to expose >>>> an unshare operation, and we probably should make that another >>>> fallocate mode. >> >> I'm expecting fallocate to be fast, too. >> >> Well, btrfs fallocate doesn't allocate space if it's a shared one >> because it thinks the space is already allocated. So a later overwrite >> over this shared extent may hit enospc errors. > And this _really_ should get fixed, otherwise glibc will add a check for > running posix_fallocate against BTRFS and force emulation, and people > _will_ complain about performance. > Thinking a bit further about this, how hard would it be to add the ability to have unwritten extents point somewhere else for reads? Then when we get an fallocate call, we create the unwritten extents, and add the metadata to make them read from the shared region. Then, when a write gets issued to that extent, the parts that aren't being written in that block get copied, the write happens, and then the link for that block gets removed. This way, fallocate would still provide the correct semantics, it would be relatively fast (still not quite as fast as it is now, but it wouldn't be anywhere near as slow as copying the data), and the cost of copying gets amortized across writes (we may not need to copy everything, but we'll still copy less than we would for just un-sharing the extent). This would of course need to be an incompat feature, but I would personally say that's not as much of an issue, as things are subtly broken in the common use-case right now (at this point I'm just thinking BTRFS, as what Darrick suggested for XFS seems to be a better solution there at least short term). From bfoster@redhat.com Thu Mar 31 09:53:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 95DC27CA3 for ; Thu, 31 Mar 2016 09:53:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 59AD28F8050 for ; Thu, 31 Mar 2016 07:52:58 -0700 (PDT) X-ASG-Debug-ID: 1459435976-04cb6c24621676b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 2pqkiBwQFfGy59g0 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 31 Mar 2016 07:52: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-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 873B4804FC; Thu, 31 Mar 2016 14:52:56 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-61.bos.redhat.com [10.18.41.61]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2VEquiv022564; Thu, 31 Mar 2016 10:52:56 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 0693512261B; Thu, 31 Mar 2016 10:52:54 -0400 (EDT) Date: Thu, 31 Mar 2016 10:52:54 -0400 From: Brian Foster To: Eryu Guan Cc: xfs@oss.sgi.com, esandeen@redhat.com Subject: Re: [PATCH] xfs: add missing break in xfs_parseargs() Message-ID: <20160331145254.GB10474@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: add missing break in xfs_parseargs() References: <1459415583-26981-1-git-send-email-guaneryu@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459415583-26981-1-git-send-email-guaneryu@gmail.com> User-Agent: Mutt/1.5.24 (2015-08-30) 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: 1459435977 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Mar 31, 2016 at 05:13:03PM +0800, Eryu Guan wrote: > Commit 2e74af0e1189 ("xfs: convert mount option parsing to tokens") > missed a 'break;' in xfs_parseargs() which causes mount to fail with > "-o pqnoenforce" option. xfs/050 catches this failure. > > XFS (vda6): Super block does not support project and group quota together > > Fixes: 2e74af0e1189 ("xfs: convert mount option parsing to tokens") > Signed-off-by: Eryu Guan > --- Reviewed-by: Brian Foster > fs/xfs/xfs_super.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index d760934..361564e 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -350,6 +350,7 @@ xfs_parseargs( > case Opt_pqnoenforce: > mp->m_qflags |= (XFS_PQUOTA_ACCT | XFS_PQUOTA_ACTIVE); > mp->m_qflags &= ~XFS_PQUOTA_ENFD; > + break; > case Opt_gquota: > case Opt_grpquota: > mp->m_qflags |= (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE | > -- > 2.5.5 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Thu Mar 31 10:04:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D1D5D7CA3 for ; Thu, 31 Mar 2016 10:04:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 42B46AC001 for ; Thu, 31 Mar 2016 08:04:45 -0700 (PDT) X-ASG-Debug-ID: 1459436681-04cbb07ad7169da0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id nDVE94TEDc2Vv8Ta for ; Thu, 31 Mar 2016 08:04:41 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 9DF8917248 for ; Thu, 31 Mar 2016 10:04:41 -0500 (CDT) Subject: Re: [PATCH] xfs: add missing break in xfs_parseargs() To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: add missing break in xfs_parseargs() References: <1459415583-26981-1-git-send-email-guaneryu@gmail.com> From: Eric Sandeen Message-ID: <56FD3C89.1080400@sandeen.net> Date: Thu, 31 Mar 2016 10:04:41 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.1 MIME-Version: 1.0 In-Reply-To: <1459415583-26981-1-git-send-email-guaneryu@gmail.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1459436681 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.20 X-Barracuda-Spam-Status: No, SCORE=0.20 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC7_SA298e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28333 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.20 BSF_SC7_SA298e Custom Rule SA298e On 3/31/16 4:13 AM, Eryu Guan wrote: > Commit 2e74af0e1189 ("xfs: convert mount option parsing to tokens") > missed a 'break;' in xfs_parseargs() which causes mount to fail with > "-o pqnoenforce" option. xfs/050 catches this failure. > > XFS (vda6): Super block does not support project and group quota together > > Fixes: 2e74af0e1189 ("xfs: convert mount option parsing to tokens") > Signed-off-by: Eryu Guan Ugh, how did I miss that; I thought I scripted that whole change. Thanks for catching it! Reviewed-by: Eric Sandeen > --- > fs/xfs/xfs_super.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index d760934..361564e 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -350,6 +350,7 @@ xfs_parseargs( > case Opt_pqnoenforce: > mp->m_qflags |= (XFS_PQUOTA_ACCT | XFS_PQUOTA_ACTIVE); > mp->m_qflags &= ~XFS_PQUOTA_ENFD; > + break; > case Opt_gquota: > case Opt_grpquota: > mp->m_qflags |= (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE | > From adilger@dilger.ca Thu Mar 31 10:31:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 678F57CA3 for ; Thu, 31 Mar 2016 10:31:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1BA10304064 for ; Thu, 31 Mar 2016 08:31:33 -0700 (PDT) X-ASG-Debug-ID: 1459438289-04bdf01105128170001-NocioJ Received: from mail-io0-f196.google.com (mail-io0-f196.google.com [209.85.223.196]) by cuda.sgi.com with ESMTP id FzQFmlssfUi4vyC8 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 31 Mar 2016 08:31:30 -0700 (PDT) X-Barracuda-Envelope-From: adilger@dilger.ca X-Barracuda-RBL-Trusted-Forwarder: 209.85.223.196 Received: by mail-io0-f196.google.com with SMTP id z133so1703004iod.1 for ; Thu, 31 Mar 2016 08:31:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dilger-ca.20150623.gappssmtp.com; s=20150623; h=subject:mime-version:from:in-reply-to:date:cc:message-id:references :to; bh=HPyfaXAtev1LnHRt88IEJGFROobjJtp5+44uRwekGDw=; b=oxxwG3M3C/bCuWY8y3aAc8XCCrtn0Gjh3Hg/BtFp/LeukFGvkNeiaA+JchWRp4+8AL Tgt/cLTqMaNztZvNOzJ3eWcVBqkJ9oME3SSw3afTgsxVqMbdHw7w8VHJwBtYx9JOU8iG vFUTLSl4Su8EE09c5jDF2au5iRdLF01dxrkYQKsiMQA/DScyT29iYf6i7JYGFo6pUp8A aFBrIWD0YYXpjqUiGNZ8w6Jz1kTO/7DnbKBSRVOt6Tc+Wihb/DEGWY0lPOEQW7/Nv0BZ gwQHW/5RWfIG+YThX/EnfkkryteB8wJrSWySqpjGWTugiuDP2UGajLebECkghd46ab13 hAxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:subject:mime-version:from:in-reply-to:date:cc :message-id:references:to; bh=HPyfaXAtev1LnHRt88IEJGFROobjJtp5+44uRwekGDw=; b=Qu13HkX38dUEmv45otueXHcYhnvQS12kICxumNh5ZUsCrfTVoEyiGWTp/fAQqHI7QS vE2DPI96iS84dhf2LsZk8uZBW8tiiOiC+b4fOTFkbTRT4qfAqS9ZJRQT6o+YtfkwSXLU hXquOMEXschwgn8+Zq20+afm/t0yiW1FQ0/GANrAJ6a1GMd3cuKWR17/TYI3vR3dnJrj zPuu4cGMoM1/9vKb4ICbLA368ZwhlK9QEbj6824l0idFTSjcxr6Q91CF/xJS7ACK10En JRhRV200KYILnpu08JtzF+mcay0/jRWnjKwr9peoYR45q9OsUi8Y8xUDiBO9TVvdDuDn vbBg== X-Gm-Message-State: AD7BkJJZiPA+W7bIp6KkJ5007KcRc+Yb8Q8HcVYOvGGx7xE2us5Qn346yah7ZEolB/Rq+w== X-Received: by 10.107.150.2 with SMTP id y2mr3761743iod.113.1459438289754; Thu, 31 Mar 2016 08:31:29 -0700 (PDT) Received: from cabot-wlan.adilger.int (S0106002191d9348b.cg.shawcable.net. [68.147.249.135]) by smtp.gmail.com with ESMTPSA id dx1sm5124568igb.21.2016.03.31.08.31.27 (version=TLS1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 31 Mar 2016 08:31:28 -0700 (PDT) Subject: Re: fallocate mode flag for "unshare blocks"? X-Barracuda-Apparent-Source-IP: 68.147.249.135 X-Barracuda-BBL-IP: 68.147.249.135 Mime-Version: 1.0 (Mac OS X Mail 9.3 \(3124\)) X-ASG-Orig-Subj: Re: fallocate mode flag for "unshare blocks"? Content-Type: multipart/signed; boundary="Apple-Mail=_46939755-A74C-4C8F-A5DA-D821D2ACA486"; protocol="application/pgp-signature"; micalg=pgp-sha256 X-Pgp-Agent: GPGMail 2.6b2 From: Andreas Dilger In-Reply-To: <20160331075529.GB4209@infradead.org> Date: Thu, 31 Mar 2016 09:31:23 -0600 Cc: Liu Bo , "Darrick J. Wong" , xfs@oss.sgi.com, linux-fsdevel , linux-btrfs , linux-api@vger.kernel.org Message-Id: <3E147309-67EA-4B29-B4E0-883BA03B7BFC@dilger.ca> References: <20160302155007.GB7125@infradead.org> <20160330182755.GC2236@birch.djwong.org> <20160331003242.GA5813@localhost.localdomain> <20160331075529.GB4209@infradead.org> To: Christoph Hellwig X-Mailer: Apple Mail (2.3124) X-Barracuda-Connect: mail-io0-f196.google.com[209.85.223.196] X-Barracuda-Start-Time: 1459438290 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28334 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature --Apple-Mail=_46939755-A74C-4C8F-A5DA-D821D2ACA486 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=us-ascii On Mar 31, 2016, at 1:55 AM, Christoph Hellwig wrote: > > On Wed, Mar 30, 2016 at 05:32:42PM -0700, Liu Bo wrote: >> Well, btrfs fallocate doesn't allocate space if it's a shared one >> because it thinks the space is already allocated. So a later overwrite >> over this shared extent may hit enospc errors. > > And this makes it an incorrect implementation of posix_fallocate, > which glibcs implements using fallocate if available. It isn't really useful for a COW filesystem to implement fallocate() to reserve blocks. Even if it did allocate all of the blocks on the initial fallocate() call, when it comes time to overwrite these blocks new blocks need to be allocated as the old ones will not be overwritten. Because of snapshots that could hold references to the old blocks, there isn't even the guarantee that the previous fallocated blocks will be released in a reasonable time to free up an equal amount of space. Cheers, Andreas --Apple-Mail=_46939755-A74C-4C8F-A5DA-D821D2ACA486 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=signature.asc Content-Type: application/pgp-signature; name=signature.asc Content-Description: Message signed with OpenPGP using GPGMail -----BEGIN PGP SIGNATURE----- Comment: GPGTools - http://gpgtools.org iQIVAwUBVv1CzHKl2rkXzB/gAQhzHRAAjRF1pWkEl2czxpH+Uk1lmdZDoZYvi/pW 2QxYC6IL5H/a+usrR4r+wP2sZ1spLa8pQaoyLEcSU5EPEvVNHSH0ip7q3cX+I+/W 6BNc+Qm2eVWgrI9d/eYGFJF5ahlZ8K6+s2fj6KlxC39f1MD6qTFLq7bqZ5bOCorI w/HIKuwclJgiQ34w/yZtHUFMICb1kwmjAYc/u18JkJ9zxXCfpZl54n71xFUWxqOM Yuuwrz5YyTwxhUV+mVSmVNPwrUCQK1mq0DfNmIk1c5VihbDDevWuW6JIam1dBpd2 EGdajSQmGg9exwoHzrn/maWLtQrBBgMpXS81KfBK0+5fIZv8kxKJ2l6KTRs2etQu 9Mjwfrs+F2ecZtp7BWf4Yxu+fmjp8hQLeypgtpbZ8I+8nqh0sY64XLP3m5f46llI K+9RGJ5VSdrCWfH5l7jh3pbJ/wpsUVn7i0YmomG91f0doLFT9vMLalkK262vfcIQ zC9CmaLz7cqI77vFZ/G8BmHMH2yNT09oV4drXTqBsvmMR2JfQYT4Z19nYNgjv6zp OZidH9SlwUPwN23y4AB9jaOe+ePtqFDrNiUZoQtbifWDozFLFTteK4Ip+w/mYpw3 Rj8771pSKhg89xj8DMl3ztq68QTVYj9vXwogVB8z/ugNyxwRXEWbvbaTzQ7FiaLk OhZvegHPSyE= =ZvYL -----END PGP SIGNATURE----- --Apple-Mail=_46939755-A74C-4C8F-A5DA-D821D2ACA486-- From ahferroin7@gmail.com Thu Mar 31 10:43:31 2016 Return-Path: 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 7D5CB7CA3 for ; Thu, 31 Mar 2016 10:43:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D173EAC001 for ; Thu, 31 Mar 2016 08:43:30 -0700 (PDT) X-ASG-Debug-ID: 1459439008-04cb6c2462169080001-NocioJ Received: from mail-qg0-f51.google.com (mail-qg0-f51.google.com [209.85.192.51]) by cuda.sgi.com with ESMTP id 9bMMTWvUMjf8kgPT (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 31 Mar 2016 08:43:28 -0700 (PDT) X-Barracuda-Envelope-From: ahferroin7@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.51 Received: by mail-qg0-f51.google.com with SMTP id j35so68022418qge.0 for ; Thu, 31 Mar 2016 08:43:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=subject:to:references:cc:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding; bh=o+EHNzFjuJ5Wsku1dAkAqw2aOAE9HU1AE1eiPbRr/ng=; b=B5C9AQLvbklsXYhuTajsDDV8+Np/N3rM17lwmtpuFIuQW93m/8n2bglJJ0sgO97c/Y P+EFLIlN+Z6QfgmNOvvbPWNOTUgbnxizg2RxDjWKsgF0FPELCewyT+w4PrpZBFmfGuES +RADpv7pXSbXIhRKUpVDh4HXXLtAGWv/1J65vV8pXibsMyCV1BBPPxWfpIjnHYq3Bmwn jwhQ+mUdM3mlli9EHGoGTUrE5aNyLOZmTMRxh2JRDAfB4SGVjbD5ERBmWQTlT76XkArr H153ORsikw44wAwvF6M1hbuIaITstxMq/AORWuQTYbpxq+hahcDTzfhxMLvHG02iswoU PSfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:subject:to:references:cc:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=o+EHNzFjuJ5Wsku1dAkAqw2aOAE9HU1AE1eiPbRr/ng=; b=j12TpSW2BFeYanW55om7+1fxezf55lCHXkMdfITVpX0e2Z7Ac+4He70CwtNeNIZrGN FlhduFPxdtKQylir1V2KP0ZvKzVjrKJrEnOeApRq7D7Fafy1VUG7/w8NT3xAmwPjpi9x lEnn7qrtnPo/aiarnBNMAUpi355pccEaIcIImbCge0JOXI/9hElbZQiqPP3V/nsp/Fc+ JYUrxse9N70ynGZVXtGLHcCDyLzxLbch3tHCHKBHgeXApY2zs39RHuHf2+UFE1B3dTz7 yikT+lycNyXf5TxEnPDz6lugy+T90iTrKxY1RSq4xMVM0p171H5N1DDI2m3lDZ+NNlgr UNZg== X-Gm-Message-State: AD7BkJJY88HPnBrmofvEKA3MKyxzl5di6EMprK5JH18jcyDIcKZnUlhka9a8WcjXPpGJRQ== X-Received: by 10.140.156.138 with SMTP id c132mr18248772qhc.96.1459439006987; Thu, 31 Mar 2016 08:43:26 -0700 (PDT) Received: from [127.0.0.1] (rrcs-70-62-41-24.central.biz.rr.com. [70.62.41.24]) by smtp.gmail.com with ESMTPSA id b74sm4153891qge.22.2016.03.31.08.43.26 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 31 Mar 2016 08:43:26 -0700 (PDT) Subject: Re: fallocate mode flag for "unshare blocks"? To: Andreas Dilger , Christoph Hellwig X-ASG-Orig-Subj: Re: fallocate mode flag for "unshare blocks"? References: <20160302155007.GB7125@infradead.org> <20160330182755.GC2236@birch.djwong.org> <20160331003242.GA5813@localhost.localdomain> <20160331075529.GB4209@infradead.org> <3E147309-67EA-4B29-B4E0-883BA03B7BFC@dilger.ca> Cc: Liu Bo , "Darrick J. Wong" , xfs@oss.sgi.com, linux-fsdevel , linux-btrfs , linux-api@vger.kernel.org From: "Austin S. Hemmelgarn" Message-ID: <56FD458D.3020007@gmail.com> Date: Thu, 31 Mar 2016 11:43:09 -0400 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.7.0 MIME-Version: 1.0 In-Reply-To: <3E147309-67EA-4B29-B4E0-883BA03B7BFC@dilger.ca> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Antivirus: avast! (VPS 160331-1, 2016-03-31), Outbound message X-Antivirus-Status: Clean X-Barracuda-Connect: mail-qg0-f51.google.com[209.85.192.51] X-Barracuda-Start-Time: 1459439008 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28333 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On 2016-03-31 11:31, Andreas Dilger wrote: > On Mar 31, 2016, at 1:55 AM, Christoph Hellwig wrote: >> >> On Wed, Mar 30, 2016 at 05:32:42PM -0700, Liu Bo wrote: >>> Well, btrfs fallocate doesn't allocate space if it's a shared one >>> because it thinks the space is already allocated. So a later overwrite >>> over this shared extent may hit enospc errors. >> >> And this makes it an incorrect implementation of posix_fallocate, >> which glibcs implements using fallocate if available. > > It isn't really useful for a COW filesystem to implement fallocate() > to reserve blocks. Even if it did allocate all of the blocks on the > initial fallocate() call, when it comes time to overwrite these blocks > new blocks need to be allocated as the old ones will not be overwritten. > > Because of snapshots that could hold references to the old blocks, > there isn't even the guarantee that the previous fallocated blocks will > be released in a reasonable time to free up an equal amount of space. That really depends on how it's done. AFAIK, unwritten extents on BTRFS are block reservations which make sure that you can write there (IOW, the unwritten extent gets converted to a regular extent in-place, not via COW). This means that it is possible to guarantee that the first write to that area will work, which is technically all that POSIX requires. This in turn means that stuff like SystemD and RDBMS software don't exactly see things working as they expect them too, but that's because they make assumptions based on existing technology. From avi@cloudius-systems.com Thu Mar 31 11:33:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 668E27CA3 for ; Thu, 31 Mar 2016 11:33:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3B26C304032 for ; Thu, 31 Mar 2016 09:33:04 -0700 (PDT) X-ASG-Debug-ID: 1459441981-04cbb07ad8171930001-NocioJ Received: from mail-wm0-f48.google.com (mail-wm0-f48.google.com [74.125.82.48]) by cuda.sgi.com with ESMTP id TszAF46BKElG0FIM (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 31 Mar 2016 09:33:02 -0700 (PDT) X-Barracuda-Envelope-From: avi@cloudius-systems.com X-Barracuda-Apparent-Source-IP: 74.125.82.48 Received: by mail-wm0-f48.google.com with SMTP id p65so121738585wmp.0 for ; Thu, 31 Mar 2016 09:33:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=scylladb-com.20150623.gappssmtp.com; s=20150623; h=to:from:subject:message-id:date:user-agent:mime-version :content-transfer-encoding; bh=q/1NYYEh1JbnH17co0s2q1fGQmnhS5kirrkXHnasj8E=; b=hPZ4fJdUjIWg8xCp3FxnzygqA2YLXglmxzTS/q5laSB8pMUB1HRUgr7+jwGO2rkdxF HMcP7PWokHDN9YVfMa5ys4YtFBdEwljDMfJih5ICR4VAvr0YPgtMYt0UkeW6jahO5M1L ap8NcA8slEE6Lq1dLnJI9OdzgrgMbX9VdGpZfzH9DKPsJl8kQ52sNq3YPfXD8jG2/Go/ ZoSV87l4zpBkvd/n/U7pzMk/Kx0IoBkcAeXGWyaMEtT3b+Wi3YAR7Hd12zeyrmwNaXWS lJyJiQstq0FKklu/oNZj7aHwh1uXCSq5uvBm1vtWRsiudcBBpdgYLR9DLG47T5llC5kf Zo6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:to:from:subject:message-id:date:user-agent :mime-version:content-transfer-encoding; bh=q/1NYYEh1JbnH17co0s2q1fGQmnhS5kirrkXHnasj8E=; b=Fc6EWiT06hzD1rFMWoNnKvdxQAgrZmbRt2WPEsHf3ZkV4fBj6bnpSLWX2G4XnT+YVL IKhNx6eyxMjNBIfyNAj8stcJvlQ9w9QHHzDHKX+MeceaT9cpuFL4mvU+cLVvAqao2V86 oXErI2pVrOb5J8keRR5DD9BiUp9xJ2Pw9NwGnRxqhsgipeGzgdeQ4wKCuRHtibfihxoa tjOs/KlkfBya9XS4oc7Oyx+5xDl1h+xLHUn8wM4VRbklv+dLPaJtnR2gF9zwScToD4kO vBsKFz169T0rlF1j2TKQ+gKiJFtspCMP7GjODhlgWddotqIZZM2nFVQOjC0+lYobaCX5 7ovQ== X-Gm-Message-State: AD7BkJL0yq6smiHbEyFypyRSVRUsYfX7o3rQ9lNuHdhInJS/tifJg5hwh2SzXqW5ki0cKw== X-Received: by 10.28.34.69 with SMTP id i66mr30934027wmi.91.1459441981015; Thu, 31 Mar 2016 09:33:01 -0700 (PDT) Received: from avi.cloudius-systems.com ([37.142.229.250]) by smtp.googlemail.com with ESMTPSA id l135sm10341452wmb.13.2016.03.31.09.32.59 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 31 Mar 2016 09:33:00 -0700 (PDT) To: xfs@oss.sgi.com From: Avi Kivity Subject: Internal error at xfs_trans_cancel Message-ID: <56FD513B.40805@scylladb.com> X-ASG-Orig-Subj: Internal error at xfs_trans_cancel Date: Thu, 31 Mar 2016 19:32:59 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.7.1 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-wm0-f48.google.com[74.125.82.48] X-Barracuda-Start-Time: 1459441982 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28337 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 Saw this nice gift this morning: [2121372.825904] XFS (dm-10): Internal error xfs_trans_cancel at line 1007 of file fs/xfs/xfs_trans.c. Caller xfs_create+0x40e/0x710 [xfs] [2121372.827209] CPU: 0 PID: 32020 Comm: java Tainted: G W ------------ 3.10.0-327.10.1.el7.x86_64 #1 [2121372.828529] Hardware name: /DH77EB, BIOS EBH7710H.86A.0099.2013.0125.1400 01/25/2013 [2121372.829873] ffff8807b2b11e80 00000000470753cc ffff88031058bb48 ffffffff816352cc [2121372.831232] ffff88031058bb60 ffffffffa084be5b ffffffffa085b7ee ffff88031058bb88 [2121372.832542] ffffffffa0866909 ffff88014a2f3b80 ffff8807f29a2800 0000000000000000 [2121372.833850] Call Trace: [2121372.835125] [] dump_stack+0x19/0x1b [2121372.836397] [] xfs_error_report+0x3b/0x40 [xfs] [2121372.837654] [] ? xfs_create+0x40e/0x710 [xfs] [2121372.838915] [] xfs_trans_cancel+0xd9/0x100 [xfs] [2121372.840178] [] xfs_create+0x40e/0x710 [xfs] [2121372.841444] [] xfs_vn_mknod+0xbb/0x250 [xfs] [2121372.842683] [] xfs_vn_create+0x13/0x20 [xfs] [2121372.843887] [] vfs_create+0xcd/0x130 [2121372.845103] [] do_last+0xbef/0x1270 [2121372.846324] [] path_openat+0xc2/0x490 [2121372.847538] [] ? user_path_at_empty+0x72/0xc0 [2121372.848746] [] do_filp_open+0x4b/0xb0 [2121372.849917] [] ? __alloc_fd+0xa7/0x130 [2121372.851090] [] do_sys_open+0xf3/0x1f0 [2121372.852227] [] SyS_open+0x1e/0x20 [2121372.853356] [] system_call_fastpath+0x16/0x1b [2121372.854486] XFS (dm-10): xfs_do_force_shutdown(0x8) called from line 1008 of file fs/xfs/xfs_trans.c. Return address = 0xffffffffa0866922 Filesystem appeared full, but after a reboot (critical server) it went back down to 420GB free. I did not spend a lot of time analyzing this as I needed the machine back up, unfortunately. From eye1tm@gmail.com Thu Mar 31 11:47:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 5FBDB7CA3 for ; Thu, 31 Mar 2016 11:47:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C8C74AC001 for ; Thu, 31 Mar 2016 09:47:54 -0700 (PDT) X-ASG-Debug-ID: 1459442871-04cbb07ad6173710001-NocioJ Received: from mail-lb0-f196.google.com (mail-lb0-f196.google.com [209.85.217.196]) by cuda.sgi.com with ESMTP id VL9HQ0IcHZ3IojKG (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 31 Mar 2016 09:47:52 -0700 (PDT) X-Barracuda-Envelope-From: eye1tm@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.196 Received: by mail-lb0-f196.google.com with SMTP id q4so7407719lbq.3 for ; Thu, 31 Mar 2016 09:47:52 -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; bh=cr0mp3MkKrLey9HNPFx/ebgRbndrOhZz3M51xQgoYko=; b=Bdq5JiovTYWhS3AAp4kY6E/ev3SopyW9mIO4+0dGFA4DIOP+frH8gNWlnCMGg6z08b yboLtv4n9LRPPSCybTLHL03dHDJxqROCqmPOlBBf0U/j93zrgW/dSwt0bU1bbEyxiQYP dOSnpa35OsxQeiEo/Oyj8jDEhnhsrzTsdITDTr3vANZrPB8tZwgQbvoeH4euK5AZ2YbS gJpL79WC65xIqAaSe2Fj3XAz6kCECZh01pR2ALHnLG2bAPK2nF005ZZQh3xw+jhcBFOp LM8NGVb+0zlwFo2egD3mvucJXe+2foeXpSCxC+0fbWnroS3XaSVL8TUafbK9r/B2u2St RiZg== 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; bh=cr0mp3MkKrLey9HNPFx/ebgRbndrOhZz3M51xQgoYko=; b=aBlc39M2fpN58zVP0HrfDDMULSWg3BLttDdK1YYisX9r3nEUScW9u8J5Js0qMaVJYo V9K4u5nML953n6/VhJ7HZeNbY1vjftsreRktQBnDO9oBVdPBqc3cTK0Cu+L77a36pdRI TxZ+M6WrLEYOIWn+j0srI65QGyLsYE6O5DoeYWUJxMQ+71sHkTyHgw6ndJ2yOKRBbJ/i Rx6YMMyRisY8baFOSxkamtFa6g9ZWFtSZIriK29auJ4cNlb7RCiICvMrdPikleTY3qO5 G8NYzFwT/ut/3xYd/wpk3I12D+mNYtn9GcH6Kh9cTguuPUo8wR3eltJVCXQJVWSMgSCv N9Bw== X-Gm-Message-State: AD7BkJKY5SiNjcfglWylSB7+C7VmrP3NY11gnjWii6uXMHOWYJ/Kxo54njEJ46DBhgdwdtAbbCwd4h/8R5JAjg== MIME-Version: 1.0 X-Received: by 10.112.149.73 with SMTP id ty9mr245164lbb.48.1459442871155; Thu, 31 Mar 2016 09:47:51 -0700 (PDT) Received: by 10.25.26.68 with HTTP; Thu, 31 Mar 2016 09:47:50 -0700 (PDT) In-Reply-To: <3E147309-67EA-4B29-B4E0-883BA03B7BFC@dilger.ca> References: <20160302155007.GB7125@infradead.org> <20160330182755.GC2236@birch.djwong.org> <20160331003242.GA5813@localhost.localdomain> <20160331075529.GB4209@infradead.org> <3E147309-67EA-4B29-B4E0-883BA03B7BFC@dilger.ca> Date: Thu, 31 Mar 2016 18:47:50 +0200 Message-ID: Subject: Re: fallocate mode flag for "unshare blocks"? From: Henk Slager X-ASG-Orig-Subj: Re: fallocate mode flag for "unshare blocks"? To: Andreas Dilger Cc: Christoph Hellwig , Liu Bo , "Darrick J. Wong" , xfs@oss.sgi.com, linux-fsdevel , linux-btrfs , linux-api@vger.kernel.org Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-lb0-f196.google.com[209.85.217.196] X-Barracuda-Start-Time: 1459442872 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28337 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Thu, Mar 31, 2016 at 5:31 PM, Andreas Dilger wrote: > On Mar 31, 2016, at 1:55 AM, Christoph Hellwig wrote: >> >> On Wed, Mar 30, 2016 at 05:32:42PM -0700, Liu Bo wrote: >>> Well, btrfs fallocate doesn't allocate space if it's a shared one >>> because it thinks the space is already allocated. So a later overwrite >>> over this shared extent may hit enospc errors. >> >> And this makes it an incorrect implementation of posix_fallocate, >> which glibcs implements using fallocate if available. > > It isn't really useful for a COW filesystem to implement fallocate() > to reserve blocks. Even if it did allocate all of the blocks on the > initial fallocate() call, when it comes time to overwrite these blocks > new blocks need to be allocated as the old ones will not be overwritten. There are also use-cases on BTRFS with CoW disabled, like operations on virtual machine images that aren't snapshotted. Those files tend to be big and having fallocate() implemented and working like for e.g. XFS, in order to achieve space and speed efficiency, makes sense IMHO. From bfields@fieldses.org Thu Mar 31 13:08:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 88EE47CA3 for ; Thu, 31 Mar 2016 13:08:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4B3518F804C for ; Thu, 31 Mar 2016 11:08:25 -0700 (PDT) X-ASG-Debug-ID: 1459447701-04cb6c246217bbb0001-NocioJ Received: from fieldses.org (fieldses.org [173.255.197.46]) by cuda.sgi.com with ESMTP id oXTzvwHkf4UjyZcj for ; Thu, 31 Mar 2016 11:08:22 -0700 (PDT) X-Barracuda-Envelope-From: bfields@fieldses.org X-Barracuda-Apparent-Source-IP: 173.255.197.46 Received: by fieldses.org (Postfix, from userid 2815) id 7710DC56; Thu, 31 Mar 2016 14:08:21 -0400 (EDT) Date: Thu, 31 Mar 2016 14:08:21 -0400 To: Dave Chinner Cc: Christoph Hellwig , "Darrick J. Wong" , xfs@oss.sgi.com, linux-fsdevel , linux-btrfs , linux-api@vger.kernel.org Subject: Re: fallocate mode flag for "unshare blocks"? Message-ID: <20160331180821.GD22462@fieldses.org> X-ASG-Orig-Subj: Re: fallocate mode flag for "unshare blocks"? References: <20160302155007.GB7125@infradead.org> <20160330182755.GC2236@birch.djwong.org> <20160331011813.GJ30721@dastard> <20160331075440.GA4209@infradead.org> <20160331111850.GP11812@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160331111850.GP11812@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) From: bfields@fieldses.org (J. Bruce Fields) X-Barracuda-Connect: fieldses.org[173.255.197.46] X-Barracuda-Start-Time: 1459447701 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28339 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Mar 31, 2016 at 10:18:50PM +1100, Dave Chinner wrote: > On Thu, Mar 31, 2016 at 12:54:40AM -0700, Christoph Hellwig wrote: > > On Thu, Mar 31, 2016 at 12:18:13PM +1100, Dave Chinner wrote: > > > On Wed, Mar 30, 2016 at 11:27:55AM -0700, Darrick J. Wong wrote: > > > > Or is it ok that fallocate could block, potentially for a long time as > > > > we stream cows through the page cache (or however unshare works > > > > internally)? Those same programs might not be expecting fallocate to > > > > take a long time. > > > > > > Yes, it's perfectly fine for fallocate to block for long periods of > > > time. See what gfs2 does during preallocation of blocks - it ends up > > > calling sb_issue_zerout() because it doesn't have unwritten > > > extents, and hence can block for long periods of time.... > > > > gfs2 fallocate is an implementation that will cause all but the most > > trivial users real pain. Even the initial XFS implementation just > > marking the transactions synchronous made it unusable for all kinds > > of applications, and this is much worse. E.g. a NFS ALLOCATE operation > > to gfs2 will probab;ly hand your connection for extended periods of > > time. > > > > If we need to support something like what gfs2 does we should have a > > separate flag for it. > > Using fallocate() for preallocation was always intended to > be a faster, more efficient method allocating zeroed space > than having userspace write blocks of data. Faster, more efficient > does not mean instantaneous, and gfs2 using sb_issue_zerout() means > that if the hardware has zeroing offloads (deterministic trim, write > same, etc) it will use them, and that will be much faster than > writing zeros from userspace. > > IMO, what gfs2 is definitely within the intended usage of > fallocate() for accelerating the preallocation of blocks. > > Yes, it may not be optimal for things like NFS servers which haven't > considered that a fallocate based offload operation might take some > time to execute, but that's not a problem with fallocate. i.e. > that's a problem with the nfs server ALLOCATE implementation not > being prepared to return NFSERR_JUKEBOX to prevent client side hangs > and timeouts while the operation is run.... That's an interesting idea, but I don't think it's really legal. I take JUKEBOX to mean "sorry, I'm failing this operation for now, try again later and it might succeed", not "OK, I'm working on it, try again and you may find out I've done it". So if the client gets a JUKEBOX error but the server goes ahead and does the operation anyway, that'd be unexpected. I suppose it's comparable to the case where a slow fallocate is interrupted--would it be legal to return EINTR in that case and leave the application to sort out whether some part of the allocation had already happened? Would it be legal to continue the fallocate under the covers even after returning EINTR? But anyway my first inclination is to say that the NFS FALLOCATE protocol just wasn't designed to handle long-running fallocates, and if we really need that then we need to give it a way to either report partial results or to report results asynchronously. --b. From darrick.wong@oracle.com Thu Mar 31 13:19:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 749AC7CA3 for ; Thu, 31 Mar 2016 13:19:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 28ABD304032 for ; Thu, 31 Mar 2016 11:19:48 -0700 (PDT) X-ASG-Debug-ID: 1459448385-04bdf0110413b7f0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id oAAgT7rVZjLXK5jd (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 31 Mar 2016 11:19:46 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u2VIJGgG023000 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 31 Mar 2016 18:19:16 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u2VIJGqr019937 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 31 Mar 2016 18:19:16 GMT Received: from abhmp0010.oracle.com (abhmp0010.oracle.com [141.146.116.16]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u2VIJFRl021511; Thu, 31 Mar 2016 18:19:15 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 31 Mar 2016 11:19:15 -0700 Date: Thu, 31 Mar 2016 11:19:13 -0700 From: "Darrick J. Wong" To: "J. Bruce Fields" Cc: Dave Chinner , Christoph Hellwig , xfs@oss.sgi.com, linux-fsdevel , linux-btrfs , linux-api@vger.kernel.org Subject: Re: fallocate mode flag for "unshare blocks"? Message-ID: <20160331181913.GA22244@birch.djwong.org> X-ASG-Orig-Subj: Re: fallocate mode flag for "unshare blocks"? References: <20160302155007.GB7125@infradead.org> <20160330182755.GC2236@birch.djwong.org> <20160331011813.GJ30721@dastard> <20160331075440.GA4209@infradead.org> <20160331111850.GP11812@dastard> <20160331180821.GD22462@fieldses.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160331180821.GD22462@fieldses.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1459448386 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28339 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Thu, Mar 31, 2016 at 02:08:21PM -0400, J. Bruce Fields wrote: > On Thu, Mar 31, 2016 at 10:18:50PM +1100, Dave Chinner wrote: > > On Thu, Mar 31, 2016 at 12:54:40AM -0700, Christoph Hellwig wrote: > > > On Thu, Mar 31, 2016 at 12:18:13PM +1100, Dave Chinner wrote: > > > > On Wed, Mar 30, 2016 at 11:27:55AM -0700, Darrick J. Wong wrote: > > > > > Or is it ok that fallocate could block, potentially for a long time as > > > > > we stream cows through the page cache (or however unshare works > > > > > internally)? Those same programs might not be expecting fallocate to > > > > > take a long time. > > > > > > > > Yes, it's perfectly fine for fallocate to block for long periods of > > > > time. See what gfs2 does during preallocation of blocks - it ends up > > > > calling sb_issue_zerout() because it doesn't have unwritten > > > > extents, and hence can block for long periods of time.... > > > > > > gfs2 fallocate is an implementation that will cause all but the most > > > trivial users real pain. Even the initial XFS implementation just > > > marking the transactions synchronous made it unusable for all kinds > > > of applications, and this is much worse. E.g. a NFS ALLOCATE operation > > > to gfs2 will probab;ly hand your connection for extended periods of > > > time. > > > > > > If we need to support something like what gfs2 does we should have a > > > separate flag for it. > > > > Using fallocate() for preallocation was always intended to > > be a faster, more efficient method allocating zeroed space > > than having userspace write blocks of data. Faster, more efficient > > does not mean instantaneous, and gfs2 using sb_issue_zerout() means > > that if the hardware has zeroing offloads (deterministic trim, write > > same, etc) it will use them, and that will be much faster than > > writing zeros from userspace. > > > > IMO, what gfs2 is definitely within the intended usage of > > fallocate() for accelerating the preallocation of blocks. > > > > Yes, it may not be optimal for things like NFS servers which haven't > > considered that a fallocate based offload operation might take some > > time to execute, but that's not a problem with fallocate. i.e. > > that's a problem with the nfs server ALLOCATE implementation not > > being prepared to return NFSERR_JUKEBOX to prevent client side hangs > > and timeouts while the operation is run.... > > That's an interesting idea, but I don't think it's really legal. I take > JUKEBOX to mean "sorry, I'm failing this operation for now, try again > later and it might succeed", not "OK, I'm working on it, try again and > you may find out I've done it". > > So if the client gets a JUKEBOX error but the server goes ahead and does > the operation anyway, that'd be unexpected. > > I suppose it's comparable to the case where a slow fallocate is > interrupted--would it be legal to return EINTR in that case and leave > the application to sort out whether some part of the allocation had > already happened? The unshare component to XFS fallocate does this if something sends a fatal signal to the process. There's a difference between shooting down a process in the middle of fallocate and fallocate returning EINTR out of the blue, though... ...the manpage for fallocate says that "EINTR == a signal was caught". > Would it be legal to continue the fallocate under the covers even > after returning EINTR? It doesn't do that, however. --D > But anyway my first inclination is to say that the NFS FALLOCATE > protocol just wasn't designed to handle long-running fallocates, and if > we really need that then we need to give it a way to either report > partial results or to report results asynchronously. > > --b. From adilger@dilger.ca Thu Mar 31 14:48:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 D9E227CA0 for ; Thu, 31 Mar 2016 14:48:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A856D8F8052 for ; Thu, 31 Mar 2016 12:48:03 -0700 (PDT) X-ASG-Debug-ID: 1459453677-04cb6c245f1818a0001-NocioJ Received: from mail-io0-f195.google.com (mail-io0-f195.google.com [209.85.223.195]) by cuda.sgi.com with ESMTP id hCAMlW7ydRSsZuUm (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 31 Mar 2016 12:47:58 -0700 (PDT) X-Barracuda-Envelope-From: adilger@dilger.ca X-Barracuda-RBL-Trusted-Forwarder: 209.85.223.195 Received: by mail-io0-f195.google.com with SMTP id q128so14937866iof.2 for ; Thu, 31 Mar 2016 12:47:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dilger-ca.20150623.gappssmtp.com; s=20150623; h=subject:mime-version:from:in-reply-to:date:cc:message-id:references :to; bh=HoRgEU8s1YUM0paOkKYBT8B0ikAUUQqgJRISvud93LY=; b=f3y5UfbPV+JwvXZ3C5182FMJ0/+CpJbKLe8GTJKpnRpL7EbKkdDL2xgAzBSuMisjVZ NOwSxX1BEGH83+1gAQNB8pJJan+JPZJykAuGLKpf8ojaWJgQNr8fucAn0GL5M9zcmUi8 C3RNp2ni3aXjXt3K5STDmUa7U//enIDzjTY+hXS8weXbyIVKgGj8Le6lc1HgRJsutnR5 ODZ+UcGo/mH/YjJLMcMUVdYTM1DJSLt9+SO6zQSGlSyyLxOOI7QM7T1k2QmSTDEigrUj QQEHwb0FL3y+AWnynWf7NhTDLOIl9gq5DjEGP8pj3CYrutLQx1kwFEt27hjmaOYxDs09 YrzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:subject:mime-version:from:in-reply-to:date:cc :message-id:references:to; bh=HoRgEU8s1YUM0paOkKYBT8B0ikAUUQqgJRISvud93LY=; b=hN9vabEpdtxnTB6y4MuIMcWiRAl5jbvK3WZ7SPsjfzof+BrZyyEOayIkXJiDptKGIb i+wHByPAFv8Qq6x/fVL/3oUN1Jiu9pFM8YuVp2050I28U8PGVRoZ8dM0VfZMMNXSf6zH F/c13kKeq/sOFZo+a9qllHA3o1OHkAYPCmOS3KC60EST6DHweRfhPAy8EXip6lTd0s/B 2jzMUqtnlP4eW5Dr8UlTPWJUuvFaqrT/ia1UevKLdXnqC0I90DuaB5zYccOEAGO8Hns9 cnWPLN1DMolz3g5Jmv4X34iJqq+zBfO1YUszbLQJXYXXveMWzvF1NDOg5qMNgPr9FoZS OO4g== X-Gm-Message-State: AD7BkJIR7rUAVkqszn0o2Ei6iZ0EpJIbzyUEe9NFkqoiGF+YWUPZsMfV/yWDocMaiAmIlw== X-Received: by 10.107.138.147 with SMTP id c19mr5534677ioj.143.1459453677487; Thu, 31 Mar 2016 12:47:57 -0700 (PDT) Received: from cabot-wlan.adilger.int (S0106002191d9348b.cg.shawcable.net. [68.147.249.135]) by smtp.gmail.com with ESMTPSA id o1sm4384088igh.0.2016.03.31.12.47.54 (version=TLS1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 31 Mar 2016 12:47:56 -0700 (PDT) Subject: Re: fallocate mode flag for "unshare blocks"? X-Barracuda-Apparent-Source-IP: 68.147.249.135 X-Barracuda-BBL-IP: 68.147.249.135 Mime-Version: 1.0 (Mac OS X Mail 9.3 \(3124\)) X-ASG-Orig-Subj: Re: fallocate mode flag for "unshare blocks"? Content-Type: multipart/signed; boundary="Apple-Mail=_65FDF3D5-A690-4317-889A-FA2B05734D3A"; protocol="application/pgp-signature"; micalg=pgp-sha256 X-Pgp-Agent: GPGMail 2.6b2 From: Andreas Dilger In-Reply-To: <20160331180821.GD22462@fieldses.org> Date: Thu, 31 Mar 2016 13:47:50 -0600 Cc: Dave Chinner , Christoph Hellwig , "Darrick J. Wong" , xfs@oss.sgi.com, linux-fsdevel , linux-btrfs , linux-api@vger.kernel.org Message-Id: <779E9BCF-8224-44FE-8AAE-E0341A7B475C@dilger.ca> References: <20160302155007.GB7125@infradead.org> <20160330182755.GC2236@birch.djwong.org> <20160331011813.GJ30721@dastard> <20160331075440.GA4209@infradead.org> <20160331111850.GP11812@dastard> <20160331180821.GD22462@fieldses.org> To: "J. Bruce Fields" X-Mailer: Apple Mail (2.3124) X-Barracuda-Connect: mail-io0-f195.google.com[209.85.223.195] X-Barracuda-Start-Time: 1459453678 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28341 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature --Apple-Mail=_65FDF3D5-A690-4317-889A-FA2B05734D3A Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=us-ascii On Mar 31, 2016, at 12:08 PM, J. Bruce Fields wrote: > > On Thu, Mar 31, 2016 at 10:18:50PM +1100, Dave Chinner wrote: >> On Thu, Mar 31, 2016 at 12:54:40AM -0700, Christoph Hellwig wrote: >>> On Thu, Mar 31, 2016 at 12:18:13PM +1100, Dave Chinner wrote: >>>> On Wed, Mar 30, 2016 at 11:27:55AM -0700, Darrick J. Wong wrote: >>>>> Or is it ok that fallocate could block, potentially for a long time as >>>>> we stream cows through the page cache (or however unshare works >>>>> internally)? Those same programs might not be expecting fallocate to >>>>> take a long time. >>>> >>>> Yes, it's perfectly fine for fallocate to block for long periods of >>>> time. See what gfs2 does during preallocation of blocks - it ends up >>>> calling sb_issue_zerout() because it doesn't have unwritten >>>> extents, and hence can block for long periods of time.... >>> >>> gfs2 fallocate is an implementation that will cause all but the most >>> trivial users real pain. Even the initial XFS implementation just >>> marking the transactions synchronous made it unusable for all kinds >>> of applications, and this is much worse. E.g. a NFS ALLOCATE operation >>> to gfs2 will probab;ly hand your connection for extended periods of >>> time. >>> >>> If we need to support something like what gfs2 does we should have a >>> separate flag for it. >> >> Using fallocate() for preallocation was always intended to >> be a faster, more efficient method allocating zeroed space >> than having userspace write blocks of data. Faster, more efficient >> does not mean instantaneous, and gfs2 using sb_issue_zerout() means >> that if the hardware has zeroing offloads (deterministic trim, write >> same, etc) it will use them, and that will be much faster than >> writing zeros from userspace. >> >> IMO, what gfs2 is definitely within the intended usage of >> fallocate() for accelerating the preallocation of blocks. >> >> Yes, it may not be optimal for things like NFS servers which haven't >> considered that a fallocate based offload operation might take some >> time to execute, but that's not a problem with fallocate. i.e. >> that's a problem with the nfs server ALLOCATE implementation not >> being prepared to return NFSERR_JUKEBOX to prevent client side hangs >> and timeouts while the operation is run.... > > That's an interesting idea, but I don't think it's really legal. I take > JUKEBOX to mean "sorry, I'm failing this operation for now, try again > later and it might succeed", not "OK, I'm working on it, try again and > you may find out I've done it". > > So if the client gets a JUKEBOX error but the server goes ahead and does > the operation anyway, that'd be unexpected. Well, the tape continued to be mounted in the background and/or the file restored from the tape into the filesystem... > I suppose it's comparable to the case where a slow fallocate is > interrupted--would it be legal to return EINTR in that case and leave > the application to sort out whether some part of the allocation had > already happened? If the later fallocate() was not re-doing the same work as the first one, it should be fine for the client to re-send the fallocate() request. The fallocate() to reserve blocks does not touch the blocks that are already allocated, so this is safe to do even if another process is writing to the file. If you have multiple processes writing and calling fallocate() with PUNCH/ZERO/COLLAPSE/INSERT to overlapping regions at the same time then the application is in for a world of hurt already. > Would it be legal to continue the fallocate under the covers even after > returning EINTR? That might produce unexpected results in some cases, but it depends on the options used. Probably the safest is to not continue, and depend on userspace to retry the operation on EINTR. For fallocate() doing prealloc or punch or zero this should eventually complete even if it is slow. Cheers, Andreas > But anyway my first inclination is to say that the NFS FALLOCATE > protocol just wasn't designed to handle long-running fallocates, and if > we really need that then we need to give it a way to either report > partial results or to report results asynchronously. > > --b. --Apple-Mail=_65FDF3D5-A690-4317-889A-FA2B05734D3A Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=signature.asc Content-Type: application/pgp-signature; name=signature.asc Content-Description: Message signed with OpenPGP using GPGMail -----BEGIN PGP SIGNATURE----- Comment: GPGTools - http://gpgtools.org iQIVAwUBVv1+53Kl2rkXzB/gAQhZqw//fFFv84kEe1JyjFDEn9izxwBNuFWV12DA VqeaTu5+ecxVVvp37mo6cL/aoFmoHGEBvJdin82q4iFBmT9egVgDt18cOs8jEK55 HKwT1MIJdnbJGZxkkVIvTExK5yN3VOEzfQ7FrifzVVE8kvFqusrIxQ2peWjbjECC m/U1jljzc/eWgGuEWqk1nz6EBmHKRYMagVEOJYmXgd3aq5bmLEa2pkIGXEE2e9OS XlEDRsmv7hOH7yBbcrguarszbXJdtj09mNRHNlSFlgtJFVLC4WHj4bCwZi5OebJ/ MTSyIkNFoRd59h0gaRtwUXDqRivBQ2GLc96OqCiSMU/4uysVs+z4KPA+QWaU0Jgy FUWcCgu4k2rwrHvE4mXk5IbAu8uAT5aiSk7D4+QStUzbbRA0cGhtnansduMtTP1A 1t9iik9wtykm+VzEeJGEdfCe5v7od947bdR219GbVkNkBsh7oKMNiBgZBpwov9oh LXhf6hrhHJqGMAc9WOTRazG66k9oWLAnpbYnOXitmD/sJXIRtHP02uFmDVyLLZsA VqaPKdarP5tzzXOJfdVb1AXB1DVzL4W8PnXjBLWFRHebftmi3OGtVcBxIrQLai3r FSs0MEaOjIT/QT576Nxtma4WPu5FbdaYO02tV3UCPwKXI+XnogJ32ZICu96nk1pc 1Tc9h6MjPBM= =5o0N -----END PGP SIGNATURE----- --Apple-Mail=_65FDF3D5-A690-4317-889A-FA2B05734D3A-- From bo.li.liu@oracle.com Thu Mar 31 14:49:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 488627CA0 for ; Thu, 31 Mar 2016 14:49:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1AE75304032 for ; Thu, 31 Mar 2016 12:48:56 -0700 (PDT) X-ASG-Debug-ID: 1459453734-04cb6c2464181920001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id IEsfELjAbzYx7tD5 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 31 Mar 2016 12:48:54 -0700 (PDT) X-Barracuda-Envelope-From: bo.li.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u2VJmRXm017241 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 31 Mar 2016 19:48:27 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u2VJmQEd024264 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 31 Mar 2016 19:48:27 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u2VJmQPK002697; Thu, 31 Mar 2016 19:48:26 GMT Received: from localhost.localdomain (/10.211.47.181) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 31 Mar 2016 12:48:26 -0700 Date: Thu, 31 Mar 2016 12:52:12 -0700 From: Liu Bo To: "Austin S. Hemmelgarn" Cc: "Darrick J. Wong" , Christoph Hellwig , xfs@oss.sgi.com, linux-fsdevel , linux-btrfs , linux-api@vger.kernel.org Subject: Re: fallocate mode flag for "unshare blocks"? Message-ID: <20160331195212.GB1415@localhost.localdomain> X-ASG-Orig-Subj: Re: fallocate mode flag for "unshare blocks"? Reply-To: bo.li.liu@oracle.com References: <20160302155007.GB7125@infradead.org> <20160330182755.GC2236@birch.djwong.org> <20160331003242.GA5813@localhost.localdomain> <56FD079F.3060606@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56FD079F.3060606@gmail.com> User-Agent: Mutt/1.5.23 (2015-06-09) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1459453734 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28341 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Thu, Mar 31, 2016 at 07:18:55AM -0400, Austin S. Hemmelgarn wrote: > On 2016-03-30 20:32, Liu Bo wrote: > >On Wed, Mar 30, 2016 at 11:27:55AM -0700, Darrick J. Wong wrote: > >>Hi all, > >> > >>Christoph and I have been working on adding reflink and CoW support to > >>XFS recently. Since the purpose of (mode 0) fallocate is to make sure > >>that future file writes cannot ENOSPC, I extended the XFS fallocate > >>handler to unshare any shared blocks via the copy on write mechanism I > >>built for it. However, Christoph shared the following concerns with > >>me about that interpretation: > >> > >>>I know that I suggested unsharing blocks on fallocate, but it turns out > >>>this is causing problems. Applications expect falloc to be a fast > >>>metadata operation, and copying a potentially large number of blocks > >>>is against that expextation. This is especially bad for the NFS > >>>server, which should not be blocked for a long time in a synchronous > >>>operation. > >>> > >>>I think we'll have to remove the unshare and just fail the fallocate > >>>for a reflinked region for now. I still think it makes sense to expose > >>>an unshare operation, and we probably should make that another > >>>fallocate mode. > > > >I'm expecting fallocate to be fast, too. > > > >Well, btrfs fallocate doesn't allocate space if it's a shared one > >because it thinks the space is already allocated. So a later overwrite > >over this shared extent may hit enospc errors. > And this _really_ should get fixed, otherwise glibc will add a check for > running posix_fallocate against BTRFS and force emulation, and people _will_ > complain about performance. Even if glibc adds a check like that and emulates fallocate by writing zero to real blocks, btrfs still does cow and requests to allocate space for new writes, so it's not only performance, but also getting ENOSPC in extremely case though. Thanks, -liubo From sandeen@sandeen.net Thu Mar 31 15:25:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E45187CA1 for ; Thu, 31 Mar 2016 15:25:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9C6908F804C for ; Thu, 31 Mar 2016 13:25:40 -0700 (PDT) X-ASG-Debug-ID: 1459455933-04bdf01105140dc0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id XqbAAHqghFMU3HFa for ; Thu, 31 Mar 2016 13:25:33 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 445FE56B for ; Thu, 31 Mar 2016 15:25:33 -0500 (CDT) Subject: Re: [PATCH 01/19] xfsprogs: use common code for multi-disk detection To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 01/19] xfsprogs: use common code for multi-disk detection References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-2-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: <56FD87BC.5070805@sandeen.net> Date: Thu, 31 Mar 2016 15:25:32 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.1 MIME-Version: 1.0 In-Reply-To: <1458818136-56043-2-git-send-email-jtulak@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1459455933 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28342 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > From: Dave Chinner > > CHANGELOG: > o Remove nonexistent headers from LIBHFILES in include/Makefile > o Remove a useless assignment which was immediately overwritten > on the next line. > o Rename include/xfs_mkfs.h global header to include/xfs_multidisk.h, > because we need it just for multidisk configuration > o Fix AG count for size thresholds to keep consistency > > Both xfs_repair and mkfs.xfs need to agree on what is a "multidisk: > configuration - mkfs for determining the AG count of the filesystem, > repair for determining how to automatically parallelise it's > execution. This requires a bunch of common defines that both mkfs > and reapir need to share. > > In fact, most of the defines in xfs_mkfs.h could be shared with > other programs (i.e. all the defaults mkfs uses) and so it is > simplest to move xfs_mkfs.h to the shared include directory and add > the new defines to it directly. Minor comment stuff below, otherwise seems ok. Reviewed-by: Eric Sandeen and feel free to add that if you make the suggested changes, too. > diff --git a/include/xfs_multidisk.h b/include/xfs_multidisk.h > new file mode 100644 > index 0000000..4006a01 > --- /dev/null > +++ b/include/xfs_multidisk.h > +/* > + * These values define what we consider a "multi-disk" filesystem. That is, a > + * filesystem that is likely to be made up of multiple devices, and hence have > + * some level of parallelism avoid to it at the IO level. "avoid to it?" Maybe "available to it?" ... > @@ -664,43 +664,45 @@ calc_default_ag_geometry( > } > > /* > - * For the remainder we choose an AG size based on the > - * number of data blocks available, trying to keep the > - * number of AGs relatively small (especially compared > - * to the original algorithm). AG count is calculated > - * based on the preferred AG size, not vice-versa - the > - * count can be increased by growfs, so prefer to use > - * smaller counts at mkfs time. > - * > - * For a single underlying storage device between 128MB > - * and 4TB in size, just use 4 AGs, otherwise scale up > - * smoothly between min/max AG sizes. > + * For a single underlying storage device between 128MB and 4TB in size > + * just use 4 AGs and scale up smoothly between min/max AG sizes. I guess a comment about the *first* >= 4T case might make this more clear; it's a little odd to document only 1 of the 2 cases below. Maybe: + * For a single underlying storage device over 4TB in size + * use the maximum AG size. Between 128MB and 4TB, just use + * 4 AGs and scale up smoothly between min/max AG sizes. > */ > - > - if (!multidisk && dblocks >= MEGABYTES(128, blocklog)) { > + if (!multidisk) { > if (dblocks >= TERABYTES(4, blocklog)) { > blocks = XFS_AG_MAX_BLOCKS(blocklog); > goto done; > + } else if (dblocks >= MEGABYTES(128, blocklog)) { > + shift = XFS_NOMULTIDISK_AGLOG; > + goto calc_blocks; > } > - shift = 2; > - } else if (dblocks > GIGABYTES(512, blocklog)) > - shift = 5; > - else if (dblocks > GIGABYTES(8, blocklog)) > - shift = 4; > - else if (dblocks >= MEGABYTES(128, blocklog)) > - shift = 3; > - else if (dblocks >= MEGABYTES(64, blocklog)) > - shift = 2; > - else if (dblocks >= MEGABYTES(32, blocklog)) > - shift = 1; > - else > - shift = 0; > + } > + > + /* > + * For the multidisk configs we choose an AG count based on the number > + * of data blocks available, trying to keep the number of AGs higher > + * than the single disk configurations. This makes the assumption that > + * larger filesystems have more parallelism available to them. > + */ > + shift = XFS_MULTIDISK_AGLOG; > + if (dblocks <= GIGABYTES(512, blocklog)) > + shift--; > + if (dblocks <= GIGABYTES(8, blocklog)) > + shift--; > + if (dblocks < MEGABYTES(128, blocklog)) > + shift--; > + if (dblocks < MEGABYTES(64, blocklog)) > + shift--; > + if (dblocks < MEGABYTES(32, blocklog)) > + shift--; > + > /* > * If dblocks is not evenly divisible by the number of > * desired AGs, round "blocks" up so we don't lose the > * last bit of the filesystem. The same principle applies > * to the AG count, so we don't lose the last AG! > */ > +calc_blocks: > + ASSERT(shift >= 0 && shift <= XFS_MULTIDISK_AGLOG); > blocks = dblocks >> shift; > if (dblocks & xfs_mask32lo(shift)) { > if (blocks < XFS_AG_MAX_BLOCKS(blocklog)) > diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c > index 5d5f3aa..9d91f2d 100644 > --- a/repair/xfs_repair.c > +++ b/repair/xfs_repair.c > @@ -19,6 +19,7 @@ > #include "libxfs.h" > #include "libxlog.h" > #include > +#include "xfs_multidisk.h" > #include "avl.h" > #include "avl64.h" > #include "globals.h" > @@ -589,6 +590,33 @@ format_log_max_lsn( > XLOG_FMT, new_cycle, true); > } > > +/* > + * mkfs increases the AG count for "multidisk" configurations, we want > + * to target these for an increase in thread count. Hence check the superlock > + * geometry information to determine if mkfs considered this a multidisk > + * configuration. > + */ > +static bool > +is_multidisk_filesystem( > + struct xfs_mount *mp) > +{ > + struct xfs_sb *sbp = &mp->m_sb; > + > + /* High agcount filesystems are always considered "multidisk" */ > + if (sbp->sb_agcount >= XFS_MULTIDISK_AGCOUNT) > + return true; > + > + /* > + * If it doesn't have a sunit/swidth, mkfs didn't consider it a > + * multi-disk array, so we don't either. > + */ > + if (!sbp->sb_unit) > + return false; > + > + ASSERT(sbp->sb_width); > + return true; > +} > + > int > main(int argc, char **argv) > { > @@ -729,9 +757,21 @@ main(int argc, char **argv) > * threads/CPU as this is enough threads to saturate a CPU on fast > * devices, yet few enough that it will saturate but won't overload slow > * devices. > + * > + * Multidisk filesystems can handle more IO parallelism so we should try > + * to process multiple AGs at a time in such a configuration to try to > + * saturate the underlying storage and speed the repair process. Only do > + * this if prefetching is enabled. > */ > - if (!ag_stride && glob_agcount >= 16 && do_prefetch) > - ag_stride = 15; > + if (!ag_stride && do_prefetch && is_multidisk_filesystem(mp)) { > + /* > + * For small agcount multidisk systems, just double the > + * parallelism. For larger AG count filesystems (32 and above) > + * use more parallelism, and linearly increase the parallelism > + * with the number of AGs. > + */ > + ag_stride = min(glob_agcount, XFS_MULTIDISK_AGCOUNT / 2) - 1; > + } > > if (ag_stride) { > int max_threads = platform_nproc() * 8; > From noreply@mail.co.za Thu Mar 31 15:29:45 2016 Return-Path: X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 934157CA1 for ; Thu, 31 Mar 2016 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 5A70E8F8052 for ; Thu, 31 Mar 2016 13:29:45 -0700 (PDT) X-ASG-Debug-ID: 1459456177-04cb6c2460182ba0001-NocioJ Received: from gogw0429.mail.goo.jp (gogw0429.mail.goo.jp [153.153.65.30]) by cuda.sgi.com with ESMTP id 0VR3tDnnajiSUaSs for ; Thu, 31 Mar 2016 13:29:37 -0700 (PDT) X-Barracuda-Envelope-From: noreply@mail.co.za X-Barracuda-Apparent-Source-IP: 153.153.65.30 Received: from ntt.pod01.gv-mta-ucb001 (gv-mta-ucb001.mail.goo.jp [180.8.112.200]) by gogw0429.mail.goo.jp (Postfix) with ESMTP id 6D9E4E00254; Fri, 1 Apr 2016 05:29:31 +0900 (JST) Received: from gzcstore012.mail.goo.jp ([180.8.112.235]) by ntt.pod01.gv-mta-ucb001 with id ckVW1s00554mytg01kVWRQ; Thu, 31 Mar 2016 20:29:31 +0000 Date: Fri, 1 Apr 2016 05:29:30 +0900 (JST) From: Quick Loans Reply-To: quickloans@safrica.com Message-ID: <1020374313.36035333.1459456170738.JavaMail.root@goo.jp> In-Reply-To: <1280623188.35849840.1459452353288.JavaMail.root@goo.jp> Subject: Get 5% Interest For All Types Of Loan MIME-Version: 1.0 X-ASG-Orig-Subj: Get 5% Interest For All Types Of Loan Content-Type: multipart/mixed; boundary="----=_Part_36035331_1106900500.1459456170715" X-Originating-IP: [23.27.249.165] X-Barracuda-Connect: gogw0429.mail.goo.jp[153.153.65.30] X-Barracuda-Start-Time: 1459456177 X-Barracuda-URL: https://192.48.176.15:443/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 To: undisclosed-recipients:; ------=_Part_36035331_1106900500.1459456170715 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit Quick Loans (Pty) Ltd 103 Katherine Quays 96 Katherine Street Strathavon, Sandton 2196 Johannesburg Dear Valued Customer, Whether you want to give your lifestyle a boost or have an unexpected expense to deal with, a Loan from Quick Loans is the cost-effective way of making it happen. We are flexible: you can borrow from R10 000 to R30,000 000, and affordable repayment periods range from 12 to 240 months for all types of loan at only 5% interest rate per year. Regards, Helen Frans (Mrs.) Loan Application Controller Quick Loans Pty Ltd ------=_Part_36035331_1106900500.1459456170715 Content-Type: application/pdf; name="See What We Offer At Quick Loans PTY Ltd.pdf" Content-Disposition: attachment; filename="See What We Offer At Quick Loans PTY Ltd.pdf" Content-Transfer-Encoding: base64 JVBERi0xLjUNJeLjz9MNCjcgMCBvYmoNPDwvTGluZWFyaXplZCAxL0wgNjM0Njk1L08gOS9FIDYz MDgyNy9OIDEvVCA2MzQ0MDQvSCBbIDU2NCAxODhdPj4NZW5kb2JqDSAgICAgICAgICAgICAgICAg DQozMyAwIG9iag08PC9EZWNvZGVQYXJtczw8L0NvbHVtbnMgNS9QcmVkaWN0b3IgMTI+Pi9GaWx0 ZXIvRmxhdGVEZWNvZGUvSURbPDVCNUE5NkQzNkZFQ0Y0NDE4QjY2ODdGODgwQzg0Qjg5Pjw5MzIy M0RCQjRFQTY3NjRDQTg0QjEzRDQ1ODY3Rjg1RT5dL0luZGV4WzcgNjRdL0luZm8gNiAwIFIvTGVu Z3RoIDEyOC9QcmV2IDYzNDQwNS9Sb290IDggMCBSL1NpemUgNzEvVHlwZS9YUmVmL1dbMSAzIDFd Pj5zdHJlYW0NCmjeYmJkYBBgYGJgYHoAIhk9wOQyEMn+A0SysoNINk8QyZIJFmkDs5eDxe+BSA6w SvYWIMmYpg0i8+XB5lSCyLLjIJHqPhA5uwFIMvUHgciPXiBZlSyQuMl0sHpjEMmsDCL564Hk9+oQ BiagC6eBRIDyw4r8z8CkdRcgwAAePxW4DQplbmRzdHJlYW0NZW5kb2JqDXN0YXJ0eHJlZg0KMA0K JSVFT0YNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KNzAgMCBv YmoNPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0kgMTE2L0xlbmd0aCAxMDcvUyAzOD4+c3RyZWFtDQpo 3mJgYJBgYGCqYWBg4JzzmQEVMAIxCwNHA7KYBBQzMBozCDJYNhY6VDU4Jkhu4PVhe8GymjmpMSRn Ptu9A0yGl4I+bZvle6z/D+uRtM9qDgwM7AekZkjegJjCzMC5ZiHUhhMAAQYA+zQaKg0KZW5kc3Ry ZWFtDWVuZG9iag04IDAgb2JqDTw8L0xhbmcoZW4tVVMpL01ldGFkYXRhIDEgMCBSL1BhZ2VzIDUg MCBSL1R5cGUvQ2F0YWxvZz4+DWVuZG9iag05IDAgb2JqDTw8L0NvbnRlbnRzWzExIDAgUiAxMiAw IFIgMTMgMCBSIDE0IDAgUiAxNSAwIFIgMTYgMCBSIDE3IDAgUiAxOCAwIFJdL0Nyb3BCb3hbMCAw IDYxMiA3OTJdL0dyb3VwPDwvQ1MvRGV2aWNlUkdCL1MvVHJhbnNwYXJlbmN5L1R5cGUvR3JvdXA+ Pi9NZWRpYUJveFswIDAgNjEyIDc5Ml0vUGFyZW50IDUgMCBSL1Jlc291cmNlczw8L0ZvbnQ8PC9G MSAzNiAwIFIvRjEwIDQyIDAgUi9GMiA0NSAwIFIvRjMgNDggMCBSL0Y0IDUxIDAgUi9GNSA1NCAw IFIvRjYgNTcgMCBSL0Y3IDYwIDAgUi9GOCA2MyAwIFIvRjkgNjkgMCBSPj4vUHJvY1NldFsvUERG L1RleHQvSW1hZ2VCL0ltYWdlQy9JbWFnZUldL1hPYmplY3Q8PC9JbWFnZTMyIDMxIDAgUi9JbWFn ZTQgMzIgMCBSPj4+Pi9Sb3RhdGUgMC9UYWJzL1MvVHlwZS9QYWdlPj4NZW5kb2JqDTEwIDAgb2Jq DTw8L0ZpbHRlci9GbGF0ZURlY29kZS9GaXJzdCAyNzkvTGVuZ3RoIDE2ODYvTiAzNi9UeXBlL09i alN0bT4+c3RyZWFtDQpo3sSYa2/bNhSG/wqBfVmxBiJ5eAWKALk0bYB2A5psGSDog1trjoDEDmx3 aP793kPJtuzIgux2KAxaong7JB++PCQZIQVZoVUQ5PCmBHlhJT4GYa0WFIX3UhgpolbCKKGkw1Pz MwpDQqmAuBGKghHGCuUsCeOE8hFxL7RUXpggtA74HoU2XLMU2qEeNKej1IIbkhYNkyDtrbAGpnh8 tzBH4wnTIipFFiM98gWYQCgPEwwqc7DQKxJsWnB4oohCvXi1pJRwBlUG5EPVlvCdq+JyqMqjHQeT osIz4qmlePMmO1t8KadLgVzZ2b+Tu2q8vIeZKrsYPb0vq8l9nXRZ1tlONCJXD6PJAh3IrmbT5fn5 7Ft+YiWlNKE0hhAlipR4VT2UGMKIwf+UPvw+eiyzs/OLy7dvf7sYPVSf51X6flc3ZaTMrpf4/uVs Onkohcw+jr7VNilvKLtZlo9/wbzs9vmpTAXZsHn1tJzNs78be2HG6WmutUOrXT82k6TDUyNmpR8U 5IE/a6jA8J6PFiXbudvpt9Mvs3E1nWR31fRsuqjW8atqvlhe3I/mqwHe9FCQSQP5YdTkCDpLA3ql spuvn5c8Jrfzr2UanPUIZWn8Fkw/Cp+ewqg/5uNyjsZ+vR5jUqvl86vsUzmpFsv5869n49nn8hXq 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 EAeFeFeId4R4W4i3hHhTiDeE+IsQrwvxmhB/FuJPQrwqxB+FeEWIl4V4SYgXhXhBiANCPC/Ec0I8 K8QzQjwtxFNCPCnEE0LsF+JxIR4T4lEhHhHiYSEeEuJBIfYJ8YAQ9wuxV4guIfYIsVuI+4TYJcRO IUJCdAoRFOJeIe4R4m4hdgixXYi7hLhTiDuE2CbE7ULcJsStQvxBiFuEuFmIm4S4UYgbhLheiK1C XCfEtUJcI8TVQlwlxJVCXCHE5UJcJsSlQlwixMVCXCTEhUJsEeICITYL0SHEJiHOF2KjEBuEWC+E CHu4CHu4CHu4CHu4CHu4CHu4CHu4CHu4CHu4CHu4CHu4CHu4CHu4CHu4CHu4CHu4CHu4CHv4YiFE /MNF/MNF/MNF/MNF/MNF/MNF/MNF/MNF/MNF/MNF/MNF/MNF/MNF/MNF/MNF/MNF/MNF/MNF/MNF /MNF/MNF/MNF/MNF/MNF/MNF/MNF/MNF/MNF/MNF/MNF/MNF/MNF2MNF2MNF2MNFtMNFtMNFtMNF tMNFtMNFtMNFtMNFtMNFtMMrdioCUXMobZgLMXMozQ46l6xzQmlDQGvJOptoTSjNBFpN1iqis4hW Ep0ZSh0OWhFKrQAtJ1pGtJTylpDVTrSYnGeEUstBi4hOJ1pIRRYQzSc6LZRSBTqVaB7RXKI5RLND KZWgNrJaiVqIZhE1EzURzSSaQfWmkzWNaCrRFKJGogaiyUSTiAJEE4nqiSYQ1RGNJxpHNJZoDNFo olqiUSHnSNBIohEh5yhQDVF1yFkLqgo5R4MqiSqIyilvONXzE5VRvWFEpxCVUsmhREOoeglRMdFg okFERdRYIVEBtZJPNJBoADWWR5RL9XKI+hNlE/Uj6kuURZRJTfuIMqjNdCIvUR9q2kPkpnouojSi VKIUIidRcih5LMhBlBRKHgdKJEogp50onpxxRLFENsqzElnIGUNkJjJRnpHIQKSnPB2RlkgTcowH qUOOOpCKSCanRBYnYhHiYaLuSBF+jKwfiX4gOkp535P1HdG3RN8QfR1Kmgj6KpRUD/qSrC+IPif6 jPI+JesToiNEhynvY6KPyPkh0QdE/yD6OxX5G1nvk/UeWX8lOkR0kPLeJXqHnG8TvUX0JtEbVOQv ZL1O9FoocTLoz6HESaA/Eb1Kzj8SvUL0MtFLVORFohfIeYDoeaLniJ6lIs8QPU3Op4ieJHqCaD/R 41TyMbIeJXqE6GHKe4joQXLuI3qA6H6ivURdVHIPWbuJ7iPaRbQzlFAGCoUSpoI6iYJE9xLdQ3Q3 0Q6i7UR3hRJwX/M7qZU7iLZR3u1EtxHdSvQHoluIbia6iehGauwGauV6oq2Udx3RtUTXEF1NFa4i 60qiK4gup7zLqJVLiS6hvIuJLiK6kGgL0QVUcjNZHUSbiM4n2ki0IWRvBq0P2WeBziNaF7LPBp1L dE7IHgCtDdlxGfOzQ/ZBoDVEq6n6Kqp3FtHKkL0VdCZVX0G0nGgZ0VKiJUTt1PRiqn4G0aKQvQV0 OjW2kEouIJpPdBrRqUTzqN5cojnUs9lUvY2olUq2EM0iaiZqIppJNIMGPZ16No1oKg16CjXdSA9q IJpM3Z1EDwpQKxOJ6okmENWF4v2g8aF45QnjQvHK9h4bil8HGhOKzwGNpiK1RKNC8YgL+EiyRhDV kLM6FL8GVBWK3wiqDMWfDaoIxa8FlYdiq0HDifxEZUTDQrF4v/NTyCoN2RpBQ4mGhGzK1ighKg7Z akCDQ7YG0KCQbQqoiPIKiQpCtv6gfCo5MGRTBjYgZFPOZh5RLlXPoSf0J8qmxvoR9aXGsogyiXxE GSGbMkvpRF5qsw+16aHG3NSKiyiN6qUSpRA5iZKJHCHrdFBSyDoDlBiyzgQlENmJ4oniiGKpgo0q WMlpIYohMhOZqKSRShrIqSfSEWmJNFRSTSVV5JSJJCJOxPxhyyyXgm5Li+uYpdX1I/QPwFHge/i+ g+9b4Bvga+Ar+L8EvkDe57A/Az4FPgGOwH8Y+Bh5H8H+EPgA+Afw95g5rr/FzHW9D7wH/BU4BN9B 8LvAO8DbsN8Cvwm8AfwFeN18mus180DXn8F/Ms93vWr2uf4IvAL9sjnb9RLwIvAC8g/A97x5ges5 6Gehn4F+2nyq6ynzPNeT5rmuJ8xzXPtR93G09xjwKOAPP4Lvh4GHgAdNZ7j2mRa7HjC1u+43LXHt BbqAPfDvBu5D3i7k7YQvBHQCQeBe45mue4wrXXcbV7l2GFe7thvXuO4C7gTuALYBtwO3GXNct4L/ ANyCOjeDbzKe5roR+gbo64Gt0NehrWvR1jVo62r4rgKuBK4ALgcuAy5FvUvQ3sWGsa6LDONcFxrm uLYYbnNdYNjmWi9nuM6Ti13reLHr3MDawDnb1wbODqwOrNm+OmBczY2rnatrV5+1evvqN1f7YzWG VYGVgbO2rwycGVgeWLF9eeB+aQObLa33lwaWbV8aUC2NX7pkqfzVUr59Ka9cygcs5RJbal3qXiqb lgQWB9q3Lw6wxeMXr10cXKwaGlx8cLHEFnNDV/iRnYudadVg/6rFZmv1GYHTA4u2nx5YOHtB4FR0 cF7xnMDc7XMCs4tbA23bWwMtxbMCzcVNgZnF0wMztk8PTCueEpi6fUqgsbghMBnlJxVPDAS2TwzU F9cFJmyvC4wrHhsYC/+Y4trA6O21gVHFIwIjt48I1BRXB6oweJZiTXGnyFalA2NT0BPm5OUDnH7n QednThVzBp2POOVYS7IrWeprcfCKcQ5+uuNsx0UO2ZL0YpLkT+rbv9qS+GLiu4mfJqri/Il9c6tZ gjXBnSDblbEljJlYHeGySuKBRZGxjknw+qotdm6xu+xSlcvOme2g7TObbH/Y+qJVsli4xRK2SH4L iltiXDGS8hWOkf0xAwdXW8wus6R8hc1ygt8Mj9Jipmn8xGqL0WWUAmXGcUbJbyyrqPYbcwZUM5m7 OWfcCpJ1Si+43VWNc70zgas53uedE+uzs2u7dGxCbVA3fmqQnx/MqFe+/XVTgprzgywwZWpDJ+cX NnZyqWJiMF75L7YRe/2WLaw8tTaYWt8QvCm1sTa4FsKviDAES+1MYOWN2TPal7ZnZy+Zga8Z7Uuy Iz+w+FLFylacyk/7EtjKZ2nEZtm/mKgYaGY70hLhXPLLtf7TE/+tO/D7T51M+UcGw8PSeaxVWgec C5wDrAXOBtYAq4FVwFnASuBMYAWwHFgGLAWWAO3AGcAi4HRgIbAAmA+cBpwKzAPmAnOA2UAb0Aq0 ALOAZqAJmAnMAKYD04CpwBSgEWgAJgOTgAAwEagHJgB1wHhgHDAWGAOMBmqBUcBIYARQA1QDVUAl UAGUA8MBP1AGDANOAUqBocAQoAQoBgYDg4AioBAoAPKBgcAAIA/IBXKA/kA20A/oC2QBmYAPyADS AS/QB/AAbsAFpAGpQArgBJIBB5AEJAIJgB2IB+KAWMAGWAELEAOYARNgBAyAHtABWkADqAHV8DC+ ZUACOMBYK4ePdwPHgB+BH4CjwPfAd8C3wDfA18BXwJfAF8DnwGfAp8AnwBHgMPAx8BHwIfAB8A/g 78DfgPeB94C/AoeAg8C7wDvA28BbwJvAG8BfgNeB14A/A38CXgX+CLwCvAy8BLwIvAAcAJ4HngOe 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 mEiN8qhILQzJOCHj+2V8s4wPlOF0Gd4SHU6jFfRZQZtm2jTT4UAaHOjdB+W/Qv4r5L9C/ivk3yz/ Zvk3y79Z/s3ybxZHsziaxdEsjmZxNIujWRzN4mjWKxXhd/8074aiU2KXmnFXoMKcm2TGXYvr4LtF 3PH+rKs0M2aENaXTQqr0J6jEdMzATMzCT1GF2/Ez3AGzsdRsLDUbS83GUrOx1GwsNRtLzcZSs7HU bCw1F0vNxVJzsdRcLDUXS83FUnOx1FzcbwxKUGrm5Sd7aiT2jB5P6vGkHk/SLX+ffqJ31+ndpN5N 6t2k3k3q3aTYM2LPiD0j9ozYM2LPiD0j9ozYM2LPiD0j9ozYM2LPiD0j9ozYM2LPiD0j9ozYM2LP iD0j9ozYM2LPiD0j9ozYM2LPiD0j9ozY8zPrirCR2m9S+NX3Z1Y+o/boDBnVeH+b94e58S433uXG u85td26xc0t1SolMT9UpJbI9dd9vQH/l0LsceleWNbKskWWNLGtkWSPLGlnWyLJGljWyrJFljSxr ZFkjyxpZ1siyRpY1sqyRZY0sa2RZI8saWdbIskaWNbKskWWNLGtkWSPLGlnWyLJGljXR2TKp4s0q 3qyKVURH8WeVDL6nA3brgKxMbpfJoft+mTk0/8uMTB7N/5rFu1W8W8W7VbxbxbtVsqqSVZWsqmRV JasqWVXJqkpWVbKqklWVrKpkVSWrKllVyapKVlWyqpJVlayqZFUlqypZVcmqSlZVsqqSVZWsqmRV JasqWVXJqkpWVbKq0sdXjPTxJ2Xx1r7/z2mCqB8U9ZKoVL718q2Xa728DpHTId55WD718qmXT718 6uVTHxXGpvD15rA7dkt4J3a7urg39MUezv/S7tU9sdtDNhrlf3dHJzsjG7tVRdyG20NT7I6oOHan T98TumOP5P89M2FvbG7YW2p/W2p/W3o0jsGx+BDG4zhc5ZyrcQ2+jx+gApNwLa7DZPwQP8L1+DFu wI24CVNwM27BrbgNU8PekXz2iLQzVhm65LI99lDYGXOnF10Zu0G134gpXr1VlrdhRmiIzcQs/BS3 R4fE7giLY7Odd1/oiN2PB/Ag5oQX5fdiaSy8WRpHAUajEEUoxhiUoBQJlGE/jMX+OAAH4iAcjEMw DofiMByOI3Bk6KNhHw37aNhHwz4a9tGwj4Z9peeFhtLzcQE+jc/gs/gcLsTn8QX8C76ICfgSLsKX cZU8rsY1+D5+gApMwrW4DpPxQ/wI1+PHuAE34iZMwc24BbfiNkwNL0YFKmcLFddTcWvskTCglm4P g+pkOPo6F3JcyHFgDwfyFbbVipO14mSdkaVyjso5K0zWCpO1wmStMFkrTNYKk6V+jvo56ueon6N+ jvo56ueon6N+jvo56ueon6N+jvo56ueon6N+jvo56ueon6N+jvo56ueon6N+jvp7qL+H+nuov4f6 e6i/h/p7qL/HKpe1ymWtclmrXNYql7XKZa1yWatclro56uaom6Nujro56uaom6Nujro56uaom6Nu jro56uaom6Nujro56uaom6Nujro56uaom9NzN6vufC9W0nS66r492o/andTeRu2d0fU0rqVxrUrv duYqWnfSujM21fPK0ONTgyo/rfLTKj+t8tN8eI8PtXyo5cNA7JdhpQ5o0QEtOqBFB7TopTfNhr/y qIlHTTyq5VEtj2p5VMujWh7V8qiWR7U8quVRLY9qeVTLo1oe1fKolke1PKrlUS2PanlUy6NaHtXy qJZHtTyq5VEtj2p5VMujWh7V8qiWR5086uRRJ486edTJo04edfKoU4ekdUhah6R1SFqHpHVIWoek dUhah6R1SFqHpHVIWoekdUhah6R1SJrHtTyu5XEtj2t5XMvjWh7X8riWx008buJxE4+beNzE4yYe N/G4icdNPG7icROPm3jcxOMmHjfxuInHTTxu4nETj5t43MTjJh43RRUcTHIwycFd/H6Nizs518a5 HZzr41wf5/o418f/BP+XcC/NvXTsbq/dy+nZYSEHuznYzcFuDnZzsJeDA+pkGRfbudjOxTQX01xM czHNxTQX01xMcjHJxSQXk1xMcjHJxSQXk1xMcjHJxSQXk1xMcjHJxSQXk1xMcjHJxSQXk1xMcjHJ xSQXk1xMcqmPS31c6uNSH5f6uNTHpT4u9XGpj0t9XOrjUh+X+rjUx6U+LvVxKc2lNJfSXEpzKc2l NJfSXEpzqZ1L7Vxq51I7l9q51M6ldi61c6mdS+1caudSO5faudTOpXYutXOpnUvtXGrnUjuX2rnU zqX26BNcynIpO9KN/+XCEBcGuDDAgSwH8vdNA9QdoO4AdQeoO0DdAepmqZulbpa6WepmqZulbpa6 WepmqZulbpa6WepmqZulbpa6WepmqZulbpa6WepmqZulbpa6WepmqTNAnQHqDFBngDoD1BmgzgB1 BqKPmgzvmgzv6v609bwkdrcs7pHFSPQeP4I51vu51u0j7eqOwtE4BsfiQxiP43CVc67GNfg+fgA7 SFoP03qY1sO0Hqb1MK2HaT1M62FaD9N6mNbDtB6m9TCth2k9TOthWg9HP6B1N627RZwWcVoXpHRB ShekdEFqRP+/dwDd/6fKt4OP5X/Z+N9Xezc/uvnRzY9ufnTzo5sf3fzo5kc3P7r50c2Pbn5086Ob H9386OZHNz+6+dHNj25+dPOjmx/d/OjmRzcF0xRMUzBNwTQF0xRMUzBNwbRuSOmGlG5I6YaUbkjp hpRuSOmGlG5I6YaUbkjphpRuSOmGlG5I6YbU/0U3pDiU4lCKQykOpTiU4lCKQykOpTiU4lCKQykO pTiU4lCKQykOpTiU4lCKQykOpTiU4lBqZI3vH/l/Ic/hVZpXadMmbdokaZ+mfV7jNI3TNE7TOE3j NI3TNE7TOE3jNI3TNE7TOE3jNI3TNE7TOE3jNI3TNE7TOE3jNI3TNE7TOE3jfI5pOablmJZjWo5p OablmJZjWo5pOablmJZjWo5pOablmJZjujRfC1NwM26BepNjWo7paH+zOPOPPaPS7h7p9KyZmv0/ 9Yi9+832qO5MdVtCtxXqtq067RCdVhJNfH+iTLEaV2K6+/LbXeuu0K+y+52d05v9VuchnzqVwlkK D31g19SvuvtVd7/q7lfd/aq7///TtOlXff2qr1/19au+ftXXr/r6VV///9NdUf5uJUeple/ftwxF 8X2v5bi0N7qMtnW0reNfL/96aZu/s2njxGj6dtG3a2T+zfb8IfcID9spzfHa3NBF1y66dtG1i65d dO2iaxdd6+haR9c6utbRtY6udXSto2sdXevoWkfXOrrW0bWOrnV0raNrHV3r6FpH1zq61tG1jq51 dK2jax1d69RUr5rqVVO9aqpXTfWqqV411aumeuneRfcuunfRvYvuXXTvonsX3bvo3kX3Lrp30b2L 7l1076J7F9276N5F9y66d9G9i+5ddO+iexfdu0rzeU7BzbgFt+I2TA1dIxrv3tcJueig2NJoXOxV O87X1OXrYWZsZaiO7bLPyITZsd2hIW5yxk9x93paWBw/KyTf/2vly6P94/8eJfb9TWF3YlNYy7EF vncRXtMBr4cNsRUq/Q2sdM1VjmvCpthad7obXK3JsRnd0ZhYj07N2ONm7YSGsScMxKPQES9CMQ53 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 J5T1Hj4HNvVe2sr95PoK/ecrup9A295L149dWoXxdbA2F7y1DvR+XZvXJUBysQTW5nWJHO3fk5sV NT6df5U1ruRdq3IsXFdyb8lKnzzjW+B/VtuzfmWta1zOsazYr+0aFyWus3KaXVsV3Z4SPDCj+ZVV 9y8r8IpV9zsr+Ji1R8Nqf7Niv8LHe3X77G98No8BWAd1DGkgvofLH9G3oys+iH3CCrHOOr3K/zAH zWr+ZoUYbZ0H3NViTwK4vXiOhfsJt9n6ALColw3tsD7W26lfXw1zumozwALY1Ei4qDoDAHO46hxA vhb/MEgOAjlBdSFgh8bH1aW6nUIsrC4HVAJqtP6q3g3Yo80TqgWtn6pd2vXVEDuq9wHatRwQ83+C m6shBlR366jU4gy27eojWr9XQw5afVKzs+rTWj/icaw+q587p5dxQePyasgRqyE/rAbuqYZ8rBry sGrIq6ohn6q+rfVv9T2dx3D7H+rbR5o9VEMuZIMcyAYxwpa6yn4ULR+wQS5kg1zItlU/rnOuDfIB 2zZ9/MBPbNBHNsgBbDtX2WpiHpCIUbBv26VdY7Nqx/DbGC9dfulv//A2xu/TWpkxz3gF/0bVMI7+ G0LJWYAcQD6gELADULpqWw6oBNQAdgP2ABwAAeACqIB9gHZAHNANOAI4DjgJOP3/mTvT8KqKbGHX 2bv2PiHAkcbIEAId04gMMgVEQBoQGXMOCBFaRAQZG5mMgIjIZRI00opEQRGZGmnEGBARkCmANJM0 MjWzSKeBBhowKEREmpzcWm/t+7U/+vtxf3zP8z08+81y1apVVatW1d61c3I0V25wrTLXOnNtNtd2 c+0x135zHTHXKXMVmOtC0ObV/8vP68HPW4F9XKkEbfUJieYqF/TtavDTjCGhgrlSzJVm9f/nZ01z 1bN9TWj87zEnNDdXa3O1N1fM+knItO0l9DRXH3MNDPRDzZVlrrHWb8IEc001V7a5ZpprtrnmmWux uZaZKy/4ufoXP//Hfr25tgQ/Fwf1tvyifIe59prroLmOmeu0uc7++6fEJeGSuQr/Fz//JxZF5rpt Y/m/+UlMfvmzq/2fzYt/5inQ094vrlK+ucr8+ydzWRD4NVep8uaqFMy30Zeq9u+fpaqbq7b6NGNv xsGMYxmnM85mXOIqzCjKuB1VUT9aJlo+WilaLVo9WjvaINok2iLaJtox2iXa3fzrFX0mOjg6PDoq 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 zaEFtITLwA6tIBtaQxvIgbZwuYygYQQNI2gYQcMIGkbQMIKGEdsgecQ2GIbAjTAUboJhMBxuhlvg VrgNRsCv4Xa4A2YQx0yYBffBbJgDc2EezIf7YQE8AAthEeTBYlgCS8EJD0I+uGCZ3C+SyJwqVPSh YlB5QZ4hl9bIH8iTUyIXF3Rc0JtkkocVJ8SKE+KJECrrirFLu1eGWGFCrDAhVpgQK0yIFSaE+jrq 66ivo76O+jrq66ivo76O+jrq66ivo76O+jrq66ivo76O+jrq66ivo76O+jrq66ivo76O+vq/zOCR 9GMUjIYxMBbGQS6Mhxm0MRNmwX0wG+bAXJgH8+F+WAAPwEJYBGiDujrq6qiro66Oujrq6qiro64u UlD3WzI8SoZrygpyeI2wo3Y1alejdkQsRONCNC4k0/08eQit/WjtV5YxUgtwYgU1V8paMr+WzK8l 82tpxYoPxfhQjA9hZT0z5gZ5ghFwghFwghFwgrFUytxQhEcePPLgUTEeFeNRMR4V41ExHhXjUSEe FeJRIR4V4lEhHhXiUSEeFeJRIR4V4lEhHhXiUSEeFeJRIR4V4lEhHhXiUSEeFeJRIR4V4lEhHhXi USEe+fHIj0d+PPLjkR+P/HjkxyM/I6SWEVLLCKllhNQyQmoZIbWMkFpGSC0jpJYRUssIqWWE1DJC ahkhtYyQWkZILR4X43ExHhfjcTEeF+NxMR4X43ExHnvw2IPHHjz24LEHjz147MFjDx578NiDxx48 9uCxB489eOzBYw8ee/DYg8cePPbgsQePPXjsEXNwUMNBDQd1/N6FizrOHce5MM5FcC6CcxGcM/xv jf+f4p6Ge5ryJNeexuln5A4cPImDJ3HwJA6exMFaHKwnT47iYgAXA7io4aKGixouario4aKGixou ario4aKGixouario4aKGixouario4aKGixouario4aKGixouario4aKGixouario4aKGixouRXAp gksRXIrgUgSXIrgUwaUILkVwKYJLEVyK4FIElyK4FMGlCC5puKThkoZLGi5puKThkoZLGi4FcCmA SwFcCuBSAJcCuBTApQAuBXApgEsBXArgUgCXArgUwKUALgVwKYBLAVwK4FIAlwK4FBB9cCmKS1Fz NK4RWbgQwYV6XKjHgSgOGN+b6lG3HnXrUbcedetRtx51o6gbRd0o6kZRN4q6UdSNom4UdaOoG0Xd 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 uzI5Td7Jf1E175HWSlJcMlEqUTpRBtFQoqwWn9nG52giB5GbaAJRAZFGVEw0laiMaBZROdE8ogVE lUTLiJYbtIpoHdFGoi1EO4h2E9UQHTDedYiojqihxWdji3+fJjpH1CxJ8TJRQovPdkQdiLoKff6M 70HUm6gv0UCizBafw4lGEuUQuYjGGfqTiKYQeYmCRNOIphPNJppLVEG0kGgJURXRCqLVROuJNhFt I9pJtIdoH9FB0a/4w0RHjc9jLT5j+ieFT/F5yKintXh+hug8/gfgUhsrEc3XNolXPtk/bToRdWvx mUKU1uKzP9HgK5/c5jbDiB4gGkVk/+c+ecyu+qQ4aTNWvB/tiel3akXjiSYbn+ONsW9BbTxEfuHv NmGiSIvPGURzpLWOM47zTslpdbZ1JjJZI85Ozm7OFGeas79zsHOY8wHnKKvfaXeOdY53TnZ6nH5n mErEOcM5x/mC80XnIudSZ7VzpXONc4NzM2i7cxf+vde531nrPAKqd55wnnKeJYtNVr/L7Ip32UBJ ri6uZFeqK92V4RrqynJlO9e4RrscLrdrgqvApbmKXVNdZa5ZrnLXPNcC5xFXpWuZa7lrlWuda6Nr i2uHa7erxnXAdYioDnUaXI2u065zruZ8OT8hv11+h/yuoB75vfP7ggbmZ4KG548E5eS78sdZI/mT jDLlMsf8lHyvUYJUprkK8qeTfKRRZufPJZqdX0FlIZUl+VX5K+j5atD6/E20JnS+5u8xSMbvMcTj 9xgS8HsMbfF7DDb8HkM7/B5DIn6PIQm/x9ABv8fQEb/E0NmWbLtLutU2wJYt9bEV2jTpPpvfFpJG 2KbaotIY2wzbTMlpm2N7Vsq3zbe9KT1s22rbJs2y7bZ9Ls3GbzOs+P+4ZSZToimI76tslu6UpJ5H DaJZ3vOkQWcMOt+CP8P/G3ciq/Fv0ktpa8gTDepkEM3qFFJOodmcQrM4ZbDQTRlm6LPsgRb/HmV8 2g0a2+Kd48W/UyZLdzqCVKY5pjtmO+ZSqXAsRFniqHKscKx2rHdscmxD2enY49jnOOg47DhK0mOO k8SdoRoLjdko5iPPxLbOFBqrm/A7HBJ+gcOMX+Cw2DJsGZJsG2EbKSm2h2y5Uhx+jaOt7XFbAY2D bvNJt9nCtielZFuZ7Wmph2227edSqm2LbYvU2/aW7S3pDlujrVFK+39s3dT8mHwP4XjFS3gD+ATw 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 H1tV4bnQ9+GnbzgfurPTx2P8/QmnUnsfz75i5Z47yim/Ppt7Hs3i0/oTRxzTh3+52rBiuPPi6A1D 3WJaiu5rWlea9ZjItpMFbzRtIWukbDD52dO+m5TBS9ZJGaWMKAsrC50ebP1dZ5U+94nfddaNUkt3 A62/IZ4fGJOCgReAW8q4ag0plXVURirDq6+VbLr/b/7ytKgwU1+rJsMTE0qwz4gRrb6YoOzp2iM6 rOPzBdu/WUU61It73X/Qq4snXF3tunLxtUZvvnIrb+4XSg/PLc1V0d0Xlm/18Ov1SoeJXfuNOJq+ 98oD9frhk96fsW6644TXvho88ezMk2PG2qzz+SjjTu++u7r5zfXw72fnp3/fq1En/09IK63b8bVp N0+lR+4jvW0Cl2RP/FYV0yXKcf9s23GXxnZ958LYYzMUqxqv3DvixorNyamF7g+bjLUpVxWMmvJw RvctWwYnvzP+na2N1yzYdtPB/wWly9mgXvunDZl0+1XXsVfOvzBik9OhoGa39MbO2Z+EXws/FtEk /2zU6ZALUz9b+vGl2ec9KjPshm+9FfBWe99Cte/PJ+eEtjCf9e0G9lkG9imxsI/LSIclfQ4Q3031 zsZ6DRqXvepJDvprfJ0OyoigDsogZUhImEQ9Ebj8C3ydfuq8zHxDWp7uj/o658I097cefi5+dKPD x+I6pxy4t8l9t3/7Pa59kg9Pvdo5+HTPoAV+O+dnXPRKmrb7YK/jk2zuXC/YP/uDDSdNal3W2FZZ l3fuul7y9sfXNj50XeMw2Lt14CddTw+QNSnckZeRF9/v7Jc/nX9nxdQPJl+YlMDCFv16YLndgGY5 PT4+faAwNXDiTl/Z9gFDR3qqqiZP6HjtpMw3MWKMwXbYwdQvpof5F3zo/EOziDoTCiuX5WrGXazo PO+V5aOdh7fp0yh9RPvln03t3dY7NSd29vnAaS5J2+7u8JiTe833Vbc7R1zKS5x/KS7M73DopXGr jo6QV9i8Pj14151FQ6dFTxtUskjzupd/3FHt0piLIy9Pajl3lIVviqkfWsTnWYxj93/D23GR17F+ WdSnkgtDahGl9nLvLq+8HbKp1/R5e5f+sDkqOubQp8rGNQXcmcyxmT1JIQX4Cokh0Y97Qk+5Uc8g qEWJ9YIOTkjaU2/uyjRb6lyqi51zPb/fvi51bNpVvdU3pcTzasT8XasHOJwv3RnV5Pj9zes/3PVG 3+ZNtHbq/1pdNvMiJbe3OVtya5R2uF1u+dzLv4+9y+zg67qXBbGu8yddOnPubt+Bh/u1zta8ObnO 6Gr7ztPJR8wuSijuL7tnPWuzdPE8xY4bW7YIhfR8mXMo1WuWhtqchC5+6+PCqRUeu8+vbbby35AU cc/g5UtL2cedn25ZNv4UVuxJaUhmY5n2aRaTs361W8eu/0w3U3963bvFXDJ5M2sez5m5dzQSazw+ is8RVLRgkmlfw3Z0mtGOpw7Hgm33ruy89yLNvPeL0rQ5ZzaUhwRaXSty2aT8DVhArQIWUJNgzSPW RQbg5hHHwDWPMAoCUBllYWBuZAosmgwNTUFllDGEawjiGjRupkfzSN1AFcKVy3POLACdPuIS7Krg GuxnZWHqYqxrbGDqrGvq5OxmqGqgDPGTDKqfdINBnlIITi0CnVZCsHj7wKK7adoBqcZ01Y1qSZuF vc8Z7DogZPGnMdWE/YjZJpWMb+wsB9inf9n+sVouScftpveSQJPtl3PeRllvaV7obivIoWea7frs kE0PUxrTSonM115v1XXe2ZRHL7lSMNM7vEXgwnrdH52yz15pbnl+fh5b0vKikEPWx87b73i4IUIg 5+nS64cPlZrv/dL6sPGFxg3pj5/WfWxafO0686L5oi2/bX+tfrjN6MQCppTPz/5LqRVyBHeJMn1q Vi/zbCpc/n6tUcWx6zli/kqp05N83fT/K69vfbOsYC/z6Vs3jFiPak9w2Dbvqk5bzvbTwka1vcfq 1onrG/1J2y27wTX0x9pfuunN6ZqTWy5FLVRGbk4hCoQX0799f9/z8Vnm48gMv+8zuqruztZDaSlh LTEoaSmVFBckJ1KlpQQzqQR7YY3S/mM7gK204rUvj59os2+p6ZLbrKwt8mGf3s9cdpyjV3/zWfvC q2015fJ3X4tv2lvz+OfMT1yuHmtFdmfqfLJLTwr59K5eXXCS5ZtzN9v9Or4nuCtXq4s6cMzfz2vI 0nTDdBvPHIbL3asqEo9u7XCca2d2J2KJ+myrW3vZYkWWbeL3Odhn0/0paeaPtLdXP8tobDC6fcqQ c89vpQw3n1+Xi5Wea/YpMfwO28+2rnGB6C6Tnxp98l5JrAs7vza6v+SdyHE9wrpfLpszc+UBj5rQ Jvt4BgvnOWxn7G/o7/cv5rT9uyvuy/E35odSEhf4XrEtOBO9Qbjx4JXFhlJ7U65Nu1RlrxXtFsxp c5b5p30kw5nO4ETDJpbZwBJrOhMjo0Fj+wB22VA6koihrgWNx0C1EzTaOJkNeZDH0YD2InjchnwG yLKiwFIDrpHFEJjU5+X98Or+/pxjzTd2p/SwjGfTHn5xNEhD0sJjGGEQtkCnQYv444UWqjWoEHEg kgJaycTSxMhQw3jaxPPoZB77T1suO5aeZbF8tC53oeuC44bi8bFTBeYqzoxoXPe4esv7DfOPHHy3 PEh/o46NZxt7bcKSpTY+109yHWi3V/k+T70oRtLJ4cSHmy9mTJec/Wt2w7mtEfNNkj8IHZx+MUx/ +vHeQ1rnDRPl185qLaxevzRxD9eLnHXTOu532qbxNUTW7eR/VqNxKPbm6xQn7i7mo4s9+jcFz63p cC25ZOMTJs2ey2PkZerw+9Gt8LJtKbsOGKVq2O2fpBzC59R2ZumWesHQhrk3f/Q8Npoq9/SmyOuT GWKd8fUP9fqDJ4vetHluGX4zJ35lmeXN189uHErnOfFDIJMzv6pcdlKmnkPjj6RNfa8XNjHJGzQx SSNiic2wiYkHKMRB9+SIXkWiVNzs0OS4INZAAjktciMGfhmBdsJlWA35QeMPhgYG5oYWRhYmZlEY SXHDrEMLTZ8wrX2acPaXKkfKEeNvDa/RyidQErmsoH1roUi73672QyJPVooWpYn+0DyWqsbid+D0 Ckk/8+mqvqIW2nyZ3QePzDi9aBLfuhQ1u9XbjwfumT9zjk7yY13zv8LXM4oea1y853tOZW2EyFyz qp/rNr9e/0z4b92pvjXClzl/TRJj/rZWpprHt3r9t51X5izdaPVTITVp8s7szVw7FrhpXfU4sPCU 3d9AVol9b73PdceYNvpsXzpv991pz/beLa448+v8O9X9slOva8+Im39CeFX3B+ua5CW31+z6mZ9X tFFGg/WBcbeFsdAGtf9vu6Tz9d/W9VkfPTThNKPu4atBcU+uNaW8qHv4RfHVP+b6rw6B5nn3WUxn GL5mT1XPevPmU3f+5MnmDAwAIKNzVQ0KZW5kc3RyZWFtDWVuZG9iag0yNSAwIG9iag08PC9GaWx0 ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDEwMTg4Mi9MZW5ndGgxIDIxMjk0ND4+c3RyZWFtDQp4nOx8 CXhb1bHwOfdq33fJ1nala8myJVuy5D1ebmTZieNAEscGKyaJHCvB2UhIAoQlG0kIOKxpoWYpUNrG Le2D61Ko6QJpC4H2Jd+jlKbQVyhbW6Dwv9BCCCSW35wryUtIKO3r177/ez72zD13zjYzZ86cGXlB GCFkBiRCCxOL2+dc9eYLuxHt7kGI2doaT3SVySw2hG6PICR5pDU+v2XvH671IHRAhxDNzEm0tune tl+F6EKYRHzBnIULFn/tvW6o3/0mopSvz1ncHV/nPPIaooafRWhT9YLF4Wjnk6PtCOEXoVOqf33f RkWluhYhvwgh6ub+y7cwS5q6n0NoFnk/f9XGi9e/4uq+HKHAFxFSdV3ct3kjMiEW1ofhSHfxuitX MY8pxhFq7EKo6IcDK/vS7zW+tBXmvwjaqweAIP+e8hJ4h/GoaGD9lq2PPaa+AuaGNdkja1duuoT+ uRr4uYaH9jfXbejva3hj7tcQWgHyFd6/vm/rRv09qqMwfhTamUv61q98QPJxHULbYD5T+8YNm7eM 34XuQei2V0n7xk0rNz7dIJ6NUOVboC8HIrqV/FpRWLnKs1zb8CFSygjf6PE/DDWS5/NWd81H7rF7 FKdkKegrRxTKFhgnvSsD6ygV0P4FxSlhpilF9CVCUS9Ac2HfSKGQDoXRKtiV51VdAoUWHaF+iMRI Jr5LHIP3e7JP/BFahTOUlhLJaLFIQlOiVxE1ziHR8vzc5y1mGMRA5X5JXaYO90nvws8wCN8nTPqq mGwvg2hxAj0hsPrTLIhrxk8KnN2BLkZnKdQRlCJP8RaUEg2glORptFS8AeBWtEag554iOxL4F69G 8882z0z5311Ez2T3+W8t9Ahq/wezMlP+BUU0NP6J8JSjXrEY9ZzZTj2QpYneRj3071GPBKFu0X8C vIx6BTo8RT+CtmMoKbz/ADX+M/mfKf+YQu9HF/4946ifoTn/aF7+LxbqIfTIv5qHmTJTZspM+f+p 0H1o27+ah5kyU2bKTPnfXuh7xj8WntVnj9kpE0oI7c+jBK1FCRGP4vRRgJez/SeeWtQqPH+Awv8c zmfKTJkpM2WmzJSZMlNmykyZKTNlpsyUmTJT/s8VKvcbRiZEkxqFkAS/K1DeP/N3j+Cdzv2mEv1X Zs2OpPFbdPX/iDvyO06SKe8qAA3SIh3SI4PANUIWANtnznLdZ7R98X/E3z+//DXN/21FhG4G7AJ9 0qBXhORIjbxoNmpB7WgBWoQWo26URpvQ/ePjQn/SzuTaO85ox+OfjJ9AaPynU79gNu94/4QlnWuf cpbCLVmZXr5s6UW9S5I93V2d583vmNc+d05boiU+m2tuamyYVV9XW1NdVRmLVkTC5WWhYGlJoNjv K2K9HsbtcjrshQU2q8VsMhr0Oq1GrVIq5DKpRCyiKYxC2MbbWnpa1/AFLSlexSZYHcOrzj9+XphH BruH1TOxcLIs14sXB3lk7OBNC3tGEFeb5CXBM7ucz9M+3Z89MPg8O9PKi3zwzc7rS/OBzh4Pqztm n2hPwhi+sKXH47HzlA++26EJvuf1MWletxDoHnuW0s6jhT0ERsdfrwUiqvUkAXf28K78azJ5NiYf B70fOoPN8/GgbkRV0JLgkWkEqV7nkZl0O16LeNTAB4LAiA5qwmwozGPTn3ls5LH5PGB5+hJk2Ku1 Z9FBa3oN25peDRpNpyZ1ejyrUQ8zyAx29uhjUBWY7uCfXdQzolS0sC0rFUBAAgGNKJRAURICTLFx BKuasFChVK31IxSSqUF9BsJuK4E1PLc/BRU2AXqDFuNky+j4oRunNiEYlq8Zs7UsE7ykhZdmmWBW 81wfj/YzI6FDgzeO6tCKVFCVZtN9F/XwdB90GEG0r3Wgi3d0LFwCJFgKIDXAkO1OCIhsHtM6wAzC O+mbAswmyKZPo6cHVqaImeAUm4A2eUvPPs8hO2+AZyuvD/Jq6Ka+6k07PdhqW82Q18HBfQx/P7A7 pdVDMBiBDVgfbGVhNZisdU2cbEl4YtsEa2xPC5vD7e9j+J0r1mRtr+/GvP17BnW86oQHdgf2B0YK A3OqTKfWEJbX9BExW9cwg/tXCqLeKIgG9sq0rkkQIAPB+lE3jF7S0zrAtk4uCIJDhfadOdbj4QuC ZODgYCthsS8N3GdZhoZJ/smZsAcx8NPCc13CA3UJewArcn2JZI6U67CEDCMtqUQy6cnuO3Tlpb59 4nKWGSQzSn28KajzPAVth8pCHZ09rQm7ID1PtfQ0vmezvwf1joUTZGyDPoPh9+xZHXUsZjsWZa1g II9SXdkDTE3sPHTN9RdmPWqzH83WL+ppY9tSg4NtLNM2mBrsGx3fuYJldOzgiEo1uLE1xQjHHwP9 +/vtfNuNSV6XGsD1wg6R6Rhie22dHbxxUS/ZqjZmoC/rOJpZT63do5/os/BczbkzB9YPZ4CcuUHd u8CbCryTnWkjrmYUPISd19WSIwsMdffAmegX7FdAcFYWw+R2cmropK919eKcssAyc8ZDfOCiHBUm 8XjIedo/yqEV8MLvXNSTfWfQCvt3EBcOwj6mSMuhfIu5m7TszLdMDE+xsG+2jsV/xb6n2vagnjUw dWFB/4LrTfOHukDGk7W8rDa39caWHtpO5WqUnSY1RRBcWQNvDQoDiU7AYw7qWOY5ltcFeXFLzyF7 Q5LR6cHVYegzN0hOEHjU59ifYeJHkUnH4wYeWwgdgV8V3DttrYXGCUNiWgdTOUubKlbuMkgPnF02 6KNjQTx7tr/ewBIJjwjuLee1fW3kXNk92R7zkryG+GZe866AgF97Sw8DnghO7iKhwrQyA2SzeSaV EFxC0j6VPDr+aipBXCCwTLrYcyYOOKva6bZWFvq8hr4TDH3XjcmBepiFKwUJmCpYVjgtXT05LdXa cyeKrNVORJnePqHFfB/YfDh4Hj5S+DMbGGqh7b3k2VTe0TXtbcpiQlvthGfo6uHbgvnJs+9zgvap r3PPaG7PN4P72Ga/ilwjFIqPsPj6RSMcvn7xkp7HdQgx13f1fIfCVEsqnhwpgraexxkIggQqRaiE SF4Y8oI6MMz2HUom9Lc/ziG0U2gVCQThvX8UI4Emy9Mw6h+lsjRdnkYBTZSlcQItG1W02gZABT0s bHqa5xb2XJMcGEwlibKRJWuAYNlsE+IptmkEUxIVr2BXxnklGyf0ZkJvztIlhC5l42D+cDgYctQH Uywcf3DAPciOk8SEiblQPmZ0fBw86FHwvB5e4rsIABysPJhkwIrnQb85BFJAnsPv7O8jfBAzpYkv b+9P8rKJCaFLOy+HGeS5GaBHmzCG3AIwqB+MtY8VqkCGw7EzySeDZNGe1WQChoF4aC5bz0v82TnF frJQODloYKPCdSLx8QrfPvKQA2/EEQoUO7zCYsmskqQq4Lyfhab+FAPaFqH+xWCMIj/5VtizlJVw q4v8KwVQ2HONKHuClGoFLy8nd5VUqCvLYUL4liaTWeaFt325DrC2jlcCR/4pqswNAO1AUzvhBb73 Aauk64/JNItGUSe7Fc4gYVqYSQrNvNrX3gcOJzteCRS2Nj8Y5pIJJDLHU1mqlEiuEgLartHxYfZK z5RSFmLhdu4hhonsEENyKDl4JoHvBccpO5OqFsiDgzL12Qdk9SVTTzwJkWldDbaKGLhTQI0Sf3vf /lpDZdnjiMGu78pteB4zip35iiNfseYrlnzFkK/o8xVtvqLOVxT5ijxfkeUrknxFnK+IuLeF2ikB fyLgdwT8poDfEPBrAn5FwC8K+JcCPirgIwL+mYCfFfBhAT8l4J8I+JCAfyTgEQE/LOAbBbxfwIMC vkHA1wl4r4D3CHi3gK8V8C4B7xTwDgFvF/A2AS8S8EIBtwt4LsHh2WHsR80ACwCWA2wA2AFwC8B9 AA8DPAnwHwBK5MZFKAzQDLAAYDnABoAdALcA3AfwMMCTAErYSJbbin/3qsXqeOFXgK6+xmK/+pqC XzwP9cuvALR+I6B1GwCtvcRiX3vJjk2FWy4zmR0XrwG0ajWglQMm+8qBvZcWFmy2XNVS4LkSQPqM 9Rnqj2/h4JZHsPUJXHws9cTGJ3Y+IbrzLirI3YWXfwHfdoAKQgzA6f5kd9bJ+239z/TTTL9aW0eI oTluX53uwZXb6+4dYt22L/lL6740hINzh/Adt1NB3e3NXN1Lt2Mlb+f38PRsNZZiMZhzEEtyT1Hu KebaB1FwP8ANAIN7JcFdO3Bw23ZxcPser/v6vTi4D2DPXnFwN4C9xmyrNpurzIZKszZmVkXN8gqz JGKmw2ZUbh7FDLezpcnjL9YEirXaUhw4OR48+bH2xEeaDz7URE5ETlLHT+LSoCYU1HpZTRGrdbk1 jFur1elVcoVSJZHKVLRIrEKYUknotFup7dBSSjQLJehV8i30Pvm30EH5f2rlSqSkldpZaJY8SffK L6e3aO9Gd8vv1D4u/w3SPI492MsZtHbsVNukhWqzzqo2iExq92wN9pCPBADrAMIAzQD3ATyJPZxf EmoobQg0+BuKGrwNTIOrwd5gazA3GBq0DfIGSQPdgBoWxrowb+hAHV1x3ojhuTjOx4IdozTTyUeD Hbx8YW/PCMY3J4HKU9fDtdjFi66Hm7ALEq4lvT2juIA07wWvgjHiO1J7b0oGg04+TcKwnc4kHyWV W51JCJiji3g7Gw+eWTZvyT0um0blP2jlT7au7uNPQsZ2AtKhk60p/gSb2JxtLW3lQ619fACIfjYx bUJ8xvwIFsiuQR6bN8NSm0mNt/HNIO+Z/IzIieALO+Mk0+jg05An2Bf2pvhCNg5BP7xVL+yF+DG+ efPmEQRRyghFkARQb2/PbCd2oTR2AjgArAAWAAOAHkALoAZQAMgBZAASADGAiDsvfSr9Sfqd9Jvp N9KvpV9Jv5j+Zfpo+kj6Z+ln04fTT6V/kj6U/lF6JP1w+sb0/vRg+ob0dem96T3p3elr07vSO9M7 0tvT29KL0gvT7em56U8p+vOU5N81SjxIPvUSdyMdCgoYiaIE5z6UejVbHz8+/mWCs3WEMp3Z+vQi 2YZ0dOP4cQpGjd8PPfSf5wM4WQ6EP+bchl5BzwrkL6KdaACeQ2g/akQpdOlnTvLh51lpesFNuBqX gVf9KroBR+Cg2tCNOXoUB9BDEx23o8vQc+hedA+6DW1GA3Bq/4xeRddCywp0yUQvwl8cvhBagmQT a2hwOfoAIarzLAy8gI5ADwO0P4eWoa3ofHQHrPVb9Dq0pdA7sMYkr6EJPAh83A/PmwAeExpXwPt1 Ao1HaVgdoQfRJjRv+mKSJ5CM2gL7swv25VV0DEiXoW7UNLFCPS4F+/8G6P1N4OwOSoR+iz9Bh2CN 41gDlMdA4lfxK2gJLQEu70DH0eXA928zL2ZeHj8uagdXPiztQGQbnwB0nbgLBVAIRVAlauKcxQiV hJzKaFlIWVamDNHV4UqjxhauRKHSsigKv3zs5cMCwuGjBmtdOBzWHSVfsfDRSAWuqmyiaproqko/ 69VQUraqujoWdVFmE7xoaLPZamarsN6jJ0DVSCylRVa/XTu7iYkUFchTDTe0tPU3ObRFDSHGb5Ya bsWnxyR03+la/EeLxVdaVVwQjtWxHZ2moqjrWle5M9ZW4m9qbCvzhIoDDsklX/lK5k3RXadWiT76 5NsgE0X+0lfsFV+EXMiDhiHWb+nu4WIMgozRjcUesU7r8dgtFlYs98i1bky7D0ACgu00xnItLTXb aIVVLlccTMiRLRzUo5jeGrM1G+rCy5ctLXwvqDegugi2haP6OuBKH4vp9h06RKDCzrn/7gmT2COV SMwmq9lTBaoEU3dRpF5dDTot9nloujjT7dEYBjLdvtryQvwVrMTzLK5IcOzFyqhGl0nhgfvx8PJA R+kKaTwuCs2fI7rw1P0dzcXyeFxSXuqeX/9rivx5NboYLGG2eCXo5odZzQiftnJVGvNcOAMLqRRF y2nK4RDT4gOcQ6TXQYNeq8UaWmsywTV6wGSksJbT6RjZNhuo4TWQo/DoC0dR83tBZNM9BTLVBZsL p7xUROzZNUKfew3OZES2aZOcMWMS61k/2Bql1xli0erqmpheImG9RVRVpaEoFrWIZl9vG+i694Ev 3tJ+UY3phkseW/Fc5uNtX8CuZ1Z+TVydeeXStZlfZI5l/pR5o2JFMvOLQtsdOPzWS3j2QxaioxRw uR48rQN15azHbDWZTQcTZloil8kPJmRou0bjcuoNuA40gIRNtTUTDMJy2jM726Z1SPpMLlrYZ7pK X1lOFVd5zHBGKCxSWQPOsb/4gmaJ2Bz0U+qSYpPsFNvgLzTCniqsJc0RenmkqcSmiMeVBUX1tTle xbuB1zb0/RyvlW2xmJk2c9oYVtGxmCtY1jSbLm0OBksPJoK0WOag3VKXy30w4WqzzJqtlMyNWbYX kZ2M6n4VfSpqqEOTRpqr6A0gJ7HWo3kZSz73IlNt/hzTJXFWIYKx+4uLyymW1Z9VSfpYtElETgR5 paRYNFpcFShmxl732uTeyjsdJSVFpk+psbTYKDOXV9d9td0eDuJxf3VbdeYFrGiYEzDLZ8fFVqPO 3bDw3WDEnNk8XdnLwlyggCi7sKi2LnOPqfLJi1s8bADHE1JHc2OGz+lfFAb9O9GunP5Z7HA6Diac NFJjNa3W6aS09ICO0+kPJnTqazUat3S7JXdwiOmgQptuwrYnbMj+GZMQjZ5tVBLnVUTVxOgpqqPW F5VapT+pb4v5lDdYTs/Jq0bcDYIGmiOnHUUdV1Zl1sUVNiL20qzYRLqlcCulQbpa9K28dVXbOblp rt1eGUCxGpeZrqyMHUxU0nKVny5RBgIlBxMBe2F1tbfGLN6h19dXub27ygXrihKBYzED8ZnTTQws ImsTQUF29nMscYZVTZshiTWUWW+yWCbsp7qGlUikmMX+YtYyvclPbAljjyRd5deqfHVj4yGvUS6h zSq7L/MBn/lDgdGg0JRWZq7zBS1itb8Wv4/NOIR/JTZq2Vkdp+9rnOPTxuMqg3NWAr+z6LflgfP6 x8rpYGvi669lKufV+9VgTbZAU4Tum19bpIuf/ne6KqdZsQM0G0E35TRbolT5i0VmTxgzEY+HOZjw 0DKz0WK2gCsplpV4VVrprpKSqHaXPW89oMhJXeaPF9DgfhZs6DMmzOvvzFE5Gzq3poAQ8+urBLsS OwIeqyqTaeoNyhXa4mqiI7NEXVKFb8crPGtKdEqFmS0BK1MbXI3Npw7SinuX/Pq/Mk90NLAaopWS pjDd11Hn18TH7qw/3PNf2P792fUukyqOKLRm/LjYD/eUBk7WhTkN2ZCBNsDdapTaafsBTipSbLNa 3dpt9MRxyl4TBBMF6M7sn79Ush2SYgbpyX0BDxMlkWBylzTBFUKRm4X6XuY3mZduwZZDOIhDya/9 PpO+7fbz1rU4m3f033aTDvfgC1/DzQcz38w89KPM+w91Uj/PPJ95afHtR656BqtvyPyJyJDZJd4E Mnhgl/NxSKWjnC4ntx4ymXy0D65TrcKtoDQKJNFJGAmtl3BwExrhJkQ2pXtbaWnUO3HPvn/YUAfe mXjOl5ctPQwH/73sxZKTN/B550a2c02S9FldtHCjWjUU6yXe2O/P3qqgJR01XUf03U220kio0B2K MG0tAymubcPq8BUPvHJlXm2Hx+ZOUZq221NRpFU67Bc2JxxMZ/uo/kvY90pei5n3Ml+n1p2hRDgp XePH6V+CFivQS1kdflfp85VZyYcaDRA4WFHBwoJUAUQUBSaTk3ZC8CCKkIgioq2AiKKirIym6QNl xgKbrcSzU6eLlOyUSmOIIzFc4VFiNcJRqgt/RghDfBYoeHLh0OdemCv7zFAmO3PSaLEQpQvXXzmE 0SR8tlj1LNyEXhIWwqkj0TSJcfzF+pcLLrt01rK68lW9529PVlz1x6HkAwM3GGf1tNQtqSxbs/Lq m1o2/eaWVS/34UVXXBZItjT1dpYXd63c2nH1t5NGW+aVBUtDgQW19d2LKrmrb0td/Wif1YIriabn w5lzCz5pXc5aLSKph3aJ3W7XwYSbNobo0AHOaFSPYvmjkUi0eLvtzJOXc8rEGs1nHTtxBCd6JnHW tQiOx6ShWW85Ne3ON7koQTn0L9T+GjxaVGqRBLq23dN381NXz5oMlExVy+atSpeIlnTMKtLmbvCx W64Z3tTmmnXFg9dR+/KXOYmcxtYtuHZptPMLB+CUpiAiHhQPIQaF0SM5uatczmEIXRhsKqKLhjiT TiKjZQ9KJOLhhEQiV4TpoDpIB2/n1BaZ3EqjPeFwRWC3Lq8Ma0xQB7mWbOEw2ezfByfkbhaOasnn XiA78NxzJbGJpApitqZYMI+88WRdtC+GSU4m2JCgRJFDbAiEM8evlGvn3tf+2KOXvHRnqLteYvRH sXlb5ned3U3Jsgt6g931uGh+W6ld0SK/Fbcv+OTUg29vVep61ybDhYoWzRi66vLkNzY//ZNgsh7s ph0h+nb6OPKjQzn91eqxEsl0MkpOy0QcpTQovUpaLxJBcH87J9L5HywqYocTRVpLga1gOGGTcVJp wI8Me5wTkULh0YmwmsgsCEx8lk13FB5wXxEtlv9ty0wG4ueaMomtRHvWbHYhGF/uBsybJCj039Xt dy1pbHlUX1NuqSozSjSl0Ywx4lOLjcURbNhOL6IvmK/OvFvfZK+IVVZmfrx8fhCyMHXp3OX47nlz gnYFpASQpX4CkeNeUQPYHYtWclVeGStiPXIVq7JZWVbEMD6VntVbPXLaM8Sp5U45JRfJ5XqrAmvd tAHp9YbhhB79TQlqPp0s9gj2kM81Y9glspqxh6b2R0s0Kk1mv0lXEcxcWRKNFuEF/w8XKI2WQsZy +k84cl1cUcQWNBaHKmc7gzWSeIu6sq+TFp9+1FtR6tCL4/hr5B9xYdQLPvsxURyyzHrODXkeorCB psRDnEMBCZ5WOWSyQBZJksjd2TNz9Bhxv09lTZu4RrBsbBZ2IW+6NTGzYOB5C6cfvdrT3X75FRs3 xeZVFVzd/9UN9/1m/TXHD154t6jgzxd1vvTrt39XMj/xgcOy+8NvfnNsv5H82mAP6PwhURTZUTFq 4jx2B+0YgoQNvPeQlrMXDifscq1uOKGV7PZ6S5x7zJNROjGabMwtYOAu6qLNJqmEfLFTQiSxnnBL PDlckKF7nrl5GRjWsiU7Vw1lEqV+g1jlr8SDHu+3v91118VhUTTYvfXr6++4dG1rvNAcVzjLWubi 48vnBtXxDaf/jT724o1PLif6BL6peQLfpZxZq1KrhhNquZ3C1HACW/dIpU6HPsfolETTMzVwM2vE WWOm2jPaPB/vO7wmpZSG6rSl41K9xe6ub8zoyGtufdEJWD+OeriotZFuvJezqrH1Xm9E6/XRKlad 5ai8Ik5TESyw5faVVtbS4YS1aY9UyC2tkFx+OrUEzYaFyONT3Jqn53pSnD2JORMmOaL5HPLoQhXV V1QaA378O0e0ouod3Mg2escydq+taHOh2+VjzyXw93SBq9uqGaaIjsepgtKav2SCsZi0OU5bbYXR 2ocDLsWxKRqh/w004kKzOS/lQq7hBALbwXJaZzQqaMWQkTOahhNGnV7PKPYUZI38HOmeMbs70xM3 0EMyL9CdgVjIL91mOP2jnKSiaJ7lsWWG6BIu88hUeQh/3ZBffAP4q0MXc5V1Lk6ln+ty1QSpauQp oGtqqocTNXKNvoQO6YLB0HAi6HLW1fkKkKXW61PssVhm+R7HMlQxNc/4a4kbnrSxfMoAaZeUZulz 5BJG+rf4yIQFZndRoi5u4L/1QLBSIyW0+/I7e/SFSZGzZhnPSVy66cubb80sxgc33L3hi5mfT23K bu7Yd3L6EN0E+ihDXbBfdKFdpLL5vFbWZrPCzSBXqJFKpR5OqOzIWUBLQqNY9ojTGZYQLRg+R7bl wURG86fzpZi/qmrKCaSjmZ3LFdNl24F/ICcU3JdVBjVw377h0bMIUr7n4e3T7PX0f4FPA18ruhZ8 rRZsMchZZcSncTIFMtLGIWRR7bbZGN1uUT5Mm0x/xJOu1GKG/AcTN0tCe8HpUn33/2Hnjr98/fF3 1+77IHPdpZu5C2LmuhVtW9brLj1x6Lsnd1z7p4OHMpltVOPbf2zbek/PwZ9f8B/Ew/Zmfiz6FXDD oihKc7OQxemM0JEhzqmwFNPFQ5zFglQ6FaOi9bRKppfRt8rul1GyW/T36R/W03oIdwo8u0OhyqLd 2SPzvr6u7jAKLz26lJyZw+TMTGRw5KKriEDCIj4jYaGmiDVdKroqoLK5HAUuHVNa6prd0r+8cfbA yvD5vz6WFfWbY9+dIqm2SutwGhUSZUHBoiaOZCxXWrH5RFb4Y5l38VvTZSde8sdgYxWoGa3l6t0o hujYEIeQjvxLSieNkEVhidLRIQtnMQ8nLPIShUypUA4nFG4Xrttjt+OSwOwY3qMj/vJpcn+/JiR8 ExaXdR5Eblv+sif+A5tN5AafaneC8BKpGezRKnySTFwmHEV9Vhkkr8BviKRqs9+VEeUMkaq46+nU VTvLOwKtBf5if+ZgrKa90Gt3+msubLqg3sk2dEZq8BNfrmv2Oixa0XTbbNi2+uID5QrT3LYryyIO eXzOmhsrohYZJcqstFae19BwfrmBnMIkxAV7wDrK0TKuUqp1+UVBN+QQRlSuK6cUdHmQM0KqPsQZ FUFInoaCFpvV6nft1WrL/Hul0ggqC58lYxMsIhfF6Z5aKpzHaQlV3h6skwFFNp8iFlOsf922dnlo Xnlx78BFW+PrD+/of3DR9czSRW3doeWppZc3c5u+vGzkKPb1r3S2VJZzDWXFF2w5L31Lu0E71ntB YlYkPqskkNzScdHOhUVhLCFSNgonkthBzZQsaDjhlpvK6DKIfbSjWPFoRUWsJHcx5M/lRE6Ep17a hEshJZp2kWdTojbiNx7I+o3qNQ9suvrba2JTbkKmq+O8BUW0fvq1fu2uO1KhSN8tm/HN0xsSi1c3 1Fy8jtjyhXSEni95ArnBYy7iyp2O8YTT/YGJpdkMZ/pILBpPSMUnZfIyukRVQpeMqT6WyiAROlVW FvZ/op1Mg3KZS/PTk0nL0yR4EhyldDJnaaKyOQsREe7AyilxXxU1LnOUPNWrkNevi1yzt2bZNa3F swqV9pJnlx6rreYSdU2OOj99ss5vkzbKkriifPjLye0LihTS6vaIWdIkz/hnJzasvWKzLczA3syh G6mviJ9AReh8rgSSBoR1tJIkDGOc6KMir9cznvCeMNustvGE9aRMKvUXIf0pRy4pAYObTCCezudl xPRApJiQOWRNTENN3gX5nauJ4WWy2LqG8ugNci9jLHYqFU42c7fHLpfZg4eXiy+KheU/8PoNbn/J kepAgbixUWorrsK4zm+VNpGMgfzHPEoM+TmNpKiQU9E0JeUlSEyLH5aEXzusAz85drgZOIFzLvyg Tdz7jQW4NPMXcffp1fSXTr2UeR6Xk3m20Tx1AjJeMo+NU0ik1CEai6SIDr9MwvDCo+QvF8gsYjLT dQtuK6GuPP9AQDyUKcB/xASR/OVjupG+STIIFuJFFZzT1ekOyH7KcErtXIbRem1+facuoOnUBnAn CoAhCF/k9AahAtPnArnJVARceHU1jhnJ5/44RuOTHr9JmXlLqfN5M0+zxXqFFRt/+o5Ua7Ibx+58 I0031kisbmeby1nlYAOimlp5xG2MUlvHWgwuq5auwZ24TNjvMuqE5CbITYsgixpxOosDlPStIr9B PYptIzbgDHQ2dpj8KCf8mpBzgJv06k1WSzYcM+dOH/kBJ/Eh1IfrlDZPufuRYLDbGy0qkK8rbe+7 MHWgr8IaaY8tvW7ODsnaQ44Knznz6KPd3QWBaOEhpU7dsOHevsbN/YucVVrgKUE34uck25ADlXAW 6xGZzOnSdWr96k6Nn+rEAccUhb03wdj0H4XkAi38XGZLiVeEKYmrBO+3uvRSCit9DN1YJfNXB+z4 +oJQtERaVSXSW12s35TZ2tZsl2Y5oF8HDuagC7mqkLOBbgc2Yp3RQKSzIlDc6fcXdfr8s0PaBbbl tg022mZDUxmcM5VB2NGlhrqj+VcMZ5844E/xaxYuafIz4nxAb5wM6KEXuZ6yEf3ZhJI5AsEyK1No bMTbC3y+0u9+aCorygyYC+UanTQpdxgtGstnCH6LyhOx+j0he1hcVUUZ3KU/yBxwlomra7DGpCwo LFDeoPHJqeFJ7VBvgnbcEE/pLEekUg+jBdFVnWq/0wpm80jOpMFypuyQ8cwNyhqQNHGmLJsYtthO rdWei9mxD9Rl8z3j5CaJ043/zd65wEdZnAt/3uwlye4m4RJDEIQ1QAgI4aJguMhNBUGwMYJVi5ol u0k2bLLL7iYQxbhcjBTxUqQYKyJai5dai1ovpbRGmqOW0tgiWESkEUWsUgS0ETzIe/4z77vJBmN/ nO875/ed7/zYx//7zvvOzDMzz8zzzGyQYA3Qk8li1qQhKdv7TO5rGZOVdenAMZN79rNM6ts3f0LR pNzhRcPyhhbl5zFFeUxRXlIRqz0+H+YUMSfasNeMxAfGWd2aeCQfZf4ZiTyty+O6PMsafwI9wYJb xsfVPUnXKuUoLBjbmCWL1Zo+MOuHd9d1GdDdaiUkDTj/1Efn5qRZkjTNkjKgr1a1wX6bGtrEPsb6 G2UM+9iQkvEXFF986imtaHDJ2MHFF5/sPyL/PHLt3c87J80l7dJ/xLDz7KNOXWFYwvIjLDFaTJyU M0q4e+bmFqT0zC8amntB0ZDc860ZfYrcbSFHzk586GOMVanGPmbMa4xdO32EtvjwOK3L43r7FCbd euqdrv27Wm2MK9dtjMuiWZJz+2ojtGvUcAedp/XOGtDFwmgv0T7qNf68kcEJD5sjsWWed05PYyD5 fW2jvtl9cc2kmxlUH1ahrVvOedk5Pb5ZJyMyUcqylijVld2236TUtOfc7mHdnrMMZLG9mJLb85Tp b5qxsTKG+J5pnGI0zn/Gt+V8K5uPVfuo+a2xVeu9gUfKR16y4NFT31hcWblj8gYWDMhyWmS6YGDe mNxzSA/d95eKR6sKLq54qCT05IIC7bd9ZxXOGtc/p+CKK6/o3WfmVVeO7Xf+6MtnTJV9TJpueZc+ 5ogJYuSkVPHciBGT+j3Xs4A+Tkrvkzv4lCUrz7XJqTlTusr/XeTGP028sEOXOY6qP1rgoK5+xjsw t20MttP6b1l7R43z3JwLeufk95nSe8yk6UPGXnvZ2L7P/iI+qG+e/a4RWQ8/8ZcLug3o073XuVef O7Rfpnv8nNFd32s0B1n2XcNjhV3OTvEW4xsjprzcK5+oPG5M/1e0rpN6d0vJ79bf2mOUPMcnCdsn o/IyevftndS77yc9cuX2caOkq/KwDy6Ug2X37K6GqpaS/Hm+cbxpOxuw4fWxMXFW+eP8Ub9N7TVo 7KAxlwwomJg9uHBC7iTv4nGzfnhpTY9pE3sMdncbfF7OzOlTRvYZNuuSSZP6TGuYbXX3HzMwc3zB gOE5fRzdho6bNfKKm8dmp6X/Yco0Z4/+PfNGdeme03/wxdOGTa4Y1SPN1r1bM6Mbxgq7F/8ZJUZN 6pIhxMWDt/fqV5ST6y46P3e4nELHOXkpRcm5tiJ7YvAwpk96TeLO03YiTXgnf0jPWSfpbhXqrjZC 3cDZy+becOf1QxPDn+v8MUOHj+mTanv0tM1p13W3fW/A+TNqr9cKel7QIefxQVMvOs9dMPMC+b9B BU35Rnyj3ZsgB7QDST+zZFpes15tfcH6gu1a27V2J1L/v1eSB/4L2fq/X1KGI4tTdsclNRt5NPWo o9bxsXMo8nPXeNcvXb9M6/q/WG77F/Le/wein5Wz8j9T0nPOyln5HyfVyKvtkiGQezN2drm+y5td z0VWIie6nuh201k5K2flrJyVs3JWzspZOStn5ayclbNyVs7KWfmvFmH8VtkWrv1Eo7CJbsIq7Pou rt3UNVNds/S/c83Wf8W1Xv9YWC2j9SnCTsn9XLupa6a6ZulfcK3XjwmXyEZrOmWauHZT10x1zaZk OmXeFxnktnDtpq6Z6ppF3QzKbBMZqpUuSk9XYdXflb2jD914v19kqnSmSmeR/oBrvaxJ+sdiDfr3 W0YL66lPGN+wpLHmLyVIS2po+wUG6SKgnozf/uq1WM00vbaUm+kkkeKIl7GIfEfYTGMNxwozbSO9 wUzbSb9ippNFjePPZjpFDLZ0M9OpYqpzqpl2JDva2nKKa52rzLRL5Dn3m+l4ny1tfY7/5teRLoeZ 1kSya7yZThLWjJ3x3xYsemS8ZqatwpWx3UzbSO8203bSH5npZDEu44iZThHnuLqa6VTRr8sFZtph uaOtLae4oMtVZtolMrvUmuk0bWaXu810uhjd9V35m5CtqaadjbRhZyNt2NlIG3Y20oadjbRhZyNt 2NlIG3Y20oadjbRhZyNt2NlIG3Y20oadjXSauRpk2rDz9SIoqoVbVAqPqOVeLSLCxz0qyoWftFuU UqKKZzcl5HOI/DDl/byLkvbybp6qK+vIupeLOWKmmGzWDSfkhHgKUqNalCiNfjS7xULVVgnXzts1 nmXZEhGgrtdsNUoJNymZHyLHGIGHcl6zLb+pocTU5VPXfN6cPm6ZH1CpPGoN4u4jb15bS531qupb ms/cRu3avUpTGe/CPEcoEVbWiHKVujsfu9H6t/s1LsECciTGWKKqvZCaDY/Sb4zVy5uFauRB3n/X SA07ezrY1KfmNWhejVEZ6WqeQurqVr2tUaPxtemRJQOU+NczVK4sFxJjxTBkoZJ8ZdEStYYiUKpK ypqVlIkyIjnCMjXGEBpqeRsfRYS07E0pedW0L2t61LpZJJ6i/ZFiuBghLiQ161ttuMWlaqRx+8Vn Jl/9TusA4hZFvCtTvY6oJ5/yozCjl/OVjwaPmnE5Yo+ygrFS5Brwqbn0qjpSS5U5x6Vt9q0SQ8kr USvEKC1TnoS1E59zw8YB9f9jzCdVplJe08uMuomz6FV15RgjyheM0ch+3KL6I8c4XeXHe1yjxlWr 1nCNqVHa0UP/Tu+N4e+G3drXs9R5mbJDmXrjUW3G6xj6o2oWjBzZsp93AaXfp3oRL21Y2Y+tjLdh tdLCao0ZM1Wj0rWqbFT1R/ZxSFvcCaga5aqPctTGevGYduhMe6Kl4v3wt63e9lkwfM6wm2HP9j7M N6NAVdscRlS/PQm+FFV1q8xa8ZaCpm8Z5SpVHwNqlIZlZ7d5cHye5byEzHEaOZVqdUstVcp7DQ/1 sBrjpapEe6zym/aQpSJtKynctk/4zBW3UL0tUeP1KZ8uVzbzqGgm8zpasZr25F6QGNEiyo8DCfFi nkp7EsbsV9aZZ0bLeMz1qVqVZgSJKEuVqt7KmfXiQX41b2Vtlvp+m0ec7p2GlYy9MNETS1RkSYzM cd+J+4tstcacPxlT3Gr1G6tjSIK92ldMmJ5921Lf9qmIWqMydnnbrBJRs2LEHWONh1WPq9V8Jva8 3VrGLmPEwPYV4zstAhk2qBIDVZ0KZYuo6LjOT2+hWtU2PDRi7i4lvG2fk7EJrcl+lKl+eFT9hWpm jbF0Fh99ROqOLS9UK7Pc3JsMPWWmXXxKi7ECKk2vSowa0q4+5RtG+Vo1/0G0dLTJNDPmzk+ofSml jT3U8Ikzi+bVZs+NdRRQHhj3g5C5V/hVnaDSYPTdY85FfK1UJew/RoyKKs+tbKsh7RQyY2ikLc4Z O7hfzUV7hIrbydiR/GqOg+b5w9Aue7+wQwTyKG+K+2uluZL8bTuUX3mI29yPT19X+Z3sr2M78cAp ai684lozbsStMhoNBeKi08oPbSvfuSd7VH/Casf0qfUQVjNqWCzuk53t/GXquVqdV4zSxnkjpKzh N2PJLNW7YMKYp5ux5vQdcbaKXkGVMsoa8Wm+8u//mjOPjCHt557Otbbnm9qeco8cPuJC9yx/STgY CZZG3ZcGw6Fg2BP1B6vy3ZMDAXeRv6w8GnEX+SK+cI3Pm3+pp3Je2O9xl3si7nk+X5Xb64v4y6p8 XndpMOwOVg2NlITl67DP4/VXlbk9VV53NOgOBIPz3WXBoNe9sJzcUNhfFaWOJ+qOVHpoJuK/xRfJ d0+PKsU1vnCt21dDwUjIUxJXEwoH6ZvsGiUv83vKglWegMqhfNRfwkO5xx8O+Kt8EfWaLvtLSYZ9 dCfAoGp8gVp3JBoOVpUNoSP+gM9dHgz7bwlWRamcUNzolNQh+2kMwVcZom/0U2mY73Pznq5F3Jir 3Bd2R8s99DcqKwWrozz6KiO+QI0c1uxyf0SNucQfok0eKoORqLsqSK99nnnyVZWs4PbTD39JRBqJ Xsg3geBCX7jEE/G5S8o9YU9J1Bc2u1g9z1vtkx2k0VpU0MV5PmlRqvnDpGkBW/oCvkpfFVMYLHUv DIa9Q/2VnjLZqe/LiYhPJ12qjpiTWOIJKSOr2ZHz4g5iYFaKOxTEHENUv5RhwkPbOtU2U5HyYHXA K7sSCci1g8XDPm91ialcdSvsi1QHosowPnMB0YOqgVF3RTXZhs3jFaojckIjbm+wpFqNZKyqFvaV VQc8YfdCn2ylfT36FpmVF/qj5W6PmzJl9MUXlQao9Mh3cmmU+H1VJbyvrZwXDJg9mcbKna+yL60N +wPMRCfLvBrl2CgQjMg5COEV/gjWktqZf2WVKuU/rKioz1MpM3yLKBeNyDUXdHv8lT61oGSfcCR/ JMoalKu3yrfQWECesJrXSozklw7lDzGrtaG4rfLb/HVs2wROCQa817I2ZFdG5xdcZL4fKt8nTLLH HQ17vL5KT3i+7JicyXbnLwsHq0PydUmwMuSp8rNKZgVZpLLl6ayauCPO9oeD7tm8ZT3Nj5RHo6Gx w4YtXLgwvzKuKh8Nw6gXLAt7QuW1w0qipfhYYlH1LItdH6xmWmrl8qM7dFHmyIWLySr9URkl5tWq jl4+Z+ZktSTkA8GARSXXinTkkvKEutzxtEC11zCz1x8JBWjACCFMEMOTCyya7463Haxileb5B+Hj 82SldlVV8cKd9kgVV2GOFR1lEg2/aWtdebWpa5zqQJ6fVqKEEoIsS6yWVb2wKhD0JDZKnz1mhCSi 8p8KL8SUEGHF66shZsgy5b5A6LQBnclUKMMP8/pKPayufE8ktCj+Mzg++gNinejsI/81r1ThEE6R rOsiw/yXveRfs83jPluItp/ddf6xWka7XBpltMVnWj4tTZX/85mWz8iQ5ZP6n2n5Ll1U+UVnWr5r V1V++5mW796d8lb1b5qlCKsqL38Sm2H+O2VpwiXOFemctTM42XQRk0VXzj3d2Jcz2bezxO1C/pbd evGgWCOe0D4Rz6PpVWq+cZrOPyboTEdnb66DeTMZnd9DZyk6b0PnXeh8CJ1PofNldP4bOv+Mpn3U /LijTu25BJ095c8S0XkxbwrReTM6F6HzR+jcgM7n0fkaOveg8+/o/KdltEZNLa2jzqTfnaHOp9H5 B3TuRudRsUbTtE+0NHT2RueAjjotHybo7IXOC9A5jjfXorMUnUvQuQ6dL6NzNzo/EfWaBZ1udA5F 5yXonNpRp21Qgs6+6JyAzkLeBNF5Dzp/gc7t6PxMZGldRLaWg87J6CxGZxU6Y+hcKf0jJYX/srOH DJlaN/XzFLtISR7vbeTjHZ9iFSnWI8Xqc0QV+2qed1EgUPqVKmbkeE+mpIoUx4cxeXT7gZJLxcFY SjLFD3uj0blzZx5SDwWB1/kEChyJD9npKTaRYl/0ZuORRdkNR8xa6lOQatdSkwuysxft5rPYbhd2 +6Go6kqSlmKVXWwUjY0Wi5Zq27BhQ2qKSFXDGFI3dernqq4xDgaSahWpNnMgxUdSU0Vq6hcxj/qC v5gJKGUxfxFLtYtUc0wMKtUpUp0tLQsaFzTegMxEJjV+0KLqfhhbIBaI6zlYz+Ir2DTxIRW11FRj TAzK2eEpOz3VRmcYYkuogDHKjqZ+Nc/4jJc1U3q7XIu3b9++typhkKlJWqoxSHOUDjlKh0M4HC6m O0tJPzFRTI5Njn3Y6EjWHKkTSrfK8ltLJziswtE24uIjjlTN4WgfcsAc9FcxWS3FLDev9JTDqTnS Oo7aGLdq94PGUCwUuy42NzYzNjU2LXZp7IOYIwXN40t/rz6l49M6Pma7kh12Wli8vYnB9161/bjq yVexEtFRJgipKDXdbq+TVmtemGwXycnKEvQ+icE3ttnCatOc9t2777vvzI2hOewJxnBoDucXjYYx Filj8IUy9kWj6oJZzlOiO1yaI70lFGoJtVxffH3xVchlxZOKW5Q1nfFFkLgMVMYEtL0Waxc5uDTH d2S4hH2SJdaJjZxythJlJBHTmaI5HdjoDI2ULI3kdAqnUxopHRN1x0iYCSNNbvywRambWOJRdTwl E51WDNtmp+IjTqfmdB1tKU5wFWmo4sajqmrcVNJWTpfmTLDVDQnWcjrQ0nHpTGXpyMWjsiai0hNr bPvIp4ki/buzDJvhZM7Uute3toTGp9vrXz8pO+uks40dZUSM4JgqXEQdi5KJjOH3ppSJcWagqjFH nJTktDd2sKJLWTHNJdJcySKZAOuMOWO9Yl0buzZObHS3FCNHj6SlamnOvrEFjLFFJEqId31Fmk1L Sz4eav8cT3NpaWknjmCvxgWxiKhhG10oIjHpeKGWE0qf4zj767cEfXosLV1L63Jk/KKCRXwCr0gp K5Ayr6C44MjiNCfKj6J6EbK4MdBY1VjaWNZYgngajzaq7L5CttXS4SPf9BVdXP8yGzvep7Xg52mO iZEPWo4sGt8nI/nO5pNK6wka/baMkSZwYKHkmEXJxFgk9mGbLIyNazSC4u0R0zoWLc3e1q4Am11L T9kuP8aJxiHWJu0TlpLacEBkloV988VovjhXiankaNcUTXHLf0GVE6Dx58DpZlpj9zT2TOM5ibNi F0paphcWXiFyir43yy3yZxdd6RZjzRIW9HU101ZOld3MtI1V2N1MyzNSpjhnPl+oRExd69V1lbqu VtcGdV2vro/LbzXiaXXdK69aurpOUNeQuj6mrjsq51fOT0pSV5e6ZqmrW10Hq+tF6jqh7aR3Jtce 3JPUiGz0Hgcwz8ws8oR/iba7HBXW6fF/VCPrv72F//4+/WfLWzi79eS0/H+T6iUKxFw2pcWcqteJ Z8QWTnF7xSFxUnNpvbUh2nhtpjZXC2iLtVXaOu0ZbYu2XdurHRLyz94t8v8BYJ+QdhHaK8b9Sa+6 a5brRKpaASnAGXLITR2fL/q043PBzo7P4xs6Pl+xI+HZJrTZkzrmz27u+Hzj4o7lKwZ3zJ/f2DE/ OrtjfnVKx/xYY8f8JcUd81d4O+b/ML1j/urWjvlrl3fMf7i0Y/7Dhzvmb5zbMX/jpx3zn18pUpPi z3ahvdBNpGoJz6/QX0vC86tdhLbhTRmd7H1cU10xV72rwbXe9SvXp67jaTe5GtIWQX3alrRtaSfT r0pfl741I5Ny35b1SH2bNCgtp8unpqA5IyftJqm/E1lPe/Wqzbhsk0Lrhmw1JCNTiquh6/asl7Ia s7Zl7czak3Woxzs87cx2ZXfj+SWV05h9Ufba7KbsZt63ZH/dMzu7pWeuyjtd9iDb4tJziNJ4mvSc 2uMdKar8ztOFdmlZtq1qt2tu7ET20Ku1qmem9FruXn9+b9nPTjR/bUqLIT1zpQwcPPCZrMaBH+el 5KXnZefl5OXljcwryJtBuhzq8prymvN2532ad3KQfVDhwI+/LdTJoW5cspWW02WkKVLzDKX925JD a3Wqxbg0Sxl0E60roQeGFErJyx48RFnhUNyS7bbL2jm0aOhcpAiZd+HJgvyCgoIJY9dI5LvxH0/Y MnnqlA3x++W509qYvnn63jgz8mc8PmP/TNeMxwuvLSwu3FF4ZMbjs39SuGOOd079nDU37PvBirl1 N/eXuZ70wh037Lthn2e2Z54n4KnzbCgpKrnOG/bu9B7jS0t6aWZpTtnw8qLy8vJb/Fv8Wz2zS4r8 O/07SwXvEP9W/x7/8Yp9/j2B8kBVoCnwjn9PZSDQVJVelVl1bnB4cHRouMprIj08tDL05IKcBWsW vLOgZcHh8K8iRZFQpK5aVKdXF1c/VhOoWVmzkjehBWtqnqztU3vklim3blrQctuMSNFta6qL68bW XVYXrltRt75uC7IVebNuT92Xt8+4fe7tc9XzittLb/8yNiMWIn9PrD7WEHs2tjf2aexIrBVOLkla 0mVJ1hL3ktwloSW3LLkldhLZuyS2ZN/SzKVXLQ3Ejiy9ZYl76XZkx9K9Sz9denxZ0rK8ZWOXFS6b tyywrGbZ8mWrl21YtnFZ07LmZS3LDi87vty+PHP5ucvdnUaGeHRIlA4ev3xe52L4eaeeGvfWRJF+ 0sHDlkfbReYmPhte1JlHtHlFonRY68vrOxdjfS+/L21bNis/ayfRtGH52nhUc/1q+aa0k67jMqYu 3zynPm3b8qblX8sY1jNXrn2s1GDaSsVIWUvmkY5bsEHF4nr0xlQUbrNj+lae6omo2+5IIZecO9LT 6tXbmJL6xPjaJirKS5GxODEepy1C6juPw3InUHuB3A3WxeOwqk8d13EZk6X179iu5uNQfR+8mvER h5vro/V1PXPr76vfaoxZeX5jQpxrNGZWRlgiAVrqW7JdPXPNePtS4jzL2CnT9a1ZL6l4bs56dou8 3mm989w7N1CmZUV73raEluKr5tByd5v2tpgu45ARiZR0XHcJK8yM4AkxPLvZkITILVfa13LfMXYe KVkvUYZYnvWSe33WSytW8NwNi6ieE8uzVzxmrrX0vLwfbiKCF6iI3ryy20q3ET9Zo9nmSjUiM6VV XB3Ztn6z1Q5Qh74Uo7whg+yk04nizXkpsuTK5/Pq1LsUJekdYrohxq5S0Bb/23eAcqSu88ivdp7d KvafNPYf1b9muRPQmtQi6xbIvUCOe2XTXaV352U13j2Bq7R5493P3JN1T2F9S9bOOfVE7XojRt+w 754a+YOkezYRZ5uMiBocTqQ/QyGynybsDh2kkxI7Osocr9GTdvl2HfaS/6QYe4p/Z/wef4o/l4rT JLM009h/vlvYmf4zsufMhd2sozR1FPa+dGNuOpPO5qVm5YI17IWmyCe5Jxr7odoTi+KpmpXsoSvZ PVvkPqn2TyXsn4isWbPyns3UpO6CFrkjqr1SCXvkiro3jd2S9Bbjbu6cxn4qZY+SFbI0ZWfcm8JO mcQuauyhStg596qdVO2iaic90paqj9VLD1HlTxrCjitF1rrl3nRqUc/cs3bKWJjtujfv3h0yLt57 3HibtfO+pUZ8+ZFrdenqhvtz7l9z/zv3v7NGrHl2TeOa19fsvjvvx6fWNBI7mtZaH3gsu6ln7gNv PkCJxHNmVmPDFQ03GLHLjFbNPXMfvOLBIhXNdmYdenBR+3k5u+nBZ4lVuQ9+9JNtDxWum/GweHjb +g2PjHzk0IbnOXvsMSyNbZSdlriNsfHdtEH/qdilF4h/6Ic0q96q3agf1Sr0jdrH+m7toL7JUghX 65scG8R4x6PwvBjvvFmM5HtIg36IbyAN+n5tpsg06x3k/S79c77TNFDfyrv2vKN8F5alNb2ZnE1a BiVGkJ4p8rSrSd+o/04r4bmCnsTgY8oc1HfzTZVaaN1Pzm6+9zbotWZvW6g7Xvu+vle7Hm6AH8Bc uBEq9CZ0PIOOmVbeWXlnvQluhmLwgBd8UKrvTRwh37Ea9KekXdBSh4aN2GE3dqA3tNuM/s9k/9SI mim3mVHJHu0n5yB19pu9l/WaqdfcQbtFWUda5iAjcykd+5VlmtCxGsvsSrCMbG2dsszHer7Uyff2 Bq7/4I2mrPwINd6mxhZlj6u536i/TI0t0mLYspWaUWputl8pvMl36tc6fgqPwxvwJrPfHY1NplVf RdtBs/3xZvsvmzPTas7MMrQ1f6e2VNk/NO1WI7iRewUj+BgO6hXUGqlWkBxFHW3uNm23kXY30u5D ZrvrzHFvovYmaneh9gMd2jTbc47VNztv1itMu1YwGwf1VvG0+hsrDpB/Z0X+jRX591V6YOtsfZ/o yVyeC731t8Vg8i6AITAU8mEsjIPxcAnMgWvh+3AdXA83wA9gLtwIN8HNUEI7XvBBKZRBOe36oQLm 034AKqEKghCCBRCGCEShmv7VwEJYBLX09Ra4FRaDnLMHWUEPcT/O/QR8Df8OJ3n3DZwCnXXFfGmH sc7ncAy+0HcnWcAGydCD9T0KRsM4KNT3s273W136PmsapEMGdIGu0A26Q6b+tvUcyIIpepP1UrgM onqzbaLeYrsMpsEV+m7bVdy/B7PJmwPf1/fZrtPftvl4V0q6DMrBDxVQxfsgLIAw1MASWAp3kF8P 95C+F+6DH8Fq9K3hvhb9D5L/MOlHePc4903wOrwBb8If4M/6MdtfYAe8DTthF3Xfgb/CbngXPXvg PdgL78M+xvM3aIEP4CP9bbtNb7KPhRmwGu6HNfp++4+BubKv5/4I96f0JsdB+ETf77yGuRkrrPoq YSOeJkMKpIITXJAOGdAFukJ3OAeyoIe+mdXcymrezGreJXrpy1nRDeI8fYvog86+4IbzIQf6QX8Y ALkwEPLwnEEwDH3D8coR3EfChXARjILRcDEUwBiYABNhEkyGKXApXAaXw1SYBlfAdLgSZsIsuAoK 4WoogmtgNhSDB+ZBCXjBB6VQBuWM0Q/4Nx7Uige14kGteFArHtSKB7XiQa14UCse1IoHteJBu/Cg XXjQLjxoFx7UgAc14EENeFCDuA071cHtQGQTSxj/UqKRXX9Rc8P5kAP9oD8MgFwYCHkwCAbrM7UL 4AO9WPsIDkArfKUXt3nU3/VVlk/hMzgE/4DD8DkcgaNwDL6AL+Gf+iFLK3wFx+EEfA3/DifhGzil H8I7W/HOVryzFe9sxTtb8c5WvLMV72zFOxvwzga8s8F6uf6idSpMgytgOsyAK2EmzIKr4HtQCFF9 s7WWNm6BW/VDtvFwCUwSmXjzZhvzapsBzK2NubUxn3j2Zjx7M57dimc32K7Xt9hu5P1NcDMwxzbm 2MYc20r0VTbmGM9vxfNb8fxWPL8Vz2+1zScvAJV6hS1EmShUw0JYBPTJdiv5i+E20nVwOzCHtmWw HO5ATz2sIP1DuIu+rKL83aRX07f7Sa+lr5xjiBSttp/w/BDpR8jbQPpR0o/BT+FnsBGegCfhKXga fg7PwC/gWfglPAfPwwvwK3gRXoKX4RX4NWyG38AW+C38Dl6FRngNtsLvoQn+DbbBH2E7/Ama4S34 M/wFdsDbsBM4jRC9NhO9NhO9NhO9WolerUSvVqJXK9Grlei1mei1mei1i+i1y7ZfX277ED5i7Aew 08dwED5D3yHgZGA7rG+x05adduy74B39Rfs++Bu06DPtn/CO8vbDPH8Ouv5iMn6UnAY9oER/USSx Z73KeWmdSu0kFSUlz3ZW9kh5ptymzpTvi7eEQ+X+g/tYsUtUaZ+Ip7XPxNNJmqiyDIeRcKF42lII V0MQauE23tfB7bAMfgYb4QnynuT+FLwOb8Cb8Afeb+P+R9gOf4JmeEtU2R4QS22nRKF9pJjKyeNr +0yxyl4oRibfKkZwCml23CVGOlaJqY67gR3H8QD8FB6Hp8QOx9NirePnlHkBXub5FZ5fo+xWeIMy b+p/dXwsCh2fCa/jECeDNOzwqe248NpOcM65DZaIRclLxSLHw5RYDxvQ8Cg8L9Y6i8SitrP4+yJF nch3qbPUDnn+pGwhZQspW6jKZVPiMCeGY5wYDnNiOMaJ4RgnhmOcGI5xWjjMDn6YXewwO9hhdrDD 7GCH2cGOsYMdYwc7zA52jN3rMJq9aPai2ctOdpid7Bg72WHhpO1dzEgfZqRP8hK9OXkpo3wY1ssz MDyqNzuL4GZzDRyVsy+s8uxMvTzq5Tkeo692cxT7sWcT9mzCXk3Ya4VIVidwcpiBpm/lWkwLvKXO 5xrXQ+o0v4IT9m5Om/Kk/gJvZ8qTpLhXLOPbynL9S7ESC6wSXcXd3O+Bh3m/Hh6BDfAoPAY/hcfh Z7ARnoAn4Wn9hPg5bILn4QX4FbwIL8Fv0fk72Abb4U/QDJw/xDvk74Z3YQ+8B3v1E3ItaDb9S+0D 0Uf7CA7AYb41fA7H4Ato5d1Xoo+1h/65NRt6wrnQC3rDedAH+oIbzocc6K+fsA6AXBgIeTAIBkM+ DIPhMAJGwoUwGi6GAv2E7Zj+pe0L+BJaeWYV2U6yOjT9S7uTe5r+uT1DP2HP4k7f7PTN3ov3fUVX ez/S/YH27bRvp1077dqHk38R72nHTjt22rGPgXG8L+L9NeieDXPgWt7PhRvhJrgZOHPbOXPbOXPb OXPbyyEAlVAFQQjBAgjDLdS5FRbDbbCOd8y1nfm1byT9hH4suUr/0pHK6r5Q/9I5Da4kPROu1T/X prJyDog7WMP1cCeswA/Za1hNB8VdsIr03dzvgXvJuw9+RLnVrPn7ua/heS0QN9T32gf1u8RP9Lfw z1qxTn9PPEWZZ+AX8Cz8Ep6Dl+EVYA8R7CGsroOsroOiEV6HN9D5Jvdt8EfS27n/CZrhz/AX3u2E d9DxV9gN78IeeA/2wvuwD/4GLfAB5T+Ev8On8BkcgsP0/XM4AkfhGHwBX8I/oRW+guOM7QR8Df8O J4kA3zDOU9x1vukJ/T0tCSz6+6z6A9oj3DfAo/AY/BQeh5/BRngCnoSn4Gn4OdAXvuE08w2nmW84 zXyraeYM1swZrJlvNc3WfvpR6xD9oHUo93wYBsNhBIyEC+EiGAWj4WIogDEwlvpSx3i4BCbARJgE U/Ravvms45vPOmu1/r71dtqI6e/jJQfwkgN4yQHbP/WjeMpR21fwtX7Qxrc0POagTdfftwv9KJ5z wM7Yib+1drv+nt3BO6d+0O7iXQbpLnzj7grdoDtkQk/2216U6U3+edCXZzf3HOoM4j4YhlIuH4ZT jnHaL0Q348PLjuJlR/Gyo3jZUb65rMPTDtrHU/cSmMi7STAZLqXO5dyvgOnkzaCP19Df2TAHvs/7 6+B6uAF+AMXgoawXnT4ohTIoBz9UkBfgXglVEIQQLIAwRMiPAva018BCWAS1cAu6b4XFcBvU8c3q dsDm9iWwDH4IK+EuWAV3Y4N74F64D34EqxnH/bBGv4s97i77Wv0t+wOAL9ofZMw/gYdgHf15GB3r KfMIdmJN2lmTdtYikeIgkeKg/UnKPUW9Z/T3iRoHkkP60eQFEIZqqIE6oF9ElIMO+u+g7w7eOZbC ciCWOOS5gn46iBcO4oVjNe+IFY410MB+uFF/z/EEbOL5RXgJfg2b4TewhTq/hd/Bq9AIf+Q9vu74 EL0H9Vr267scf9ffc45kJ75QP+BkzTuZd+dkmMYz8+xknp0zuF+pHyTiHXTO4vkq+B7fWgu5X6PX OmfrbznnoIf5dzL/TubfWYyv91Unuf9HpzZtGbt6f+Ky/O0mduKynbi8ibjcn5i8mZi8mVhcQSyu IBbbicUVxGI7sbhC/FjPJx6vJh5XMIIK4nEF8biCeFxBPC7mVFDBqaA/p4IKTgUVnAoqOBVUcCqo 4FRQwamgglNBf04F/TkV9Cd+2zkZVHAyqCCO24njduK4nThu56RQQSy3c1qo4LRQwWmhgtNCBaeF CuK7nfhuF7+mzc3wG3RtgVdFH2L8ZvEa963we2iCf4PXef8Gdd/k/gee/0j6L7AD3oad8A66/ore 3dzfhT3wHuyF93m/D/4GLfAB5fej68P/IObe4+MqDzOPj8b2XGwIDhlCuJibDViAHGyVQIKdxBCw AHGRQxxAQARYCA4XcREG4RugDHECyrRDEnW12jZq1dmtrHW1beWlSlvaeNhUbWSgpJlxkwEsMMNF mLsNBHz2O/KQuGw23c9+tts/frwz55wZnTnv8z7Pc0bCxudclx061PMoe/wCXnRNX8LLrtckXsFO jf1Vx79mfB1v4E28hbexy77deAfv4j38AnuzINgnC1r0tJw8aJEHgSbUKA+G5cGwPBiWB8PyYFge DMuDYXkwLA+G5cGwPBiWB8PyYNg9+Wk1E17vM7g3P829+WlT3yTuMu7GOx6/62e8b/wgbIlGw9Oi 0xELT9Oo5mlUgUYVaFSBRhVoVIFGFWhUgUYVaFSBRhVoVIFsiWlVgVYVaFWBVhVoVYFWFWhVwfQT tbST3FPXOW5B2CJ7WmRPi+xpkT0tsqdF9sRkT0z2tMieFtnTIntisieQPR2yJ5A9gezpkD0dsqdD 9gT7ZE9W9ozKnmF5E5M3LfImJmsCORPImZiMycqYQMa0yJiYfAm0tSD2scgRcqZFzgRypkPOdMiZ DjnTocUFWlygxQUyZ17sUMcd7rVzcGQ4KnNisaNtcx20u0C7C7S7QLsLYsd73/motf8EuA6xk1Dn fRdgodf67JrfPLkUk0stcqlFLrXIpZapXPK5ZVJWJsVkUkwmxWJnhAvkUotcismlmFwK5FLl++WV 2uI8DTGQSzG5FJNLMbkUk0sxrTHQGgOtMdAaAzkVk1PDsWu81/U+S2DbDc7vdmMH7sAq3Im70Im7 Hbsaa7AW62xbj3twL+7z+i7j151jGveHG2LfwAaPv+lzfAsP4EF0O+7b4ElyqUMudcilQC4FcimQ S4FcCuRSIJcCudQil1rkUotMysqkYCqTvu8zWxtyaViDnSebsjKpRSYFMimQRzF5FJNHMXkUk0cx eRSTR4EsismimCyKyaKYLIrJopgsCmRRIIsCWRTIopgsismimCwKZvaFC+RRizxqkUcxeRSTRzF5 FJNHMXkUk0dZeZSVR1l5lJVHw/IoJo9i8iiQR4E8CuRRizwKZFFs1unhAnmUlUdZWRSTRcOyKCaD AhkUyKBABgUyKJBBgQxq0cjnyaGYHIrJodisKyJHyKIgchQnH+PkY5z8GU4+xn3GuM8Y9xnjPmPc Z4z7jHGfMe4zZkWNWVFjVtSYlTJGgWOUNWZWxszKmFkZMytjZuUZs/KMWRkzC2NmYczVHvOJxnyi MWc35uyeiXzMT97pvjTPj4p8qMiHirrqTl11l666U1fdxZOKPKnoXXd6151euTOSqDnA/V8j9v4W paP625yt0y4Kc9Oawpw73MDda3Tqd2zuiT0KwrKjyvZc4c7gwz3FqSP/xp32FeG2yr3xh3fb7qcP sKURV0z9jm155X0+/L1fZIa9u2oWhm84YldNEyq/3fh4zVdtuRSXoRmX4wpodZXXT/d8uufTr8TX 0IKr4B5tunu06ZXfi1TO9fnKb5SmzvJpr8tPnV/l7j7/4bcIU1t+vvczV7dUjv7Tyu+TIgc6j83O Y7Pz2Ow8NjuPzfZutjf34Sd0Lpudy2bnstm5bHYum53LZuey2blsdi6bI9O86tnqb+4mIvU1sfAH NUf6PEcZj8YxmIt5OBbH4XjMRy1OkFYnYr3X3OOK32vc7t2eww7swm7X5azwB9PPxjI04Byci/PQ iPNxAS7EReEPYj92H/pT41N4Gs+EudhO46vYY18Y/iDuXOP742C47nHXPe66x6/xPHCdx3yaoZp4 OFmTxEzMwv74GGbj4zgQn8BBOBiHhOM1h5rvw8JHaw4Pf1IzJ/yjmiPCUVdlwlUZclWGXJUhV2XI VRlyVYZclSFXZchVGXJVhlyVO12VO2t+y/t9DqdjKc7EuTgP5+MCXIiLsBxfxgpcjZUIaOIG53Mj bnZOd2AV7nRed6ETd2O149Y4x7XGdXBPYDYmzMZETeV7/a9ju3X4HHZgF3aHebMyZFaGzMqQWRky K0NmZcisDJmVIbMyZFaGzMqQWRma3hROTr8M14W7pge4Ae24Rfbe6n7wNqwKx6evccxarHNf9if4 Qfho7K+Nj4S7Yj8Kx2N/h7/3+B/kzo/dvzxu3z/iJ1Pfrw7Fttn3z/gZfo4SnrL9aTwT3hkrO+4l vDL1vesQVQzFXvf4Hce9i/c93uN9w3AoHgkn4zPCUWoZiifDcYoZipv/+IG2Hezxpzx2Pxk/FIdj Do6Ae8r4UZiLeTgO81GLE3ES6nAyFmIR6mHO46fgMzgVp+GzoIM4HcQXgxbiZ4Ae4l/CWTgbjc7v fFyAC3FRuCvOe+LL8WVcjK+Ej8ZX4KvhT+KX4NLwj+KXodnnuTycsAomrIKJ+Ne8X4v3uMoxV9t3 jc/aZtt1uB7WfPymigdFH4pcF/3D8LFITfSCSG1NLjI9fDzySZ50sLZ7CK89NPxx5LAwEzk8bIzM cZdzhP1H4igcjWMwF/NwLI7D8ZivRdfiGu+1Eq24Fm24zntfjwB3eP9VuBN3odPPuRursQZUHaHq yHr0Um4Mh+Aw2XA4hc/RnI/w3IxZoXkrNG+F5q3QvBWat0LzVmjeCs1boXkrNG+Fjlqho1N/LXED bsSd3usudOJurLZtDdZiHdZX/0Lj3nAyenj4RPRIHB0+Fj3OuCCsiy4MM67g8ujySH10ZfhotA2u dPRm4yp0hn3RNcaM4/sdP+D4P/P8rzwuGt8JH502E/uHfdOOM74YPj7tJbyMSbyCnXgVr+F1vIE3 8Vb4+PRU2Dj9IHwSZ1ndZ2MZGnAOzsV5aMT5uAAX4iLcgltx29TvsBdYxfkZDWFuxsXhghlfwSVh 44xLw60zrgkfn3EDbsRN4eiM1cY1eMC+B41Zxz1k/J7X9Bp/3/PvGx/3fk/gH/EkfoJ/csxPUUAR T/l5T+OZ8McztmMizMx4Fs95jx3eXxbOKGNnuFVbyGsLec5S5Ch5jpLnJnluUnGQPLfIc4s8txjl EHkOkecIkxwhzw3y3CDPDfLcIM8J8pwgb/Xlrb681Ze3+vJWWtFKK1ppE1bahJXWZ6X1WWl5K23S Spu00iqrLG+VTVhleassb2VNxsthOf5COBx/MczFX7L6Xg7H4pNha/yVsCm+0/iq/a+FI/HXwyfi b+BNvGXb247f5Wfs9pp3wifj7zr2vXBZ/BfG9x3zgWP2eN8wzCUi4WiiJhxLRMPWxLSwKTHdOCPs ScTsiyMRdiSSYXNiZrgsMcv2/cKWxP7Gj9l3ANzxJNzxJA50zCcckwoPTRxk/ycd96mwO3FI2Jc4 FIfZf7jj5oSNiSPCJYkjHXe0447xHnPhridxrP3HOe547zPf/lr7dYOEbpA4yX53PYkF9n/a/pPt X2i/u7/EKT7DZxxzKk4L+xOfdcznHHO67YudwxKv+7znX7D9i8ale55NnOG1Z4b1ibMds8zr6DRx jmPPtf08xzU67nz7L7D/wrAr0WRc7nN8GRc77iuOW+G4r/oslzjuMvubvcfluML+K+3/mv0t3ucq +38WPpr4OUp4Ck/jGWzHBJ7Fc9iB51HGC3gRL+FlTOIV7MSreA2v4w28ibfwNnZhN3hB4t3w0eQ1 4RPJ1jCXvBZtYTHJvZPXh+3JIGxK3hBmkzfaf1NYTt4cDifbHXNLuDV5aziRvM0xt4ctyY5wQ3JV 2JO8M+xL3gV3ccm7wVuTa8IlybXhrOT6sD95j9fei/vscweX/HrYnEyHy5L3278hHE1+02u/hQe8 14PhxmS3/d/2+gx+x/6s1z6E79j/Xe/3Pft7vP7hsC751/jbMJN83Lk+gec9LuPVsG7mjPDRmSfg RJyNc8K+mZcYL8XNHrfjzvBRdwX5mv0k06BUylX/imlCKgVSKSuVJqTSoFQalEqDUmlQKg1KpUGp NCiVBqXSoFQalEodUqlj6m8+rvNe1yPAHd5jFaSAFJqQQlkplJVCWSmUlUITUmhCCk1U/l5CAgxK gEEJsF0CDEqAnAQIuPsgd89x94Cz57j4IBcf5OKDXHyQiw9y8UEuPsjFB7n4IBcf5OKDXHyQi2e5 eJaLZzlxrvp3B0VOnOPEOU6c5cQTnHiQEw9y4kFO3MGJBznxICee4MSDnDjLiQc5cY4TD3LiLCce 5Lo5rpvjujmum9vnL3omuO4E1w24bsB1s1x3gutOcN0JrjtRdbUSVytVXW2Uq2W5WhdXa666Wj9X G+Rqg1xtsOpqRa5W5GobudooV+viah1crZmrDVZdrcTVSlVXG+VqWa7WxdWauVqeq5W4WomrdXO1 LFfr4mpbuVoHV8tztRJXK3G1Hq7WzdWyXK2Lq9Vyta1crYOrjXK1IlcrcrVurtbF1bq4WgdXq+Vq ea5W4molrtbD1bq5WpardXG1Wq6W52olrlbiaj1crZurZblaF1er5WpbuVoHVytytRJXK3G1jVwt y9W6uFqRq/VwtW6u1sXVslytK7GUI57htWdyRKnN1UpcrcTVeqquluVqXVVX28rVOrhanqsVuVqR q/VwtW6u1sXVOrhaLVfLc7USVytxtZ6qq2W5WlfF1TjLYHJlWOIuRe5S5C557vIkd+niLh3cpZO7 DHKXEncpcZcSd8lzlye5S5a7dHGXdu4yyl2K3KXIXbq5Sxd36eIuHdzlUO6S5y4l7lLiLj3cpYu7 ZLlLF3ep5S557lLkLsWqu/Rwly7u0sFd6rnLVu5S4i6lfdwly126uEuOu+S4S8BdBrnLIHcJuEvA XXK67YpIbXQycopuW/nvd6ML9LOHwlOihXA4Wsb74ZXT9guHY+dFvhcvR06NvxBZGn8RL0cWxyeN r9i2kzpf9fi1yPz4W56/7fEuvOPxu8b3jL+g3g+MezwPI0sTNZHFiahxWuRUCi4nZkTqEjHP40jY ljTONM7CfpH5if3t/5htB+Djth1o/IQx5bUHGT/pmE855hDbD8Xhts0xHmE80gwfbd8xns/FsbYd ZzzeON/ra+07wfMTUWfbAuOnjSfbt9C4yHuf4pjP2H4qTrPts8bPGU/HYvuXGD+PL9j+ReNSrz3D eKZ9Z3vtMtsbcK5t5xkbjec75gLjhY5pcsxy27+Mr9i2wvhV4yXO/TL7mj2/HFfa9jVji/EqubYy Mj/ZGlmavBbXReqS1xuDyKnUWUreZN/NnrfjVttuM95u7PC6VY690/O7cLdtq41rjGu9br1993h+ L7ps+7oxbbzf6zbY903Pv4UHbes2ftuY8brfsS/r+UP4rm3fM/ZETo18Z0pRW7T7QriWqtZS1Sm/ RlGn7qOoIkUtpqi5v0ZRiymqjqKKH1HUqfsoqvivKGrub1BUsaqouR9RVB1FLaaoOooq/gZFFX+D oopVRc39VxQ199coqlhV1NzfoKhiVVFzP6KoOopaTFF1FFX8DYoqUtTcfRQ1n6IWU1QdRRUpau4+ iqrbR1HFjyiqjqIWU1QdRRV/g6KKH1FUHUUtpqg6iir+bxV1R/ToyBKNYnife4eclM1OpexrUnS3 +4x3wx4puoFSOve5F8hJzWw1NStpmZWWOWmZlZZladkpLSspOSwls1IyJyWzVFEvJctSslNKPikd c9Jxg3TskY4bqulYScVhqZiVijmpmKWGeqlYScNhaZiVhjlpmKWEemlYload0rCSglkpmJOCWSlY loKdUjArBbNSMCcFsxRQLwXLUrBTClbSb1j6ZaVfTvplq+lXln6d0u9JqZerpl6P1NtQTb1K2g1L u6y0y0m77FTatVnb10uPQB++QY+9SY/+VVfOSbOsWe6SZk9KsZwU2yDFeqTYBjNcK8Uq6TUsvbLS Kye9sma3Xno9KbVy1dTqkVobqqlVSathadUjrXLSKhv5g6muuCBs1BNHo6vC7frUmD7VpU91muke M50z041meoGZXqJPPWm2u3WoJ3WoLh2q3cz36FA5s99o9heY/SX605j+1KU/VZTQQwk5SmikhAWU sIQSAv2pVX9qpYgmiphFEbMoIqCIJRQR6E+t+lMrZdRTRhNlzKKMWYnUnlcoI6CMJZTRrD+t0J9W UEg9hSyjkFmJI/a8nzjScUc77hjvMRfz7D/W+xxn//GYb3+t/SfYdyJOsr/O/gX2fRon268/U8wS iunSn1r1p1bKaaacQxOf8zNON9uL/cwlXvd5z7/gdV80Lt3zEOU0Jc70Hmf7/MvCdv2plYJaKSig oHoKOoiCZlFQPwU1UVCP/tSuP7VSUislBZRUS0kHUdIsSurRn9r1p1aKaqWogKLqKeogipqlOz2p O2V1p07q2qg7jVJYM4UtobBWChvTm7J6UxelbaS0UUprprQllLaC0gK9aYXetILizqC4ZRQ3K7lm z/vJtXueorgOvalVb2qlvDMobxnlHUp5s5L327+Bsr6pf33L/gcc+yC6KfXb4UEUeBAF9utN7XpT KyV2UGIHJdZT4kGRFRT4GMUVKW6S2srU1jX1fcRuPeYdTf9d29/zeK+3FClqkprK1NRFQWXqqXjJ CLUUqaVMKWUe0kUlI5RRoowSZUzyjhLv6KSGIjWUKaHMM7rMftHsl818mVd0mfURM13mDxVvGDHD Zd5Q5gtlvtDFE0bMZtFsls1k2Ux2mcURM1cycyUzN2nmSmau02wVzVbZTJXNVJfZKZmdotmZNDul qWa7d/0XzUrJjJSn1n6nx3djtX1rjGsdd59juuxP437HPGD7g+h2zLeNGcd8xzHftb8nLEf6q2v8 MVd4vfVdtL4fsb5HXO2cq73R+u5wxVtd8TOs71J1fRet7xHru+LsOTOw0Qx0mIFmM3CG9V20vh+x vkfMRs5sbLS+O8xIqxk5w/rOWd8j1veI2em0vgMz1Gx958xSq/Wds75HrO/KjLWbsU7rOzBrzWZt tvWdM3Ot1neP9b3R+t5oFtvNYrtZbDaLjWZxtvWds75HrO8RM9puRjut78CsNpvV2dZ3zvoesb5H zHC7Ge60vgOz3GyWZ1vfOTPdWv3WZ8T6rsx6t/UdmPnm6rc+7Wa/0+w3W98BBTRb329Y37l9vvUZ sb4rishSRLf13UEVzVRRa30/Qhnt1W99NlrfG6kkSyVdVBJQSXM1KSrf+oxY3yMUk6WYbuu7g2qa qabW+t5qfY9Y3yMUNEJBI9V7o1YKaqagrdb3I9b3CCWNUNKI9d1FTe3U1Gx956zvjdb3Rspqp6x2 ymqmrEbKmm1956zvEet7hMo6qazd+g4orZnSZle/ddlofW+kuizVdVNdQHXNVFdb/dZlxPoeocAs BXZb3x1U2Br5vanfHN0TTlLjs9Xvpvd+F72KMjv1ihf0ihfxkh7xsnSZlCyvUNtOY8UH3nbMLlR6 xt7vIdupsYka2ylxlBJHKTFPiU9SYjslNlNiOyX2U+IoJY5S4jpKbKXEJkrsp8SAEvspcZQSRymx gxLXUWIrJTZR4jxK7KfEoKrEYUocpsRWSlxHiSsocRklHkSJ/ZQ4SomjlNhBiesosZUSmyhxHiX2 U+IoJY5SYgclrqPEVkpsosR5lNhPiQEl5ilxlBJHq3fqrZTYRIn56p36OkpsosRWSmyixFcosZ8S l1Tv1EcpcbR6p95Pia2U2ESJSygxT4ndlPgIJQ5T4nD1Tr2fElspcRklLqneqY9S4mj1Tr2fElsp sYkSl1DhMBUOT33/dz2lBBRQ+e7vZgpoR8XHbrP9durosH0V57/T8XehkyLuxmops0aCrJUM6ynq Hq+7F/eF6yivg/JaKa+J8g6q3pEPU97wPt/3tVJeE+U1Ul6e8kYpb7R6R76R8loprylyP8VNUtzo lP+9REkvU9Bk2Edd3dS1Yqq9viVd3pYyu7DbMe9Mtdksha2jsBWUNUJZecrqo6xuylpBWUWK6qGo PorqpqgiRa2jqCIl9VNSDyX1UVJ3tc0WKWkdJeUpaYKSJiiph5K6KSlLSesoqZ6SihTUT0E9FNRH Qd3VVluknH7K6aGcPsrprrbaIuWsq7baEYrpo5huiilRTD/F9FBMN8X0UUy39JpHMUWK6aCYIqX0 V5XSRyndVaUUKWUdpWyllAlKmaCU/uo31VlKWVf9prpIIf1VhfRRSPeUQlZKo1ZN9lq08aXrJNP1 lBCY3V+l3dbqdzd9lNJNKZ2UkqeUCUqZoJQeSummlCylrKOUeZRSpJB+CumhkD4K6a623q0UMkEh ExTSTyH9FJKlkHXVb4SLlLGx+l1NH2V0V/6mI7KopjGyKPpw5PToy5GF0cnI6dOOjiyM3xsZnPn9 yH2R1D5HLJza81JkUXx3ZFEigtk4DPNwEs7BxbgisijZhlvQifvwAL4TWRSZEz08rI26d4keh4y7 9L8Lt0WfwE9QwPPhtvjrYW38DbyJ9znrNbgRj4enJJ8IT5kZCbfNrMFROBonoQ6Lwm37vY438Cbe wq5wW+SAmufDQuX/IrcOLoueHP5FdFG4OvrFsDd6lrVxXjgQXe7xirAQ/SrkRPSu8OHo3eHqyl+f RM51zjuc8w4r6Q3nvcO7vBH9tFaxMHw6erpR14muDF+MtuFmrPIud+JurPH8PmNXWIiPusMoGZ/C 03g93OFz7vA5d/icOxJfCrcnzsLPwhcTP0cJT+FpPIPtmMCzeA478DzKeAEv4iW8jEm8gp14Fa/h dbyBN/EW3sYu7MY7eDd8MfnZsJD8HE7HYizB5/EFfBFLcQbOxJdwFq4Jd5ifHTUH1mwPZ9Y8hx14 OVJb82pkec2b2OX5brwTbqp51/b3jR9EaqMHR5a7uilXN+Xqjkfnhptc4VT0BOMCV+1k81Lv8RJq 8dOjS8N09Az4ydFltjd4zbnG88PLoxcYLwzroxd53GR+lzvuy7ZdHDZMze0lxku9z2W2N3t+uX1X uKu/El/zmhbPr8LVuMaxK/fsirbhesfe4DU3e3ybsTK7d4Xt0dVes8a2e237enj5tNMjy+N/Hm6K b8bfh5fHf4ximI5vw8/wepgy2ymznTLbqcRF4abEpbha96HwxEq04lq04TpcjwA3wApI3ISb0Y5b cCtuw+3owB1YhTtxFzpxN1aH6cQarMU6rMc90s+5J+4DdSa+jjTuxzewAd/Et/AAHkQ3vo0Mfhu/ gywewnfwXXwPPfhd/Af0+oz/MbIk0Rc5O/GfjL+H3+cT34+sTPR7/AfGP8SAx3/k2JzxP3v+X4x/ 7LjB8PLERgzhv2IT/gTD+G/4Uz78Z3DtEyNw/RP/HQ/jLzCKH+Av8Vf4azyCv8Hf4ofYgnzYkHgU /wM/wt9hDH+Pf8CPMY6teAyP4wn8I57ET/BP+CkKKGIb/hk/27Mr8XOU8BSexjPYjgk8i+ewA8+j jBfwIl7Cy5jEK9iJV/EaXscbeBNv4W3swm68g3f37Eoey3uPx3zw6eSnw3TyZCzEItTjt3AKPoOz w8uTy9CAc3AuzkMjrLPkBbgQ1lmyCcvxZVyMr2AFvopLcCkuQzMuxxW4EtZbsgVX4WpcE6Y4SCr5 jXBT8rfDTZHo1Opf5f7t8Mq/ocAzlvOL5dFpnHYG4pjLeU+Yurcbt45rreNarxi1Brdbg9tprpbm ammuluZqaa6W5mpprpbmammuluZq6a2W3mrprZbeaiNxTlSK1vn5C8InePxfRs/hCBUX6AwLkZdq tjuXCR72LJ7zeEdk+Yf/vkfNLo93453wsZr3wm/U/ML4PvZ4HGr6Ua1/WnhHdLpxhjFmjBvnGk9A nc+wINzF9zZFF3q8yE/lwFNZtdTnPAvLPG/AOfaf6zqc72wv8rzJvuV8b6/n7c2yS3DplNcVXKN6 16ie15U+4nWFaKv0vw4BbrD/RuNNaMctuM22240duCOSqmbkJgl3a3StbetxD+51/7xAT/jz8FFz 8CgfLPHBEh8s8cESHyzFn7H/WTwfWcj7CryvwPsKvK/A+wq8r8D7CryvwPsKvK/A+wq8r8D7Cryv wPsKvK/A+wq8r8D7CryvwPsKvK/A+wq8r8D7Kv5ToIV6WqinhXpaqKeFelqop4V6WqinhXpaqOc/ BXqop4d6eqinh3r+U+I/Jf5T4j8l/lPiPyX+U+I/pf8HvlPgOwW+U+A7Bb5T4DsFvlPgOwW+U+A7 Bb5T4DsFvlPgOwW+U+A7Bb5T4DsFvlPgOwW+U+A7Bb5TSLznGv8C7+MD7EEYWZiMoAZRTMN0zEAM cSSQxEzMwn7YHx/DAZiNj+NAfAIpHIRP4mB8CofgUByGwzEHR+BIHAV9MnkM5mIejsVxOB7zUYsT cCJOQh1oi3+V+FeJf5X4V4l/lfhXiX+V+FcpeapjToss1Fy3h9u1ke3ayHYNZLsGsl3b2KZtbNMy tlnbb+ltZb2trLeVdbWylN4mpbdJ6W1SepsuVtbFyrpYWRcr62JlXaysi5V1sbIuVtbFyrpYWRcr 62JlXaysi5V1sbIuVtbFyrpYWRcr62JlXaysi5V1sbIuVtbFyrpYWRcr62JlXaysi5W54jauuE1T f153XRi+xgMGuFHaet9kvT9snfdOudI0jpG3+jdVmk7Ncp98ds0E33kWz3m8A8+HdZV/tWefTjbb FZnNqxpr3vWq96a8qrHmA4/3THlVHa8a5VV1vGqUV9XxqtFqZ5vjKs7hlDt5149czTn860fOIuM8 K57VwLPSzjejr62Onulcv+Tcl9nW4PG5xkbHnR826m29+/S2y6selq72tgwf21Ttbg2622rdbYCf pffpbo38LM3P0vwsvbe76XmtPoMeFb3OGOCGsC96o/Em6FDRduMtcP8Vvd3YgVXhT6ea+13Op3Oq vddG19q+Hvfw23sdW23zU31vQfgYr/sRr/sRr2vkdY28ro/X9fG6vn/R9p9xrPmIP4/XwzlUNofK 5lDZHD7YwAcb+GADH2zggw18sIEPNvDBBj7YwAcb+GADH2zggw18sIEPNvDBBj7YwAcb+GADH2zg gw18sIEPNvDBBj7YoAOu1gFX64CrdcDVOuBqHTCvA67WAVfrgAM64IAOOKADDuiAAzrggA44oAMO 6IADOuCADjigAw7ogAM64IAOOKADDuiAAzrggA44oAMO6IADOuCADjjAg9PVDrhobwd0X/0vO+Bl PPiyagdM/5oO2MiDG3lwIw9u5MGNPLiPBzfy4MZ9OmCaF6d5cZoXp3lxmheneXGaF6d5cZoXp3lx mheneXGaF6d5cZoXp/9tO6Ae/nOU8BSexjPYjgk8i+ewA8+jjBfwIl7Cy5jEK9iJV/Ea3C1zklpO UstJajlJLSep5SS1nKSWk9QmrO2ELpLQRRIfwPpO6CPJCGoQxTRMxwzEEEcCSczELOyH/fExHIDZ +DgOxCeQwkH4JA7Gp3AIDsVhOBxzcASOxFE4GsdgLuah0lePM37YWWs9PgEnotJf64zWnRzokwN9 cqBPDvTJgT450CcH+uRAX/JUx5yG/7s72jmcd07khJpJjvThnejSKSer3HWu5mANUw52gfEiLtHE MZZ7fLG7Vw2Ya13LTYY4yUyrOGvlBlZuYOUGVmfWigysxGGrcNgq3GplrLQiVloR30v0hxNWxF1W xF2JnMd7V8KiqZXwJ+Gw5FxUbfWLXaHFrspFkSU8v5fX9/L6Xt7ey9t7+fQAnx7g0wUePVBttZui n7ZvIU7HOfx4Jd9sq9zjVu9v93pfOj4a9vKqAV41wKsGeNVA4kthb+IsuKel5zQ9p+k5Tc9pek7T c5qe0/Scpuc0PafpOU3PaXpO03OantP0nKbnND2n6TlNz2l6TtNzmp7T9Jym5zQ9p+k5Tc9pek7T c9r8DJifgcgfa+P1+7Txem28/sN/4U0br9fG66ttfP0+bXx9tY2PSrj1Em5Uwq2XcKMSbr1Ee1ia PayNp6buLk4Of1tyVZp2wRxfK522TLXry227wjFX4muet9h+Fa5Gq23XIYAGq1GnNOqURp3SqFNS p6BRpzTqX7XptR6vxz24V2IsiKSky8PS5WHpUpAuBelSkC4F6SJR7H8Wz0dSHHaSw6boKMVhU1pu ip5S9JTisCl6StFTisOmOOwkh03RVYquUnSV4rAFDlvgsAUOW+CwBVorcNgChy1w1i2cdQtn3cJZ t3DWLZx1C2fdwlm3cNYtnHULZ93CWbdw1i2cdQtn3cJZt2iiKU00pYmmNNGUJprSRFOaaEoTTWmi KU00pYmmNNGUJprSRFOaaEoTTWmiKU00pYmmNNGUJprSRFOaaEoTTWmiKU00pYmmNNGUJprSRFOa aEoTTWmiKU00pYmmNNGUJprSRFOaaMp6SmmiKU00pYmmrK2UJpqyvlLWV0oTTWmiKU00Za2lNNGU JpriQAUOVOBABQ5U4EAFDlTgQAUOVNBEU5poKnL3v/jWc4lOs3TqO6teztHLOQa4RlrHyeg4GUrq 1WEyUx2m0l8qXUUPoYBeCuj96LejukNGd8joDhndIaM7ZHSHDNfJ6A4Z3SGjO2Q4UIYDZThQRnfI 6A4Z3SGjO2R0h4zukNEdMtwpoztkdIeM7pDhVJlfZvUfRM6morMpZz7VHEE1vVTTSzW9VNNLNb1U 00s1vVTTK08z8jQjTzPyNCNPM/I0I08z8jQjTzPyNCNPM/I0I08z8jQjTzPyNCNPM/I0I08z8jQj TzPyNCNPM/+eeUohi/dx30UffkMd+Xh8t6sUwWwchnk4CefgYlwRWZlswy3oxH14AJmpb8hXJn83 skibXxruoovJ6MVT/z/Qcn6i10em217QlX+o7/xQ3/mhO4Od2vobU98QjMuiQvXY8Wk0OI0GIzfS 26ZqFx+Inud+/Xza2nv/kHH0Em7W5uds4mgbaLCXBjft42oZrtbG1dq4Whtd9tJhJl6Zt6vdu16D lWjFtWjDdbgeAW7AjbgJN6Mdt+BW3Ibb0YE7sAp3ghPS3Sa62/R/7Gj/q5tl6DJDlxm6zNBlhi4z dJmhyww3a+NmbdysjZu1cbM2btbGzdq4WRs3a+NmbdysjZu1cbM2btbGzdq4WRtd99J1L1330nUv XffSdS9d99J1L1330nUvXffSdS9d99J1L1330nUvXffSdS9d99J1L1330nUvXfdGaqLn8IyzP0y1 qe9/lk7dKxV++T3Pxft8t1NJnmukQTUh/r98p/KvpcW/4XcakU9R8abqXWLhl7+1acFVuHoqqwpm t2B2C2a3YHYLZrdgdgtmt2B2C2a3YHYLZrdgdgtmt2B2C2a3EInrRFsq66x6vSvrsPDLNXemGRk3 Iw9XZ6RyFz5enY3xXzMb42Zj3GyMm41xszFuNsbNxrjZGDcb42Zj3GyMm41xszFuNsbNxrjZGDcb 42Zj3GyMm41xszFuNsbNxrjZGDcb4/+uszGNt0yajf/J3bnAR1Wd7X7ttWfvyewMERWLt6IoShSs GhoO1SlVxHgBdcR4GzXaMiqiovXWWAuU6GnqV3oBf81RG22slipaihjbEZUqCRqrIV5DRsAwiSQg 4xACX8RIs77/XrOTTEIAqdKecya/Z/Z97Xc97/s+6117koz2BLF7mjhO76v19tX28FXl8VXr8RXL 4Cv2fxlfMfiKwVcMvmLwFYOvGHzF4CsGXzH4isFXDL5i8BWDrxh8xeArBl8x+IrBVwy+YvAVg68Y fMXE2VqPT0dnJ+mcdj+zekjXAS5f7vOcNDOLYGaRx8wimFn0b9HbheBp8Az4M1gE/gIWg2fBEvUQ OfDQPmXI0hF1Ts94VuuNfel4SjKyxRjZYiIMkzGYXC4nqE2c/zBsJmByExm7CSbfkpeIMbBZD5sx GWHf1RyfquphNAGjCRiNwWgMRmMwGoPRGIzGYDQGozEYjcFoDEZjMBqD0RiMxmA0BqMxGI3BaAxG YzAag9EYjMZgNAajMRiNZd2jNmX9BMwEs8Bs8FMwB5SAhdjxNHgG/BksAn8Bi8GzoFrVw3Q9TNfD dD1M18N0PUzXw3Q9TNfDdD1M18N0PUzXw3Q9TNfDdD1M18N0PUzXw3Q9TNfDdD1M17sjjVoEs721 Q8zL4nPEFOFnHlVnbNKffXQwR7mTOcoq71PxBeI71Kcp6tMU9WmKo9skWca8sdn71DslS9i+V9X6 14KPQCOZt1qlqNlS1GwparYUNVuKmi1FzZaiZktRs6Wo2VLUbClqthQ1W4qaLUXNlqJmS1GzpajZ UtRsKWq2FDVbipotRc2WomZLUbOlqNlS1GwparYUNVuKmi1FzZYKfEfVBk4Bp4IQQJUC48H3AAwE TgcTwBlgIjgT7fqB/kTb/T8MzaD7k+2dP9Ve5X2qvarnU+3u6j396XGVruJvY5n+9Dgm76Eac58u zmHffeoJ/TSxQVUxt6tiblf1H61uT1RVzGuqmNdUMa+pYl5TxbyminlNFfOaqkABs++zwNngHHAu mAQmg/PA+eACEAbMbgJTwEWgEFwMLgGXgsvA5SACrgBXgqtAEbgaXAO+D37ATN9wmRMHEZOJnk8D JfnsAza4kci7DdzF+hzVDJfNcNkMl830p5n+NNOfZvrTTH+a6U8z/WmmP81kwA2qVTJauJ84EsMv iWN6nim4/z8/pX+T4WSjTf+/y+Pw/cnGNta3q6X4fCl2lGNHOXaU43t3vh/Hlri8UwzD12QFMfFj bVfczBcnm2PBqWKIGRbHYWccO+PYGcfOOHbGsTOOnXHsjGNnHDvj2BkXuURjkihMEoVJoi9J9Lm/ eZIg0hJEWIKIcn97JEHkJIicBJGTIHISRE6CyEkQOQkiJ0HkJIicBJGTIHISRE6CyEkQOQkiJ0Hk JIicBJGTIHISRE6CyEkQOQkiJ0HkJIicBJGTIHISRE6CyEngpbvd//jiKoU4E2tP6H02w/p60KJW wOV1cHgdPTiBHpwAjwkvfxI6f6Sqg886+KzzcilCDyPw2kgvI3DbqHPoJ6zPUY1e7jTCYyM8NsJA BAYiMBCBgQgMRGAgAgMRGIjAQAQGIjAQgYEIDERgIAIDERiIwEAEBiIwEIGBCAxEYCACAxEYiMBA BAYiMBCBgQgMRGAgAgMRfNiIDxvxYSM+bMSHjfiwER824sNGzc3DYjzcrIKTVXCyCh5WwcMq+llL P2vpYy3RuNL7PSJXVavoa+0uFLWWvtbS11r6Wpvl7lsHEqAJNIOPwXrQAlrBBrARfAI2gST4FKTA ZtAGtoB2sBVsA/8NOsBnYDv4HIX8VxT1GxmZVY6nF+PpxXh6Md5dgmeXeAq5CM8uwatL8OoSvLoE ZpfA7BKYXQKzS2B2CcwugdklMLtEj1fp3/J6XL0on1MbZUy1yfdUh/4trmHyEdShAizgvktYfkCG riUjg2KUuR8Z9hJqUKXKA9VgJXCVYw1YC5rYTrHcoeKOBDYgO51JYDK4BExX8WCTag42g4/BetCK uhwuf63Wy8dUu3yCuF1ATD/F+rPgZVBPBreD7WpjIKbaA8vAq8TKcpZVqg5r6rCmLvC2Wh94BzSx 3sLxVrBZtTtHq6QzAhwDLlMbncvVRjFYPqCCsFAuF6lqWaWuka93NcNEtVylzpXrYKhJ3Spb1W1y k8iXm7tSsg0V26GGmkEVNIeqaULKmBguk2I4tfwD8LQJjo50/yc/LNbBYp3m2O3LElAPPlRFnDWN vtSZsGMGXGZZ3081mYdpduv69Gc1WAPWArdPKVXn+FWRkwX2B0ezPQIcA45le6Jmuwm2m2C7yZnK dhRcq5lvcu7S7NfBfh3s18F+HezXDRIqPsgAeG2QCSx0dCS9SNGLFF5x46Eaj8TxSJzepPBKs+lo y+PmAeBQ4H4eEcP/L1FHLGO5nB5VqWp6U01vqulNit6k6E2K3lTTmxTeaXZOw7oCenDuzrHi/AgL qXmwOIXFKSxOYXGK2efj6ln4Hyqrseh1LFqFlZvEue7fxWp/zCOyU/hrpbjGSHS1Gh+D9cAdqzpY fgZ6x6YV+rdNbP1/TiZy9Sj5W9orAw/j+UeIwQrwB+71BPmyhPUX2b+MbfzF/UfJGnRnJct3WL4P VtEWWkIEbZRoiURL5GY1lBiehu+T+D6Jz5OB52CqUrPmxnRb4A3W3+xKEcsTieWJgXq26VuAsRoG 22GwHQbbAx+x3QjD60ACtHBtK0hybYrjW7pSjlC1jgFy1ChnKMsjwJFgOBgNTgAncSyPZT7LiTo/ ppEf04idJLGTJHaSxE0SL7TjhXa80I4X2vFCexD9C6J/QfQviP4F0T5iKUksJYmlJLGUHOR+U4aJ t1agNtt0fgzp/pQdnos4soAMXMDR9ekshMP31DIvC0vJwuFweCe+PQ7+hpOF88zD1VLzm0TfkeI4 c7j6wM3lru34ewUtDCWP59FCIS0Ml014qZXlJiJlM/vb2L+ja2lwtZoe/ESNCyZVefBzNU7/HsRM xpqZjDUzGWtmMtbMJBZcG28nFuqIhTr5MOuPoRh/0P8pYR4ZUU5GlGN7XEfbixx/me1lHH+d9c3Y v0MtNk1sHqHm4es6fO1mSTkZUo6/55El5fi8LvCmuh2fL8DnC/B5HT6vw+d1+LkOPy/Azwvw8wL8 PA8/zwskOX8z125RtzsXqXnOHeBuNU8rvP5kB2bnYVkCLpJwkNTc++UDMBFD0ZLie3KHGBVYLxY6 x4ky52ZRJh6Rv+6Kay7TUV9I1BfS4zg9dtVsqNaARXgmrQOF9DquM+Fllss4p4r1FWqMfA283rVY 1sD5m6y/BWrByq6lso7l2+Adjr3L8j3u9z7rH3DvVVzfAOLs/7BrplzNcg1Yy7GPWDaCdUrKBMsm 2m9m+TFo4fpWztmATRsBWiw/ZX8KbOaebV0JuZX1HV3NptkVJwPHkIFj0LASM5vZWlA56FiJOZTj h7I8jGMjulxNKzFHqnvwmKvOhXgtrnVNZ2hXPPAOWM3+NWAtaMRb60ACpDOxEC/F3WwMtKsxgQ7w OegEO7j2nyy7gFJjHNE1zzGA7Io7Ftlrs/R3zXSywCCO53QtdfZjORjsz76hqtD5JuvDwBGsH8m1 w8GxHBvJvlxwnCp3jqetUWA0x04AJ9HOyRzLY30M98hn+zRVQvaPQYdL0OES5yL2T2U7Cq4F16t7 nGngBnAHx+5i34847+4ud0QpRBkKUYZClKEQZSgMbumaF2wHW8E20NE1D2UYgzKMQRnGoAxjUIYx g0JqjPg2OebmVpJIyyfSVjLaFBJpo4iyUV5eJYmwfCJsJRVJeix1x1BHleO9JKNQOd5bjOcW47Fy PJbEY/l4Kx9vjWIUKmQUKiTHkoxErpdW4qWVeGklI1EhuZTES/nkUpLKpY7Kpa7P2DoGnKYWw045 7CxmlCpnlCpnlCqHmSTMJGEmyYjl/t+XcmY3j5APFTpH4t01lKtBxJAbL3HiJU68xImPeP96CT7j 8BmHzzh8xuEzLq4goxPGduEYO4SDLiXgqhUNaoWrONy0yiqRI2vAO+B9UE+F2MJyA9gINmGV+xnI 5yw7wRfgn8yvBDCABD5gAT/IAjlgMNgfHAjQbvMb4GBwCBgGjgAoi3k0cD8TjKlWeG9F21rhPQ7v cTiPo20JtC0B3+5Y1YqGtcJ5qyNEjmOAoeAIcCQYDo5Wq+B/FfyvckazfQLIA2PFEGccOAV8F4wH p4MJ4AxwHgiDKaAQXAyuAN8HPwA3gpvAnWJIcIvICbaDrWAb6BA5g2hTXAfD7fgwiQ+T+DDJ6N7B yN7ByN6RZpblBrARfFlWbdXew2yAdUe17pHhwzhvAJaJ8lZiKQmr7bDaTkwliakkMZUkppKM/B2M /B1oRAfa0MGo38Go39GXVbZPAHlgT6xOpIouwFt7Yncq50XBtSCDafSincxoJbaTxHaS2E4S20li O0kV0UEV0UEV0UEV0UEV0YFWtKMV7WhFO1rRjla0a88cgGde1dX2w+7Io2u/OHVXHWNtHbVVGznu xtqrsPIqeY3yklU55O9JIB9cptqob9qoJh5glH6Yqx5DZR5nuYBx6ClqhWdBWnXqyKxRjOB1jOBx /FXqVpeozTzUphS1KWVUd8eIUqJ+FFE/CrUZHqjq2h6oBm+6VTzLJpBkfTPHt2glKYXLUpSkFCWZ h5LMYwR3a955KIg7krt1bymjeVxIV8HdKkVk09PF8o1ePQl81k87guDQtIYIi7kGowfIAvuDY/Xe Ks3YNF0tN6kmWMunJviQGjgp8jl/Kecv5fylnL/UrQuYi6/iSoOryoVPVzXpa5NudSNs91kTrb7v tRqn0mjkyDRxkJGi0sYrRjvLrbpKruuxvwF+3XllPnyOVYv79MVSqT79OZ7tUcDtl0//lmcVFqTv 5X7y61p+nFgojqaGC1LDBanhgtRwQWq4IOc2cedCMngecZJPFs8ji+fp/6XTxHhCPUUml5PJ5emZ nv7bKUZikMP6UDT9CHAk28PBaHACOIljeSzzVT4RzGgHtoJtoIM6zO1/nP7H6X+c/nf3OwnbK+j7 pz1936E+9fqd1P32qxV4YQVeWIEX3P80lqT/Sd3/AOrTTittqE47V7SR0e1kdDsZ3c6ZbZzZhp/r 1VrOWMvRtRxdy9G1mrs6aud2auZt+vm05c7f+s+5iLTtKkW0bzMHMcs7Vm0jWrc55zBTuwwvXA5m sH4L+JHaRm2/gxkNvmJO3CYM6siFwmB7hX5PEjnkjzCp19vNI/W9O/Q3/SSEdJ9zYU/6nFHkNmfK Lp1ti7l/iixLkWUpsswd11POqTp7UtiTIntSzoVsX8R4XMTyDpY/Yt/dzP/clstpeZvbshhFxbtD FdJqEA0uRXvdPM7H3nL01c3hoJkvrjTHiivRuVJaDKJjpehYKTpWSstB9MvNxyC6VIoulaJLpehS KbpUKgZpZdgPdKsCitAvy0thuBSGS2G41M1ukZPxBCDuzv717D1zxs5sfcCZuR//rOee67nPeu6x Hr+sxy/raXc9/tiuEuxJsCfBaNSrXu7/jFqKnUXYWYSdRZ56FWFrEe0UYWsRthZha5GnSEXYW+Qp UpFWJMP9D1RCmpcRG1eoTXj2MiLlCvWeeZUbDd7+T9jq0Ge16LMCZqFKmBerTeYl4FLVZF6uNpgR tY6jfzCvVJ9x/uvCx1nN7N3M3g/Z8wEReglblxI3xB57q9nbrs/rYM8vOfdTfV/3Tp+699VrH7MG E+Z0rrmJUfYW1cTWTep11laaP1QtemupOYO23W8jNNj6VPjNaWqLeQO8TldvmTeqD8ybWb9F/YYr VtHuLez5oVrJ3W+At+n08Rb1M/bU09o07LlJ3U6L5Zx5E/a67boWuPvdVpgFm49yT6pC8zExkns+ oUr0e1wMtieJZfZkUWA/LvL0d5X9Fuz8HWULnYUi6vyNZYxl+jvJVurvIvPp719t0d+m2kBrYfeb 2Rh3fyGGed+2Va7/E3f6P2YbnFGAdqdE1Ngsyox2lltFGVlQRhaUceZmZsRbRZ6Q2eO8b4Ad9KW/ +TaR8e23pvsf/rm7nX0KFrj3zRMnivtFhZjLfeaLqHiB9aXgRfCSqJBCRK3tRpH1OfhCRG2/KLMP ERX2oWCYWGgfwfZw1k9kfTzLAlFinwWmsj6L82eDF4xp9ivGuf79RIl/plHkn2Pc5i8BP4e5e0WJ 8yA2PWIUOY+CCmOa8xh4UlQ4S4xp9Lc4e7yIZl8Aphi3ZV8hyrKLxDw4eDf7+1g9RPydPrwKloMq UA1WgDdEnm+UyLNzwEiQC9zt0WASFt7IskTk4UfXh1HXh9lXcd1BxibthxIYL5FDRYl5Kmd/1YiQ HA1zhEhgLcJ57laE88IiaG0Xc63PxVz7BTHXPxPMERX+Ehh4RMx1HgUVqsF5DCxRDdlT8IyfK0Kc FeascJ/vl55Ce5b7l9DsKWFPCXuisJUrzMxvntPn9GxxToRzisVw8Tuu3wH+CbqAEmHfBHAGmCjC 7n2xNGRbImyfAs4F88ED4EHwe0BP6UWvfb9V0+FqOlxNp0chehTi7hHuHuHuEadVhLUFF+nv2puB Fff3RGMZ0VhGNJYRjWVEYzEWlGFBhY7GQ4i+Q8Ew1UEUlhF1Zd1RhwUVWFCJBZX+n1NT6ygTZdy9 jLtXcvdK7l6ZjiyxkMgqJrLcbwWsIbJKxMHcfS53n0vMF3OXudxhLneYm9kyLVbQYkVPi09SGbit jqPV8fTnNDE3O6z7596hpM8d3IwvJtKKyfhioq1Yf+dhjL6eYYwhBvPBWPC/AO0Z3wETRKcxEZwJ CsBZ4GxwDpgMrkAppoLrOPd6MJ31m8Et4FbwQ3AbuB3cAe4BM8Es8FMRMjagP5+ATaIF6zqxrtNo EwuNLaIGKzuxstPYxvZ/ixpyoxONqkGjasiRTnOFaPERbb6LQCG4GFwCLgWXgctFp+8GsvImgE2+ GQB7fNhjrxKddhue4x429/APx4NHgWOIgoPpdRm9LqPXZfS6jF6X0esyel1Gr11rS7C2TKsnrWBt FGvLXBXF2ijWRrG2DCvLsLIES8q4Yxl3K+NuZfobDBpRyg79PQojDFtNN44Ew8FR4GgwAhwDjgUj QS44Dhyvxhmj1DjfmWq6rwCcBc4G54BzwSQwGZwHzgcXgLCabteDj0AjWKfG2SmWm4FS0/3c3z8I DAVT1XTGE7STnpbYrxB/+5EjuTpHXNUeIEdkUCyUg8EQsbA7XzJyJempdpl9IuvjWRYQ4WcB8sf9 TwpE9kJyJok6F++UM0+SS30jvDgjf2YQ3ZVEd7G4VdyH7/4LDfkFqjoX/JL1X4GFYph4GrwAloKX 2bcM/J2rXtFqXoyaF6Pmxah5MWpeLF5jf41W9WLxD859C9SCleBt8AH3amIUXc85LcSyhdc3sMyM DC8iYKcSdiphp7J7jNVRMUoU+xgdfLNFnsUYbG0FRI/Vie6hifrbTA1iNJtljtaEYfZhrB9B/A5n fST7cgHtMMoU2yfpbz/Ns09lmf4G1DL7Qq4nP2zywyY/YHyYHeX4teA6cD2YBsgTRqhi+ybWbwYz wC3gVvBDcBso4fjPOK8UlLO9APwJzZ2B0gXQ3bkAzhlv1vR8m+rfWE9/k2rYWa6/PXVGNlqTfRag TsmeDK4SxcGfwqOF1TX9RzVxmKjTfJfBdxiOo+hF1P2eMjissP6p+xy1JxkH099K+3zWUVj6XUb1 MwSbotgUpdVOWq3BJncEKqD1Tlqvwa4odkWdahHFhqg4lJbL8GANHnQVqAYP1mR6UOd1txfJ7/Td e9kegIWCgVgQOdwp7NVgJV4N5o7/BbQepfUorRfQamQnRgLiIf0t8tXic9AJvtDfXl5t/1Z/c7n7 beXVIqfP38v8QZRkPQ6eEMVZ+Mz9O5nACFEQOEYUB0aKGYFcMFqEA98SISH136D9ibUD/6VPSber cZmflDIbGcdsZByzw+PIKZvj5ZmzRo6Xc7xcHL+XGlOmR8pd68xcdGYGOjND68zMnbRmRobWLERr Fnqj6UK0JqKrwNPE3W7902+sLhYBLCjAggJajNBipF8F5FY3w8RRuj8796WkX18qtF727UtPfbFT XdG/AlginsPeqZ69c/vVFsu0vQNaYiQZpfpZgxW9VU43kwOo9W5UOrJbSy5BpUOodAh1DqHOIdQ4 hBqHUONclDgXJc5FiXNR4lyUOBcFzkWBQyhwCAUOocAhFDiE4obIoBkDqG0FvamgNxX9cxXFmIHq 5qK2IdQ2hNqGUNsQahtCaUMobQilzUVlQ6hrLuqai7rmoq65qGvIU9cQ+d5CZhZ76hpCXUOoawhl DaGsIZQ1hLKGUNYQqpqLqoZQ1RCqGkJVQ6hqCFUNoaohVDUXNQ2hpiHUNISahlDTEDqSh46484Ua T0dcBahxv38aBQ2hoCEUNISChlDQXBHs0RO0BBZKYKEEFlxNcbUkupOOHOXlW0X/yNhFTLr5VaGj onfW1T8+k3uoUGcQFZVeZVrSM6s63Bs3v7TquuMn42OB9khf9e1mLa2+vcqbh/LmuezpsWYwdyzY SX2D6MxgMAS4rPUqsctehcdehWbPYUZc/aWUeBSznAiznAiznAiznAiznIgMGjlyMBhi5DDjiTDj iTDjiTD79TH79THjiTDjLWCm6858Isx8Isx8Isx8Isx8Isx8Isx8IsxwfcxuD/bfy/rPGWvm6nlH JzPbg5nZHsjMNuw84456xjeZ+UTwQw1+qMmmvmUGFMEXa/DFmuyrjaPwRQvzxW41dJXwarLN0N+/ 7es3gysQ53gVV5RcjpLLUXI5Si5Hydco+RolX6Pka1SP4G+z7B7F09VS35G8bwUUJSejenRPV0BR cjJKDkb1eHvqwCN+n0onCq4FzEzIxSi5GCUPo+RhlDyMkodR8jBKHkbJwyg5GCUHo+Rg1Ktoontb QWRUNlHyMl1RGPp5zPVwFda611ud9te/sFeNhtHAMBoYRgPDaGA4oxoND6SF8FrSpxo1xBA4Du+i Gu1R+/5ZhTaGMyrSMP4I449wt0bqjDPwSVonw1onj9DPO8JoZRitDKOV4X5amVmJhvFPGP+EB9TK dBUa3oNehjOq0EzdDHu6GfIU4F1PAd7NVAB8FMZH4QztDItAZua7VSgWh3fKeJOMX9udBeLwgcbU HuXMHEMz1XLX8/j0+Nk7dlbuNH/36WdHC3ufH4lT/1Pf22v9H62/bu1d4Hl4rh3GI+7zqnvEyfqZ FZGONwrwRsEAz64qe+YIz+l5QqXnpQK8VOA9y1rltOhqOeo906rgzMeI8QCjThQuS+AxCo9RjlRw pAIOK+CuJP3Msvs518DPuDKeyYxLP+fiqvAer1rGVcu4ahlKGu656jtEQ6eYLyrRevc5UidR0UlU dBIVnWh/FO2Pov1RtD+K3kfR+yh67z7tzLG+QMcs/bTzXSKnk8jpRPsjRE+np/9R9N+dvXXaszh3 NpjP9gPgQUCVz1gQZSzI8c9mHJjDeJAeE2YwJkTwgvvUk6gzcpxHQYUxmrFhNGNDxBsbRjM2ROnR W9kXwMcUxgK0NGNsGEsEtunndXoUc0esfiNVRFvaf5TqHqHSVuVgVU6GVcV6pHpUj1ZHYdFR2qIl LN2RaoqR02+EGq1HqPHwWwK/JWhmFL2MopdR9DKKXkbRyyg66c7O87r10H2qnKl7/WbhUc/jZVrf /FidA5+HkrHDwUjWcwHnoW1RellCRkfJaHfet11r21T9fDeKNkW7tUnPL9JjcQk9LOmJ0LQu1eh5 IdHq6VNljz6N009Vy+j1DLQp6j3jcKvnGeIEIqwEH4SIqBB+CBFRISIqRA/deqmFHrbQwxb8EyLC QkRYiN6toXdriLISfBWys1iewvJcMIv12WA+6w+AB8HvwVMo6kyxhvhvI/7biB4319bQkzX0pJOe dGJ9J34KoVfLiBp33tOGv0JYXonVbu3QidWV+GA+6jhwDeSjBvJRA/n61kCiE4s7sbhMR5ebF5l1 0Cz2zwYD1UN3qqbMSNNR9iDKko60L7y66KiMuuhgry56jZqohJ6UZUTeh/SkxquN3hP5Xk/CXk/C vT0RnXDfCfed3vPrPtWc15Nwv4ounNGTzGfaEf1M+07VgA86yZ1wv9xxq7wZGb3qrvYOplcFGb0K 62pvIuNJuldZ+pl3/3waQa8qdI+6eyPEmj492rk3FZ5PCnRPZrE9G/zey+oHtWL2t6yHb6xa7nFd obm+gnlAEUjzvEZ8a3efsnjVTm5GtTOM8a94L2eCxe6nNTrjB/rExh3XvE9sejJ6rn4W8643boUy KosCPStzP8052YuQqBch0V3U+9FdxHrUU9KIFyHRjAjJ1PuIp/euskY9rS/2VLV/ZPQq6zP4Jq3z mVFxsKf1LfigxdV6Yenfw1umVmb+rpyQ9MnHvEeIHLGf8IsDxFAREIeI77I1SVwgvi0uFtMZCe8U s9maQ3UaEe+IpHhSpIygqDYGG/uLZmOIcYhYbxxmfE9sMs4zzmdv2LjQOMC41LiZYz8y5hijjHuN +4yxxu+Np41xRsJoNc40NvIz2Ujyc56RMjZzXbuxlSs7DGVMkVL6jStltsw2fiAHyUHGVLmf3M+I yv3l/sa18kB5oHGdPEgeZFwvh8qhxjR5uBxu3CCPlkcbt8hj5LHGrTJX5hq3yePl8cbtcrTMM+6Q 35b5xj1ynDzVmCm/K8cbc+Rp8nTjXnmGPMP43/IseY7xMzlJXmDcLy+Uhcav5CXycmO+vFLeYJTJ G+WNxhPyZjnD+KO8Vd5q/EneJm8znpR3yLuNp+RP5EzjL3KOvNd4Vv5alhmV8iH5kPGSfEQ+Yrws fy//aCyTT8onjRXyGfln4zX5F/m8USNjMmbUyaVyqfG2fFkuM96Ry+Vy4z1ZLV833pdvyDeMBlkr a424fEe+Y3wo35PvGavlBzJurJH8GAm5TiaMJtks1xsfy1bZarTKpEwaG2RKpoyNsl22G5/I7XKH sUl2SWW0mdKURrtpm7ax1cwyc4xt5v7m/sYX5kHmN4wd5sHm4UaXOdwcLk3zaPNo6TOPNUdKy8w3 x0q/WWheJQPmNPOH8kDzCfMJ+U2z1qyVw8w68215hLnR3CGHm8qXLfN9Ob7L5ATfFb7r5S990313 yYd9s32z5Z+sU61T5ZPWeOt0+ZQ10Tpb/tmaZE2SS6zzrfPlc1bYulBWWhdZF8u/WpdZl8sXrKus IvmidY11jXzZ+oE1VS6zrrWula9YN1q3yVetO6y75BvWPdYs+ZY1x7pPvm2VWqXyfeu/rAflB9bD 1u/kx9Yj1mLZYsWsZbLTes1qMA3rI2uTOcT61NpsHmW1W+3mMdY263PzWGuHtcMcbSnbME+Anizz JNuxTzLH2mPsb5tX2WPtU8yr7e/Zp5lRe4J9hnmdfbY9yZxmT7GvNm+yv28/Zv7YfsJeaL5o/9le ZC63n7UrzWr7b/aLZo29zF5m1tqv2q+aK+0qu8qss1+3a8y37Tftt8x37bftd8z37Xq73qy3G+wG c5X9kb3ebLBb7Y3mOjtlbzGb7W32Z2ar3Wl3mpvsf9rKTPoNf8Dc7M/2Z5vb/YP8Oebn/sH+A8wv /EP9I8wu/7H+kb6g/0Q/nvB/13+B7yD/xf4iX67/Gv/1vjz/Df4bfaf4Z/hv933Xf6f/Lt8Z/p/4 Z/nO9M/xl/jO9pf67/ed66/0L/Wd53/F/4qv0P+m/03fxf5af63vEv/7/vd9l/ob/A2+y/wf+j/0 Xe5f42/0RfytWUFfUdaRWbm++7Lys870/TLr8qwf+x7NejirzfdKVmfAsIYGTgycaR0RmBq40Rob eDrwtPW9wKLAIuu0wLOBZ63TA88FnrMmBJ4PLLXOCLwcWGadE3g1UG1NCtQE3rAuCLwZqLcuDKwO bLCuCrQF2qwbA9sC/23dFPgs8Jk1I/B5oMu6xZGOtO50LCfLussJOkHrx06Os791j3Owc6g12znC OcYqcUY6o6z7nROdE61fOWOdsdavnXHOd6zfOKc6E6z5zplOgfWwc44z2Sp3ws6FVoVzkXOJ9Qfn Mudya4FzpXO19aQz1bnVesa5x/mJtdSZ5cyyXnLuc+6zXnZKnfutZc5c5zfWq84DzkPWa06585hV 6zzuPGG95yxwFlgfOE86T1r1zkJnobXKec55zmpwnndesOLOS84y6yPnVWe5lXBWOK9bzc5bTq3V 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 p7rLD+VGKpCb5KfUW34uN1Nf+S+5hfrLbXIbDZK75L9psNwrD9Bw9qa6QP4sf6Yx8qgM0Fiz0zZN YM+qCy2v5aOJVrgVQVOtOlY0TbdirFi62GpgNaDLrEQriWZYja2mNNNqbjWnK53nnedptvOCs5r+ x+y+THPN7ss0z+y7TNeYfZfpN2bfZbrW2en8TDd4bW8YLTL7LlOx91ZvET3lfdK7j940+y4L1+y7 LOqYfZdFmvu0u0K0NTsuiyyz47LINjsui/Zmx2XRxey4LPLMjsuiu9lxWfQwOy6LIWbHZXGh+537 vZjo/uCWiylaaCku07YOE5ebXZbF1TpGx4trzC7LYoFurtPF7bqD7izuNjsri/vMzsqi0OysLIrN zsqizOysLB7WY/R4sUxP1JME76wsntS/0b8RL4ZtDdshVpm3ueKVsPKwcvGGeZsr3kS//IT7pWR/ OilT0Ds93DuDvnWSe6fi3uly79Tondmgt0cf9aCPdsbZnMqems09tRX31A7cUztyT23PPTUbPXUS zk6WU0E3Pnrt2UdPsI+ekJeiB1vcg4P+eoJ7sM092Ms9OJ17sMN+fELegH5soR/fDJ5b0JvTuTe3 5t4cyb25Dvfmutyb66M3P4yxZDz+4uSj6Nlt2e8vUz6G/h1v9pNHbHwA66GXP4X4T+jr9bmvR3Jf r2P2lkdpL6HH1+Me35Z7fBL3+BT2E2xk9pmnLPkuen9L7v2Nufc3NbvNIzb+g8nyY/kxRt1GjIc0 9iVsJz/FqGhudqFHvBljIxVj41+Iv8QIacojJIU9DRvJ3RgnLcyO9Cj5W7mPmsj9cj/acAAjJ41H TgaPnAiMnKOQFOWyHDIigFGUyKMomkdRLEaRl3zspRjGXooNLB/GVQL7KraxIjC6Gprd7BEbv8UY jLEYxPUw0mJ5pEXwSIsyO9ujzCYYbzE83hJ4vCmMtxcQv4hRp3nUteJR14pHnc2jzsao+xzxZoy9 dB57kseeB2Mvl5Q3z5tHrrcrxqHmcZiNcfgMtfI+6/0LdfA+532LOrIHSnvvZxifwoxPsjA+O5Dt dnQ7kdft7PaidDNWSZrd0SneXeGuoHpmxFKkGbFUFyP2RcSr3FU4u9pdDfor7isUzt4rcey9kum+ 6b6Ns2vdtYj/7v4d/Ovc95A2niyt3Q/cD6mO+5H7MdV3N7obcfYz9wuk/+VuobbuVncrOLe521Dy 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 8RofU8zkFXQVuFG/Mn5GeZnQZ6J2QWIL5zJzoU7FGctZeQzBRFcmn0lizIy14Ghqn+05E8GkMkln ZpmjZ8dShVc2s5Zsa7btzCLm8tkhm3T6RP2CbZupyJrKLSqIqDacLofU89LBrClTdtbS6cOnjfnl FxIubEF/gz2YJbaMtVx4ygywN5gp9grbZ1sBu8yBTe6yBexB9jG7wW6xu+xJsB+yVzzrgaOMiTsz wrBMDHOKGWAm6mzMnTobG8sms3Zmk9mBXlh6qRs9LXM+pTO1jzuWPnHaxp14OY7LtDWARfQZy9w8 V87RNU+4wzU9tb3cEc6Y+ex0T0rnK/6aopyp9IGXcjKiKrurDfk1XBsnIQsVHSk6Uq0WFb2qnrnD Xed8nI/JRnbMmqo2vKpWb6RdLU1IL07tS+lM6axWmd50lhs9nZnZwNm4htMNVUWp3VVXuftgqRlm gnvIJkBqZA2sAHNfN/TEnrWPpWDGvMc+sG6x+2yJdY65g3LMLDPNPGKvscPMOquyYfZpnfGlx+wi MwI+vMreRD0Dno18etM6Bx4dlanPWsB/zen5+3j0P7N39uFRHuX+3zwvu2kEjBUjQt6EZN9Idjeb EMgLAQMGSIGmnBgwu9m3IFKKmCJFDgdpREwpIqY0UoqU0pSmSFNEpEhTRKRIKY0UETEHEVOMkdKc iBxEmtMmv5nPxLZ6/PX0/PG7Lq/fxfVc+8299zNzz8w998zc9zyTfW75o7f80X8ef1SMkY3vrnhj Lr+/bxU6HRHeUeRU6FjkrPh2KHLFogUvRzoEry20NyJ8pOD5yCXxrTXULP5qwfZIvfh2PtQUOSHS b4rsF98aQw2RZosWrojMF9/WhFZEWt+ZG979b5Yus+fdX6MaUyE/Wve0JHtipKOoxdNTUJmX7l/k r5vYKTjNE+P9rRmCb0/MXOY5Or5bpsitzm329PgvTEvyOiMdOfWSJ3P465wN/gTnyvE7y1ZGLBkd Jcmeo77KrEu5lflXilqK6uyGPTFqj/qj5dGK6JLopuj26N5Zc2aej3ZHr8WSojdjebE5sbzo1Niq Wddja2JbYztiLbGEWKvIkyXyVIk8h2bNiZ4XqQ1ST1YpozejVbH5scO+XXnDHPn2vpybNY2R9qI6 R75vT+SKb4+vzZnlckbOZHTYT5euKEz3T87xO/KjwyKbHUc89bnV1EnWZokoa2+0QpTRHbXLGs1e Kkrpjc2JbhDl9NVaYi211toh05JyduaeyW9HF2/5L3iq7In2JOdO366MjrxhRS2RDv9McedGbrNv hX/RZ07kdnmNsoXTEmoafRHvusgeWT/PUalhf1JU6DpvmE/ULa/CcUbUZKqsS60vuqQ2P9pQO7u2 OnZY1GTvYD3KZ12/U7szXdRjae3VO7Pma/PjY2W1F6Nb5g+PToitqj0eLRc6ETqtbazdVdtee6W2 Q2j0QEGlb7ZzZ6wwtm5896zrnh6hvdExp78u65KoeaI/IXdtUYvjTEFlQWWky3tMcJb72orqclM9 sdz19rq7jkfj/RdqGnOtmfbCTc7hBSsyuvLSMzoKN9kvRzYX9QkN9OQ2Flfmt4sWnRbXZNG6yZlL Mtrtq8SVWHDV0zN+pKcncjFyZErn+IbIcXtiUYuwmEUi3XJH6fhOe9LU5f4L3sP57ZkTHI3RYdES oYedos9lrwejsehK0Yp62Ud3atGz0VPR7lgyFlAWC8WWx/bJ/pl1XXCaxKc12hBtiB2MLowlxjzR nSLnwuiJWRsFb3Rspri7RGi5PNov0u8WOtsovi2LdsYWxepiCbOnx47FTsZOC32vivYL25sn6nEg 2iNylUe3RI96YrLX/a32pIyuKdfyKuxJwvKX+5dHrjg67hoiR0rmssyp42MTTo/vthd6NzqXeHrK hjvy/Zf9l317/K25pd51pSucMXUJ+9uf0ZG7x3nTe9qxYGJn6QrfHlHbcnXF+qKbYpdrR8Qu1abW ZsSuF9XFzsUu1N7uqXKU5g3LbbT3uhLEGHTm5tsvOU95E/NGFjY4hyvb8/RkNvgTHc2OZv+iqXVT 6+zJ9iR7km+Xf5FzZ0GX15nRVTY8oyO/Pbcxoz23WYzNwuIV0ZFFh+0J9j7vKtGyYbWV84dF7bXu 2PLaYmGHkdrFwuJWRA/U7qltq90m7VBoJ6H2YmxH7Y3at2Kja/fX7p81p3ZB7Wpx90Dt1drN0SzR lgbRR8dix2q7hMVenD+ytrR2eu362ubaI7VnovW1a/1N0gqmXAssqzrsv1CoFfVJe/GPdo4UWGhP nHA6/0pkV/Hi0uqaq45m77op3bkdkc2RPeJ6K7LHH8osyZzqOWpfXr4jUxtfX9g9vju32tOTPULY 0umy4ZmxyP5IW+GWvJG5YnwV1fl2RbaVrvAs9C+yJ8l7RYlzj+dssJ8s2+JscI0uafJVTq3zHvOe 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 HsxTAcxTEcxTCcxTGcxTBcxzJpjnLDBPVTBPNTBPdTBPDTBPTTBPLTBPbTBPHTBPXTBPPTBPfTBP AzBPQzBPIzBPYzBPEzBPUzBPMzBPczBPCzBPSzBPKzBPazBPGzBPWzBGOzBGezBGBzBGRzBGJzBG ZzBGR/v/RMIYNZJ+x732v/4vMUxb7f/qHGkW2//bkhhB+T3PQKPPh4Ze5zQo7YcGFdCg0rbyb1m7 tsiPu7bIT7i2yE+6tshPubbIT9t29jRvdy2JX0FL6upakljo6qnY6eqgeMHVQfGuvaoKyE3nBSKw Fk9g/0gEJjC2hILOBecROI/BeQKcJ8F5ITgvBuelwHlpcF4GnJcLnJcHnJcPnFcAnFcUXFUSXFUa XFUGXFUWXHUGuKo8uKoCuKqiYymq5FiKKjuWoiqOpehMx1J0lmMpqgof6tUcu9iacyQ4amuO1YO2 tlg9aGuL1YNUz+lBauj0IDVyepAaOz1IzZwepOZOD1JLpwepldOD1NrpQWrj9CC1c3qQOjk9aPsd VtNRV6fpbL/Dajrb13CWSC+n6egcp+mot9lutlMfp+mor9N01M9pOjrPaTo632k66u/0Gl3g9BoN cHqNBjq9RoOcXqMhTq9RltNrNMLpNRrp9BqNcnqNxji9RuOcXqPxTq/RJKfXaLLTazTF6TWa7fQa zXV6jRY4vUYXO71GC51eo0udXqPLnF6jJU6v0TKn12i502u0wuk1PGfff16c1Nua/2u1NFDPuW/U qt1qt+2dPa+eJ6FeUNaKVC+pl2yJfunry0koaS17zhUYoyGqYnv+kW1hNWydrEUNKTc1puZUmFpS ByphW7Ctb9Td/tw84QXWTh9of3VpMA2nejTS9gmb0Fiaas+Ybnt/Hehmup160V22ffenB2ibTfcI PU6j6EnaQeNpN+2habTX/mbQi/Y3k16h/TSLXqf3aB59YH+L6CM6SJfSIftbRl/a33L6mo7ZPuJx FnQdl+HKts93Ftegu7kW16KNXIcb0wPclFvSw9yaO9Hj3JW70w7uyT3J9oV4IO3mwTyYXuOhPJJe 59E8lt7l8TydPuCZfDEdEg1FQ/qraGKf2FFxnsiiY2KeWMQsbhA32H7eRrGRU2Kz2MJpsU1s41zi EfEo5xZPiCc4r9gr9nI+8YmwfTtxSBzmAuIL8QUXEl+Jr7mwOCKOcFHJkrmYLCKLcHFZUpbiErKM LMOlZDl5BpeWlWQlLmvrSMDllFEZbqFyqzrcXtVTTXisaqaG8BSVpUbz9WqsmsJrg6xgPN8RTAwm 8YPBlGAqPxTMCGbwlmBOcBlvDRYHi/mZYHmwnJ8NVgZX8Y5gXfAQ7wm2BJ/x+zqjC4i8upAuIorq Yrq4KKFL6tKilC6rq4uyuqauKWrourquqKnr68ailu6le4n6urfuIxrofjpLNNbD9QjRXo/Sl9q+ 0eV6gxihX9cfioX6Y/2JWKE/1QfFFfqwPiyu1F/p78VV+oQ+IW7Rp/Qpsc6wCcR6U9icKe4wVU1H 8ajpbLLEG2aJWSK+NY+YR8UR8775QBw1n5kT4pj5MSwtU2HZsJ+sHp4frpAjwivCb+Tq8EhUUJ6M CkfnqTJR/2isyorGRxeqadH86Ap1aXRldIO6Ltod7VZro5ejV9Qt0avRq2p99Fr0htoQvRW9o26P 3os+VndFB6ID6v44HafVxrhAXFA9EBeOC6tNcdG4uHooLhmXVlvjsnFF9UhcOa6snozPjs9WT8X9 4vPU03H/uL96Jh4QD1LPxkPiLPVcPDweo/bE4+Jx6mXbugravsuD6Ltssb2Wh63tomzf5XHbU7Gt 2vZRdljbJbZ9lz2Utn2XFymX7bvss3zwmrVd8tm+y9uWD5zvm0LwfVMYdnRR2NHFMP5WXL4qD9ne xk3qC6qjvgoa0yJrCW6ifZaV99MJvCsR2PzKibqyvepnW3Jjam1bs/OzOpTG0BSaY/XUUrrKsu4G ups20aO03bbOffQ2fWyZ6Qj9wG6hRTr1MMnUQ6nNqUew3ZJ6FNutqT9juy31uN1utqEnsN2cehLb LamnsN2aehrbbaln7HaLTfcstptTO7DdktqJ7dbUc9huS+2226023R5sN6eex3ZLai+2W1MvYLst 9ZLdbrPpXsZ2c+oVbLek9mG7NfUqtttSj5GwR7db3JLaZXFr6kWL2/6ARF7DnT+Uej2RzBuJZN5M JPNWIpm3E8m8k0jk3UQi7yUS+SCRyIeJRD5KJPJxIpFPEol8mkjkYCKRzxKJHEokcjiRyBeJRL5M JPJVIpGvE4n8JZHIfnv/D6Xeh0QOQCKf/0GJfJtI5Egikb8mEjmaSORviUS+SyRyPKkr3yeS+SGR zIlEMicTyfyYSOanRCKnvETS7CWSFl4iaeklklZeIunASyRtvETSoZdIOvISScdeIulUIpFvIJFj rqakyUkkrf+YRNIZL5F0Li+RdG4vkXQeL5F0Xi+RdH4vkXQBL5F0QS+RdCEvkXRhL5F0US+RdDEv kXRxX1fSJbxk0iUTyZRKJFM6kUyZRDJlE4mckUikfCKRColEKiYSqeQlkk47iaTzQSJFXE1Jl/uD EqmSSOTMRCJnJRKpmkikWiKRGolEaiYSqZVIpHYikTqJROolEqmfSKRBIpGGiUQaJRJpkkikaSKR ZolEmid1pUUimZaJZFolkmmdSKZNIpnKkEh1SKQuJNLY1RQ3E+LKjZmQflSFP+PP+Sv+gU/wT3xK SGs4GBGLjMgl8op8oqAoJJbKhnKUHC3HyLFynBwvJ8iJcpKcLKfIqXKanC5nyJlylpwt58i5waz0 LJtvXj7ofMjxYT5sLeEv+UvLKcfZth4+yT9a48T+kRFKKAqFFpoiYX8Ui5RIU0rkFnkoI/K7NxrE ErHE2roNZANr6/aWIyl/MDOYSZXSM9Mzbd9OUDFrM++Uz8ldcrfcI5+Xe+UL8kX5krtLW765uEuX ZrW8Sa6RN8u18ha5Tq6XG+Stf5fmH+fzc++5RNJ7ro1jO703JrKdvV9SlEtS1HHzVwJLKez1b8N4 9a9ndMYMZt1fZ3nkHSStgljjtvI2u70d+2vd1u6vdTNflEvemcTemcTaXG25d2OVR255g7xRLpPL 5Qq5Ul4hV8kr5VXyanmNvFZeJ6939iFkTLgnIe+W91BaPigftH1pYUtUTraQrWQb2U52lJ1lN9lD DpSD5GA5RA6VWXKYHC5HyJG/99wzLTKtMu0yHTKdMl1sTnlkc+dFSraULd36ZNnaXqutbGtL3EF2 ICU7yU4UyK6yK2nZXXYnY5/tAAptLZtM+TLNM82pRKZlpiWVzLTNtKVSmfaZ9lTaed2mMpnOmc5U Niltc3uF1jbnDjbHrjan3vJc2Uf2lf3kefJ82V9eIAf8Xs21V2hpc25vc+yM0rZw39S3d+7eqGoj 29jStpPtbGk7yo62tJ1lZ1vabrKbLW0P2cOWdqCtiSFkmM/eeQtb2laZVra07TLtbGk7ZDrY0nbK dLKl7WLl8WtpW9jStrGl7WhL2+13S/s78ralbWFL286WtpObvbT33MqWtq0tobD33dmWsLstlbZ3 OpdCe2etbHna2zKUsrLqQmWSq9uz3DnuDJf+dFu0y8/lhrzc1ZtDVq0hpQ6QT1dIxrXO0JXVXr0t 5ODKa68elBErrEY1HHLEMac4zRnOxbk5D+flfJyfC3BBLsSFuQgX5WJcnEtwSS7Fpa3tVJbL8Rlc nitwRa7ElbkKn2ltqapcjatzDa5pLara1p6qy/W4PjfghtyIG3MTa1s14+bcgltyK2thteG23I7b cwfuyJ24M3ex9lY37s49rMV1NveyFldvPpf7cF/ux+fx+dyfL+ABPJAHWStsiLXBsngYD+cRPJJH WVtsDI/lcdYam8ATeRJP5ik8lafxdJ5hbbNZPJvn8FyexxfyRTyfF/DFvJAv4UV8H3/D3/JR/psY JoaLEWKkGCVGizFirBgnxosJYqKYJCaLKWKqmCamixlippglZos5Yq617C4UF4n5YoG4WCwUl4hF Ypk4Lr4XP4gT4qT4UfwkTtnOBEshpVQykFoaGcpIxjIl0zIjc8ncMo/MK/PJ/LKALCgLycLWsisq i8nisoSz7mRpa92VdbadLC8ryIrWvqssq8gz5VmqnWqvOqiOqpPqrLqorqqb6q56qJ7qbNVLnaN6 q3NVH9VX9VPnqfNVf3WBGqAGqkFqsBqihloLcJgarkaokWqUGq3GWFtwnBqvJqiJapKarKaoGWqe vl9v1A/oB/Um/ZDerLforXqbflg/oh/Vf9aP6cf1E/pJ/ZR+Wm/Xz+hn9Q69Uz+nd+ndeo9+Xu/V L+gX9Uv6ZfvbZ3/77e91/YZ+U7+l39bv6Hf1e/p9/YH+UH/kbD19wNl6+jP7O6w/t78vrb33tf6L /kZ/q4/ov+qj+m/6mP5OH9ff6x+sFXhS/6h/0qcMWStQGGmUCYw2xoQmMrFJmbTJmFwmt8lj8pp8 1kYsYoqaYqa4KWFKmlKmtCljyppy5gxT3lQwFU0lU9lUMWeas6wdWc1UNzVMTVPL1DZ1TF1Tz9Q3 DUxD08g0Nk1MU9PMNDctTEvTyrQ2bUxb0860Nx1MR9PJWp9dTFfTzXQ3PUxPc7bpZc4xvc25po/p a/qZ88z5pr+5wAwwA80wM9yMMCPNKDPajDFjzTgz3uQ3BUxBU8gMMoPNEDPUZJk3zVvmbfOOede8 5+xY86H5yHxsPjEHzKfmYPhO+G74Xvh++EH4YfhR+HH4SXggPBh+Fh4KD4efh1+EX4ZfhV+Hfwm/ CX8IT4Qnwx/Dn8JTEUVsqVxGKgoiHZkojKIojlJRJsoV5Y7yRHmjfFH+qEBUMCodlYnKRuWiM6Ly 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 UP+79Z+t7xycq3+R/vN8z/lxt/qtRf3WQmVtVDY1c5HvWOL+xd5zCS51fRlavO/y3Q9T2aJMq9dX qs2uMg9Xe98yqmqjvGuo51pqb/c51+lfru967Q3aFb6jw7j3G7fSuBvjOmqbSm0b1G+d6rc2qltF dR1UN4PqDqW6qWq3JyhvNeV1Ul5O7dZLfQuobxb1LaC+fnVbj7qtkwpzVNhLhQuocBYVLqDCJVS4 mAoXU+EcKlwUfmz3rnDD7h3hw7tLVNimbmtRt7VQ4xxqXBR+Uv+nsEn/Z9RxjxvzWf05O8vP2WV+ ngq/ENdR41Rq3KBu61S3tVHlKqrsoMoZVHlo0EaVOylykBqrZyTV3USR+kYor0x53ZRXobx8zZ8O qHnUCLUVa+cfB9d2CUUqG6GwMoV1U1WZL5WpKU9BRQoq86IyL+qmnDy1DFNLkfeM8J4i71lFIUUK KfOcMs/ppogiRZR5TZnXdFNC3uqX+Uu1as9b9TJvKfOVMl/p5il5K1y0wmWrW7a63VY2bzWHrWbR ao5YzaLVXGUFi1awbPXKVq+75hXdNb8YsWLF2v59Ta3CLlqpEatUtkrdVmbYyhT5wwh/KPKHVVaj aDXKfKHMF7rN/rDZL5r9EbNfNPurzHjRjJfNdjn4ktmunk4OmvG1ZnyzGX9C3PeL+/5Jcd9p9tuS uH/S7Hcncd8v7nsnxX2blViSxP0T4r5f3PdPivtOq9KWxH31FKpf3PdboQ7Zo8UqLUpOoZYkp1D9 4r7fqq2yah2ySIuVW2TlpianUEuSU6hecd9rJZdbyQ4ruTg5hZqanEL1i/t+q7rKqnbIJi1WdpGV nZqcQvWL+36rvMoqd8gqLVZ6kZWempxCLRH3/eK+X9z3W/lucd9i9ReJ+/4ku3RQwCLZpYUKFon7 krjfQAmzxH2/uO8X9/1U0UMV3eK+jTKWJFmmnzo6xH2vuO8V972U0kMp3ZTSQimLKOVQcd8v7vvF fT/V9FBNt7hvo5wltWyzJ+77xX3vpLhvo6IlSdw/Ie77xX3/pLjvpKi2JO6rJ0C94r6XupZTVwd1 LU5OgKYmJ0D94r6f0lZRWocs1EJti6htqrjvFfe94r6X8noor5vyWihvEeUdKu77xX2/uO+nwh4q 7Bb3bZS4JPhaXWe8tXp+TpFPJefle87G76TO7trpyVDt/PuEeLDmCy/H+eTsdCuVVqh0FZW2TPKI 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 1dwymlrsJ6n62QX6LtReHBf52CAf2yzf5FJXGNtayzl9/KzEz0ZT13jP3nm6zvjlxrwP1+MGYzqC Wakb0YmbvfcW7QewCrfhdve6tKtxh5+1lseq/wqqlsfWpbLur8X9eMCury2YZS36rEUffyvyt0H+ NsjfBht+o+8l7Apm8a9R/jXKv0b51yj/GuVfo/xrlH+N8q9R/jXKv0b51yj/GuVfo/xrlH+N8q9R /jXKv0b51yj/GuVfo/xrlH+N8q/RTD+f/GP18L+MfZMm+FSRTxX5VJFPFflUkU8V+VSRTxUzm+NC 5h/xT/getuCf8S/4Pv4VWzGIf8NT+AGK+CF+FJf4U4k/lfhTiT+V+FOJP5X4U4k/lfhTiT+V+FOJ P5X4U4k/lfhTiT+V+FOJP5X4U4k/lfhTiT+VwoOCWWE93oKDcQgOxWE4HNOQRgMyCHEEjsRROBrH 4K2Yjhl4GxrxdhyL43A8TsA7MBOzcCKa8E7MxhychJNxCuZiHk7FfJyG07EA78IZOBNnYSHejbNx TjzI5wb53CCfG+Rzg3xukM8N8rnBsNmYC4JZwTxVxjZVxjZVxjaVxTaVxTZVREkVUVI9qNril1QL 1RqqIptXZPGKjF2RdUuybknWLcm6JS5f4fIVLl/h8hUuX+HyFS5f4fIVLl/h8hUuX+HyFS5f4fIV Ll/h8hUuX+HyFS5f4fIVLl/h8hUuX+HyFS5f4fIVLl/h8hUuX+HyFS5f4YYlblgKUsFBwYHcaDTY r/pfk/rZn+cIfe7kRX+f6K9GfT6YmpolPqs16QVi/nK91Srxg0Fj3RXm4+i6kXiwbhRPe70dz8Sz q3+vRgXWpAJrMk9Hm6ejOdiSupdrLjbIwZbUvVZzsUEONpuDFTjYbA5W4GCzOVhBhZZ9vUI7luPs qc5GeXdjUp1Vq+RwUnXW5efPq85yqfP8pO/Rt5ij7K3ULo6XpS5x71L9l6HFvctdX4FW11fhap+x TNvm3jXe+4bDLVOxhSq2UMUWcricNW5Odfj5V2pv1HbiZvN2i/YDuNX9VdrbcLv7XdrVuNPPehdU VdyukT6aU1n31+J+PGDsg/p7giaVXbahjcP9NB7lfKNJdbeM+/Vxvz7u16e6a1LdNanumhp+Y+xL 2BUP/sFKryvu4pBdHLKLQ3ZxyC4O2cUhuzhkF4fs4pBdHLKLQ3ZxyC4O2cUhuzhkF4fs4pBdHLKL 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 Omj+0jZt0/yV7bN9Zondwc4yJ9qd7GzzIduyu5iP2F3tY8wpdg/7BPNRO88+2XzcPtU+03zSLrD7 meX2OfY55jP2efYA81l7oD3QnG5fag82/2z/wB5izrKvs28wZ9uj7FvNV+zR9t3mPLvY/o35tv2w PcVcYT9qP2q+b5faj5tr7afscnO9/Yz9rPmRPcOeaW62Z9tzzI/tufYr5lb7A/sjc5v9sf2xmbC3 2lvNXfZ2e7tZZ++wd5i77Z12nVlvN3Y51mzockaXszOO6RLsMjTjxC6jutye0a/LTMfIGOB0cLIz Sp0LnEsy/ugMcoZmTHfGOndnvOy85ryW8ZrzhvP3jNedt5y3Mt5wFjlLM/7uLHeiGdXOKmdNxjtO jbM+Y7mzwfkoY4VT62zLWOPEnc8zPnAhloztbobbLuMTt73bPmOnm+l2zki4ftefsdft4uZkfOoe 6x6b8bl7nNszY5/b183LOOie7vbzGW5/9zxfe/cC9wJfJ/cSd5Cvs3u5+wOf3x3mDvN1dcPucN8x 7o/dG3zd3Yj7U19P92b3Fl8v9zZ3tK+PO9a933eS+7D7sK+/+4j7iO9s93H3Sd857lT3ad957jT3 Od9F7l/cGb6B7gvuS75L3LnuK77B7t/cv/mudOe583whd74733eVu9Bd5Lvafdt9xzfEXeZGfT9y V7mrfde577vrfCPcD91/+H7sxtxtvhvduBv33ZRzcc6Vvp/kXJVztW9Mzg9zfugblxPOuc53R86I nOt943NuyLnRd3fOTTk3++7JuTWn0Pdgzuicn/tKcqO5Ud+vc9fkrvU9lLsld5vv4dy9uZ/5Jne9 vOsVvseEPP+vKudc+JfBl4urxI3i/+GPF2u95cW83bymeGvobwQTFbyG1BkXfUtyVIDXWu1bDqJp 21N4jfUqkjJ4O7116vfXHH9zEt/ujxcHjaD2a7/jE6+S1ydf8+xt3gZvG+3ubyphG2PGky/d36rG 5iofK3uzd/u/Mk6qPSSbpUfbm9xzyNO0luL/EeFTV+S1Gak3N1nY2/NNrsIo6j0NX/Ps//AsvuQq e/7ld61Lta1s0bSHGK9PbX/NWXgNbeul5X626nmt8z4C6w5J8A1sMdEbmuSe/9s/LXnF69/q6Civ nWd5o3S/2luOVpbDat301m69Zzleu4ntTU1a0qwHJ3zJNSu8Rc3nWHrPOv2q4JXU+iI91mb92q1/ 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 SkipOyGlKsW/c51S6obON8lR8a/4f8ZQ+S0x2dMlzWbxb3dnDBMrcMg2SJEnIRVWqlzl5KAc6+T3 cqyTQ3Kskw/FWLeTw6pTdZI/yBFPjsgRTz6SY5ccxdi1YOxaxTiLU4ccDXSnHA30HTka6C45Guhv 5Gigu2VPF7M20cfp++jjVbKPs1myB7Fdsnew38rewY7KOahyTvlMLCQ+Vy5gRloLWUwgiylkMYMs 5pDFOZDFFshiK2SxDbLYDlnsgCx2QRZ7IIs1yOIgZGgUMjQOGZqADE1ChqYhQzOQoXmQoVkpPUm+ lJ6kQEpPcp2UnqSblJ6ku5SepIeUnqSnKv8CR6GqqArppTpUB+mtulQX6SNkXIzcoCW0FCmSUonc KKUS6SulEimRUoncIqUS6SelErlVSiVSLqUS6S+lErldSiVSIaUSuUNKJVIppRIZKKUSqZZSSbwP hdwRb0Ihd0iNlDtkMGZ9Q6XcIXVS7pD7pMQh90v5QoZL+UK+I+ULGSHlC3lAyhfyoJQvZLSUL2Ss lC9knJQvZLyUL6RByhfSKOULmSDlC2mW8oU8IuULaZHyhTwm5Qt5XMoXMlPKF/I9KV/ILClfyFNS vpA5Ur6QZ6R8Ic9K+ULmS/lCnpPyBS1szJc2d/bqov9v+jBV3jN8jOefV97Pbc1ty92YuyV3W+6u 3L25B3IP5x7PPZV7NvdC7qXcqxbFYrG4LH5LxJKyFFgKLUWWEkuZpcJSZamx1FlGWOotDZZmyxTL dMssy1zLAstiyzLLSssayzrLBstmS7tlp2WPZb/lkOWo5YTltOWc5aLlspVYTVab1WPVrTFrxtrN 2stabC21llsrrdXWWusw60jrWGujtcU61TrDOts6z7rQusS63LrK2mpts260brFus+6y7rMetB6x Hreesp61XrBesl61KTaLzWXz2yK2lK3AVmgrspXYymwVtipbja3ONsJWb2uwNdum2KbbZtnm2hbY FtuW2Vba1tjW2TbYNtvabTtte2z7bYdsR20nbKdt52wXbZftxG6y2+weu26P2TP2bvZe9mJ7qb3c Xmmvttfah9lH2sfaG+0t9qn2GfbZ9nn2hfYl9uX2Vfa19vX2Tfat9u323fZ99oP2I/bj9lP2s/YL 9kv2qw7FYXG4HH5HxJFyFDgKHUWOEkeZo8JR5ahx1DlGOOodDY5mxxTHdMcsx1zHAsdixzLHSsca xzrHBsdmR7tjp2OPY7/jkOOo44TjtOOc46LjspM4TU6b0+PUnTFnxtnN2ctZ7Cx1ljsrndXOWucw 50jnWGejs8U51TnDOds5z7nQucS53LnK2epsc250bnFuc+5y7nUecB52HnOedJ5xnnd+4bziYq4c l8OluUKuhCvr6uHq4+rr6uca4BroGuQa4hruGuUa72pyTXZNc810zXHNdy1yLXWtcK1xrXNtcG12 tbt2ufa6DrgOu465TrrOuM67LrmuuhW3xe1y+90Rd8pd4O7lLnaXusvdle5qd617mHuke6y70d3i nuqe4Z7tnude6F7iXu5e5W51t7k3ube6t7t3u/e5D7mPuk+4T7vPuS+6L3uIJ8fj8GiekCfhyXp6 ePp4+nrKPBWeKk+Np84zwlPvafA0i9ngdDHbm+tZ4FnsWeZZ6VnjWefZ4Nnsaffs8uz1HPAc9hzz nPKc9VzwXPJc9Spei9fl1YVczHi7eXt5i8X8r9xb6R0k5nvDxRtzvLfJO9k7zTvTO8c737vIu9S7 wrvau9a73rvJu9W73bvHe8B7xHvCe8Z7wXvJe1VTNIvm0vxaREtpBVqhVqSVaGVahVal1Wh12git XmvQmoXcnKnN0RZoi7Vl2kptjbZO26Bt1tq1ndoeIUcPa8e1U9pZ7YJ2SbvqU3wWn8vn90V8GV83 Xy9fsa/UN8A30DfIN8Q33DfKN97X5Jvsm+ab5ZvnW+Rb5lvpW+Nb59vg2+Lb5tvl2+s76DvqO+k7 4zvv+8J3xc/8OX6H3++P+TP+bv5e/mJ/qb/cX+mv9tf6h/lH+sf6G/0t/mn+Wf55/kX+Zf5V/lZ/ m3+jf4t/m3+Xf6//gP+w/5j/pP+M/7z/C/+VAAvkBBwBLRAKJALZQGGgOFAaGBAYGBgUGBIYHhgV GB9oEnJqWmBWYF5gYWBJYHlgVaA10BbYGNgS2BbYFdgbOBg4EjgeOBU4G7gYuKwT3STeCR5dl38/ XO+m99FL9HJ9oD5IH6IP10fpDXqzPkWfrs/W5+uL9KX6Cn21vlZfr28SbwAh9/UD+mH9mH5SP6Of 17/QrwRZMCfoCGrBUDARzAZ7BPsE+wb7iXdAVbBWyP36YGNwcnBacGZwTnB+cFFwaXBFcHVwbXB9 cFNwa3B7cHdwX/Bg8EjwePBU8GzwQvByiIVyQq6QPxQJpUIFocJQUagkVBaqCFWFakLDQqNC40NN ocmhaaGZoTmh+aFFoaWhFaE1oXWhDaHNYra1K7Q3dCB0OHQsdDJ0JnQ+9EXoSlgJ28JaOBJOhQvC heGicGm4PFwZrg4PCY8I14cbws3hKeHp4VnhueGF4aXhFeHV4bXh9eFN4a3h7eHd4X3hg+Ej4ePh U+Gz4QvhS+GrESViibgi/kgkkooURAojRZGSSFmkIlIVqYnURUZExkaaIlMiMyJzIgsiSyIrIqsj ayPrI5siWyPbI7sj+yIHI0cixyOnImcjFyKXIlejStQSdUX90Ug0FS2IFkaLoiXRsmhldFC0Ljoy Oj7aHJ0anRmdE50fXRRdGl0RXR1dG10f3RTdGt0e3R3dFz0YPRI9Hj0VPRu9EL0UvRpTYpaYK+aP RWKpWEGsMFYUK4mVxSpiVbGaWF1sRKw+1hBrjk2JTY/Nis2NLYgtji2LrYy1xtbHNse2xXbH9scO x47HTsXOxi7ELsWuxpW4Je6K++OReCpeEC+MF8VL4mXxinhVvCZeFx8Rr483xifHp8dnx+fHF8eX x1fH18U3xrfGt8d3x/fFD8aPxI/HT8XPxi/EL8WvJpSEJeFK+BORRCpRkChMFCVKEmWJikRVoiZR lxiRqE80JJoTUxLTE7MScxMLEosTyxIrE2sS6xIbEpsT7YmdiT2J/YlDiaOJE4nTiXOJi4nLSZI0 JW1JT1JPxpKZZLdkr2RxsjRZnqxMVidrk8OSI5Njk43JluTU5Izk7OS85MLkkuTy5Kpka7ItuTG5 NbkzuTd5MHk0eTJ5NnkxeSWlpGwpT0pPxVKZVLdUr1RxqjRVnqpMVadqU8NSI1PjU82pqamZqbmp hamlqZWpNal1qQ2pzan21M7UntT+1KHU0dSJ1OnUudTF1OU0SZvStrQnradj6Uy6W7pXujhdmi5P V6YHpevSI9Pj083pqemZ6bnpBenF6WXplek16XXpDenN6fb0zvSe9P70ofTR9In06fS59MX0lQzL 5GQcYmoZyiQy2UyPTJ9M30y/zIDMwMygzJDM8MyozPhMU2ZyZlpmZmZOZn5mUWZpZkVmdWZtZn1m U2ZrZntmd2Zf5mDmSOZ45lTmbOZi5kqekmfL0/IieZm8Hnl98vrm9csbkDcwb1DekLzheaPyGvJa 8qblzcqbl7cob1neqrzWvLa8jXlb8rbl7crbm3cg73De8bzTeefzLmVJNifryurZWDaT7ZbtlS3O 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 ONTWfkKEpqO3JC1IaHW5Op2ZMtlvOai+wvRoP36wrx8/YG61OclGq8Nla7Y1WlxW0kY7LmV0q5Py Xoe12eqwdjRaxaSlo4m0uZxkl9NKfYnodDlsja62Xo6zq2G6tdFFuuxi0tVqJUf1MUKX8tsKh6XR RRUmVCJc1nZrh4tMRJwkcbpHvraUo0O6LbY2S0MbxclPqY0KQFpcmZw7CZpFcW2QtCMyCI9EJ0gc 1pldVqfLqf0pnt3BQajDiD81r5hUpmWokEUtqFLpuq1S6rvYrg6XBXFVbbP2iJE1yYxUeaqKU2XS kaNf3aIAV2RkqH9GjiR1bW1kJYXhRAnBiWqjtUlK6g2VZp2xjDNRV1mpKzMbDSaywGjSl+iMpYYC UldWMKYelhhLjagcSjkUdpmxrCiTNI8zkFUmA1leiECjiSZnLDTqdWYDiYYmc6VRby6ZRJqq8osN ejNpLqe2cKoNlUaTsahsDL6xvIysqNTpzUa9Ae1DBEoNZWbENnWE0WSqQueRuirzuPJKxAtnmEnT sASksbSixOjh2VBTUWkwmchRqZASyvQlVQUUldFZDuK71FCpH4eGw1KWV5KFRnMZtb0QwTqyQod4 1FeV6CrJiqrKinKTQUwfMtFYUkKWlZs5+QZaSSUGeoO+vMxkmFCFmDfqSsRoS5nRbKz27BlmthxJ VUkW6Ep1RQaTlDQZDBxKTuQqNI0CA8IqMSFN6+0oDXQgk9mbf+6LLTYnyhDWJrLD3kG5VbPN2mRy B4LOhSKjoQsFEMc6C+2nnbvb0tZlJZ2tFuQHHXYX2WAlG+1oqYkmYnGSlsbGLoc7ApvtjnY6Zjjd 7rSPMJCnUhwYdVLOY+oFqX8kzIfn2+wtdmmLrVmuphIJTsjkEnnKlqQtCYvjKDKIihNFZJfzp4Qa qXKkkDY62uRBY/JNOMGWM1HOQX+/8jBZdXbDCXPxLfn1A6ff+R6++cTKoO+uzPyiuPP7KelSwT8L /b6tzN+74wJod1hSm49WHas6fOrQZFj6WMCXeZs2HG2bME1zcfOT2s6l2eBfO7O5yV9I7U989q/2 +UsevrbxobD0/Xvb/jk+ovzvNREnz/OeOffA4IT+W+9du3ry4/XTYl749uOP9syuUfTjz8n7cdRV QXnXvyGh/0pr9JOvTbb0HZWHjmjJC1eMTe8EqrijI2/Fz5K/PHp0I6EIIPzfPVtOrO75/uJdz5pb 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 Q0aZSCLiRMwXstW7FfTZGtxHbY3uI9DfAYeBb2H7Bravga+AL4EvYP8c+Ax5nyL9CfA34GPgEOwf AR8i769IfwC8D/wFeC+q2f3nqBb3u8A7wJ+Ag7AdAL8NvAW8ifQb4NeBPwJ/AH5vPcX9mnWE+1Xw 76zL3K9YM90vAy9Bv2jNdr8APA88h/xnYXvG2up+Gvop6Cehn7Ce7H7cutT9mLXF/ai12b0fdR9B ew8DDwG+0D48HwQeAO63nOq+z9LuvtfS4b7H0um+G+gF7oL9TuAO5N2OvL2wBYEeIADcZl7jvtW8 1n2LeZ37ZvN69x7zBvdvgZuAG4HdwA3A9eYc93Xga4HfoM414KvNp7ivgr4S+tfALugr0NblaOsy tHUpbJcAFwMXARcCFwC/Qr3z0d55phnuc00z3TtNze4dpuvd20273ZvlDPdZcpF7Ey9yn+nf6D9j z0b/6f71/g171vvN67l5vWv91PWnrd+z/vX1vmidaZ1/rf+0PWv9a/yr/Kv3rPLfI21hS6TNvnH+ lXu6/Jqu2K7OLvmLLr6ni5d18eFdXGJd9i5Pl2zp9Lf7O/a0+1n7rPaN7YF2zdhA+4F2ibVzU29o 3952V2oF2Leu3WqvONW/wt+2Z4V/+ZJW/8no4NKiZn/Lnmb/kqJGf9OeRn9DUb2/rqjWv7joJP+i PSf5FxbN9y/YM99fU1TtPxHl5xXN9fv3zPVXFc32z9kz2z+zaIZ/BuzTi6b6p+2Z6p9SNMk/ec8k f2VRhb8cg2fJ9mRPsmxXOjAjGT1hLj5xuMvnOuD6xKVhroBrn0uOtiW5k6QhtkReOjORr0g8PfHc RNmW8HyC5EsYMqzCFv98/Nvxf4vXxPjih+RWsDh7nCdOdipji5s+t0LlkjLiESPVsU6P82ZW2Jzc 5nQ7pXK3kzPHAccnDtn5oP15u2SzcZstZJN8NhS3RbmjJOURipJ9USNGV9isbqukPEJWOc5nhUVp cbBl1twKm9ltlvwl5plmyWcuKa3wmXOGVzCZezhn3A6SDUovuNNdgX29N45rOT7Pe+ZWZWdP7TWw OVMDhlkLAvzsQEaV8vTNnh/QnR1g/vkLqns431nTw6XSuYFY5b/YqunNO3awiSlTAylV1YGrU2qm BjZC+BQRgmApPXFsYk32oo6ujuzszkV4LOrozFZ/kOJdSipbMSo/HZ1IK7FLTbPsnwxUDLS4A6FT GDt/uta/e+A/dwd++aGHKb9kMCEkncUapU3AmcAZwEbgdGADsB5YB5wGrAXWAKuBVcBKoAvoBDqA U4E2YAWwHGgFlgGnACcDS4EWoBlYAjQBjUADUA/UAbXAYmARcBKwEFgAzAdqgGrgRGAe4AfmAlXA HGA2MAuYCcwApgPTgKnAFGAyMAmoBCqAcqAMKAUmAhMAH1ACjAdOAMYBY4ExQDFQBIwGRgEjgUKg AMgHRgDDgTwgF8gBhgHZwFBgCJAFDAYygQwgHfACg4A0wAO4gVQgBUgGXEASkAgkAPFAHOAEYoEY IBpwAHbABkQBVsACmAETYAQMgB7QAVpAMyGEpwxIAAcYa+Sw8T7gKHAE+A44DHwLfAN8DXwFfAl8 AXwOfAZ8CnwC/A34GDgEfAR8CPwV+AB4H/gL8B7wZ+Bd4B3gT8BB4ADwNvAW8CbwBvA68EfgD8Dv gdeAV4HfAa8ALwMvAS8CLwDPA88BzwLPAE8DTwFPAk8AjwOPAY8C+4FHgIeBh4B9wIPAA8D9wH3A vcA9wN1AL3AXcCdwB3A7sBcIAj1AALgNuBW4BbgZ2AP8FrgJuBHYDdwAXA9cB1wL/Aa4BrgauAq4 Evg1sAu4ArgcuAy4FLgEuBi4CLgQuAD4FXA+cB5wLrAT2AFsB7YB3cA5wNnAVmALsJk1TtjIsf85 9j/H/ufY/xz7n2P/c+x/jv3Psf859j/H/ufY/xz7n2P/c+x/jv3Psf859j9vB3AGcJwBHGcAxxnA cQZwnAEcZwDHGcBxBnCcARxnAMcZwHEGcJwBHGcAxxnAcQZwnAEcZwDHGcBxBnCcARxnAMcZwHEG cJwBHGcAxxnAcQZwnAEcZwDHGcCx/zn2P8f+59j7HHufY+9z7H2Ovc+x9zn2Psfe59j7HHv/5z6H f+Gh5ufuwC88JCxexJj+Ssb6Ljjml6hnsZNZB9uIuIXtYBewB9nrrJ5tgrqMXc1uYDexAHuIPcle +1/8vXDWt0bbyizyXUzHYhgLHQ4d6rsB6NVGDbBcgFSMxvO9JWQPfXyc7eO+C0L2vl5dNDOpda3S S7B+zo+GDuPzFenQKCUtbYW2qTU+1V/Zd1vf7uN8MJvNZwvYQnYSq2V1GH8ja2FL4ZlT2DLWypar qeXIa8ZzCVKLUQpniaq/L7WCtQHtrJN1sZWIbdAd4ZSSd6qa7mKrEFezNWwtO42tY+vDz1WqZR1y 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 /M5LyqS0KtOJMr0ok0yZWylzOzknCvX/wm5b5pVWZbpQpg9lhlDmNspMJOdUnk+/pMzZVmUSKdOP MjdRZgJlppBzGs8fbltGSmtVphtlBlLmFsqkUOYecs7geeYlZTytylxDmUGUGU2ZqZS5n5yP8Nyp 9i+zWTJbtm9/m5+XXzZHSWaT2Vy8kp9io14yGo6Wqj9mSTIbtLNSUSrxoy+VTNxbo9dL5qgNGzaY oyWz9fPSz0s3ktaSVpKio6RoamuuziAZoz4qV+uIlqToSHVt6otW64tW64u2SNG2cn7eHPfmuDVa WkWyGCWL2WAwuFctX758ldtkkEyRKkstks4S1VJnqU6SdHyFzsTtNWsMBsliXM2PxSpZYsod5Q6+ Y8Pz9uftT5OWk6xGSf3/i65YtVXSWZurbl13NPfVOKndqtVujZGs7coTyhM29N3Qd/XE1RPVwJ8w P2F+3GwzSbZoHT8j73ycnztHmg2S2Rj5glKbpLMZS6/8FbbIV9hM6lfYYiVb+6Pdj3Y/c+uBgdU5 1Tm7puzdu2PVF6u227bbYsxSjEXPz6jZ29Wf2aM0C6qPlod/YnS6GGN5y48oL1dbFMWHhSd7y/eW RxmlGPNe9UfrrRbxse4Doc8sceWIjrNd2fNEak6GW/17Bq4Vutun3msX7e9Nv93OW6pgvgqPu3ai S+RKoje2FwmRKx0zW5xI1HKF7+ipP150FZ2FflJa2kTRO33q3XYx+L70yXZ1jGp5DMLKbNhNu9IL m+goukeeRIkY0UlcE7lSf7vRmVb1yCwoLBCfacdt2nGXdtyvHSu04yHteHQeWyBxUjvK2vGsdgxp x5/Vo2TQjhbt2F5duqXO2rG/dhyjHdO14yztuEg7PqsdN+bOy50nfawdvdpxp3bcrx2rtOMR7XhS Oza0zHZXd5T+q6MZ/fWaTibO1d/o/P91T/19Y8z/+jMW59X3bvVN8XGxRmwUW8U2cVDUibOS2u+E 1hfDSshC/Z1Xc19Sf9MppJHhz5Urwp+/DbUqQ39t2NjmWrJdaHsdO77tddzgttcd/tL2uk/3ttd9 L3nef0Tb62GpIlrX6vqm+FbPjUK6a0bb6ymb+bQwQvqyZulQx4AqQjdYlyaW6d7SfSs26H+r/62o MLgNb4rKqG+MKyW95V5LhvSJ5UmrJO2ytbdN0N1he9D2uq4kJitmru5vMctiVul2xOpizbqDsU2x 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 lHQHJd1BSXdQ0h2UdAcl3UFJd1DSHZR0R8WMkFbMxL24D7NwP2bjATwYzlM5z1M5z9N31eq7avVd tapoThXNqaI5VTSniuZU0ZwqmlNFc6poThXNqaI5VTRHZ6Z0ZkpnpnRmSmemdGZKZ6Z0ZkpnpnRm SmemdGZKZ6YV/aGzYjf2YAB7sQ/7cQBiQmUerzKPV5kvV5nzKvMY/V9B/1fQ/xX0fwX9X0H/V9Al FHUJRV1Chy6hqIKfV7k1pDqFok6hqJJfrpJfXmlOleakop+noie6hmLlQechpJkIZShHHCUqfaKj KOooijqKoo6iqPInKn+isyjqLIqZ4937Dpzs2qnOT4Ncq8soUgbnUQZJ5gPe54PUwVG6jiKFcB6F kOg8ijqPos6jqPMo6jyKOo8i5XA55XA55XA55XB5Rh7NyKMZeTRzNcZiXBhJTYykJq6kJq6kIs7T zxYoiTwlkc88MPiNTMMzC/GnwW9lGp55xbEh1FIZ+Yy91PcWMnui4RRHnuLIUxx5iiOvF67VC9fq hZfqhZdSIHn98FL9cG323CinJ67VF6T6glRfkOoLUn1BC5UyV1+Q6gtSamUMtTIm++3Qmf0OLg3j 9Qdp9gqvxVT2J/gprsQYz7wK1qV3aNE7pHqHVO+QUjg5Cienh0j1EGn2N+6/afBbBVOqJ6efSPUT qX4i1U+kVNB4KihHBR2nr0gpofGUUE5vkeotUr1FqrdI9Rap3iKlkMZQSGMopDEU0pjsVs/ehjcg 12fleqppBtU0g2qaSzXNpZbGU0tjqKW51NJ4aimn1y/o9Qt6/YJev6DXL+j1C3r9gl6/oNcv6PUL ev2CXr+g1y/o9Qt6/YJev6DXL+j1C1RXnurKU115qitPdeWprjzVlae68lRXnurKU115qitPdeWp rjzVlae68lRXnurKV33QnD6Ej4XaqnPwXc/+gfPL8EP8yLXLHf8DIzEKPw0dFFqeQstTaPmqqT4z 3fXfu3deWFr1qNePoT8UhkTRcAouP8TahhwVaoccHeVyXw1bcl/D13FxuJCyuzD3ba+vC5258ZiI vym9aV7/EjdGCcWXUHwJxZdQfAnFl1B8CcWXUHwJxZdQfAnFl1B8CcWXUHwJxZdQfAnFl1B8CcWX UHwJxZdQfAnFl1B8CcWXUHwJxZdQfAnFl/x/VHzJPyi+o6Nbw8fLLo2+UPa96Ktl34+uK/v36F/K fhB9vOyy6BvlF0QXl4+Mvh5fFD4dXxw+FT8b5sbPhS/Em8OrtOGwWIaL3wi3x9vDirg9envcod/a EXZHJ0a3Hnw5ejysiZaHNZ7+yUPfBvsRTz/D08/w9H8uGxl2q63bjKKb05VdFM4xyieMMi5eGpbE y/Dcwc74hbBIjVsfvxReiV8Otxr9F0YeiLeFNqOfY/TpRo+N/oDRX46q4lVhTtxgTjr5eE34QdwU Fsd5n1oXmlXFjXTq4+HP5vZnd35T7Vzl7hnunhivOXjQ3Q+7+7Pq6CKfuNYn7hv8bsczzXaSav4O 1fuz5V9QyUeGkeU/ieLyx+jkl8O/l68IM8s3RR8u71eRh0VD4zPD7+KlUaJKn2kFfzTSCv1oHK/R a64Nf1KlKz39oBXlVeqJhyp1fKgnja2sLW63qg7Xd4Susm9EFWFxVIkMsqjCEORQjQQ1OAxDw5Lo cJwTmqNz8fOwMPoFfokbcCN+hV/jN7gJN+NWNlwcGqNnQ2NZeWgui1GBSmSQRRWGIIdq1OBwHIEj cRSG4WgMxzE4FsfhBJyId+IkvAsn4xScitPwbnwpbCz7Mr6Cr+JrmITJmIKpmIaf4ef4BX6JG3Aj foXbwoay23EH7sRduBv3YEbYUP6BsLD8bIzAl8Mz5b8OxfLfhCIvv8iudPKzA3xsoZ3o5GNf5GMH 4t0Ht8d7RMRAyMZ7D+6J9x1sjveHTHzgYFv8ZhgRH3Q9hOMqKg9ur8iET1dkQ7ai6uCeiiEHmyty IVNRfbCtIgkjKmpcP8x9Y8PiinG4BtfiOozHBEzE9ZiEyZiC34bmikcwB7/DXPwe8/AoHsPj+AOe wHwswEL8EU+iFn/CIjwTNlYsxrNYgqVYhufwPF7Ai3gJL2M51oSFFU3IYy3WYT0K2IAimtGCjWFh 5f6wOBOD/2Yqw5LMkY5H4WScjrPwodCc+ajjzWFj5h7MdG6dmd95bT0Z68lYT8Z6MgtcW4gnUYun sdj1Z7EES2HuGXPP1Hn9Gv7idT1WYTXWYX3YkCl6rw070INe7EIf+rEnbMwehqE4HEfg2LAhexze hrfjeJwdmrMfxZiwMHsVpmIabseDeDg0Zh933BMWVr07bKw6IzRXvd/xA44X4otefzNsqPqB9y/D D/Fr12e6fi/uwyw8jv1hw5AobBxyhKP4GiKuhrwNx4fm3A9CMTcKV+AnuBJjId5z4j0n3nPiPSfe c+I9dwtuxXTcBvPN3YE7cRfuxj2YgZm4F/dhFu7HbDwAa8w9hIfxWzyCOWFh9b+FYvXn8Hl8ARfi i/gSvoyJ4Znq6zEJkzEFUzENP8PP8Qv8EjfgRvwKv8ZvcBNuxi24FdNxG+7AnbgLd+MezMBM3Bue Sc4ICw8bEp45LIfq8ExUoVYslPk74rXR++XlA9Hd0YQwK5qI6zEJk7E3FPXPRf1zUf9c1D8X9c+p /jnVP6f651T/nOqfU/1zqn9O9c+p/jnVP6f651T/nOqfU/1zqn9O9c+p/jnVP6f651T/nOqfU/1z qn9O9c+p/jnVP6f651T/nOqfU/1zqn9O9c+p/jnVP6f651T/nOqfU/1zqn9OS9/CVfZn81wROvWs nXrWTj1rp561Ux86Ux86U9/ZpO9s0nc2lc8J2wd/P/I/f+vo9fI94XXVrKCKzYpXRyeql60q2M16 uFl6uFl6uFl6uE49XKcertQ/FfVPRf1TUc+U6plSPVOqZ0r1TKmeKdUjzdIHzdKnzNKTzNJDzNJD pHqETr1Bqg/o1Ad0Zk8PxewZg9/H2Un7l7R8kc4u0tZFWrhIAxfp35T+TenflP5N6d+U/k3p35T+ TenflP5N6d+U/k3p35T+TenflP5N6d+U/k3p1U56tZNeTWnUzqpxnj3V69+XvjUtpPRmSm92Dhkm ni4OM2nMmTRlE03ZlEwK25PJmBK21wwLr9ccjeE4Ee/ENNcfCa9H5arKH9R1Oi5+NvpYvCT6Tvx8 dHb8QnQs+z4dv0RJvRy9O14VXcjWF+rrKymGT+rtj4zz0QfZ/a+Uwwl0zmZXt0Sn0wsX0gunxduj 8z33pUM/yz7DSC+Gx91/5+CYC703iqpYEh3m2qvOVpe+l/J//y7dspHRiP/++3TN5yzR8XGjfl49 /Kw5/OeVs1TLPa5+WrVcolp2DH5H8Y7Sf6N09Xhnnxz8meIx7j3VHEr/i+CN6H3ueL+z1dEIKxzm vROstfStbxeH+nhsdI75v1TxCXqt3JWVzl5zt9pEE+50ttHZFVGNs33OVkbvjiqiEVElMsiiCkOQ QzUS1OAwI14UHR1/i8a7FFdY0xI68AU688XQWDE2GlExDtfgWlyH8ZiAibgekzAZU6IRevkRevYR evYRevQRevQRevIR+u8Reu8R+u0Rg///ooa67TPSRqt4I37eTpb+m8mL4Snqdoe1j2WTZ81rmbus 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 i9e11pniTV1PNxNf6nN0SzFft9atxRL9F32R+EVfqv8qVugr9BVirb5KXyXW6av11WK97qS7ig36 Zt1dbNW369vFdn2n7ieydX89SBzWD+mHJdeP6yek1E/pp6XSw/QY6et/6n/KZD1Wj5UV9Tg9Xqbo yXqyTNVT9AxZWX+h58gGep5eJE/Ty/QueYbeow/K9vqQNvIqv55fT17rN/BPktf5p/qnyev9Zn4z eYN/jt9cdvXP9VvKG/3Wfmt5s3+xf6ns7l/mXyZ7+H/1O8jb/Cv9jvIO/zr/OtnLv9nvIe/y7/b/ Lu/1+/v9ZV9/oD9Q3u8/5D8i+/lP+E/KB/2n/aFykD/MHyYf8kf6I+XD/ij/JfmI/7r/LznEn+JP kU/5U/2p8ml/l79bDvX3+nvls/5+f78cFgLwyeEhGZJyZEiHwvK5UBCqLEeH0kPpclKoSqi6nBzK DGXKf4WvDHeSb4S7hbvJ/4S7h7vLd8O3hW+X74XvDN8pPwj3Ct8lPwzfE75HfhTuG+4rPw73D/eX 08MDwoPljPAT4bfkp+HPwt/I9eGF4V/l9vCK8HqZEz4QyZB5kdqR4V5mZGRkovds5MPILG9c5MfI Lu/1QAdp3nfBycEF3vLg2uA2b39wZ3CPCgW9gz4qMegb9FPJQf+gv6oUDAgeU6nBkOBZlRkMD4ar +sHI4HnVIBgVTFAnB68Er6gzg8nBW+qs4O3gfdU6mBbMUBcGnwSfqHbBp8Gn6rLg8+Ab1T74PvhZ dQwWBAvU9cGiYInqEiwNVqpuwepgh7o12B3sV32Dg8EhNSDIi5IaHOVRrh6JyqhSj0b9aFQ9Hk2K pqqh0bRomnoumhGtqp6PVo/WUaOj9aL11Ljo4OhgNT76cPQxNSE6JPqMejU6IvqcmhJ9ITpKTY2+ GH1RvRN9KfqS+k/05ehE9W50UvR1NS2BJySomQnJCZXVnIQqCdXUjwn7Eg6qn4mHMX8nCs6vcDk1 oEw6QYeZbtaaDdTYbER4WYk58sxL5m2c2eYpXF1uOqPMbIQ2xtM3ms3wV8evcoqVt6mbzR6cv6Xp EurZDfd8qfw+CPdJkZgVqCHV1nLEA5oX8v1ichEOMJJfT1Fcry3KY/7dlFDn92aV2W5+AIU1uNus 0ng8hsMH1VFx6uvMVjPbrI9f7SpW+xa45WalmW/2m0sphLY7iWoWSs8rrTKzF89uDyj8xjnaHzOW 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 S3GULCJTWCMWPMKs26X02WxPRjgbOTN1k+ZYSp92FoEtOPpKonEVcie1DPLoVQ35OJYr8TAWeQz6 TURjDfryaI7SOg7NVryNQ9MAy4NKX3FYrygPGX9z5vItY9hJJkSZPF5n7e8CdhAl1h0OY6XysE/h oSrHqktrNfJnJ/raSl/fdV2axTbK3eTABjyvj+IfR0NH3oS57CRWxdAXgO2w7Bkf9xTnxSly7wiZ EFlq3Eqr7HP7CJmsNh3gWDQ3YVmSY5XEci29VmIzCS6gtUV8/tbwc0ky5vnM8TP0peAHjKd7ZMl8 745mrZY+i3hqTUYl46jOIKuJhkYm6I7nZ6gDS4jesvhY6qcGK1UsqlT0OkCvZVimyPZqWM4nM7NV TpaRgmTaQlZcxz8lOqPjc0S93coalYW3M8L9ccUrwbVGj7ImPmcn+tY3onNZvflq+QyjqkGvqK6q 5xE8JT4gXcirLnpNz2/l5b+QdfuwoQ7Y6DwaQ98W5lMyfyGrqXNcGtVGLIeib0vkxyt9XVpIrdCq Eq3IbJhOaw6zbsx8d8An4Ck8N2G9GsIy8NrYRqvckHgdtbI9rTXT58NCzqaXyYpTvH96ilw9RT6f Yi1UPkHchsVXsRJodNaTmGm96CpGzTnA6ixSppFFaVxl7F4su0CucXJI89C/Bv6aGniEGqgVpi3j rEuWViOH15PV1CJvOQNLtX8dfU8smyJfh34mI9+EPBf91amNsDdn3xF9Ta5HSU3M38V6tdazlTW9 nnmVia5rqY94l7yojpaRD2cuOVi2TvGah76lpLT3WTJeWS+fnqeeRfilNQn12zHxk0alZKLPVL2I alK36GebU+318+cpvoWRykSujlwduaZ+OjqVq59g9/re6Ocg/1U/taWfh/fyCuQDyPtV1u/O+L7v 6+/MoM/Vz+B5P6/y6yjH+IWZRUr99L6Ifrs8la3foUhl67cwUm8le+rvzKQ9qL8zo/LpxSqnhief 1N+ZSTuk/pO7lWkHkbep/7S9yL8hRzatYE0sO8Iu+sszOrbTO6MxJ5/FfgZy1GsfY85DXxZ9IWVa Q2ZXFR5kviNonQ/T0F+OZWOOtR/9anzWQFOXyESak7Tegv1ojriaKJ2EQzl6Iyyr0FctqyFXQ66R /Bj9CeQq+In05RnJX5ArId+Mn83K9DRkfksnPZ3WW9CMwtt7+sszeLgcD9WRqyPX1G+pe/vPkYvB ovS6ijHXYMydWOWpzPQYrYwtOQvNX+EKmEfreZ6Xpr2O/AY+lyCPweZt+DT6+cgbkI/qCPW3L/xo NQ9r8m64PZ2PTNz0/etU9dM/6nhOsxb6frfXHNHW04s1kpEmNRTmQHrhofrp5VjS9zSzPj0VeTc+ P0LehHyAVjLq9FdofsCPfpagJd/TyeN7cKX4tk6p5NtaB+JfqNBfeKjN71qc5vtZlfTsCNYpzRy+ Q72Cz2/zLY/g+1B/3WIpn2rmG4umSfIcvfLyLci1KpsPkY+EW/T5A99jzQ9XUAVFMoMlmfXEdr6v T0/JvqNP17tkfs+O/e6WvdJQTOMb2uRIoTatG+eIv7bk50tRcZImOVLRS7lSTxpJM2krnUVfletv dI6Xe2WQDJVHZHJsX1DS5UKpJMXkMvmzNJZr5UZfv+7yx75NnpAJ0kfuk2HyqEyJ7QtJhpSRynKe 1JL6cqVcJ3+RrtJTjHSQJ/21sa8MlgdlpEzl7xRGfc6VTLlIqkhxuVwaSBN/dblJukkvsfJXGSvP Sj+5X4bLKJnmR2GbtWzZVK5tfcP1OdKpbevrcmQiXs6TwnKOlJUL5GJ/haktV8n10krayR1ytz9S NbldxnnL/vKAPCSj5Xn6ZEg5uURKSh25WlrIzVJdpqMvLkUkS8r7SlxVzpe6PpLXyA2+UreX7nKP JPy1vaM8Jc/JAPmbjJDH5IV4BNlSQCrIn+RSKSVXSFNpKW3kFrnTxz4pNaWTPC2TZKAMkYdljMyQ FzvX6NvZboTb4W64H+bBU8ow7NyxZ78wCxaDObAyzIX1YdPOHft2DVvDdrAD7AJ7wN5wQOfOvXqH D8DRcCKcBefDZXA93NGl5513hPvgIXi8y9339ApPKRMGpkMHs2FJmAPLd+vTsXPiYlgLNoTXwraw A+wO+/iDdEw8AIfDkfCJnnf375UYDyfB6XAWnAvfggvgkp73dO6ZWA7XwA1wK9zpTfok9sD98Ag8 AVPKZAgzYaF7/CZZDJaCZWBFWBXmwrqw4T19utydvBo2h617q74d7AC7wB6wNxwAH4DD+/qVTY6E Y+EzcBqcCefAt/reeXe35AK4BC6Hq+F6uAlu79urc+/kLrgfHlemCcyE2bB0377VqqdVhNVgbdgQ NoUtYTvPGmm3w+6wNxwEh8GRcKxnzbSJcDqcDd+AC+BS+LFnbtp6uAluh7vgXngA5vXt36lv2kll usAkzIKFYXFYum//3n3Ty8LKsBqsBevBxrBpPx//9BawLWwPb4fdYE/YBw4S/SXkIr4O/PGt9XXo fCn1H0oBP576rzDhq2LC16U0Sf//tBeyF8mBr4pns8AfovXXiHP4hen/HSnw1f2fs/AfovH/LHvm jL0gvj4rM/8gz/2DvOD/YaE/RB1zDns5/8/eP3Ryhs79i7T+6l5Miv/b0nlIxr8CKfNvbS+Ssv/W tpyU/ze2gb/6/6v8VyMY+Fcz/yoL/gFW96/i+vlXL+NlpsyX5bJRdkteEAbZQdkgN2gStA26BP2C EcH4YGYwP1gebAx2B3kmNKVNczPYjDaTzBzzvllttpp95qTNtCVtZVvXXmvb2x52sB1tJ9k5/tzX Y6VHZ4NtcdZ+p7P2x5y1/8Tv9sOz2pO+vGyRtOB3+5m5Z+5nzTizvzt+pv/s9mfuF5Uz/RfNPmu/ /Fn2Tc/av/Ws/bPmU3TrmfvFKp613/Ks/UFnjr/U9DPbL1h05n65i8/ar/q7fX/+lqt2Vvtw9o2v OYWjGVZoGW0rRjMPff4V8zWxfKxdH2+3xtvd8fbQP7OunBtv68fbpvG27ZmjqDz6zFlWqXXmftXU mfaXtjtzv/pZq1Cjxln7uWftrz9rf8NZ+/vP2j9w5n7Nwr/LMi/Uyj5rv9aZ9rVqn7V/dvu1Z+03 P2u/xZmrWOdaT+cj0zmYIN2CKVTrTv6f+DN1vASJQolzuQoVlmRWM7cyq6lb7pa6ZV6TDH4OfvZ2 h4JDejcZHBETHAuOiXWNXCMJ3ZXuSn+91nww9iqr62VMYVPUa/RbWU7HYwv4nlX9fjF/R9XH3/Ot lJ1yMsj2Y0j3o8rOaiUmq2lWa89mWW08dXaFfA3XO85q/o6wntsr1hTyY/qR7Uq3z2+L+v2f2K50 m8T4vS2eK91Wz4/9XDVDS0oZt9OPdalv/ZbtSrfLb5f5/e/Yrvyd5e7Y8vvYck9s+UNs+Y/xXsd4 mzPe6xnvP1pa0HIDLS1/3+JWM8I1jHAtI/xHy3paNtCykRYjacb/86fZOUbv5AuZQj6qRX1UbdbV Wdf4qC91SyXpx7TMR8qKvqYILM8P/f+Kvv9wP6vhfrdgUFCGBiWDC2QYfy90RNA+uFUeDnoGvWQk fyN0dHBv0E8eC0YHo+XJYGLwnIwNDgeH5angeHBcng5+C36T8ZoaMsEkTVKeMVkmS54155pzZaIp ZorJc+Z8c75MMheZi2SyqWQqyRRTzbSUqaaf6S9LzEAzUJb66j9YPjR/M0NkmRlhRshy86h5VFaY 8Wa8rDTPmmdllZlpNsvHtoDPmlM21+ZKyja2TSTfNrPNAmOn2qmBDfuFLwRhonOic1Aj0TXRNaiZ uCNxR5CbuDNxZ3BZom+ib1Ar0T/RP7g8MTAxMKid+CI5MqiT2SazY3Aw89FzgiCVVSjrKnNf1i1Z 08zrBboU6GGOFhhaYIw56YxLt+nuQnehLeguchfZQq6cK2fPdRVcBVvYVXKVbBFXxVWx2e4Sd4kt 6i51l9pirrqrbs9zuS7XFne1XC1bwtV2tW1JV9fVtee7eq6eLeXqu/r2AtfQNbSlXWPX2P7JNXFN bI5r6praC10H18GWcV1cF3uR6+a62bKuu+tuy7lerpct7+5x99gK7l53r63o+rv+tpIb6Abayu4+ d5+t4oa6ofZi96B70F7iHnYP26pupBtpL3Wj3WhbzT3uHrfV3ZPuSVvDPeWesjXdeDfe5rpn3DP2 MjfRTbS13CQ3yV7uprgptrab5qbZOm66m27ruhluhr3CzXQzbT03y82yf3az3Wxb381xc2wDN9fN tQ3da+4128i96d60jd3b7m17pXvHvWObuHfdu/Yq9557z17tFrqF9hq3xC2xTd2H7kPbzH3kPrLX uhVuhb3OrXKrbHP3ifvEXu8+dZ/aFu4z95m9wa1z62xL97n73LZyX7gvbGv3pfvStnGb3Wbb1n3l vrI3um1um/2L+8Z9Y29yP7ufbTt3yB2yN7sj7oht7/Jcnr3FHXe/2Ft98nakfgmVKwhOBid9FcsP 8n31SBh//8F5luA8S3KepZmSpqSkmzKmjGSYiqaiZNqmvrqdk+iU6CRZiS6JLlIg0S3RTVyie6K7 FEz0SfSRQol+iX5ybmJAYoAUdjkuR4q4Mq6MP8fLurJS1JV35aWYq+gqynmusqssxd3F7mIp4aq6 qlLSVXPV+DsANaWUu8xdJhe4y93lUtrVcXXkT+4Kd4XkuD+7P8uFroFr4KuV1t+LqL9l3TXuGinn bnO3SXnX2XWWCq6r6yoV3R3uDqnkerqeUtnd7e6WKq636y0Xu36un1ziBrgBUtUNcoPkUjfEDZFq bpgbJtXdCDdCarhH3aNS041yoyTXjXFj5DL3hHtCarlxbpxc7p52T0ttN8FNkDruWfes1HXPuefk CjfZTfb1eqqbKn92z7vnpb57wb0gDdyL7kVp6F5yL0kj97J7WRq7V9wrcqV71b0qTdw8N0+ucm+4 N+Rq95Z7S65x8918aer+7v4uzdwCt0Cude+79+U6t9gtlubUv+upfy187VwuN/jauVJauo999Wzl Vvtq29qt8dW2jVvrq21bt95X2RvdBl9l/+I2+ip7k9vkrxnt3BZ/zbjZbfXXjPZuh9sht/Ab/Le6 g+6g3OYOu8PSwR11R+Wv7pg7JrfHd2n6yieXWlvJ51YiuC24zau7Bl0lCN8N3xWTPJ08LTa9fnp9 X4f/d7LP18D/Zt9/sy/OvpJkX2V9tRXcmdz23xz7b479L+VYkOjhX88XCsqYXHt12E5KSV3ev9H3 MTpJD//6fbB/ZTlanpJJMkPmyFvyviyT1bJBtsou2SdH/Ct7CZJBVsYgsRl9M/pl3Me2f8ZgtgMy 7mc7MONvftvPS0PY9ssYyrZ/xjC2AzIeZDsw4yG/7e/tRrDtl/Ew2/4Zj7AdkPEo24EZo/x2gLcb zbZfxmNs+2eMYTsg43G2AzOe9NuB3m4s234Z49j2z3iK7YCMp9kOzHhAjG8d7tk/Y6TngIwnPAf+ BxGZwMz7ZjwTR+bZODIT48g8F0dmUhyZyXFEpsQRmRpH5Pk4ItPjiLwQR2RGHJEX44i8FEdkVhyR l+OIzI4j8kockVfjiMyNIzIvjshrcURejyMy3s+/b8Y0IjKTiMz5DyPyZhyRt+KIvB1HZH4ckXfi iLwbR2RBnCvvxZF5P47Mwjgyi+LILI4jsySOyAdxRD6MI7IsjshHcUSWxxFZEUdkVRyRj+OIfBJH ZHUckU/jiLxBRP5OpiwlIiv/w4h8FkdkbRyRdXFE1scR+TyOyBdxRDbGEfkyjsimOCKb44h8FUdk axyRbXGubI8j83UcmR1xZL6JI7Mzjsy3cUS+iyOyO47I93FE9sQR+SGOyBoisoGIbCFTdv2HEfkx jsi+OCI/xRHZH0fk5zgiB+OIHIojcjiOyJE4IkfjiByLI3I8jsgvcUROxBH5NY7Ib3FETsUROR1H JBXnSn4UmUyJIpMZRJHJNFFkMm0cmb1E5AARySMiJzVT9O9g6rh5mtZOKgUbzPO2ub3BdrN32B72 LtvX9rcD7X32b3akHWVH28fsGPu4vwveZb+zu+33do/9we61P9p99ie73/5sD9iD9pA9bI/YozbP HitQS/9OVbA+WO8PME2/e22vs9eJsS1sC7G2i+0qoe1u75Sk7WP7SLrtZ/tJhh1gB/hXAoPsIDnH PmAfkCw7xD4kBexkO1mK2PftZ5Jd4LICl/GUoaRkhqXDP4U54YVhmfCisGxYLiwfVtCZ+REd42l8 9HqlVPxsooq2+T7R0+zA9vwfi4qxxcX6bMr29C0SZof6q2oVw4pyzu/6RcfNDouGxcLzwuJhibCk /p6gt/2/xzVSVgqGhcMiYSJMhmlhepgRZobnhFlhgdCFBcNCoT7vCv3chvpBah8T/jmsL1lho7CR ON9WS4rbWXa2nWtft8vtCrvSrrIf20/savupXWM/+2cR16dl9iX7kvf4sn5r3b5qX/Xxfs36Ouoj 95E/3i770/94f8lbvepb37cL7SK72C6xH9il9kO7zH70z9YY77PsLO99tp2tn7e1c733162vzn6E n3nvOg/1XlWy/6nXfzIPYrYrjpn2+xezi36aDb5f4m4zXx6SEfKwPCKPykgZ5c/rx2QMf731SRkr 4/xZ/rSMlwnyjDwrE+U5f85PlikyVabJ8zJdXtDPNchMeUlmycsyW17x9eBVmSvz5DV5Xd6QN311 eFvmyzvyd3lXFsh7vlYslEWyWJbIB7JUPvSV4yNZLitkpaySj+UTX0c+lTXymayVdbJePvdV5QvZ KF/KJtksW+QrX2O2yXb5WnbIN7JTvvUV5zvZLd/LHvlB9sqPvv78JPvlZzkgB+WQHPbV6KjkyTE5 Lr/ICflVTspvckpOS0ryfRoHppVpbdqYtuZG8xdzk2lnbjbtzS3mVnOb6WD+am43HU0n09l0MV1N N3OH6W7uND3MXaan6WXuNveY3uZeM91sMV+ZrWab2W6+NjvMN2an+dbsMt+Z3eZ7s8f8YPaaH80+ 85PZbzPNz+aAPcccNIfMYXPEHDV55pg5bn4xJ8yv5qT5zZwyp03K5PsSpN+lsDa0CZu0aTbdZthW trVtY9vaW+1t9nbb0fay99oR9mH7iH3UPm2fs1PsG/ZN+7adbxfY9+xau86ut5/bDfYLu9F+aTfZ zXaL/cputdvsdvu13WG/sTvtt+EVYT39u7jhxvDLcFO4OdwSfhVuDbeF28Ovwx3hN+HO8NtwV/hd uDv8P+x9B1gUydpuVc/01NDd0+QcBFQUFeghCSpmoooB1oAoEhUTiBgwrIphzbpmMQGCEXPOec1Z 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 JtPh0vzKvf/2D58PFt0NCmVuZHN0cmVhbQ1lbmRvYmoNMzEgMCBvYmoNPDwvQml0c1BlckNvbXBv bmVudCA4L0NvbG9yU3BhY2VbL0luZGV4ZWQvRGV2aWNlUkdCIDI1NSAzMCAwIFJdL0ZpbHRlci9G bGF0ZURlY29kZS9IZWlnaHQgNDUvSW50ZXJwb2xhdGUgZmFsc2UvTGVuZ3RoIDM1MTQvU3VidHlw ZS9JbWFnZS9UeXBlL1hPYmplY3QvV2lkdGggMTY1Pj5zdHJlYW0NCnicrVmFnxu3El5ptZKZfczM zMzMOWa+MDMzMydNwykmbQOFYJmZGR/ze//Bk7T22ZdeoOnpF/uy2rXm08A3M1oo8AGAAOkQBPax TSl3XYkUAISiaJuQ/9ieEIU7DboWvQvueP9Bhh2ZZAMiUrAUAYCRW2L7IBDEX8MRHVu5w5r3uP8g IAUGS2RoAADQrrjIKTdLnBUC6YUIJSTcXUtwwhFSgQgwAyGMSZVSo1QqNygw4Hi/PeB3BowBST8g 02KSfpdA0TZ+C0ZmT6T03p/VktdVvXWrTnfhcJslKT0Gg4e33NyFnLQmUpiioqN+Fbqrsph0CO+M 4cFAquIudp3cXpjck6MPcSvyjw5p1ReV7j6tfXeK+fpMJ1VCBlLZ5bkKQHA3g1PxkjShcQPAnIEc 12uTh8MsG40KRVWVYoM6MqOtvPHpqa8tO/X2t2hUGtWeCKBmqzWI/e/OfklvYKWGTCRInLWl/8Bj cx5WOAuFVIxH/PQ3O/sfzTiGWOBDbmwaVD7tz3hTRQK2PZHOQsBhMQZjX8xrBdFjZFj1+xx37Ojz j539EBacIhYAWSI4dia2M/bRK2UuGIoYsVs0tg1rYh+CLNQAQ05nkc2y8rfIdqiId63Pn0CMwnfF /1VCRIlndEb2eZHq6OcpOw6c+ZOuvMSEBREx8Qhlti7yZtoTALe4yOlVkmT7A8SQg8h5O1wtEwny x3cyIKSRICDnWWZOjI2vdV7GpOC53sA/KjkiCt/09JSHoZyfAP+JLf9w3XOoCGctLdavnUhzT41l Lgbxr+9A8IfjLx/HQCBx8b15O7Hscz4hdpAcNJvCBNMh2ZIqkhLyVjZ2BY6z4gOPKcVZFAfEDnPb CQwCxeXOzzHL3qQg770KA31GQhGj5kYsyCGu8tjZMbSgLOioD2a2F4GodA9vW6hLmECQjya+iAVM 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 SCxuwcWJ7gYoOJ506MZ2uuIAKNi8Gsiwf8u7kXuClHsjwnMelI9h5LKXJp6mQ2e37qeNBsvJ4q/L lLGate1N5hUot9y/Den/AWzKWtwNCmVuZHN0cmVhbQ1lbmRvYmoNMzIgMCBvYmoNPDwvQml0c1Bl ckNvbXBvbmVudCA4L0NvbG9yU3BhY2UvRGV2aWNlUkdCL0ZpbHRlci9EQ1REZWNvZGUvSGVpZ2h0 IDExOC9JbnRlcnBvbGF0ZSB0cnVlL0xlbmd0aCA2NzQ5L1N1YnR5cGUvSW1hZ2UvVHlwZS9YT2Jq ZWN0L1dpZHRoIDE5Mz4+c3RyZWFtDQr/2P/gABBKRklGAAEBAQBgAGAAAP/bAEMACAYGBwYFCAcH BwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicgIiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/b AEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMv/AABEIAHYAwQMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUG BwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR 8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5 eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj 5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQAC AQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXx FxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqS k5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T1 9vf4+fr/2gAMAwEAAhEDEQA/APf6KKKACiiigAooooAKKKKACiiigAoopM0AFGahmuIra3eWZ1ji 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 zTyzeIom2N/Du5z6+ua9yeCq4ml7PFzVlskccasKcr0Fr1uRap4s8J6nB5V7dxTxK27y/LkPP4LW fd/Eqwhg8rTbSeXau1dy+Wi4+vNejR/B7wsj5+zO3+8xrbsPAPhvT/8AVadF/wACrKGU4SKs7tLo bSxlV9EjxOy+IVlDG9xdJdT3sn3mVQFUf3U56fzrP1/xhdeI7T+zdKtJ08/5ZN33mHpx2r6AXwL4 bR966Tb/APfNXLfw1pFs++LToFdfuttrop4HCQqc6jqS8VWceVvQ+abA3vgnWbiK60meW4aMeW23 5dpGeDg5z0/CtOfxrqt1A8SeHp2Rvvfe+Yf9819ITWNrckNLbxOy/wB5QaFsLVPu28X/AHwK1rUc PWqe0qQuyaeIq0o8sHZHzbP4g8XXsDxW/h6WLzFKqyq3y8Y4zVKx8FeM9GS31e10lpXkV1ZWx+7z 68ivqMQRJ92Jf++RUm2rpxpUouMIKz3FOvUm1JvVHzV9g+Jdz9zTFXd/sjv+Jqax+G3xAsrHdauq 7mLNCzDr+P8AhX0hijFKMKUVZQRTxFVu7kz5zTwJ8Srn5HmSJP8AdH+Aq4Pgl4j+S7/tn/Tf4tzZ Kj2NfQOKTHvTjaPwpL5ClWqS3k/vPBB8EdeuU2Xut7ov4l3Zr2Hwz4ft/DOhW+l2qfJEu1m/vH1r a59aU029LGbberdwFLRRSAKKKKACiiigBCKia2jf76I3+8KKKAEEMMf3Yl/75FSBF9KKKGwFxQFo ooAXFLRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB//2Q0KZW5kc3RyZWFt DWVuZG9iag0xIDAgb2JqDTw8L0xlbmd0aCAzMTYxL1N1YnR5cGUvWE1ML1R5cGUvTWV0YWRhdGE+ PnN0cmVhbQ0KPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtj OWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUg WE1QIENvcmUgNS40LWMwMDUgNzguMTQ3MzI2LCAyMDEyLzA4LzIzLTEzOjAzOjAzICAgICAgICAi PgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRm LXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAg ICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAg IHhtbG5zOnBkZj0iaHR0cDovL25zLmFkb2JlLmNvbS9wZGYvMS4zLyIKICAgICAgICAgICAgeG1s bnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICAgICAgICAgIHht bG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+CiAgICAgICAgIDx4bXA6 Q3JlYXRlRGF0ZT4yMDE2LTAzLTE1VDE1OjI0OjIzPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAg PHhtcDpDcmVhdG9yVG9vbD5jb252ZXJ0b25saW5lZnJlZS5jb208L3htcDpDcmVhdG9yVG9vbD4K ICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTYtMDMtMTVUMTc6MjQ6MTQrMDI6MDA8L3htcDpN b2RpZnlEYXRlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDE2LTAzLTE1VDE3OjI0OjE0 KzAyOjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8cGRmOlByb2R1Y2VyPmNvbnZlcnRv bmxpbmVmcmVlLmNvbTwvcGRmOlByb2R1Y2VyPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD51 dWlkOjQ3Mzg0MDZmLWI4ODUtNDNlNS1iZWM4LTg5M2U1YmYxZWJjMDwveG1wTU06RG9jdW1lbnRJ RD4KICAgICAgICAgPHhtcE1NOkluc3RhbmNlSUQ+dXVpZDo3ZjViYjZjNC0xNDlkLTQ5NjgtYmIy Ni0zY2MxYzEzNzI0NGE8L3htcE1NOkluc3RhbmNlSUQ+CiAgICAgICAgIDxkYzpmb3JtYXQ+YXBw bGljYXRpb24vcGRmPC9kYzpmb3JtYXQ+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3Jk ZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg ICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz4NCmVuZHN0cmVhbQ1lbmRvYmoNMiAw IG9iag08PC9GaWx0ZXIvRmxhdGVEZWNvZGUvRmlyc3QgNC9MZW5ndGggNDgvTiAxL1R5cGUvT2Jq U3RtPj5zdHJlYW0NCmjeMlUwULCx0XfOL80rUTDU985MKY62BIoFxeqHVBak6gckpqcW29kBBBgA 1ncLgA0KZW5kc3RyZWFtDWVuZG9iag0zIDAgb2JqDTw8L0ZpbHRlci9GbGF0ZURlY29kZS9GaXJz dCA0L0xlbmd0aCAxMDcvTiAxL1R5cGUvT2JqU3RtPj5zdHJlYW0NCmjeMlMwULCx0XcuSk0syczP c0ksSdVwsTIyMDQzMDY0NTQ1MjEyjtKEyOcXaSTn55WlFpXk5+Vk5qWmFaWm6iXn52rq++anoOs0 NzIxNNE2MFI3MFDX1A8oyk8pTU7FZYCdHUCAAQDu2CpDDQplbmRzdHJlYW0NZW5kb2JqDTQgMCBv YmoNPDwvRGVjb2RlUGFybXM8PC9Db2x1bW5zIDQvUHJlZGljdG9yIDEyPj4vRmlsdGVyL0ZsYXRl RGVjb2RlL0lEWzw1QjVBOTZEMzZGRUNGNDQxOEI2Njg3Rjg4MEM4NEI4OT48OTMyMjNEQkI0RUE2 NzY0Q0E4NEIxM0Q0NTg2N0Y4NUU+XS9JbmZvIDYgMCBSL0xlbmd0aCAzOS9Sb290IDggMCBSL1Np emUgNy9UeXBlL1hSZWYvV1sxIDMgMF0+PnN0cmVhbQ0KaN5iYgACJkbOBdpMDAw8y4AEYw+IOMHE +D3oLpDFwAgQYABG2wUUDQplbmRzdHJlYW0NZW5kb2JqDXN0YXJ0eHJlZg0KMTE2DQolJUVPRg0K ------=_Part_36035331_1106900500.1459456170715-- From david@fromorbit.com Thu Mar 31 17:01:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D362A7CA2 for ; Thu, 31 Mar 2016 17:01:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8B29C304048 for ; Thu, 31 Mar 2016 15:01:10 -0700 (PDT) X-ASG-Debug-ID: 1459461667-04bdf011021431e0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id A6ug4RrBKVyeViH9 for ; Thu, 31 Mar 2016 15:01:08 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AHJgDKnP1WPDGaLHldgzOBUIZqoB8GjBKDTYRWgU+GBwICAQECgUZNAQEBAQEBBwEBAQFCQIRBAQEBAwEeHBwjBQsIAxgJJQ8FJQMHGhOIHwe3TYt+AQEBBwIBHRmFPYUOhCaFbgWHa4VciiuNfo8XRI5RgmYZgV4oMIhtAQEB Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail06.adl2.internode.on.net with ESMTP; 01 Apr 2016 08:31:06 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1alkeH-0000J8-Kn; Fri, 01 Apr 2016 09:01:05 +1100 Date: Fri, 1 Apr 2016 09:01:05 +1100 From: Dave Chinner To: Avi Kivity Cc: xfs@oss.sgi.com Subject: Re: Internal error at xfs_trans_cancel Message-ID: <20160331220105.GQ11812@dastard> X-ASG-Orig-Subj: Re: Internal error at xfs_trans_cancel References: <56FD513B.40805@scylladb.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56FD513B.40805@scylladb.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: 1459461667 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28344 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Mar 31, 2016 at 07:32:59PM +0300, Avi Kivity wrote: > Saw this nice gift this morning: > > [2121372.825904] XFS (dm-10): Internal error xfs_trans_cancel at > line 1007 of file fs/xfs/xfs_trans.c. Caller xfs_create+0x40e/0x710 > [xfs] > [2121372.827209] CPU: 0 PID: 32020 Comm: java Tainted: G W > ------------ 3.10.0-327.10.1.el7.x86_64 #1 > [2121372.828529] Hardware name: /DH77EB, BIOS > EBH7710H.86A.0099.2013.0125.1400 01/25/2013 > [2121372.829873] ffff8807b2b11e80 00000000470753cc ffff88031058bb48 > ffffffff816352cc > [2121372.831232] ffff88031058bb60 ffffffffa084be5b ffffffffa085b7ee > ffff88031058bb88 > [2121372.832542] ffffffffa0866909 ffff88014a2f3b80 ffff8807f29a2800 > 0000000000000000 > [2121372.833850] Call Trace: > [2121372.835125] [] dump_stack+0x19/0x1b > [2121372.836397] [] xfs_error_report+0x3b/0x40 [xfs] > [2121372.837654] [] ? xfs_create+0x40e/0x710 [xfs] > [2121372.838915] [] xfs_trans_cancel+0xd9/0x100 [xfs] > [2121372.840178] [] xfs_create+0x40e/0x710 [xfs] > [2121372.841444] [] xfs_vn_mknod+0xbb/0x250 [xfs] > [2121372.842683] [] xfs_vn_create+0x13/0x20 [xfs] > [2121372.843887] [] vfs_create+0xcd/0x130 > [2121372.845103] [] do_last+0xbef/0x1270 > [2121372.846324] [] path_openat+0xc2/0x490 > [2121372.847538] [] ? user_path_at_empty+0x72/0xc0 > [2121372.848746] [] do_filp_open+0x4b/0xb0 > [2121372.849917] [] ? __alloc_fd+0xa7/0x130 > [2121372.851090] [] do_sys_open+0xf3/0x1f0 > [2121372.852227] [] SyS_open+0x1e/0x20 > [2121372.853356] [] system_call_fastpath+0x16/0x1b > [2121372.854486] XFS (dm-10): xfs_do_force_shutdown(0x8) called from > line 1008 of file fs/xfs/xfs_trans.c. Return address = > 0xffffffffa0866922 > > Filesystem appeared full, ISTR there was a bug inthe inode allocation code that could lead to multiple AGFs being dirtied (via AGFL fixups) and then not having enough contiguous freee space to allocate a new inode chuck. I think it was also a potential deadlock vector. Yeah: e480a72 xfs: avoid AGI/AGF deadlock scenario for inode chunk allocation Fixed in 3.15. > but after a reboot (critical server) it > went back down to 420GB free. Lots of open unlinked (or O_TMPFILE) files, I'd guess. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Mar 31 17:20:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 435107CA4 for ; Thu, 31 Mar 2016 17:20:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0F816304048 for ; Thu, 31 Mar 2016 15:20:29 -0700 (PDT) X-ASG-Debug-ID: 1459462825-04cbb07ad6186930001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id kqgegwBgCEftODdT for ; Thu, 31 Mar 2016 15:20:25 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AKDAB2of1WPDGaLHldgzNTfY04mUASBowSiXIlhWICAgEBAoFGTQEBAQEBAQcBAQEBQkCEQgEBBDocIxAIAw4KCSUPBSUDBxoTiCYPw0wBCx4ZhT2FDoQmhW4Fl3KFc4gLjxePFYRdKDABAQOIaAEBAQ Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail06.adl2.internode.on.net with ESMTP; 01 Apr 2016 08:50:24 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1alkwx-0000Ld-T9; Fri, 01 Apr 2016 09:20:23 +1100 Date: Fri, 1 Apr 2016 09:20:23 +1100 From: Dave Chinner To: Andreas Dilger Cc: "J. Bruce Fields" , Christoph Hellwig , "Darrick J. Wong" , xfs@oss.sgi.com, linux-fsdevel , linux-btrfs , linux-api@vger.kernel.org Subject: Re: fallocate mode flag for "unshare blocks"? Message-ID: <20160331222023.GR11812@dastard> X-ASG-Orig-Subj: Re: fallocate mode flag for "unshare blocks"? References: <20160302155007.GB7125@infradead.org> <20160330182755.GC2236@birch.djwong.org> <20160331011813.GJ30721@dastard> <20160331075440.GA4209@infradead.org> <20160331111850.GP11812@dastard> <20160331180821.GD22462@fieldses.org> <779E9BCF-8224-44FE-8AAE-E0341A7B475C@dilger.ca> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <779E9BCF-8224-44FE-8AAE-E0341A7B475C@dilger.ca> 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: 1459462825 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28344 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Mar 31, 2016 at 01:47:50PM -0600, Andreas Dilger wrote: > On Mar 31, 2016, at 12:08 PM, J. Bruce Fields wrote: > > > > On Thu, Mar 31, 2016 at 10:18:50PM +1100, Dave Chinner wrote: > >> On Thu, Mar 31, 2016 at 12:54:40AM -0700, Christoph Hellwig wrote: > >>> On Thu, Mar 31, 2016 at 12:18:13PM +1100, Dave Chinner wrote: > >>>> On Wed, Mar 30, 2016 at 11:27:55AM -0700, Darrick J. Wong wrote: > >>>>> Or is it ok that fallocate could block, potentially for a long time as > >>>>> we stream cows through the page cache (or however unshare works > >>>>> internally)? Those same programs might not be expecting fallocate to > >>>>> take a long time. > >>>> > >>>> Yes, it's perfectly fine for fallocate to block for long periods of > >>>> time. See what gfs2 does during preallocation of blocks - it ends up > >>>> calling sb_issue_zerout() because it doesn't have unwritten > >>>> extents, and hence can block for long periods of time.... > >>> > >>> gfs2 fallocate is an implementation that will cause all but the most > >>> trivial users real pain. Even the initial XFS implementation just > >>> marking the transactions synchronous made it unusable for all kinds > >>> of applications, and this is much worse. E.g. a NFS ALLOCATE operation > >>> to gfs2 will probab;ly hand your connection for extended periods of > >>> time. > >>> > >>> If we need to support something like what gfs2 does we should have a > >>> separate flag for it. > >> > >> Using fallocate() for preallocation was always intended to > >> be a faster, more efficient method allocating zeroed space > >> than having userspace write blocks of data. Faster, more efficient > >> does not mean instantaneous, and gfs2 using sb_issue_zerout() means > >> that if the hardware has zeroing offloads (deterministic trim, write > >> same, etc) it will use them, and that will be much faster than > >> writing zeros from userspace. > >> > >> IMO, what gfs2 is definitely within the intended usage of > >> fallocate() for accelerating the preallocation of blocks. > >> > >> Yes, it may not be optimal for things like NFS servers which haven't > >> considered that a fallocate based offload operation might take some > >> time to execute, but that's not a problem with fallocate. i.e. > >> that's a problem with the nfs server ALLOCATE implementation not > >> being prepared to return NFSERR_JUKEBOX to prevent client side hangs > >> and timeouts while the operation is run.... > > > > That's an interesting idea, but I don't think it's really legal. I take > > JUKEBOX to mean "sorry, I'm failing this operation for now, try again > > later and it might succeed", not "OK, I'm working on it, try again and > > you may find out I've done it". > > > > So if the client gets a JUKEBOX error but the server goes ahead and does > > the operation anyway, that'd be unexpected. > > Well, the tape continued to be mounted in the background and/or the file > restored from the tape into the filesystem... Right, and SGI have been shipping a DMAPI-aware Linux NFS server for many years, using the above NFSERR_JUKEBOX behaviour for operations that may block for a long time due to the need to pull stuff into the filesytsem from the slow backing store. Best explanation is in the relevant commit in the last published XFS+DMAPI branch from SGI, for example: http://oss.sgi.com/cgi-bin/gitweb.cgi?p=xfs/xfs.git;a=commit;h=28b171cf2b64167826474efbb82ad9d471a05f75 Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfields@fieldses.org Thu Mar 31 17:34:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 088C67CA4 for ; Thu, 31 Mar 2016 17:34:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C13A28F8050 for ; Thu, 31 Mar 2016 15:34:20 -0700 (PDT) X-ASG-Debug-ID: 1459463657-04cbb07ad5186d60001-NocioJ Received: from fieldses.org (fieldses.org [173.255.197.46]) by cuda.sgi.com with ESMTP id T6sWTm988tdhIIdN for ; Thu, 31 Mar 2016 15:34:17 -0700 (PDT) X-Barracuda-Envelope-From: bfields@fieldses.org X-Barracuda-Apparent-Source-IP: 173.255.197.46 Received: by fieldses.org (Postfix, from userid 2815) id 7FFFD242D; Thu, 31 Mar 2016 18:34:17 -0400 (EDT) Date: Thu, 31 Mar 2016 18:34:17 -0400 From: "J. Bruce Fields" To: Dave Chinner Cc: Andreas Dilger , Christoph Hellwig , "Darrick J. Wong" , xfs@oss.sgi.com, linux-fsdevel , linux-btrfs , linux-api@vger.kernel.org Subject: Re: fallocate mode flag for "unshare blocks"? Message-ID: <20160331223417.GA24069@fieldses.org> X-ASG-Orig-Subj: Re: fallocate mode flag for "unshare blocks"? References: <20160302155007.GB7125@infradead.org> <20160330182755.GC2236@birch.djwong.org> <20160331011813.GJ30721@dastard> <20160331075440.GA4209@infradead.org> <20160331111850.GP11812@dastard> <20160331180821.GD22462@fieldses.org> <779E9BCF-8224-44FE-8AAE-E0341A7B475C@dilger.ca> <20160331222023.GR11812@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160331222023.GR11812@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: fieldses.org[173.255.197.46] X-Barracuda-Start-Time: 1459463657 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28344 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Apr 01, 2016 at 09:20:23AM +1100, Dave Chinner wrote: > On Thu, Mar 31, 2016 at 01:47:50PM -0600, Andreas Dilger wrote: > > On Mar 31, 2016, at 12:08 PM, J. Bruce Fields wrote: > > > > > > On Thu, Mar 31, 2016 at 10:18:50PM +1100, Dave Chinner wrote: > > >> On Thu, Mar 31, 2016 at 12:54:40AM -0700, Christoph Hellwig wrote: > > >>> On Thu, Mar 31, 2016 at 12:18:13PM +1100, Dave Chinner wrote: > > >>>> On Wed, Mar 30, 2016 at 11:27:55AM -0700, Darrick J. Wong wrote: > > >>>>> Or is it ok that fallocate could block, potentially for a long time as > > >>>>> we stream cows through the page cache (or however unshare works > > >>>>> internally)? Those same programs might not be expecting fallocate to > > >>>>> take a long time. > > >>>> > > >>>> Yes, it's perfectly fine for fallocate to block for long periods of > > >>>> time. See what gfs2 does during preallocation of blocks - it ends up > > >>>> calling sb_issue_zerout() because it doesn't have unwritten > > >>>> extents, and hence can block for long periods of time.... > > >>> > > >>> gfs2 fallocate is an implementation that will cause all but the most > > >>> trivial users real pain. Even the initial XFS implementation just > > >>> marking the transactions synchronous made it unusable for all kinds > > >>> of applications, and this is much worse. E.g. a NFS ALLOCATE operation > > >>> to gfs2 will probab;ly hand your connection for extended periods of > > >>> time. > > >>> > > >>> If we need to support something like what gfs2 does we should have a > > >>> separate flag for it. > > >> > > >> Using fallocate() for preallocation was always intended to > > >> be a faster, more efficient method allocating zeroed space > > >> than having userspace write blocks of data. Faster, more efficient > > >> does not mean instantaneous, and gfs2 using sb_issue_zerout() means > > >> that if the hardware has zeroing offloads (deterministic trim, write > > >> same, etc) it will use them, and that will be much faster than > > >> writing zeros from userspace. > > >> > > >> IMO, what gfs2 is definitely within the intended usage of > > >> fallocate() for accelerating the preallocation of blocks. > > >> > > >> Yes, it may not be optimal for things like NFS servers which haven't > > >> considered that a fallocate based offload operation might take some > > >> time to execute, but that's not a problem with fallocate. i.e. > > >> that's a problem with the nfs server ALLOCATE implementation not > > >> being prepared to return NFSERR_JUKEBOX to prevent client side hangs > > >> and timeouts while the operation is run.... > > > > > > That's an interesting idea, but I don't think it's really legal. I take > > > JUKEBOX to mean "sorry, I'm failing this operation for now, try again > > > later and it might succeed", not "OK, I'm working on it, try again and > > > you may find out I've done it". > > > > > > So if the client gets a JUKEBOX error but the server goes ahead and does > > > the operation anyway, that'd be unexpected. > > > > Well, the tape continued to be mounted in the background and/or the file > > restored from the tape into the filesystem... > > Right, and SGI have been shipping a DMAPI-aware Linux NFS server for > many years, using the above NFSERR_JUKEBOX behaviour for operations > that may block for a long time due to the need to pull stuff into > the filesytsem from the slow backing store. Best explanation is in > the relevant commit in the last published XFS+DMAPI branch from SGI, > for example: > > http://oss.sgi.com/cgi-bin/gitweb.cgi?p=xfs/xfs.git;a=commit;h=28b171cf2b64167826474efbb82ad9d471a05f75 I haven't looked at the code, but I assume a JUKEBOX-returning write to an absent file brings into cache the bits necessary to perform the write, but stops short of actually doing the write. That allows handling the retried write quickly without doing the wrong thing in the case the retry never comes. Implementing fallocate by returning JUKEBOX while still continuing the allocation in the background is a bit different. I guess it doesn't matter as much in practice, since the only way you're likely to notice that fallocate unexpectedly succeeded would be if it caused you to hit ENOSPC elsewhere. Is that right? Still, it seems a little weird. --b. From darrick.wong@oracle.com Thu Mar 31 19:12:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4B6097CB1 for ; Thu, 31 Mar 2016 19:12:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0E8DA304048 for ; Thu, 31 Mar 2016 17:12:01 -0700 (PDT) X-ASG-Debug-ID: 1459469519-04cb6c2464187a70001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id xAhpy4S3B6gSDCHs (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 31 Mar 2016 17:11:59 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u310BVG5021548 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 1 Apr 2016 00:11:31 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u310BUub014007 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 1 Apr 2016 00:11:31 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u310BUTB017637; Fri, 1 Apr 2016 00:11:30 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 31 Mar 2016 17:11:29 -0700 Date: Thu, 31 Mar 2016 17:11:28 -0700 From: "Darrick J. Wong" To: david@fromorbit.com Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: XFS reverse-mapping, reflink, and scrub update Message-ID: <20160401001128.GG5822@birch.djwong.org> X-ASG-Orig-Subj: XFS reverse-mapping, reflink, and scrub update References: <20160305011530.GG27973@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160305011530.GG27973@birch.djwong.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1459469519 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28349 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Hi. I've rebased the rmap+reflink patches against 4.6-rc1. There are also some patches to start the process of drafting a metadata scrubber for XFS and/or to give us more to talk about at LSF. The thirty or so bugfixes tacked on the end of the last patch series seems to be stable enough that I integrated them into the main body of the patches, partly to reduce the number of patches to review and partly to avoid the situation where reviewers complain about something in a patch only to discover that it's fixed by a later patch that reorganizes everything. The first fifteen patches from Dave's latest posting of rmapbt code are integrated here too. I've not gotten to the last two, primarily because I need to add rmapbt and refcountbt update intents and want to use the interval query code for rmap updates. This will be its own sprint, starting just after I send this email. This leaves us basically in the same place as we were at the end of the 4.5 cycle, but rebased against 4.6. One exception is that the "rmapxbt" is gone; now there's only one rmapbt format regardless of whether reflink is enabled. As far as xfsprogs goes, I imported (I think) all the libxfs updates from 4.6-rc1, and broke out the huge horrible libxfs changes into individual patches that are direct descendants of the kernel-side patches. They have the same subject line + commit message, so as to make it easier to cross-reference trees and to port changes from one to another. This also brings the xfsprogs libxfs updates for rmap and reflink up to date with the stuff that has been hanging out in the kernel. Unfortunately that means there are now ~105 patches there. There are also a bunch of xfstests updates that fix various test errors and add more tests to check out recovery of extents being held for CoW operations that didn't succeed before crashing; and ensure that we can't have reflinked swap files. There are also minor documentation and manpage updates. Anyway, the development trees are now posted to github under "djwong-devel" branches: https://github.com/djwong/linux/commits/djwong-devel https://github.com/djwong/xfsprogs/commits/djwong-devel https://github.com/djwong/xfstests/commits/djwong-devel https://github.com/djwong/xfs-documentation/commits/djwong-devel https://github.com/djwong/man-pages/commits/djwong-devel I'll patchbomb the mailing list when I finish the next XFS sprint or before LSF, whichever comes first. Christoph: Does that problem you observed with NFS blocking for a long time when someone uses fallocate to unshare a lot of shared blocks? The last patch in the kernel series disables the dirty page flush, and I'm curious to see if it helps any. (I'd conservatively assumed that a preemptive CoW had to fsync as well, but let's evaluate if skipping it is worth the risk.) --D On Fri, Mar 04, 2016 at 05:15:30PM -0800, Darrick J. Wong wrote: > Hi all, > > Dave's started reviewing the rmap/reflink patches I sent him, and said he'll > trickle the patches (with various edits) out to the mailing list as he gets to > them. Therefore, I won't blast the mailing list with the kernel/xfsprogs > patches that will soon be obsolete, though I will push out all the pending > xfstests and xfsdocumentation fixes. > > I've also renamed the confusing 'for-dave' branches on github to > 'rmap-reflink-devel' to make it clearer that it's just a development branch and > not what I'm trying to get pushed upstream. > > Soooo... stuff I'm hoping to get upstream for 4.6: > https://github.com/djwong/linux/tree/for-dave-for-4.6 > https://github.com/djwong/xfsprogs/tree/for-dave-for-4.6 > > Stuff I hope to get upstream: > https://github.com/djwong/xfs-documentation/tree/reflink-devel > https://github.com/djwong/xfstests/tree/reflink-dev > > Development branch, not for upstream: > https://github.com/djwong/linux/tree/rmap-reflink-devel > https://github.com/djwong/xfsprogs/tree/rmap-reflink-devel > > I'm taking a break from active development for a week or two to concentrate on > finding and fixing bugs. The content of the branches hasn't changed from > a few days ago, so no need to re-pull if you just did. > > --D > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From ming.lei@canonical.com Thu Mar 31 19:31:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A2E367CA3 for ; Thu, 31 Mar 2016 19:31:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 69A0B8F8050 for ; Thu, 31 Mar 2016 17:31:12 -0700 (PDT) X-ASG-Debug-ID: 1459470668-04bdf01104145ec0001-NocioJ Received: from youngberry.canonical.com (youngberry.canonical.com [91.189.89.112]) by cuda.sgi.com with ESMTP id UHw5o2f7Q9rpQg0U (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 31 Mar 2016 17:31:09 -0700 (PDT) X-Barracuda-Envelope-From: ming.lei@canonical.com X-Barracuda-Apparent-Source-IP: 91.189.89.112 Received: from mail-yw0-f182.google.com ([209.85.161.182]) by youngberry.canonical.com with esmtpsa (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.76) (envelope-from ) id 1almzT-0004qd-OW for xfs@oss.sgi.com; Fri, 01 Apr 2016 00:31:07 +0000 Received: by mail-yw0-f182.google.com with SMTP id h129so123336872ywb.1 for ; Thu, 31 Mar 2016 17:31:07 -0700 (PDT) X-Gm-Message-State: AD7BkJJGEizVqNESyqebkQv2AQf4RDeAt2YcrE0Raue8j3IxC5MMkYuWpaExGpzp5XmFbljYSPkMxprHkyDSqQ== MIME-Version: 1.0 X-Received: by 10.13.241.199 with SMTP id a190mr10427060ywf.47.1459470666883; Thu, 31 Mar 2016 17:31:06 -0700 (PDT) Received: by 10.37.207.145 with HTTP; Thu, 31 Mar 2016 17:31:06 -0700 (PDT) In-Reply-To: <20160331075228.GA2491@infradead.org> References: <1459354637-17415-1-git-send-email-ming.lei@canonical.com> <1459354637-17415-3-git-send-email-ming.lei@canonical.com> <20160330171927.GA13320@infradead.org> <20160331075228.GA2491@infradead.org> Date: Fri, 1 Apr 2016 08:31:06 +0800 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH v1 2/8] block: make 'struct bvec_iter' not depend on CONFIG_BLOCK From: Ming Lei X-ASG-Orig-Subj: Re: [PATCH v1 2/8] block: make 'struct bvec_iter' not depend on CONFIG_BLOCK To: Christoph Hellwig Cc: linux-block@vger.kernel.org, Boaz Harrosh , Linux Kernel Mailing List , xfs@oss.sgi.com, Jens Axboe , Al Viro , Lars Ellenberg , Philipp Reisner , Anton Altaparmakov , drbd-dev@lists.linbit.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: youngberry.canonical.com[91.189.89.112] X-Barracuda-Start-Time: 1459470669 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28351 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Mar 31, 2016 at 3:52 PM, Christoph Hellwig wrote: > On Thu, Mar 31, 2016 at 09:02:59AM +0800, Ming Lei wrote: >> That way may cause trouble to blk_type.h because it needs bvec_iter, >> then looks not good to always include bvec_iter.h into blk_type.h. > > I'd expect bvec.h to be always included in blk_types.h, and replace That should be fine, but blk_types.h will become more fat. > the inclusion of blk_types.h in fs.h eventually. I guess it can't be done because fs.h need 'struct bio'. thanks, Ming From info77@porienthk.com Thu Mar 31 19:39:10 2016 Return-Path: X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AC97D7CA3 for ; Thu, 31 Mar 2016 19:39:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 676D28F804C for ; Thu, 31 Mar 2016 17:39:10 -0700 (PDT) X-ASG-Debug-ID: 1459471141-04cbb07ad6189190001-NocioJ Received: from porienthk.com ([14.155.132.93]) by cuda.sgi.com with SMTP id Oqj2mAgk9zq1cbSv for ; Thu, 31 Mar 2016 17:39:02 -0700 (PDT) X-Barracuda-Envelope-From: info77@porienthk.com X-Barracuda-Apparent-Source-IP: 14.155.132.93 Sender: info77@porienthk.com Received: from DESKTOP-BHN1PSG[127.0.0.1] by DESKTOP-BHN1PSG[127.0.0.1] (SMTPD32); Thu, 31 Mar 2016 19:53:07 +0800 From: "thomas@porienthk.com" Subject: K9- car wirelss professional karaoke player with blueooth function To: xfs@oss.sgi.com X-ASG-Orig-Subj: K9- car wirelss professional karaoke player with blueooth function Content-Type: multipart/mixed; charset=UTF-8; boundary="oVRejI1DFODqd8kef=_lcffDxK9JFrLHTM" MIME-Version: 1.0 Reply-To: thomas@porienthk.com Date: Thu, 31 Mar 2016 19:53:07 +0800 X-Mailer: Microsoft Outlook Express 6.00.3790.4657 X-Priority: 3 X-MSMail-Priority: Normal X-MimeOLE: Produced By Microsoft MimeOLE V6.00.3790.4913 X-Barracuda-Connect: UNKNOWN[14.155.132.93] X-Barracuda-Start-Time: 1459471141 X-Barracuda-URL: https://192.48.176.25:443/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: <20160401003909.D8CE4106C1A1@cuda.sgi.com> This is a multi-part message in MIME format --oVRejI1DFODqd8kef=_lcffDxK9JFrLHTM Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgMTEuMDAuMTA1ODYuMTYyIj48L0hFQUQ+DQo8Qk9EWT4NCjxQIGNsYXNzPU1zb05vcm1h bCANCnN0eWxlPSJCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBURVhULUFMSUdOOiBsZWZ0 OyBNQVJHSU46IDBwdCAzNnB0OyBURVhULUlOREVOVDogMHB0OyBtc28tcGFnaW5hdGlvbjogd2lk b3ctb3JwaGFuIj48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1GQU1JTFk6 ICYjMzk7TWljcm9zb2Z0IFlhSGVpIFVJJiMzOTs7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1 NSk7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBGT05ULVdFSUdIVDogbm9ybWFsOyBDT0xPUjogcmdi KDAsMCwwKTsgRk9OVC1TVFlMRTogbm9ybWFsOyBMRVRURVItU1BBQ0lORzogMHB0OyBtc28tc3Bh Y2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tc2hh ZGluZzogcmdiKDI1NSwyNTUsMjU1KSI+SG93IA0KYXJlIHlvdT8gbG9uZyB0aW1lIG5vdCB0byBz ZWUgeW91ICZhbXA7IGhvcGUgeW91IHN0aWxsIGEgd29uZGVyZnVsIGJ1c2luZXNzIGF0IA0KcHJl c2VudCE8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQtRkFNSUxZ OiAmIzM5O01pY3Jvc29mdCBZYUhlaSBVSSYjMzk7OyBURVhULVRSQU5TRk9STTogbm9uZTsgRk9O VC1XRUlHSFQ6IG5vcm1hbDsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU1RZTEU6IG5vcm1hbDsg TEVUVEVSLVNQQUNJTkc6IDBwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9u dC1rZXJuaW5nOiAxLjAwMDBwdCI+PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgY2xhc3M9TXNv Tm9ybWFsIA0Kc3R5bGU9IkJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IFRFWFQtQUxJR046 IGxlZnQ7IE1BUkdJTjogMHB0IDM2cHQ7IFRFWFQtSU5ERU5UOiAwcHQ7IG1zby1wYWdpbmF0aW9u OiB3aWRvdy1vcnBoYW4iPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTAuNXB0OyBGT05ULUZB TUlMWTogJiMzOTtNaWNyb3NvZnQgWWFIZWkgVUkmIzM5OzsgQkFDS0dST1VORDogcmdiKDI1NSwy NTUsMjU1KTsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEZPTlQtV0VJR0hUOiBub3JtYWw7IENPTE9S OiByZ2IoMCwwLDApOyBGT05ULVNUWUxFOiBub3JtYWw7IExFVFRFUi1TUEFDSU5HOiAwcHQ7IG1z by1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1z by1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUpIj4mbmJzcDs8L1NQQU4+PFNQQU4gDQpzdHlsZT0i Rk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQtRkFNSUxZOiAmIzM5O01pY3Jvc29mdCBZYUhlaSBVSSYj Mzk7OyBURVhULVRSQU5TRk9STTogbm9uZTsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgQ09MT1I6IHJn YigwLDAsMCk7IEZPTlQtU1RZTEU6IG5vcm1hbDsgTEVUVEVSLVNQQUNJTkc6IDBwdDsgbXNvLXNw YWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+PG86cD48 L286cD48L1NQQU4+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9IkJBQ0tHUk9VTkQ6 IHJnYigyNTUsMjU1LDI1NSk7IFRFWFQtQUxJR046IGxlZnQ7IE1BUkdJTjogMHB0IDM2cHQ7IFRF WFQtSU5ERU5UOiAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iPjxTUEFOIA0Kc3R5 bGU9IkZPTlQtU0laRTogMTAuNXB0OyBGT05ULUZBTUlMWTogJiMzOTtNaWNyb3NvZnQgWWFIZWkg VUkmIzM5OzsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgVEVYVC1UUkFOU0ZPUk06IG5v bmU7IEZPTlQtV0VJR0hUOiBub3JtYWw7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNUWUxFOiBu b3JtYWw7IExFVFRFUi1TUEFDSU5HOiAwcHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5Ozsg bXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUp Ij4mbmJzcDsmbmJzcDtXb3VsZCANCnlvdSAmbmJzcDt2aXNpdCB0aGUgQWlycG9ydCZuYnNwO0hL IEVsZWN0cm9uaWNzJm5ic3A7ZmFpciAmbmJzcDt0aGlzIA0KQXByaWwsMjAxNj88L1NQQU4+PFNQ QU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQtRkFNSUxZOiAmIzM5O01pY3Jvc29m dCBZYUhlaSBVSSYjMzk7OyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBGT05ULVdFSUdI VDogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TVFlMRTogbm9ybWFsOyBMRVRURVIt U1BBQ0lORzogMHB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5p bmc6IDAuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyNTUsMjU1KSI+STwvU1BBTj48U1BB TiANCnN0eWxlPSJGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1GQU1JTFk6ICYjMzk7TWljcm9zb2Z0 IFlhSGVpIFVJJiMzOTs7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IFRFWFQtVFJBTlNG T1JNOiBub25lOyBGT05ULVdFSUdIVDogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1T VFlMRTogbm9ybWFsOyBMRVRURVItU1BBQ0lORzogMHB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVz JiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwy NTUsMjU1KSI+ZiANCnlvdSBjb21lIHRvIHRoZSBmYWlyLCBob3BlIHlvdSBjYW4gY29tZSBvdXIg Jm5ic3A7Ym9vdGg6PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTAuNXB0OyBGT05U LUZBTUlMWTogJiMzOTtNaWNyb3NvZnQgWWFIZWkgVUkmIzM5OzsgVEVYVC1UUkFOU0ZPUk06IG5v bmU7IEZPTlQtV0VJR0hUOiBub3JtYWw7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNUWUxFOiBu b3JtYWw7IExFVFRFUi1TUEFDSU5HOiAwcHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5Ozsg bXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIGNs YXNzPU1zb05vcm1hbCANCnN0eWxlPSJCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBURVhU LUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBwdCAzNnB0OyBURVhULUlOREVOVDogMHB0OyBtc28tcGFn aW5hdGlvbjogd2lkb3ctb3JwaGFuIj48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDE4cHQ7IEZP TlQtRkFNSUxZOiAmIzM5O01pY3Jvc29mdCBZYUhlaSBVSSYjMzk7OyBCQUNLR1JPVU5EOiByZ2Io MjU1LDI1NSwyNTUpOyBURVhULVRSQU5TRk9STTogbm9uZTsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsg Q09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU1RZTEU6IG5vcm1hbDsgTEVUVEVSLVNQQUNJTkc6IDBw dDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBw dDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPkdsb2JhbCANCnNvdXJpbmcgZmFpciwg QXByaWwgMTEgdG8gMTR0aCwgMjAxNiwgQm9vdGggTm86IDc8L1NQQU4+PFNQQU4gDQpzdHlsZT0i Rk9OVC1TSVpFOiAxOHB0OyBGT05ULUZBTUlMWTogJiMzOTtNaWNyb3NvZnQgWWFIZWkgVUkmIzM5 OzsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEZP TlQtV0VJR0hUOiBub3JtYWw7IENPTE9SOiByZ2IoMjU1LDAsMjU1KTsgRk9OVC1TVFlMRTogbm9y bWFsOyBMRVRURVItU1BBQ0lORzogMHB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1z by1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyNTUsMjU1KSI+ UDA5PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTAuNXB0OyBGT05ULUZBTUlMWTog JiMzOTtNaWNyb3NvZnQgWWFIZWkgVUkmIzM5OzsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEZPTlQt V0VJR0hUOiBub3JtYWw7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNUWUxFOiBub3JtYWw7IExF VFRFUi1TUEFDSU5HOiAwcHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQt a2VybmluZzogMS4wMDAwcHQiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05v cm1hbCANCnN0eWxlPSJCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBURVhULUFMSUdOOiBs ZWZ0OyBNQVJHSU46IDBwdCAzNnB0OyBURVhULUlOREVOVDogMHB0OyBtc28tcGFnaW5hdGlvbjog d2lkb3ctb3JwaGFuIj48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1GQU1J TFk6ICYjMzk7TWljcm9zb2Z0IFlhSGVpIFVJJiMzOTs7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBG T05ULVdFSUdIVDogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TVFlMRTogbm9ybWFs OyBMRVRURVItU1BBQ0lORzogMHB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1m b250LWtlcm5pbmc6IDEuMDAwMHB0Ij48bzpwPiZuYnNwOzxJTUcgDQpzdHlsZT0iSEVJR0hUOiAx ODhweDsgV0lEVEg6IDY2OHB4IiBib3JkZXI9MCBoc3BhY2U9MCBhbHQ9IiIgDQpzcmM9ImNpZDpp bWcwLmpwZyIgd2lkdGg9MTQyOSANCmFsaWduPWJhc2VsaW5lIGhlaWdodD00OTk+PC9vOnA+PC9T UEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJCQUNLR1JPVU5EOiByZ2IoMjU1 LDI1NSwyNTUpOyBURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBwdCAzNnB0OyBURVhULUlOREVO VDogMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIj48U1BBTiANCnN0eWxlPSJGT05U LVNJWkU6IDEwLjVwdDsgRk9OVC1GQU1JTFk6ICYjMzk7TWljcm9zb2Z0IFlhSGVpIFVJJiMzOTs7 IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBGT05U LVdFSUdIVDogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TVFlMRTogbm9ybWFsOyBM RVRURVItU1BBQ0lORzogMHB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250 LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyNTUsMjU1KSI+Jm5ic3A7 PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTAuNXB0OyBGT05ULUZBTUlMWTogJiMz OTtNaWNyb3NvZnQgWWFIZWkgVUkmIzM5OzsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEZPTlQtV0VJ R0hUOiBub3JtYWw7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNUWUxFOiBub3JtYWw7IExFVFRF Ui1TUEFDSU5HOiAwcHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2Vy bmluZzogMS4wMDAwcHQiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1h bCANCnN0eWxlPSJCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBURVhULUFMSUdOOiBsZWZ0 OyBNQVJHSU46IDBwdCAzNnB0OyBURVhULUlOREVOVDogMHB0OyBtc28tcGFnaW5hdGlvbjogd2lk b3ctb3JwaGFuIj48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDE4cHQ7IEZPTlQtRkFNSUxZOiAm IzM5O01pY3Jvc29mdCBZYUhlaSBVSSYjMzk7OyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUp OyBURVhULVRSQU5TRk9STTogbm9uZTsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgQ09MT1I6IHJnYigw LDAsMCk7IEZPTlQtU1RZTEU6IG5vcm1hbDsgTEVUVEVSLVNQQUNJTkc6IDBwdDsgbXNvLXNwYWNl cnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRp bmc6IHJnYigyNTUsMjU1LDI1NSkiPldlbGNvbWUgDQp0byBvdXIgYm9vdGghZW5jbG9zZWQgb3Vy IG5ldyAmbmJzcDtDYXIgd2lyZWxlc3MgS2FyYW9rZSBwbGF5ZXIgZm9yIHlvdXIgDQpyZWZlcmVu Y2UhPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTAuNXB0OyBGT05ULUZBTUlMWTog JiMzOTtNaWNyb3NvZnQgWWFIZWkgVUkmIzM5OzsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEZPTlQt V0VJR0hUOiBub3JtYWw7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNUWUxFOiBub3JtYWw7IExF VFRFUi1TUEFDSU5HOiAwcHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQt a2VybmluZzogMS4wMDAwcHQiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05v cm1hbCANCnN0eWxlPSJCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBURVhULUFMSUdOOiBs ZWZ0OyBNQVJHSU46IDBwdDsgTElORS1IRUlHSFQ6IDE1Ljc1cHQ7IFRFWFQtSU5ERU5UOiAwcHQ7 IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTog MTAuNXB0OyBGT05ULUZBTUlMWTog5b6u6L2v6ZuF6buROyBURVhULVRSQU5TRk9STTogbm9uZTsg Rk9OVC1XRUlHSFQ6IG5vcm1hbDsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU1RZTEU6IG5vcm1h bDsgTEVUVEVSLVNQQUNJTkc6IDBwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28t Zm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+PG86cD4mbmJzcDs8SU1HIA0Kc3R5bGU9IkhFSUdIVDog NDU2cHg7IFdJRFRIOiA2MjhweCIgYm9yZGVyPTAgaHNwYWNlPTAgYWx0PSIiIA0Kc3JjPSJjaWQ6 aW1nMS5qcGciIHdpZHRoPTc4OCBhbGlnbj1iYXNlbGluZSANCmhlaWdodD01Mjk+PC9vOnA+PC9T UEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJCQUNLR1JPVU5EOiByZ2IoMjU1 LDI1NSwyNTUpOyBURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBwdDsgTElORS1IRUlHSFQ6IDE1 Ljc1cHQ7IFRFWFQtSU5ERU5UOiAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iPjxT UEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTAuNXB0OyBGT05ULUZBTUlMWTog5b6u6L2v6ZuF6buR OyBURVhULVRSQU5TRk9STTogbm9uZTsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgQ09MT1I6IHJnYigw LDAsMCk7IEZPTlQtU1RZTEU6IG5vcm1hbDsgTEVUVEVSLVNQQUNJTkc6IDBwdDsgbXNvLXNwYWNl cnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+PG86cD4mbmJz cDs8L286cD48L1NQQU4+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9IkJBQ0tHUk9V TkQ6IHJnYigyNTUsMjU1LDI1NSk7IFRFWFQtQUxJR046IGxlZnQ7IE1BUkdJTjogMHB0IDM2cHQ7 IFRFWFQtSU5ERU5UOiAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iPjxTUEFOIA0K c3R5bGU9IkZPTlQtU0laRTogMTAuNXB0OyBGT05ULUZBTUlMWTog5b6u6L2v6ZuF6buROyBCQUNL R1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBURVhULVRSQU5TRk9STTogbm9uZTsgRk9OVC1XRUlH SFQ6IG5vcm1hbDsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU1RZTEU6IG5vcm1hbDsgTEVUVEVS LVNQQUNJTkc6IDBwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJu aW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPnlvdXIgDQpraW5k IHZpc2l0aW5nIHdpbGwgZ2l2ZSB1cyBhIGJpZyBzdXBwb3J0IGF0IDIwMTYhIDwvU1BBTj48U1BB TiANCnN0eWxlPSJGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1GQU1JTFk6IOW+rui9r+mbhem7kTsg VEVYVC1UUkFOU0ZPUk06IG5vbmU7IEZPTlQtV0VJR0hUOiBub3JtYWw7IENPTE9SOiByZ2IoMCww LDApOyBGT05ULVNUWUxFOiBub3JtYWw7IExFVFRFUi1TUEFDSU5HOiAwcHQ7IG1zby1zcGFjZXJ1 bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQiPjxvOnA+PC9vOnA+ PC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0 OyBNQVJHSU46IDBwdCAzNnB0OyBMSU5FLUhFSUdIVDogMTUuNzVwdDsgbXNvLXBhZ2luYXRpb246 IHdpZG93LW9ycGhhbiI+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05ULUZBTUlM WTog5b6u6L2v6ZuF6buROyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBGT05ULVdFSUdI VDogbm9ybWFsOyBDT0xPUjogcmdiKDMxLDczLDEyNSk7IEZPTlQtU1RZTEU6IG5vcm1hbDsgTEVU VEVSLVNQQUNJTkc6IDBwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1r ZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSk7IG1zby1iaWRp LWZvbnQtZmFtaWx5OiBDYWxpYnJpOyBtc28tYXNjaWktZm9udC1mYW1pbHk6IENhbGlicmk7IG1z by1oYW5zaS1mb250LWZhbWlseTogQ2FsaWJyaSI+VzwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05U LVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiDlvq7ova/pm4Xpu5E7IEJBQ0tHUk9VTkQ6IHJnYigy NTUsMjU1LDI1NSk7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBGT05ULVdFSUdIVDogbm9ybWFsOyBD T0xPUjogcmdiKDMxLDczLDEyNSk7IEZPTlQtU1RZTEU6IG5vcm1hbDsgTEVUVEVSLVNQQUNJTkc6 IDBwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAw MDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSk7IG1zby1iaWRpLWZvbnQtZmFtaWx5 OiBDYWxpYnJpOyBtc28tYXNjaWktZm9udC1mYW1pbHk6IENhbGlicmk7IG1zby1oYW5zaS1mb250 LWZhbWlseTogQ2FsaWJyaSI+YWl0aW5nIA0KZm9yIHlvdXIga2luZCByZXBseSB0byBzdXBwb3J0 IG91ciBhbGwgZGV0YWlsZWQgb2ZmZXIgZm9yIHlvdXIgZXN0ZWVtZWQgDQpjb21wYW55ITwvU1BB Tj48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBC QUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBURVhULVRSQU5TRk9STTogbm9uZTsgRk9OVC1X RUlHSFQ6IG5vcm1hbDsgQ09MT1I6IHJnYigzMSw3MywxMjUpOyBGT05ULVNUWUxFOiBub3JtYWw7 IExFVFRFUi1TUEFDSU5HOiAwcHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZv bnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUpOyBtc28t ZmFyZWFzdC1mb250LWZhbWlseTog5b6u6L2v6ZuF6buRIj4mbmJzcDs8L1NQQU4+PFNQQU4gDQpz dHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05ULUZBTUlMWTogJiMzOTtUaW1lcyBOZXcgUm9tYW4m IzM5OzsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAxLjAw MDBwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kyI+PG86cD48L286cD48L1NQQU4+ PC9QPg0KPFAgY2xhc3M9cCANCnN0eWxlPSJNQVJHSU46IDBwdCAzNnB0OyBMSU5FLUhFSUdIVDog MTUuNzVwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiI+PFNQQU4gDQpzdHlsZT0iRk9O VC1TSVpFOiAxMnB0OyBGT05ULUZBTUlMWTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgQkFD S0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEZPTlQtV0VJ R0hUOiBub3JtYWw7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNUWUxFOiBub3JtYWw7IExFVFRF Ui1TUEFDSU5HOiAwcHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2Vy bmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUpOyBtc28tZmFyZWFz dC1mb250LWZhbWlseTog5b6u6L2v6ZuF6buRIj5UaGFua3MgDQphIGxvdCBhbmQgYmVzdCByZWdh cmRzLDwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiAm IzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBU RVhULVRSQU5TRk9STTogbm9uZTsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgQ09MT1I6IHJnYigwLDAs MCk7IEZPTlQtU1RZTEU6IG5vcm1hbDsgTEVUVEVSLVNQQUNJTkc6IDBwdDsgbXNvLXNwYWNlcnVu OiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6 IHJnYigyNTUsMjU1LDI1NSk7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlvq7ova/pm4Xpu5Ei PjxCUj48L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05ULUZBTUlMWTog JiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsg VEVYVC1UUkFOU0ZPUk06IG5vbmU7IEZPTlQtV0VJR0hUOiBub3JtYWw7IENPTE9SOiByZ2IoMCww LDApOyBGT05ULVNUWUxFOiBub3JtYWw7IExFVFRFUi1TUEFDSU5HOiAwcHQ7IG1zby1zcGFjZXJ1 bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5n OiByZ2IoMjU1LDI1NSwyNTUpOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5b6u6L2v6ZuF6buR Ij48L1A+DQo8RElWPg0KPERJViANCnN0eWxlPSJXSElURS1TUEFDRTogbm9ybWFsOyBXT1JELVNQ QUNJTkc6IDBweDsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IENPTE9SOiByZ2IoMCwwLDApOyBGT05U OiAxM3B4LzE5cHggdmVyZGFuYTsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgQkFDS0dST1VORC1D T0xPUjogcmdiKDI1NSwyNTUsMjU1KTsgVEVYVC1JTkRFTlQ6IDBweDsgLXdlYmtpdC10ZXh0LXN0 cm9rZS13aWR0aDogMHB4Ij48QSANCnN0eWxlPSJNQVJHSU4tQk9UVE9NOiAwcHg7IE1BUkdJTi1U T1A6IDBweCIgbmFtZT1fTWFpbEF1dG9TaWc+PEJSIA0KY2xhc3M9QXBwbGUtaW50ZXJjaGFuZ2Ut bmV3bGluZT48SU1HIGJvcmRlcj0wIA0Kc3JjPSJjaWQ6aW1nMi5qcGciIA0Kd2lkdGg9NTYgaGVp Z2h0PTUwIG5vcmVzY2FsZT0idHJ1ZSI+PC9BPjwvRElWPg0KPERJViANCnN0eWxlPSJXSElURS1T UEFDRTogbm9ybWFsOyBXT1JELVNQQUNJTkc6IDBweDsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IENP TE9SOiByZ2IoMCwwLDApOyBGT05UOiAxM3B4LzE5cHgg5b6u6L2v6ZuF6buROyBMRVRURVItU1BB Q0lORzogbm9ybWFsOyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1LDI1NSwyNTUpOyBURVhULUlO REVOVDogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiPjxBIA0Kc3R5bGU9Ik1B UkdJTi1CT1RUT006IDBweDsgRk9OVC1GQU1JTFk6IHZlcmRhbmE7IE1BUkdJTi1UT1A6IDBweCIg DQpuYW1lPV9NYWlsQXV0b1NpZz48Rk9OVCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4iPjxTUEFOIGxh bmc9RU4tVVMgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMHB0Ij5UaG9tYXMmbmJzcDtIYW4mbmJzcDsv RXhwb3J0aW5nIG1hbmFnZXI8L1NQQU4+PFNQQU4gDQpsYW5nPUVOLVVTPjxvOnAgDQpzdHlsZT0i TUFSR0lOLUJPVFRPTTogMHB4OyBNQVJHSU4tVE9QOiAwcHgiPjwvbzpwPjwvU1BBTj48L0ZPTlQ+ PC9BPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7 Ij4gDQo8UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQiPjxGT05U IHNpemU9Mz48Rk9OVCANCmZhY2U9IlRpbWVzIE5ldyBSb21hbiI+PFNUUk9ORz48U1BBTiBsYW5n PUVOLVVTPlBPUklFTlQoSE9OR0tPTkcpIA0KQ08uLExURDwvU1BBTj48L1NUUk9ORz48L0ZPTlQ+ PC9GT05UPjwvUD48L1NQQU4+PC9ESVY+PC9ESVY+DQo8UCBzdHlsZT0iTUFSR0lOLUJPVFRPTTog MHB4OyBNQVJHSU4tVE9QOiAwcHgiPlNoZW56aGVuIFRlYW5hIFRlY2hub2xvZ3kgQ28uLCANCkx0 ZC48L1A+DQo8UCBzdHlsZT0iTUFSR0lOLUJPVFRPTTogMHB4OyBNQVJHSU4tVE9QOiAwcHgiPldo YXQmIzM5O3MgQXBwIGFuZCBNb2JpbGU6IA0KMTg2NjQxOTQ2NTA8QlI+UVE6Jm5ic3A7NDA5NDM1 MjA8L1A+DQo8UCBzdHlsZT0iTUFSR0lOLUJPVFRPTTogMHB4OyBNQVJHSU4tVE9QOiAwcHgiPkVt YWlsOjxTUEFOIA0KY2xhc3M9QXBwbGUtY29udmVydGVkLXNwYWNlPiZuYnNwOyA8QSANCmhyZWY9 Im1haWx0bzp0aG9tYXNAcG9yaW50aGsuY29tIj50aG9tYXNAcG9yaW50aGsuY29tPC9BPjsgPC9T UEFOPjxTUEFOIA0Kc3R5bGU9IlRFWFQtREVDT1JBVElPTjogdW5kZXJsaW5lOyBDT0xPUjogcmdi KDAsMCwyNTUpIj48QSANCnN0eWxlPSJURVhULURFQ09SQVRJT046IG5vbmUgIWltcG9ydGFudCIg aHJlZj0ibWFpbHRvOnRob21hc0BzbWFydC1jYWJsZS5uZXQuY24iIA0KdGFyZ2V0PV9ibGFuaz50 aG9tYXNAc21hcnQtY2FibGUubmV0LmNuPC9BPjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lO LUJPVFRPTTogMHB4OyBNQVJHSU4tVE9QOiAwcHgiPjxTVFJPTkc+bXNuOiZuYnNwOzwvU1RST05H PjxBIA0Kc3R5bGU9IlRFWFQtREVDT1JBVElPTjogbm9uZSAhaW1wb3J0YW50IiBocmVmPSJtYWls dG86cG9yaWVudEBob3RtYWlsLmNvbSIgDQp0YXJnZXQ9X2JsYW5rPjxTVFJPTkc+cG9yaWVudEBo b3RtYWlsLmNvbTwvU1RST05HPjwvQT47Jm5ic3A7PEEgDQpzdHlsZT0iVEVYVC1ERUNPUkFUSU9O OiBub25lICFpbXBvcnRhbnQiIGhyZWY9Im1haWx0bzpibHVld2luZDk2MjEyQG1zbi5jb20iIA0K dGFyZ2V0PV9ibGFuaz5ibHVld2luZDk2MjEyQG1zbi5jb208L0E+Jm5ic3A7PC9QPg0KPFAgDQpz dHlsZT0iTUFSR0lOLUJPVFRPTTogMHB4OyBNQVJHSU4tVE9QOiAwcHgiPjxTVFJPTkc+U2t5cGU8 L1NUUk9ORz46Jm5ic3A7dGhvbWFzLnBvcmllbnQgDQombmJzcDsmbmJzcDtXaGF0c2FwcDorODYg MTg2NjQxOTQ2NTA8L1A+DQo8UCBzdHlsZT0iTUFSR0lOLUJPVFRPTTogMHB4OyBNQVJHSU4tVE9Q OiAwcHgiPk9mZmljZSBBZGQ6IEFkZDogMm5kIEJ1bGlkaW5nLCANCkVhc3QgQXNpYSBJbmR1c3Ry aWFsIFBhcmssIE5vLjYgTmFubGluZyBub3J0aCBSb2FkLCBOYW5saW5nIFZpbGxhZ2UsIE5hbndh biANCnN0cmVldCxMb25nZ2FuZyBEaXN0cmljdCwgU2hlbnpoZW4gQ2hpbmE8QlI+VGVsOiA0MDAt MDc3MS03MjI8L1A+DQo8UCBzdHlsZT0iTUFSR0lOLUJPVFRPTTogMHB4OyBNQVJHSU4tVE9QOiAw cHgiPndlYnNpdGU6Jm5ic3A7PEEgDQpocmVmPSJodHRwOi8vd3d3LnBvcmllbnRoay5jb20vIj53 d3cucG9yaWVudGhrLmNvbTwvQT4mbmJzcDs8L1A+DQo8UCBzdHlsZT0iTUFSR0lOLUJPVFRPTTog MHB4OyBNQVJHSU4tVE9QOiAwcHgiPjxBIA0Kc3R5bGU9IlRFWFQtREVDT1JBVElPTjogbm9uZSAh aW1wb3J0YW50IiANCmhyZWY9Imh0dHA6Ly9pdGVhbmEuZW4uYWxpYmFiYS5jb20vY29tcGFueV9w cm9maWxlLmh0bWwiPmh0dHA6Ly9pdGVhbmEuZW4uYWxpYmFiYS5jb20vY29tcGFueV9wcm9maWxl Lmh0bWw8L0E+PC9QPg0KPFAgY2xhc3M9cCANCnN0eWxlPSJNQVJHSU46IDBwdCAzNnB0OyBMSU5F LUhFSUdIVDogMTUuNzVwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiI+PC9TUEFOPjxT UEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3 IFJvbWFuJiMzOTs7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IFRFWFQtVFJBTlNGT1JN OiBub25lOyBGT05ULVdFSUdIVDogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TVFlM RTogbm9ybWFsOyBMRVRURVItU1BBQ0lORzogMHB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMz OTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyNTUs MjU1KTsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOW+rui9r+mbhem7kSI+Jm5ic3A7PC9TUEFO PjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMg TmV3IFJvbWFuJiMzOTs7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2Vy bmluZzogMS4wMDAwcHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZMiPjxvOnA+PC9v OnA+PC9TUEFOPjwvUD48IS0tRW5kRnJhZ21lbnQtLT48L0JPRFk+PC9IVE1MPg0KDQo= --oVRejI1DFODqd8kef=_lcffDxK9JFrLHTM Content-Type: image/jpeg; name="invitate letter-(03-24-16-20-51).jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="invitate letter-(03-24-16-20-51).jpg" Content-ID: Content-Description: Photo /9j/4AAQSkZJRgABAgEASABIAAD/4Q8VRXhpZgAASUkqAAgAAAAHABIBAwABAAAAAQAAABoBBQAB AAAAYgAAABsBBQABAAAAagAAACgBAwABAAAAAgAAADEBAgAbAAAAcgAAADIBAgAUAAAAjQAAAGmH BAABAAAApAAAANAAAABIAAAAAQAAAEgAAAABAAAAQWRvYmUgUGhvdG9zaG9wIENTIFdpbmRvd3MA MjAxNjowMzoxOCAxNjo1MDo0NAAAAAADAAGgAwABAAAA//8AAAKgBAABAAAAlgUAAAOgBAABAAAA 8wEAAAAAAAAAAAYAAwEDAAEAAAAGAAAAGgEFAAEAAAAeAQAAGwEFAAEAAAAmAQAAKAEDAAEAAAAC AAAAAQIEAAEAAAAuAQAAAgIEAAEAAADfDQAAAAAAAEgAAAABAAAASAAAAAEAAAD/2P/gABBKRklG AAECAQBIAEgAAP/tAAxBZG9iZV9DTQAC/+4ADkFkb2JlAGSAAAAAAf/bAIQADAgICAkIDAkJDBEL CgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsN Dg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwM/8AAEQgAOACgAwEiAAIRAQMRAf/dAAQACv/EAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYH CAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQh EjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXi ZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5/cRAAICAQIE BAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKy gwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dX Z3eHl6e3x//aAAwDAQACEQMRAD8A4VJXOlZGBi5T8jOo+1MZVYKaIaWuudFdXqesy6pramusu/SU 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 td+dba/32KyZXzSkseV2eLe9bbT9K6+KYz4r5rSQU/SR3eKY7vFfNySSn6QO7xUTuXzikkp+jYcS ANZ0hYL+rtqvDQxvokPsF+8maK7m47n7Nn84+v1sxjN/8xSvEElm/FPY/o/vcP8AOeniv/C+X/J/ J7jb5Ov1l3sPl/l8z771gY9b8UZOBZlPBfbi211iz0nMGtjH/wCD/N2f9bf/ADnpIeE/Fd1K4U4b 25FlPqZGeWCHtrLWsq+0t9tn0/8Aof8ABs2eDJLV/U8Qvi972pf5zh9v3P8Awrh9z/ntUcfB/U4h 2+av8Z//2f/tFBJQaG90b3Nob3AgMy4wADhCSU0EBAAAAAAABxwCAAACAAIAOEJJTQQlAAAAAAAQ RgzyiSa4VtqwnAGhsKeQdzhCSU0D7QAAAAAAEABIAAAAAQACAEgAAAABAAI4QklNBCYAAAAAAA4A AAAAAAAAAAAAP4AAADhCSU0EDQAAAAAABAAAAB44QklNBBkAAAAAAAQAAAAeOEJJTQPzAAAAAAAJ AAAAAAAAAAABADhCSU0ECgAAAAAAAQAAOEJJTScQAAAAAAAKAAEAAAAAAAAAAjhCSU0D9QAAAAAA SAAvZmYAAQBsZmYABgAAAAAAAQAvZmYAAQChmZoABgAAAAAAAQAyAAAAAQBaAAAABgAAAAAAAQA1 AAAAAQAtAAAABgAAAAAAAThCSU0D+AAAAAAAcAAA/////////////////////////////wPoAAAA AP////////////////////////////8D6AAAAAD/////////////////////////////A+gAAAAA /////////////////////////////wPoAAA4QklNBAAAAAAAAAIABThCSU0EAgAAAAAAGgAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAOEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAA AAAABAAAAAA4QklNBBoAAAAAA1MAAAAGAAAAAAAAAAAAAAHzAAAFlgAAAA8AaQBuAHYAaQB0AGEA dABlACAAbABlAHQAdABlAHIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAABZYAAAHz AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAEAAAAAAABudWxsAAAAAgAA AAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9u ZwAAAAAAAAAAQnRvbWxvbmcAAAHzAAAAAFJnaHRsb25nAAAFlgAAAAZzbGljZXNWbExzAAAAAU9i amMAAAABAAAAAAAFc2xpY2UAAAASAAAAB3NsaWNlSURsb25nAAAAAAAAAAdncm91cElEbG9uZwAA AAAAAAAGb3JpZ2luZW51bQAAAAxFU2xpY2VPcmlnaW4AAAANYXV0b0dlbmVyYXRlZAAAAABUeXBl ZW51bQAAAApFU2xpY2VUeXBlAAAAAEltZyAAAAAGYm91bmRzT2JqYwAAAAEAAAAAAABSY3QxAAAA BAAAAABUb3AgbG9uZwAAAAAAAAAATGVmdGxvbmcAAAAAAAAAAEJ0b21sb25nAAAB8wAAAABSZ2h0 bG9uZwAABZYAAAADdXJsVEVYVAAAAAEAAAAAAABudWxsVEVYVAAAAAEAAAAAAABNc2dlVEVYVAAA AAEAAAAAAAZhbHRUYWdURVhUAAAAAQAAAAAADmNlbGxUZXh0SXNIVE1MYm9vbAEAAAAIY2VsbFRl eHRURVhUAAAAAQAAAAAACWhvcnpBbGlnbmVudW0AAAAPRVNsaWNlSG9yekFsaWduAAAAB2RlZmF1 bHQAAAAJdmVydEFsaWduZW51bQAAAA9FU2xpY2VWZXJ0QWxpZ24AAAAHZGVmYXVsdAAAAAtiZ0Nv bG9yVHlwZWVudW0AAAARRVNsaWNlQkdDb2xvclR5cGUAAAAATm9uZQAAAAl0b3BPdXRzZXRsb25n AAAAAAAAAApsZWZ0T3V0c2V0bG9uZwAAAAAAAAAMYm90dG9tT3V0c2V0bG9uZwAAAAAAAAALcmln aHRPdXRzZXRsb25nAAAAAAA4QklNBCgAAAAAAAwAAAABP/AAAAAAAAA4QklNBBEAAAAAAAEBADhC SU0EFAAAAAAABAAAACY4QklNBAwAAAAADfsAAAABAAAAoAAAADgAAAHgAABpAAAADd8AGAAB/9j/ 4AAQSkZJRgABAgEASABIAAD/7QAMQWRvYmVfQ00AAv/uAA5BZG9iZQBkgAAAAAH/2wCEAAwICAgJ CAwJCQwRCwoLERUPDAwPFRgTExUTExgRDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM 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 kODQ7ErOxja2/S0ZW306a/pfRqZ/N/uK8olKz3KmqzpnTq63VMxq21Oc17mRLS5g21uLXbv5ufb/ AJ/84qt/Tfq/W8V3UU12WD2ghwmfaODs/N+itMppI7oWe6RXUE+R4f2Scpl3TcRznYWwuuIFuxzW SW/Q3m4fvWuUndVYCPB0wfUq7cng/ne1aW5w4MBRa5z2uexwO0SWSd+3jcB9FRZMsYECeQRM74RW /D8zNA4yNMJlW5OQ9dvljFz2dR9Q1tA91pAAFlR5Ib+6rZa798/c3/yKjkZ+JjWUVZOQymzMf6eM x7oNj43bWf8Akneze+qr+ctrUW5uG/MtwWXsdmY7Wvuxwfexrvouc3/q/wDRb6vV2erUphCdXRIq 7rp8t/4zFOUCfTHg/wAIz/6T/9Lz/wB+ntPH5VpY27puGOoERnZIc3p471s91d/Uf6308bB/4X7R k/8AafHXMJLYltrt18msHWa1wbxrx8kg0+B5KyUk/Ra6zmuIAjidUgw9xPwWSklorV1of5/er3RO j5/WepVdPxB77JL7SC5tdY/nciz+RX/4JZsqXNpJsr4Tw/NXp80irF7P0b03p2J0rAp6fhNLcfHb DdxlzidbLrXfnW2v99ismV80pLHldni3vW20/SuvimM+K+a0kFP0kd3imO7xXzckkp+kDu8VE7l8 4pJKfo2HEgDWdIWC/q7arw0Mb6JD7BfvJmiu5uO5+zZ/OPr9bMYzf/MUrxBJZvxT2P6P73D/ADnp 4r/wvl/yfye42+Tr9Zd7D5f5fM++9YGPW/FGTgWZTwX24ttdYs9JzBrYx/8Ag/zdn/W3/wA56SHh PxXdSuFOG9uRZT6mRnlgh7ay1rKvtLfbZ9P/AKH/AAbNngyS1f1PEL4ve9qX+c4fb9z/AMK4fc/5 7VHHwf1OIdvmr/Gf/9kAOEJJTQQhAAAAAABTAAAAAQEAAAAPAEEAZABvAGIAZQAgAFAAaABvAHQA bwBzAGgAbwBwAAAAEgBBAGQAbwBiAGUAIABQAGgAbwB0AG8AcwBoAG8AcAAgAEMAUwAAAAEAOEJJ TQQGAAAAAAAHAAgAAAABAQD/4RnyaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNr ZXQgYmVnaW49J++7vycgaWQ9J1c1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCc/Pgo8eDp4bXBtZXRh IHhtbG5zOng9J2Fkb2JlOm5zOm1ldGEvJyB4OnhtcHRrPSdYTVAgdG9vbGtpdCAzLjAtMjgsIGZy YW1ld29yayAxLjYnPgo8cmRmOlJERiB4bWxuczpyZGY9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkv MDIvMjItcmRmLXN5bnRheC1ucyMnIHhtbG5zOmlYPSdodHRwOi8vbnMuYWRvYmUuY29tL2lYLzEu MC8nPgoKIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSd1dWlkOmZhM2EwZThlLWVjZTUtMTFl NS05YzA2LWU2MzU3YTc0NTFiYScKICB4bWxuczpleGlmPSdodHRwOi8vbnMuYWRvYmUuY29tL2V4 aWYvMS4wLyc+CiAgPGV4aWY6Q29sb3JTcGFjZT40Mjk0OTY3Mjk1PC9leGlmOkNvbG9yU3BhY2U+ CiAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjE0MzA8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogIDxl eGlmOlBpeGVsWURpbWVuc2lvbj40OTk8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogPC9yZGY6RGVz Y3JpcHRpb24+CgogPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9J3V1aWQ6ZmEzYTBlOGUtZWNl NS0xMWU1LTljMDYtZTYzNTdhNzQ1MWJhJwogIHhtbG5zOnBkZj0naHR0cDovL25zLmFkb2JlLmNv bS9wZGYvMS4zLyc+CiA8L3JkZjpEZXNjcmlwdGlvbj4KCiA8cmRmOkRlc2NyaXB0aW9uIHJkZjph Ym91dD0ndXVpZDpmYTNhMGU4ZS1lY2U1LTExZTUtOWMwNi1lNjM1N2E3NDUxYmEnCiAgeG1sbnM6 cGhvdG9zaG9wPSdodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvJz4KICA8cGhvdG9z aG9wOkhpc3Rvcnk+PC9waG90b3Nob3A6SGlzdG9yeT4KIDwvcmRmOkRlc2NyaXB0aW9uPgoKIDxy ZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSd1dWlkOmZhM2EwZThlLWVjZTUtMTFlNS05YzA2LWU2 MzU3YTc0NTFiYScKICB4bWxuczp0aWZmPSdodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyc+ CiAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICA8dGlmZjpYUmVzb2x1 dGlvbj43Mi8xPC90aWZmOlhSZXNvbHV0aW9uPgogIDx0aWZmOllSZXNvbHV0aW9uPjcyLzE8L3Rp ZmY6WVJlc29sdXRpb24+CiAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9u VW5pdD4KIDwvcmRmOkRlc2NyaXB0aW9uPgoKIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSd1 dWlkOmZhM2EwZThlLWVjZTUtMTFlNS05YzA2LWU2MzU3YTc0NTFiYScKICB4bWxuczp4YXA9J2h0 dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8nPgogIDx4YXA6Q3JlYXRvclRvb2w+QWRvYmUgUGhv dG9zaG9wIENTIFdpbmRvd3M8L3hhcDpDcmVhdG9yVG9vbD4KICA8eGFwOkNyZWF0ZURhdGU+MjAx Ni0wMy0xOFQxNjo1MDo0NCswODowMDwveGFwOkNyZWF0ZURhdGU+CiAgPHhhcDpNb2RpZnlEYXRl PjIwMTYtMDMtMThUMTY6NTA6NDQrMDg6MDA8L3hhcDpNb2RpZnlEYXRlPgogIDx4YXA6TWV0YWRh dGFEYXRlPjIwMTYtMDMtMThUMTY6NTA6NDQrMDg6MDA8L3hhcDpNZXRhZGF0YURhdGU+CiA8L3Jk ZjpEZXNjcmlwdGlvbj4KCiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0ndXVpZDpmYTNhMGU4 ZS1lY2U1LTExZTUtOWMwNi1lNjM1N2E3NDUxYmEnCiAgeG1sbnM6c3RSZWY9J2h0dHA6Ly9ucy5h ZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMnCiAgeG1sbnM6eGFwTU09J2h0dHA6 Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8nPgogIDx4YXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+ eG1wLmRpZDo3NjZmMmMxOS1kNTI5LWI4NDUtYmYwZC02NDhmOWViMzY1MDg8L3hhcE1NOk9yaWdp bmFsRG9jdW1lbnRJRD4KICA8eGFwTU06SW5zdGFuY2VJRD54bXAuaWlkOjBEQjYyODhGREFFMjEx RTU5RUVERUFDRDg4RTkwMTgwPC94YXBNTTpJbnN0YW5jZUlEPgogIDx4YXBNTTpEZXJpdmVkRnJv bSByZGY6cGFyc2VUeXBlPSdSZXNvdXJjZSc+CiAgIDxzdFJlZjppbnN0YW5jZUlEPnV1aWQ6MzQy YTY1OTgtZWNhYi0xMWU1LWFiNTYtOGY4OGFiM2QxMGVkPC9zdFJlZjppbnN0YW5jZUlEPgogICA8 c3RSZWY6ZG9jdW1lbnRJRD5hZG9iZTpkb2NpZDpwaG90b3Nob3A6MzQyYTY1OTctZWNhYi0xMWU1 LWFiNTYtOGY4OGFiM2QxMGVkPC9zdFJlZjpkb2N1bWVudElEPgogIDwveGFwTU06RGVyaXZlZEZy b20+CiAgPHhhcE1NOkRvY3VtZW50SUQ+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmZhM2EwZThkLWVj ZTUtMTFlNS05YzA2LWU2MzU3YTc0NTFiYTwveGFwTU06RG9jdW1lbnRJRD4KIDwvcmRmOkRlc2Ny aXB0aW9uPgoKIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSd1dWlkOmZhM2EwZThlLWVjZTUt MTFlNS05YzA2LWU2MzU3YTc0NTFiYScKICB4bWxuczpkYz0naHR0cDovL3B1cmwub3JnL2RjL2Vs ZW1lbnRzLzEuMS8nPgogIDxkYzpmb3JtYXQ+aW1hZ2UvanBlZzwvZGM6Zm9ybWF0PgogPC9yZGY6 RGVzY3JpcHRpb24+Cgo8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0ndyc/Pv/uAA5BZG9i ZQBkQAAAAAH/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAQEBAQEBAgICAgICAgIC AgICAgIDAwMDAwMDAwMDAwMDAwMBAQEBAQEBAgEBAgMCAgIDAwMDAwMDAwMDAwMDAwMDAwMDAwMD AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA//AABEIAfMFlgMBEQACEQEDEQH/3QAEALP/xAGi AAAABgIDAQAAAAAAAAAAAAAHCAYFBAkDCgIBAAsBAAAGAwEBAQAAAAAAAAAAAAYFBAMHAggBCQAK CxAAAgEDBAEDAwIDAwMCBgl1AQIDBBEFEgYhBxMiAAgxFEEyIxUJUUIWYSQzF1JxgRhikSVDobHw JjRyChnB0TUn4VM2gvGSokRUc0VGN0djKFVWVxqywtLi8mSDdJOEZaOzw9PjKThm83UqOTpISUpY WVpnaGlqdnd4eXqFhoeIiYqUlZaXmJmapKWmp6ipqrS1tre4ubrExcbHyMnK1NXW19jZ2uTl5ufo 6er09fb3+Pn6EQACAQMCBAQDBQQEBAYGBW0BAgMRBCESBTEGACITQVEHMmEUcQhCgSORFVKhYhYz CbEkwdFDcvAX4YI0JZJTGGNE8aKyJjUZVDZFZCcKc4OTRnTC0uLyVWV1VjeEhaOzw9Pj8ykalKS0 xNTk9JWltcXV5fUoR1dmOHaGlqa2xtbm9md3h5ent8fX5/dIWGh4iJiouMjY6Pg5SVlpeYmZqbnJ 2en5KjpKWmp6ipqqusra6vr/2gAMAwEAAhEDEQA/ANU6sI+4l/115v5B61D/AFf/AJL9f6/85J6P fVHkUU5QsP8AmkP8J6xw37/ks3P+nP8Aq/yV8uAz1At/X8f8hfT1f2/9X+v1/r/W/wC36PY36K/9 X+r7OGOHAZz13yRzzq/w1f7V/a/6L/X+t/R7917/AFf6v9jhwGeu7fj/AHr1D/V/2v8Akv1/r/XJ 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 IZip23R7Vym+tvY3cL5vG4hM3WYePDyT+dKmGgljn8aJrRH/AG/JJJ5Pfta+vVfDk9P5dccN3/0b uHYG5O0sF3B1vlutNnVOYo91b8xO89vVO0tt1O3pvsMxR5jOUE7QUb0zv4JI9etNfjj8kknk9+1r 69e8OT0/l1Fb5C9DR7IwfZMncfWFP17uRKyTb+9Jd87apNsZj+FUEtfkIsXnPuPt3emgineSOB9c CJJHH/lHkk971r69e7ustJ3/ANH1++tu9ZUXbfXU3Yu6tt028tr7Fh3fgU3VntqzUa1lHnMPt+Gf 7p6Z6V/JHJBG/o/4D+STySe/a19evd3ThsjufqLsnN7s21152ZsPem4tg1n8N3lhtq7qw+YyW1a9 Hej+3zFHh5ZZaN0ZJIP836H8lPH5Kjye/a19evMrpw6Erj6/p0/6n0aNH7N/2f0aNXj9H+b/AM3H 5KjySe7dV64/pFv0afT6fTo0fsx+Pw/o0fo/b/R/m4/3PJJ7917rH6VHPp0/6n0aPD+z+34dWjR+ j0fo/wA3H+55JPfuvddm6/jhfT/qNGj9n/dP6NH6P2/0f5uP9zySe/de64foH+p0/wCpGjR4/wBj 9vw/o0fo/b/R/m4/3PJJ7917rjYDk/t6P9T6NGj9n/dP6NH+b9H6P83H+55JPfuvdRyQbE+u/wBV BM2rygwj/gORq16hH6NOsN4Iv2dch917oq/znJX4UfMM6tI/2Vr5BnUHVf1dSZen1eWIEerUIyyg BtXgQLEHJM9k/wCSzaf81ov+Pr03N/ZN9h/wdfN395EdEXXvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3XvfuvdGf6C/5 lT83P/FYNp/lef8AnM/qL/VAn/kmx/xtcErv/wDcqy/5rN/2j3HTifC/2f8APy9f/9TVIk/zkv5/ dk/2PrM39v8A5L9f/LST+xH764bYP91lsP8AhMX/ABxesYbvN1J/pm/wn/isfYPM9RTf6f77/jr/ ALt/5L9f/B3/ALEfs46b/wBX+Ty/Zj7B5nru3P8Aqf8AY/8AT3/dv/Jfr/4PJ/YT37r3+r/VT9mP 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 WE2/hUjo8dR0kE4gpaSljWGniRY4VUIg99HNpt5bLa7aynkaWSGKNGdmLs7IgVnZ2qzMxBJZiSxN Tk9QFcypNcyTIAodmYKAAACa0AGABgUGPLh1bz/wnuy/SGy/5kmy+1u/O1urOntn9Q9Zdo7xxm5e 3t/7P652zXbqyWETrXF4ahym9amkpp69YdwVVZT0cMvmVKaScC1PKyxN7/Q73ee3U21bFaz3c13N DGyQRSSuEVjMzFYwxC1iVSxGmrBTlh0KeSGs4t/S5vZUiWJHYF2VRqI0gAsQCTqJHmaVGB1ct/wp 2+c3x+7n+OXxx6V+P/yC6a7piy/c24Ox97J072hsjsj+70XXuzZNu4GPc9RsrI1hoUqpdy1ElLHV oFmeleSM+Sl9w1923krftn5h3Hed+sLizKW6wx/UQyQ6vFkDtoEiLqKiEBip7QwBw3Qo9w95sbuw t7Sxnjm1OWbw3V6aVoK6SeOo0B+KnyPWleDbg3UC/wDtIXxfm3+0av8AkD/g/vMn/V/q/wBX/VTq KP8AV+3/AD/z+zrem/4TZ97fDP4x/BretV3L8qfjL1T2f2r3ruvcuQ2v2R3p1bsTeVBtDbW3sVtL bNNktubmy9PVxQ/cU+UrKZ5adNSVQI1LpZsIfvE7HzfzJzrCu0bXeXVta2yIHhtppYzI7u7kOkZU mhRSATQr646mHkG92nb9nc3VzFHJLISQ8iK1AAq1BYHJDEGma4xTq4js7tz+Rp3VumXfPc3Z38p/ tre0tFSY2beHZ29PiDvzdMmOxGoUFBLuDdVTV1ZgpdTCGIzaY7nSFufcS7btXvXs1t9Fs9tvdpCC T4cMd/ElTxOlAq1PmaVPQpuLrk68k8a7kspXpTU7QMaeQqSTTpJVH8xH+SZ8Ids5OfrXuf4Z7Bxs +Plrp9ufE7C7D3TWZnw1oiSgOF+PFFWqahqiYER1WgIGaolaOBZJlVr7fe83Olyq7jZ7hOwNNd80 qBcZOq7ZcUFO2tTRRViFLZ33lHaIybeWBBStIQprn0iByT6/bwqetT/+cT/Pv3V88MFW/Hf45YXc /U/xlNa8m8sjnqmmpd/90nG1iVOMh3BR4xpI8RhIJESpGKSqnknkEctXIrIlLFlT7RexNryLOvMP MTpdbnT9MKCYraoo2ktQvKQaeIVUKKhBnUY15p50k3lDY2AMdvXur8UnpUDgv9Gp1cTjHWt9e3P6 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 9nXv624/5M/R/X/Uf9Ef8tPfuvfb/q/z/wCX7Ouj+fquk+n+x+j6/wDBNP8AyZ/y0927o269w/1f 6q1/n9nXd7X/ADp/x8WjR6/+QNH/ACZ/y09161T/AFf6uNf5/Z176f09H/IGnT/0J/0R/wAtPfut 8f8AV/qr/l+zr30+np0/8g6NH/Qun/rH/wAtPfutf6v9XrX+f2de5HAOkL/yBoP6/wC3+jR/yZ/y 09+699v+r/PX+f2de+jf6n/av80PR/yVo/6I/wCWnv3XvL1/n/q/y/Z176cfp0/6r0lNPq/2rR/0 R/y09+63/q/1cP8AZ+zr36f+QP8AkD9P/Qn/AER/y09+69/q/wBXr/l+zr1+L/p0/p/sH0fX6/o0 f8mf8tPfuvf6v9XrX+f2de+n+06f9UfFo0/9Caf+TP8Alp791r/L/q/Ov8/s69+f6af+nOnT/wBC f9Ef8tPfut/5fz/4v/L9nXuf+C6fV/qNGjn/AJA0f8mf8tPfutf6v9XrX+f2deI08kcf4ejRp/4P +jR/yZ/y09+69/q/1etf5/Z161v9pt/a/wAzbT/yVp0f8mf8tPfuvV/1cf8ANx/n9nXhwbcLp+v9 nTp/x/sf9Ef8tPfutn/V/q8/8v2deHA/w/x9H6f6j+x/0R/y09+69/q/1ev+X7Ovf8mlf+Qbaf8A oXT/AMmf8tPfutf6v9XrX+f2deHpH00lf9aH9H/Qmn/kz/lp7917j/qr/wAXX+f2dd/j+hU/8sig U/8AJn/RH/LT37rf+r1/4v8Ay/Z10TY3Hp0n/gujT9ef7Oj/AJM/5ae/da/1f6vWv8/s653tyLKV v/tGjT/0J/0R/wAtPfuveX2/6vz/AMv2dcPzf9Nv7X+a0aPr/wAE/wCiP+Wnv3W/9Xr/AMX/AJfs 64hQDybaP6koE08/8gf9Ef8ALT3bW3XiT5f6v8/+X7Oslwt7f2bf82f0/T/VaP8Aoj/lp7r1qn+r j/xf+X7OugbG9tNv6/s/o/6F0/8AJn/LT37r3+r1/wCL/wAv2ddgACx9On/kAIU/6E0f8mf8tJPf uvHj/q/1Gv8AP7B1jb6j8hePp4dOn/X/AEf9Ef8AB/bq/wCr/V/q/wCcnVh/q8/+L/y/Z13Y/wCF l/11KaT/AMmaP+TP+D+6629evV/1f6uNf5/Z11wObXC+oj9H6P8AW/Rp/wCTP+Wnt/rf+r/V6/5f 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 R1CxySsZnne1lcXFxtsTzjhJUVBHClYywp/pvsI6b+jYDSshC+n+o/5OrZPh98OeofhV1XH1d1JS ZGeOvrv43u3dufqIq7c28twzQLRNlMrPQpHEI441WmpaWjiSJUBjjDl6qplCm77xeb1dfVXZGBRV HwqPQf4STk/ZQBVFEkS6V6NWbsL/AKtX6f7fD+j/AHT+vX/m/wBv9f8Am4/2/JJ7KunOuNwT6vVq /Sxs+vX6P906df8AqP2/1/5uP9vySe/de699QhPq1f6q769Y0f7q/Xr/AM3+3+v/ADcf7fkk9+69 1xJLBf7Wr/VDX+v0fueH9f8AqP2/1/5uP9uOST37r3XHljYeot+W9f6vR/un9ev9Ho/X/m4/2/JJ 7917rG1/oP7Vv6Pr8no58P69f+0fr/zcf7fkk9+6914c8/q1f8h31+j/AHT+v/Uej9f+bj/b8knv 3XusZ5Ny3H6bfr16/R/un9ev/m3+v/Nx+OPySe/de64nn6/2v+Q/1nR/un9ev/N+j9f+bj/b9+69 14i/0+rf8h69Z0f7p/Xr/wCbf6/83H44/JJ7917rjxbnkf8AJdtfo/3T+v8A45/t/r/zcf7fv3Xu uJ1Hj8/j+3q1/wBPD+vX/tH6/wDNx+OP37r3WNrtYH+0f+D/AK/R/Y/Xr/2j9f8Am4/HH7917riL N/tQb0j+3r1+i3o069f+0fr/AM3H+37917rief8AkL/VevWH9H9j/V/82/1/5uPxx+T37r3XFrGw /Lf19f6/R/Y/Xr/2j9f+bj8cfv3XuvcN/tX/ACQ/6/R/Y/X/ANO/1/5uP9v37r3XE88Wtx/wf9fo +kf69f8AtH6/83H+37917riR+Txq+n9vVrOj+x+vX/tH6/8AN/5v37r3XHVfggsW/Vf1j1+j+z+v /kD9f+b/AG4/fuvdceQf9V/XV+9/nPR/Z/Xr/wBo/X/m/wDN+/de64nm/wDaP19Xrtr9H9j9ev8A 2j9f+b/zfv3XuuPJ5/1XK/2tev0f2P16/wDaP85/m/24/fuvdeNrc/2vr/b16+f7H6/+nf6/+Wfv 3XuuJ5/r6kv6vX+vn+x+v/kD9f8Am/24/fuvdY/r9PUWt/tevX/wT9f/AE7/AF/824/fuvdebUW/ Lav1L+v9f/BP1/8AIH6/+Wfv3XuuP1P+P+Pr1iT/AIJ+v/ov/ln7917rjcHm/wCr02/XrMn/AEP/ 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 f5z/AIDx/t+ST37r3XEDU2o+osLX4cuHYRkOYP1hyqp+3+uwgj/bEknv3XuuHDkkgOJA6nWA/kWc iKRT4dGsS6VQhP8AOWEafth5PfuvdcPr6uXLhwf93eQTMqOJPD+sSlVU6P8AOECOP9sPJ7917rif WCT6zJr1X9fk87qZL+H9flZVU6P84QIE/bDye/de64m8pJHq8nk1E+vyidl8t/Dp1+UxKraP84QE Tx04eT37r3Xv1lmb1+QSBtQ1mUVBVJAfD/nPKURG0f5wqsaeOMPJ7917rgbsNR9WsOJNX72sVLAS g+H9flICto/zhARPHTxySe/de66azAk+syB7n/P6/M6s4Jh06/IyKDo/zhARPHAHl9+691jPr+ql hJ5EOr1+UTsvkB8OjyeUoito/wA4VEcfjpw8nv3XuuPDX/tFwwJb94yeZhrv4dHk8hAJ0f5wgIn+ TiST37r3XHliWPrMgYHUNayCZvWCYdOvyMlyE/zh9Ef+T+ST37r3XE3b1fq1h7n/ADxk87AScw/r 1EKW0f5wgRp+3HJJ7917rzDWTq/cLagdR8nkE0gZwfFp8nkdQDo/zhASPxwRSe/de64EXJA9TOGB a3l8gnYFwfBo1iQgE6P84QEj8dPFJJ7917rgeb39Zk1qf93mTzOC1/Dp1+RlDHR/nCAkfjgjk9+6 91S9Rfyx99LkPmtlshu/ZFdP3XD2jRfHzFjI7hkx2yKftPdJ3JmK7eEseLUU1TMKHE0Tti6asLRx TBHMXkUwNH7SbgJd/nlmiY34uBZLqfTCLiTWxk/T7WOmNToEnaGzmh7A3n95FyW9h7ObVYbXuMSc nNs0nNE3hWnjbk+zWf0lvHYj6s+NChnvrhRcyWlZZIiUBXUpiupPhNlNgfCjtT4/5fO4PO9ud07a 7Nq9+72WpyM+AyXZO/cXLj8XXQ132a1jY+jMGOVWWiMkphkkjhRJJlIp2X2/m2zkC85ZnkSS9v0n M0tW0NPKpVWqVDaEog+GuCwUE06x991Pvlbbz598flj352iyubLlXk+72iPbNv0xC6i2jbp45Zoj Gs7QfU3Oq5an1BQeJHE0zLGJOie5j+Vb23VfG7q3rTF9kbFpu2oOzczujtzfL5PdNRj6raea2W/W cWB2ZKmMaesNNgoqSkp4KiCkjkZpyskSN5HA8/s5vb8qWe0w3UK3onaS5mLSaTG0Rg0Rnw9TaYQq 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 g7dH/vaf5uuH+y69leph/wAJzfigdQuCfkF8dOdS/tg3xX4F2P0/DcKLHx562TWW/wBevd80qf3Z uFTwGT4+QB614U699LIBjbo/97X/ACj/AAdKb+dDtPF9dfyk+r6CH41dPbBxOC3P1aMx1BJNNJ/o Dzu7cLW1uSj6k3NsapoKZ8hjs1VPjqmdIZKavo56yVogjKPe/uf397vn3n5Xj5hvGuLiK7Ed6qBj fJGBQXUUwciOSFPECk6o3RBXHW+YEWPZSPDWi6e2vw1PkRTgT+zoL/kD80d7dBYr+U90N0H0j8L9 n4D5P9DdSmml7w2PuDM9fdRZDf8AV4akVo80mapqmkwNJPlJa7JVVbJUVMoElTPM8jOWFHtz7P7Z zxN7mc5c5b1vk03Ld9clht8qR3F94TTVZ0MbAysIwFVNIUdqigACW+v5LQWltbxR0lQfEKhfszw+ 3oNPkz3x8zcR8ruu/wCXRS78/lG4vcvyL2pj2oflL0ZsnJ1/XfWtHuWTLUlRTZPeW78hlaahr0jx M6TPJiJ3iWqgeHTI0ciD32+9u/am49vtw97riLm+S22CeMHbby6USXb1jZdKwiJ2Qax8LgVWhNKj pNdXl6LlduXwKyD41XC1HqSRXpC/y3F3P/Lh/mdbb/l1Jj/iT3Pl+0oslVdi/Kvqmp3dvbdGV25U 9OV/bWD2Ps3elbkKWgpKCjrcfSLkaJcQEmnRnnMkkcMsRx95Kws/fb2CuPft5932yHbdEdrs9z4U dvG4uVtpJpECNI7srHQ7SVC0phmBps7Ptu6DbCqOzfFIKk/CWoPLyzjrcJPNh9Q/PqOsSBhqt6rX vYn16dXDPoQqDyX6HXXFuf8AY2sD9DrYaeTYm99Q1addtR0oVB917rr8X/B9V7n6X131W1f7Vq06 v7ZUCyH3Xuv/09OaWgqBHG/jZw9xpETt/wAgfp99QRZTRjPWP6TJUgmlPmP8/XcFPVaXkEEohGtZ WVDpUL/nPJ/wT35Lacj1/l1qR46gVFcU/wBXz6kTU/kgpZfA8OryxvUsf8nqEibSZ0/2v/V+7vCZ IIuqK+lita/LzFfL7PTrFTUyGaNpG8sHlsPHrf7hP9o0e9w2/iS0OYurySEKQuDT7KdcZpmqJpp3 4k1svjtoMUSRkH9v3VpPEmNwR1ZVCqEHD19TXrNTvM0ktRSRvrWLxxLE2uaJGRU1xhdPHtyBpmlM 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 H611atf/ADrR915PD/tWjyaP+UXxfb/t+X37r3XmtpbVo/W2vVr/AOdaPuvJ4v7evRr0f8oXi+3/ AG/J7917rg1rjXo/Wdfl1/8AOqH3Wvw/2/Lo8+j/AJQv+A/+T+T37r3XA6dK6tP621+Tzf8AOuj+ 61+H+35dHn0f8ovj+3/yfye/de65NbjV4/1jX5Nf/Ou/yrX4f7evRr0f8ovj+3/b8nv3XuuvTpbV b9Ta7+b/AJ1Q+61eH+35dGvR/wAovj+3/wAn8nv3XuuBtY69H1Ovza/+dan3Ovw/2/Lo8+j/AJRf F9v/AJP5PfuvddNaxv4/84+vya/+dan3Xn0f2/Lp+40f8ovj+3/yfye/de69x6tWj9UmvX5L/wDA Afda/F/b8ujz6P8AlFt9v/k/k9+6910+ix1aP1tr8nm/51ifc+fx/wBvy6fuNH/KL4/t/wDJ/J79 17rz6LtfR+uo1+bzf860eXz6P7fl0/c6P+UXR4/8n1+/de64to9erR+uX9Xm0f8AFuby+Xx/2/Lp +5/6ZdHj/wAn1+/de64yW5vo/XUa/P5L/wDFt/d+40f2/Lo+50f8ovj8f+T+T37r3XptNnvo/wB3 /wCe83/KgPN9zo/t+XT9z/0y6PH/AJPr9+691xe3r1aP1y6/Jr0f8W1PL9x4f7fl0fc6P+UXxeP/ ACfye/de64vp/cvo/XUf5/zf8qDeb7nR/b8un7m3/KLo8X+T6/fuvddSabNfR+uo1+fzf8qA8v3G n+35dP3Oj/lF0eP/ACfX7917rp7a3vo/XPr8vk/51o8vn0f2/Lp+50f8oujx/wCT6/fuvdcRp0vq 0/rP+e81v+AP7v3Ph/t+XT5/+mXR4/8AJ9fv3XuvSabyatP66jX5vN/yojy/deL+35dP3Oj/AJRd Hj/yfX7917ri+i0t/D9Zf8/5v+VBvL9zo/3Z5dP3H/TLo8f+T6/fuvddSabvfR+uXX9x5v8AlQXy /caP7fl/z+j/AJRfH4/8n9+691ibT+5fx/Wb/Pea3/AAeX7rR/zd0/cW/wB0aPH/AJPr9+691wfT aW/h+st/N5rf8AE8v3Oj+35f+BFv+UXx+P8Ayf37r3XJ9P7l/H9Jv+BHk/5UV8v3Wj+35f8AgRb/ AHT4/H/k/v3XuuLaNMt9P0m/4Eeb/lQTy/faP7fl/wA//wA2PH4/8n9+691xa37l9H+7f89r0f8A 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 --oVRejI1DFODqd8kef=_lcffDxK9JFrLHTM Content-Type: image/jpeg; name="kk1.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="kk1.jpg" Content-ID: Content-Description: Photo /9j/4AAQSkZJRgABAgEASABIAAD/4RfPRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUA AAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAbAAAAcgEyAAIAAAAUAAAAjYdp AAQAAAABAAAApAAAANAAAABIAAAAAQAAAEgAAAABQWRvYmUgUGhvdG9zaG9wIENTIFdpbmRvd3MA MjAxNjowMzoxNyAxNzozMjo1NQAAAAAAA6ABAAMAAAAB//8AAKACAAQAAAABAAADFqADAAQAAAAB AAACEQAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEA AgAAAgEABAAAAAEAAAEuAgIABAAAAAEAABaZAAAAAAAAAEgAAAABAAAASAAAAAH/2P/gABBKRklG AAECAQBIAEgAAP/tAAxBZG9iZV9DTQAC/+4ADkFkb2JlAGSAAAAAAf/bAIQADAgICAkIDAkJDBEL CgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsN Dg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwM/8AAEQgAawCgAwEiAAIRAQMRAf/dAAQACv/EAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYH CAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQh EjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXi ZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5/cRAAICAQIE BAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKy gwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dX Z3eHl6e3x//aAAwDAQACEQMRAD8A8yc4GTOs8KQdUXbNWscG+5xmHx7rPbH6Pf8A+Bf8IrvSunYe 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 AAAGAAAAAAABADUAAAABAC0AAAAGAAAAAAABOEJJTQP4AAAAAABwAAD///////////////////// ////////A+gAAAAA/////////////////////////////wPoAAAAAP////////////////////// //////8D6AAAAAD/////////////////////////////A+gAADhCSU0EAAAAAAAAAgAEOEJJTQQC AAAAAAAOAAAAAAAAAAAAAAAAAAA4QklNBAgAAAAAABAAAAABAAACQAAAAkAAAAAAOEJJTQQeAAAA AAAEAAAAADhCSU0EGgAAAAADPQAAAAYAAAAAAAAAAAAAAhEAAAMWAAAABABrADkALQAxAAAAAQAA AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAMWAAACEQAAAAAAAAAAAAAAAAAAAAABAAAAAAAA AAAAAAAAAAAAAAAAABAAAAABAAAAAAAAbnVsbAAAAAIAAAAGYm91bmRzT2JqYwAAAAEAAAAAAABS Y3QxAAAABAAAAABUb3AgbG9uZwAAAAAAAAAATGVmdGxvbmcAAAAAAAAAAEJ0b21sb25nAAACEQAA AABSZ2h0bG9uZwAAAxYAAAAGc2xpY2VzVmxMcwAAAAFPYmpjAAAAAQAAAAAABXNsaWNlAAAAEgAA AAdzbGljZUlEbG9uZwAAAAAAAAAHZ3JvdXBJRGxvbmcAAAAAAAAABm9yaWdpbmVudW0AAAAMRVNs aWNlT3JpZ2luAAAADWF1dG9HZW5lcmF0ZWQAAAAAVHlwZWVudW0AAAAKRVNsaWNlVHlwZQAAAABJ bWcgAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExl ZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAhEAAAAAUmdodGxvbmcAAAMWAAAAA3VybFRFWFQAAAAB AAAAAAAAbnVsbFRFWFQAAAABAAAAAAAATXNnZVRFWFQAAAABAAAAAAAGYWx0VGFnVEVYVAAAAAEA AAAAAA5jZWxsVGV4dElzSFRNTGJvb2wBAAAACGNlbGxUZXh0VEVYVAAAAAEAAAAAAAlob3J6QWxp Z25lbnVtAAAAD0VTbGljZUhvcnpBbGlnbgAAAAdkZWZhdWx0AAAACXZlcnRBbGlnbmVudW0AAAAP RVNsaWNlVmVydEFsaWduAAAAB2RlZmF1bHQAAAALYmdDb2xvclR5cGVlbnVtAAAAEUVTbGljZUJH Q29sb3JUeXBlAAAAAE5vbmUAAAAJdG9wT3V0c2V0bG9uZwAAAAAAAAAKbGVmdE91dHNldGxvbmcA AAAAAAAADGJvdHRvbU91dHNldGxvbmcAAAAAAAAAC3JpZ2h0T3V0c2V0bG9uZwAAAAAAOEJJTQQo AAAAAAAMAAAAAT/wAAAAAAAAOEJJTQQRAAAAAAABAQA4QklNBBQAAAAAAAQAAAAROEJJTQQMAAAA ABa1AAAAAQAAAKAAAABrAAAB4AAAyKAAABaZABgAAf/Y/+AAEEpGSUYAAQIBAEgASAAA/+0ADEFk b2JlX0NNAAL/7gAOQWRvYmUAZIAAAAAB/9sAhAAMCAgICQgMCQkMEQsKCxEVDwwMDxUYExMVExMY EQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQ0LCw0ODRAODhAUDg4OFBQODg4O FBEMDAwMDBERDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCABrAKADASIA AhEBAxEB/90ABAAK/8QBPwAAAQUBAQEBAQEAAAAAAAAAAwABAgQFBgcICQoLAQABBQEBAQEBAQAA AAAAAAABAAIDBAUGBwgJCgsQAAEEAQMCBAIFBwYIBQMMMwEAAhEDBCESMQVBUWETInGBMgYUkaGx QiMkFVLBYjM0coLRQwclklPw4fFjczUWorKDJkSTVGRFwqN0NhfSVeJl8rOEw9N14/NGJ5SkhbSV xNTk9KW1xdXl9VZmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9xEAAgIBAgQEAwQFBgcHBgU1AQACEQMh MRIEQVFhcSITBTKBkRShsUIjwVLR8DMkYuFygpJDUxVjczTxJQYWorKDByY1wtJEk1SjF2RFVTZ0 ZeLys4TD03Xj80aUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9ic3R1dnd4eXp7fH/9oADAMBAAIR AxEAPwDzJzgZM6zwpB1Rds1axwb7nGYfHus9sfo9/wD4F/wiu9K6dh5uJm333Gu7HDfs9DSG+qXM yLXtG8O/mm4/rf8ADbPsn8/lUK3m/V3Ebn5lGHlB1eMyhzGvLXPJu27vVe44rGU0Od+mt2/obbKK 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 wGkBwLnAMc/2ht30Gqn1cX9SxcLEt9Is6e0MrNdQrtDQPT9A2bnfomV/R9lX6T/i0blHTUeB/gp4 rP6X0h2PZf0662u5gBGJc2S7UAtqtZub7Z3/AElhuDmna4EEcg6Fdhk9LuY5xDIaSS0CTAn2tk/S 2qhdiyNtjQ4eDhKBlfSlU//V8sTJ0x5SUpTZW57g1oknsFEcrR6d/J57+n/Of2d6Ma6lBvonxenY mMBb1BxnkUMjcf6x/wAGrGR9YHio4+I0Y9H+jr0n/jHfTs/trKv+kZ38/nIB78qxEz4f1caj1r5v 8JiIjfrOvS/lTWZdlhlzkL1PNDSUJ4utsgrok3ynDihDlSCQtOiYPU22ahACk3kcqQWt0eo/xdWf 9mnTh4i//wA82rctyuj4xdZ1bGdmUGq1jKwAQLSWHGsgur/dsY73f4Rc9/i6/wDFr0znm7/zxctb qk+mY9T6Lv5qN39qf8F/pFDP+cN/ux/Oa4fKPMuN0zb9g6y0TBxK2kuIJnd7zpH5y53QuI5A578L dwP+Tusf+FWcf11P66f0rE/oX9Er/oH0f+vf8InQr1a9R9UG/Tp317OTgdZ6r0xwOBl240aljHHY f61Tt1Tv8xdFi/4x80gM6xh0dQaIHqtHo3fHezdX/m11rj/FMiOOtNvH5f8AnLxb1tn14rdk2Obg xgucBU31CbWD/hbHDZZv+n9Bn/GK5V1j6vZ4/nhQ8jVl42H/AD/dT/4IuIq5d8PlyPp/yVBRmkav /9kAOEJJTQQhAAAAAABTAAAAAQEAAAAPAEEAZABvAGIAZQAgAFAAaABvAHQAbwBzAGgAbwBwAAAA EgBBAGQAbwBiAGUAIABQAGgAbwB0AG8AcwBoAG8AcAAgAEMAUwAAAAEAOEJJTQQGAAAAAAAHAAgA AAABAQD/4RwxaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49J++7 vycgaWQ9J1c1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCc/Pgo8eDp4bXBtZXRhIHhtbG5zOng9J2Fk b2JlOm5zOm1ldGEvJyB4OnhtcHRrPSdYTVAgdG9vbGtpdCAzLjAtMjgsIGZyYW1ld29yayAxLjYn Pgo8cmRmOlJERiB4bWxuczpyZGY9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5 bnRheC1ucyMnIHhtbG5zOmlYPSdodHRwOi8vbnMuYWRvYmUuY29tL2lYLzEuMC8nPgoKIDxyZGY6 RGVzY3JpcHRpb24gcmRmOmFib3V0PSd1dWlkOjJmNzRkNTUyLWVjMjMtMTFlNS04MzI0LThkYWJm ZjNmNzJmNycKICB4bWxuczpleGlmPSdodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyc+CiAg PGV4aWY6UGl4ZWxYRGltZW5zaW9uPjc5MDwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgPGV4aWY6 UGl4ZWxZRGltZW5zaW9uPjUyOTwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgPGV4aWY6Q29sb3JT cGFjZT40Mjk0OTY3Mjk1PC9leGlmOkNvbG9yU3BhY2U+CiAgPGV4aWY6TmF0aXZlRGlnZXN0PjM2 ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQwOTY0LDM2ODY3 LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3Mzc3LDM3Mzc4LDM3 Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3Mzk2LDQxNDgz LDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQxNzI4LDQxNzI5LDQx NzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkxLDQxOTkyLDQxOTkz LDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwx NSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwzMDs5MDI3QUVFOURFM0EyNEFFRTZE MDY4Q0RDNTZGODAzMDwvZXhpZjpOYXRpdmVEaWdlc3Q+CiA8L3JkZjpEZXNjcmlwdGlvbj4KCiA8 cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0ndXVpZDoyZjc0ZDU1Mi1lYzIzLTExZTUtODMyNC04 ZGFiZmYzZjcyZjcnCiAgeG1sbnM6cGRmPSdodHRwOi8vbnMuYWRvYmUuY29tL3BkZi8xLjMvJz4K IDwvcmRmOkRlc2NyaXB0aW9uPgoKIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSd1dWlkOjJm NzRkNTUyLWVjMjMtMTFlNS04MzI0LThkYWJmZjNmNzJmNycKICB4bWxuczpwaG90b3Nob3A9J2h0 dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8nPgogIDxwaG90b3Nob3A6Q29sb3JNb2Rl PjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgPHBob3Rvc2hvcDpIaXN0b3J5PjwvcGhvdG9zaG9w Okhpc3Rvcnk+CiA8L3JkZjpEZXNjcmlwdGlvbj4KCiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91 dD0ndXVpZDoyZjc0ZDU1Mi1lYzIzLTExZTUtODMyNC04ZGFiZmYzZjcyZjcnCiAgeG1sbnM6dGlm Zj0naHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8nPgogIDx0aWZmOk9yaWVudGF0aW9uPjE8 L3RpZmY6T3JpZW50YXRpb24+CiAgPHRpZmY6WFJlc29sdXRpb24+NzIvMTwvdGlmZjpYUmVzb2x1 dGlvbj4KICA8dGlmZjpZUmVzb2x1dGlvbj43Mi8xPC90aWZmOllSZXNvbHV0aW9uPgogIDx0aWZm OlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgPHRpZmY6TmF0aXZlRGln ZXN0PjI1NiwyNTcsMjU4LDI1OSwyNjIsMjc0LDI3NywyODQsNTMwLDUzMSwyODIsMjgzLDI5Niwz MDEsMzE4LDMxOSw1MjksNTMyLDMwNiwyNzAsMjcxLDI3MiwzMDUsMzE1LDMzNDMyO0EzQzg5Qjk4 RjZCNUI5MkFDRUFGNThDNkQ5OEY1QzIzPC90aWZmOk5hdGl2ZURpZ2VzdD4KIDwvcmRmOkRlc2Ny aXB0aW9uPgoKIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSd1dWlkOjJmNzRkNTUyLWVjMjMt MTFlNS04MzI0LThkYWJmZjNmNzJmNycKICB4bWxuczp4YXA9J2h0dHA6Ly9ucy5hZG9iZS5jb20v eGFwLzEuMC8nPgogIDx4YXA6Q3JlYXRlRGF0ZT4yMDE2LTAzLTE3VDE3OjMyOjU1KzA4OjAwPC94 YXA6Q3JlYXRlRGF0ZT4KICA8eGFwOk1vZGlmeURhdGU+MjAxNi0wMy0xN1QxNzozMjo1NSswODow MDwveGFwOk1vZGlmeURhdGU+CiAgPHhhcDpNZXRhZGF0YURhdGU+MjAxNi0wMy0xN1QxNzozMjo1 NSswODowMDwveGFwOk1ldGFkYXRhRGF0ZT4KICA8eGFwOkNyZWF0b3JUb29sPkFkb2JlIFBob3Rv c2hvcCBDUyBXaW5kb3dzPC94YXA6Q3JlYXRvclRvb2w+CiA8L3JkZjpEZXNjcmlwdGlvbj4KCiA8 cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0ndXVpZDoyZjc0ZDU1Mi1lYzIzLTExZTUtODMyNC04 ZGFiZmYzZjcyZjcnCiAgeG1sbnM6c3RSZWY9J2h0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9z VHlwZS9SZXNvdXJjZVJlZiMnCiAgeG1sbnM6eGFwTU09J2h0dHA6Ly9ucy5hZG9iZS5jb20veGFw LzEuMC9tbS8nPgogIDx4YXBNTTpJbnN0YW5jZUlEPnV1aWQ6RDhDRTQ3RDkwQUJGRTQxMTlCRDlC MDhDODg4Qzc0NjM8L3hhcE1NOkluc3RhbmNlSUQ+CiAgPHhhcE1NOkRlcml2ZWRGcm9tIHJkZjpw YXJzZVR5cGU9J1Jlc291cmNlJz4KICAgPHN0UmVmOmluc3RhbmNlSUQ+dXVpZDoyZjc0ZDU0ZS1l YzIzLTExZTUtODMyNC04ZGFiZmYzZjcyZjc8L3N0UmVmOmluc3RhbmNlSUQ+CiAgIDxzdFJlZjpk b2N1bWVudElEPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDoyZjc0ZDU0ZC1lYzIzLTExZTUtODMyNC04 ZGFiZmYzZjcyZjc8L3N0UmVmOmRvY3VtZW50SUQ+CiAgPC94YXBNTTpEZXJpdmVkRnJvbT4KICA8 eGFwTU06RG9jdW1lbnRJRD5hZG9iZTpkb2NpZDpwaG90b3Nob3A6MmY3NGQ1NTEtZWMyMy0xMWU1 LTgzMjQtOGRhYmZmM2Y3MmY3PC94YXBNTTpEb2N1bWVudElEPgogPC9yZGY6RGVzY3JpcHRpb24+ CgogPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9J3V1aWQ6MmY3NGQ1NTItZWMyMy0xMWU1LTgz MjQtOGRhYmZmM2Y3MmY3JwogIHhtbG5zOmRjPSdodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMv MS4xLyc+CiAgPGRjOmZvcm1hdD5pbWFnZS9qcGVnPC9kYzpmb3JtYXQ+CiA8L3JkZjpEZXNjcmlw dGlvbj4KCjwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSd3Jz8+/+4ADkFkb2JlAGRAAAAA Af/bAIQAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgIC AgICAwMDAwMDAwMDAwEBAQEBAQEBAQEBAgIBAgIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD AwMDAwMDAwMDAwMDAwMDAwMDAwMD/8AAEQgCEQMWAwERAAIRAQMRAf/dAAQAY//EAaIAAAAGAgMB AAAAAAAAAAAAAAcIBgUECQMKAgEACwEAAAYDAQEBAAAAAAAAAAAABgUEAwcCCAEJAAoLEAACAQME AQMDAgMDAwIGCXUBAgMEEQUSBiEHEyIACDEUQTIjFQlRQhZhJDMXUnGBGGKRJUOhsfAmNHIKGcHR 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 /nf4XlKOuqsBnovNDP8AwfKwQyU0vj9vQvaxy+NN/wA2urzeLLEPB6W/b3btd3R2BlN95Da+z9lt Vw0dBR7b2Ng4sHgMXj8XS/bUEUVLF+/PUeD/ADtVL+9N/wBY/bFze/US+N59ehtzbxeABx6CWSVJ pGQtpb+yf+OhB9tJMa/PpfC9c9YlOn9uRNK/8jPPH+Pu/j/P+fTuenmnp4fDqhZGLC+n/W5H+x59 08cfL+fT+nxDSbpN5Jq6lk/e1ssn+be0n7kf/G/apJ4fLpPcpLH5dRklZW8qNqVv85G/+w/2Ht7o rd+Oc9O2Yzmc3FS4mPLZrM5an2/jUw+34MlkaqsjwWIjkmqo8Ni4qqWb7HHwVE0kvii/Z96muZZf pfG6TFIoqeCek+qGYsGiKyW+n+8+3F6pL+p1Pp6OT0rIS8ev+2P9bj/D3XxV6S6X9D1ly2LkpzSx MPpD5rn/AJuf63+t7c1eJ15ofDxTrvB57PbXrv4ptzNZXb2UjhrKZclh8hVYvIx09ZFNS10UVVSz Qz/bzwTSRS+9x3MtvL+j0mmhiki/W6dWwdVNtOPclVUUa41s3JgaVXrIv4pUVsdLDkKqWKlv556e hhmj8sv/ADej971fqeD5/wCz0xrHhfLpkwJxcWYp13BU1NLjI0qHmqKCn+4qJBHSzfaxRRfs/wCe n8XvaPT7Oqf2f68HDpqXJys36tLSf5yPyDx/ue7I/qenesMwDR+ZfUv9pf8Ajn+Pr/gPd9a+vVdP Te9UvCoXWNfHpV5PJo/avLe3tp3r9nTiw+vWehkofvqVchUVNPj5Jo0rJqaMVNRFRyS/uyxUv7Im qIP+OXuvXnSXwv0T1CrzSyVVRJQNN9r9zUfaeaOKOokp/KftPLFF/u/we22YU+XSlFl9cdN7aoys yNqT/rX/AI3+vuiS9OsvWY5D9oKF9HLlufJ5fFx/vPt3UOmvBX06/9DQwKm39f6j8ix5v7Mq9U1/ LrtSVYMLcfj+v/Gre/V68XqCKdXUfy9v5j3SPxN+GXzi+O/Y+1u1czvb5L7P3bgNiZTZOE2jktrY msz3VW5djUcu7a3O7423lqCmjy2YikkNHQ17inV2VWcCNsH/ALyH3aeeveH3t9h/cnlndtpg2Lle 8t5ruO6luEnkWK/gumFusVrNG7GONgokliBcgEhasDCyvYre2uoXVi8gNKUpwIzkdEg/l+fL3NfB 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 1qOKe4eJIl/TUZJ4dGN+en8ln59/ylsNtjuLufG9c746uy2bpdtJ2x0bujMbs2ntrc9fT1NTiMDu mk3ZtHYW78HNkoqOZaerkxRxss0YhFT5pIo5Fm0b3a3LFCSJAOBxUeoyR/OvSLc9puggkiuPDk4V HD/B/k6E3q7+Q183/kxtDqTuztfvD4Y/FnKfK6to6zoTY3y672yfVXa3dMOTFGuFfrnr/b+wN7ZP J/e0OTo5aKivHk5Ia6mk+20TxsWJ98tfEljS0d4E+LQKgfaagdKoNvlk0Tzsqs3AE0J/Lo1f8m3+ WjnuhP54GM+GX8wL4/dX75qcR0d2Vuyp2H2LtzZXcnWO5sdW7Vp8ntLeeDgzuPzm2c3S38ggqDCt TR1cM0Miw1EUsaJNyvhNtZubOZhVwKglSM5Hr0/aW5S8EM8YPacGhH29PnyJ/wCEtX8xzs3sb5X9 8dO7H+PGxNg1vyE79zfSfx3l35Ds3sDM9XN2huGbruPZG3sJs6bpzaOBye1KinbE47Jbkwz0tHEs csFMfHGzcO92KJbxSu5fQupqVFaZrmpzxoD089hOxkdQoFTQfKv7P59BN/wnP+Nu6N5/NH5QdU7x +E/xU+Tm8etuns3jt0dSfOTOT7HwXWu5tudtbU29nK3GLUfF35SVMG/MNlRLjZqV8NjZIoZJ71YK +CR/eZ1S2gkW6kjVmwY8kggn+NMefH8umNvjJmkUwqxA4N5Z+w56I98Kf5LPzP8A5jvx57L+UPxo k6kzeJ2D29S9SVnWuZ3NuTb3Ze4N0ZWPYGVlrtr0X9yazYMW08XjOxKaqrKzKbgxgp6aiq5GTTEh lWXO52tjPHBcBgWXVWgoBnjmtccAD5dMwWcs8bSR0waU8/8AN5+vQs/Oz/hOt/ML+APx9qPk12kv SfYvWWAbF/6Q26Y31uTcW4OrafPV+Jw+NyG8cRvDYmwxW42XcGagoZJ8FLmkppSZZjHSj7j3W03u xu5vAi1hzw1ACtPShPkPOnTtxYSRR+JIAV86eX+r5dNf8vz/AIT5fzB/5jHU8fevVeP6n6q6fzE2 Rp9mb7763duXatD2DLhsicTlpNm4fZWxuxN01uNosjFNAa+poKTHTTU00cM8kkToHLvebHb5fCmL NMOIUA0+0kgflWvW4rGedNS0C/P/AIo9RtkfyMfmDi/5l3SP8uzvvB7a673J2jPkN40G9JtzZCXr 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 U2PxqpkY3UrLpWQUcSvJFG57uA+WevVTQ5Hw06J3sb5tdd9V/wAtr4G9Sfz4P5WVR2H8YqrrPbGy viZ8seqc50t3Xh8jsSl2rs2LaFdkaLZXZ1Jvvo/cEnVzUD189JnIcvuFcTK0GLealqoaa5QmRzDJ 3VyP9XHq/kKjoD/51HxR676K+W/8n/vnrX5GfJPffWHfXZOw87sro/5W9zdl9mbh6H2jR766V3Fi 4thQd0ZjK9k7F2jXYndNPTV+IzEs9ZQ1+L0TVDt+zT2g/UjmbSO0cQPXrR4jo6H8yHrLc+zf+FN/ wO+Sfa3W29MR8Yq7O/HPrnE93Zna2UpOoZu5chjO2V2BtGPsGsoRtX+9tLuyihqmoPufvIYYRMyo hST23GQbd1B7s9bJoR6dGh+U0vbfWP8AN9zHZ3TP8g35CfKH5CUAw+W61+b2B/mDd/8AWXT27tsH YlJDLhsqNx7WqPjZ1rjsXTR1WIqtoZeujo6irpy6U04rIJZ6ihi/tgB6UH/F9bJPp0X7+Sp3Lu/t r+d5/OH7Y3p0lifjv2LU9TYiPfXSeP7U2z3hj9i9ibIzeytrb0xk/Z2x6LEba3XVV+7tu1dZWGii jWlqamSlLM8LSNaVQIogDUV60DU9fP73dvTdO/d1bk3xvTOZDc2794Z3Lbn3RuPMVD1mWzu4M7XT 5PMZfJVcpMlRXZHIVMksrnlncn2tAAFBw61qPW35/wAJHsnBkl/mldZ7Ly1Ph/kpvj447Drejq/7 6PG52iiwkfb+Ez2RxFbK8S0kGO3zvTaEs8xIEMogckAX9pbn/Qz+GuevKa1z0db/AISt/Eb+Y18d Pkj8x8/8pOqu++neoM/s1cTmcb3PjtzbapexO/U35i6yj3vtui3O0R39JRbXps5HUbmx4rKKoWvi UVkvlT3W5aNlTSQT1sV8+pn8sZtl77/4Tqd97W2h8UNx/PHMbc+SfaCd6/EzrLvPsHofsDsk1G/9 r5ER0u5epKCv3zmZMf1pNiMh/AkhlGfpMdJSxrPII6Z9SVE6nVpxx68OHRIv5jXeXyA2/wDyWab4 25D+S3vj+X58VN79sdfY/p3enfHz/fsPePXXYVNv/wDvY2Couku/9uYLv7FY/cGG21m4Ep6psXi8 XQ1c+RVRTBjLdAvi6vF1NTyH+bHWjw4dWL9zfOToHL7n+JnSv/CgD+VNvzrf5X7k21sen6P+SHQm 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 qiS3GadFry3yCqoayrWGsxtPIqSJHQ11ZLUxx/bSQzfcxRUvlP3FdP8A8c5fDD7MktbWvDPShNqk pbdFl318jd0TStT5bJw04p/GhpaCSljp45JPNL/yiTmCf/qZ7OLb91x/2PSlNhlkNOgGznfEjQyV ElbqanjkkjUv+3/m/wDjkLf5QCPd5tyhji6M7bl706C+u7+qJKdg2SeSX/VI5sfx/wA2f93+yp9+ i9M9G6cvRdBxle86tlbTUPb/AJaeOT/W/H49lV1zH5dGUOw/8u3QaZTuaum1eTIOq/6lXv8A7b88 +yG55nl6OIdkij6DzJdrSvf/ACzU1vxJ/reySbmTz6Xw7VEM9Imu7Sk0t/lGr/eBzc/7D2SXPMkh r0vh2oU/3G6Rdd2fUO7KJP8Ab/1/29ufZJNzDXowTaukjVdi1Uisv3ll5/H+P5vz7LZt68TiOjFN q6StXviRjb7h2b/ev+J9lU+6yDy6WR2MWT5dJ6t3ozP6ZtXoumjw3j9oJtzr5dPJYx8fPpgqN7SM r6X1H/lp/h/SH2jfciPLPSlbeLj0n6jd1VJ6hN/tf++8tuefaN9y+fSlLIDj0x1G65WX1Ta2/tHy fT/WH+ufaJrzxOlKWXl1Bk3PJqsJPST+P+Odv8be2nux+XV0s+mCo3DUfpVnZm/r/vX+8+0z3PHP +r/V8+nfp4fTptqM+5DKG/2IkP8Avf8Aj7TPcD8un0hrny6bpMxM+pQdNv13t+eT+LH2me8/b1db aaTqBJlH+rSFv+CX90+pX5f6vz6e+lHof9X5dYf4jPq0GU218f8AHMD8/n+nun1Q/wBX/FdX+iX1 /wBX7Ov/1NBaX+z9dV/z/vH1/wBh7u/Hrw6w/wC303/33+F7e6de6mr/ALX/AIW1f7z/AL4e1HWu o8f5/wBh/wAT7917qV+n/BR/r3vf37r3T5t+npKeSPPZSjoMph8TX0n3uEmykWPrMv8Aceb/ACWl iiP301PP4f3ZY4/2fa23SL/cyYf4vF01K/8AoUXHpty1bS5LKZGuo8bTYelrKySanxdBJUyUWPSS Xyx0tL91NNP9vB/zdk9tTPFJL40Nt4XV1QpGM9Nnu/TnXPj/AFB/259+691kX/X1c/74f19+691w i/QP99+B7917rL/a9N/rx/vv6e/de64fvf7V7917rN6ba2/P+24/5F7917qP+j/G/wDsPp/t/wCv v3Xus4X/AFLD/ej/AMV9+691w/2q3p+v59+691nVmTxsv6/7J/wvx71C/hzGnWusrW1+r/Vfm/8A vvp723HpjrB/av8Aj/Vf7D/kn250/wBSp6doY42Z00zIHXSf98fp7cmg8CK2m8+mkccfLqN+fVp+ n+x/3n8e2dQ6d6x+pjp/31/9h7r1vrP7tqHWuur+pl/p9P8Aifduvdd/2/8Aaf8Ajf8At/p7917r y/7V/wAguPfuvdZv99/07/33+x90Xh0x1yRv7Nv6XX/jY9mEfn1s9cl/2P0/s/776e3OkfRrfjH8 2/kP8T9wYvL9V71mXEY3MUeZn2TuBGzOzcpUUiTU+msxM8iBY6ihqZqeTxPHrgmdG1Kbe1grwDUF QaeRp6jgelEc8kWFbt9PLrZx+Hn86P449zUe1et/kDhabqzc2Twe9+sd2ZzK5/P43amd2nvWKSfb Ur5/EGqnfG9d5xg1LjJlxwMJAE0gVl97kjhkC9oQ6s8dIB9OJ/aaDjXy6MI7uJ+I0v6eX+r7erSa bYPXvdWK+/Apu1sn3d8HO1uitxybk7sfHYvfe7+lsvSZ/a2f7LoqGsgpMbLhcPiaE7emxEMhkRYU kukkjsnawj8QqGc+IGWmuoqpBAPrUVGtQdPn5VVFSR8v2/6j5dMWO64aLJYjsXbfx86nodyt/KBq MJgOy+7uxqXdOUosjtajxW38vtr5T7epqtqXO0OXpaE0G3axJJEnFNSSsyNpBTFVXu+jpII9NWat CABpb8J/0wx5VxivFuBpSnr+X+foXviDlN4Yb5dfyydp/efFfam0ML8U6vsPcPxAWhx9Zurq+pzS ZOXO9p9ZbmrvDk8nVblqKWnylPSxiV6M0sqMqBxL7fgtpbqSC0gWOLXHTSDVgdLUKnPaxwxHlx9e qZyC1PkP8nW1thu3MdVhBU+NtRtqQhT+Bc/VB9fbNzy5cxV0ggfPpKVZSa9LaffGEjpY6lJw/kdU 8ZIVgCLkjUQCR/vPsrTa7tnaPw6ECtfLrQzX1HWE7vwOQhlpayKOemqUaGenqI4p4ZoZAVkjnhk1 RyRuhsVIII49+/d93G2pcMPMf5+vVpngegqrOjPjbnGmlrOsdku9UzNL48RFR3ZiGZkWkMCxFj9d IXn2ew8z842aLHDu9ysacBqqKfnX9nT4up1WgmNB0jMj8MPitm21nr7F0jAAEUGQr6TUwPol0iqZ dQJ402X/AA9ro/cHnODDbizV/iUH/J/hz1sXk9KCWtekTXfy6fjNXrIKah3Rjmlkdw+P3RIDE7Ag tTianmEbqfp9Rbi3tWvufzSpUy+A1BTMfH7aHpwX89R8Jp8uhG6i+F/RfTmUg3BgsDV5zcNK2uiz G6awZefHScgSY6FooqellsT69LPckgjgAv3v3A5i3y1NlNOkVmeKxrp1f6Y1JI+WOqyXk0ilCaL8 ujYewR0l697917orXyt3jBs/r3LZioYCPbe3NzbwILKlqnD4ySnxsodjb9qsrgbf1I9ijl8/TWu8 XxbTSLwwfTXx/aAB0/DUFiOFOtXv4n7KHafyV6P2tlYZqiLOb+x25s7ZWmmlgw1U+565ak6W/Zap pVimZvrG59hO1/WnMsia1FXYcPn/AKh1rVkscnPW4nVYqGpd3YAFw2o2HJ/q355Fhx/T2tjuGQAD y6br0w1Gz6CZGVo42DXLHxqHP9ALgggH2qTcpkIKscdX1n16S9b1niagGNqZJFPFmA9WkD6203YW Bv8Ak+zCLfLlDqEhB+XXtVTXz6QmU6Zx8qkJTICdQNlumkEsVYEA+n6D/D2cW/NVzGRWU062GpTv z1TT/N06OjouluodwCnligw3yI2fJUeMKKcxZHH1tBG1QANYUy1AAJ9KX1/UD2m5p5hfd9nhs5JK hJVfj6Gmf28eI6dVyVcE1NOqM8jsrWWk8B0t6gWXSNRJVCy8t9STbm1/cfaRxPHqmoefHpB5Pr55 XZftzZ3AVWCgsT6Vvcm92I/3j3QjgPPq2oeRFerM/wDhPV0jRb7+XPyr+TVVSCow3SmBw3x/2BWO DoTcObH8Y3rW01wV88NNSmkkI50y2J59vWydzP5Up1SU9qr58etobdkHYO297Vm4MTtZ+y9p52nx pTb7V+Jpcts3cONQ0bV+FbLvDT/wnNUjRtJpkDQVKO7WRrgM7q3MG2bubyy25ty2mcL+kGRXt5VF NSeIVHhyClaGquCx7Tgsl+oimLqhkiYfDiqsPSvkf5HoiX8w/ZXdmT+DHy43ZhN8Y3p/tbe3XE+3 8fuGkr6qp/0cbIpqmKSuhxuWxhSebc9bQiRPPEQqTyDQ3Gr2s2mx3Brm63zeY0j3GSPQIlbUsUQN QpYYZycsRjyFR1a2jmMrXFwAJWFAB+Ef5T6/y61nv5YnWVdszceY+Ve6Iafdu4d+ZSt2T1RsrdNT sbIbq+Q25No4GLc2+MZtht65CLL0HYVBQUMdTjstQRVFTBVoI2CI3mQ3gBDNJSrE4GM/8V0aOeCA +X7P9Xz6qV+XW/8AM/I75Bdmdy5CbcFXFurNlcM27aHbmP3TDt7FxpQYWh3HT7SjTBT53H0MKU80 8TSedo9TO5JYpZWLyMw9enVGlQOimVu3Jo9RZDw2q7cf6/8AX1A34/HtupFBTq5UgfZ1cT8FP5g3 QfTHUeF6H+RHXO7qSi23mMtVbe7S2HQ0+bWfHZyuXIvQbqwMUy5maox80jok1JDOz0wUFdSm6yC5 jChGFKcCOk0sLsdSnq2Hobs74D9vrntndbfLTrduyv715bJTUe+8hV7Am3kmbqDVYXJ4bKbsp8Vi ZGakkWOSiecVFLMpjKXHtWjxSYSQV6YZHAqw6NTkuq+8+ppKbK4qfMR0D2mxuTop5KjGVy8FKnG5 GleSkq4SBdZInZSPofd6MBWvTeOhP6i7K7C7G3lvN+xKyrrshtza/XGKoKmvaSSqakly/aNQ6NNK TK6Cb6amNrm3uHvdCpudkqM6Jf8ADH0MeVf7O+FfNP8An7o+PXzf5TAP9qX/AA/p/r+wny6f8cT7 ehHf/wC459ada4vylcj5P/IZtZVf9L27ha1/0SxqbAG5IZr/AEFrfn3kVt/+4NpX+AdRXc/7kT0/ iPQ7fyx1v87+l2Zrv/Be0yTptqJ633BcG/8AaF+bf8a9qm4dNL8a9WP/AAukt3926v8A3+rsgfi3 /H75kfT3RuHDp9fP7etSv4/5itpPkL2XhaDCfDzKzbh/0jJ9z81qanPVGM/g296vIM+JylQQuL3d Wqxip/xPAZE/A9vH4Bxp8uiqp8eQAJxPxcOPRK/mtmKyp+YfT2LrMH8PMLPt7P8ASdK03wlpof8A Q7lxk+zKDMLU5GugPiym9KUVfgrWA/ahSGPkqfex8B4/n025JnjBCClPh4cetvTPnV82s0Lc/wCk 7N/+9HVj215D7Ojng3Wrp/wpbAH83XuH/wAQ98dP9464p7X/ABYf737di+H8+im+/tgPl0RX+Vex /wCHHfhaBzbvraZH05PhyBv/AFt/j7LN/wD+SHu1P+Ud/wDB0s5e/wCS7tH/AD0J/h63KvnTOj0e QS6kh5Tb830WDWsLHgj63PvHnl3O8TEcKHrIbmGn7pjH9Ida/GHfelL2lk8xsTP5jbuZxeFrz/EM JVS0s/iqsli0MU2i8c0LvCLo6shP1HvJ32luLi13Hc5raZ45Pp0FVJBprJ4j7Bxx1CnNO17bvNrF Z7rZRz2xJ7XFRwpUeYNPToxWL+Wfe+1kSl3VS0O8aWI+L7mZZsTlbA6i81RTrJT1chf8tGh5/Vx7 yf27n3cbUqt7CJ08yGKPT/TLWv7B1Bm9+ymw3+p9nvprOQ/hrrQn8+4D9vXHcHzU+6WOng2/kMTV SCN6mqzyCTGwnW5qY42oayaWoll8KxxtLJAqiW7MAg9yHtnP3Ll2FSWVreY+Ugx/vYqv7SOo23D2 i5h20sWtxcwCvdF3cPPT8Q/Z0gst8pcnVNFNJmqHHUKyyQzrRJSo9RH4zLLXwkQ5iun+x/5RfH/n v+OkfsTjcbaYCSJw0Z4EEEH9nQd/q8LZtEqFXB4EUP8APoNd2fJDFzYubE/xLJZFsfU09BNlMll6 WjgzF6Waqr6rxS43JTfw+Cf9uWWKOj83/Afxye0z7zFGf9xujCHYRHKJuiyTdzYvG1VU1RnkyFLo qIftcR5cf5KiPzRUtLS5SX7yonx8Hhjl8v2373/WP2Svu80Z6EKbd4nl0Dm+e5MfkJG+10UMipJH qhk8kdRUeWa3+dEJgp5/N/mo4/aR+YZfXwulibVFn06BfI9lzMrKomm/xf6f9ZPx7LrnfZelkO2x V49Imbe1RHHIslQdWuR9Jl/bi8gMv7Xshk3gR/8AEjpf9GJM06StdviWTUBM5F/9f+n+w/4n2U3O 9+nS+LbvXh0kqzeUh1fuXX+2/k8n+29lb7rNx8uli7bFgdJ2q3TI/wCqZ/Vx+v8A4r9fr7LH3OnS 9LOIdJqr3PIzf5zT/qtf/Gv9b2ge96UJCPy6Yajckn0Mjkt+pU4sf+WX+PtG96ePT8cPkOmWbcEt vTIF0mT1eX/Xi/x9l73+Aenlt5ePTdJkJpNWqR/Vxf68/wBfz7TvcyydKPpfmeoE1U/6mLszC3r8 X+8+2vEPy6c8KP1/l0yz5H+0zeq3/Ff9v7Zd+IBz0p6iTZRbeuTUq/q/c/1/bDy/s6b0eh6gTZT0 t+vV/av/AMdAB4ufz7TPcU+3p7wfs6b5chq4H6h/sb/7e17e2Xuun/pfkf8AV+XTe1fp/T+lf6n/ ADn++HtN4/2/y6VeD9nUCCtZpLy+n/U38v8AvPtguf4urolKEjPWJp4NPpb+2f68/n/WPuuvq2hf TrEa0t/qv9hf6/7z73Tp7QOo33T6tX9r/U/4X9t063oHX//V0G5/0f7Ee3X4fn1odRtS6v8AC2i/ +8/X+ntrrfUuP+zp/wBj/wBE/X2o61176f8AIf8AvF/97+vv3Xusfv3Xuuh9B/rD/evfuvdd+/de 648/8lf7zz/xX2r6t10P0q39r/if+I9+691mv9NLBf8AWt7917rl7917ryrr9Qt/S59+6912P9fT 7917rh/t/wBwf77/AGPv3XupGr/kn+v+P0+nv3Xuo/N/9q41Xv8A0/3v37r3Wb9PCr/seT7917rl ww/w/wB6/wCN+/de65av9e/+p/N/9tf3XpP1FC/19R/x/wCI926UdSrf2P8Ak3/ffn3TWvr1qvXF vx6dX/Ef7wfd+t9R+P7Xq0/7e39PfuvdclbUrepP1/7H37r3XFfVp9X6v8Bz/wAi9+691J/p6f0v 9P8Aivu2oda65B/7K/2v0sPduvde9+691kT8/wCw/wCJ93j4/l0xJ/ZdcvZ1qPSbrGrav+Cp/sfx 7117qXHp0nV/vuf8ePp7urGvz690cX41fOj5NfFLN7cyPU/ZeZx2L2vuOHdGK2jmZP4/tGmzCwGi qqykwGWFXj8fV5DGsaaolpkiklhIViQos+wqhQMQpYGnkSOBI4E5I+wkefTsdxLECqt2ny8utgf4 qfzzuhs1leltvfJjrKHr2DZC9sbOy+4tubdxm7Nt5TYPdv3dVuqOvxYjxOSWppc3VCUCqXK/sXWF oGRSyYRxlkk8KunGmgK6TxFMUHrT4vkc9LYtwjftkXSf5dXA/GbtfrXcNX8FN29UZ/p/dO0uns/2 P0Xk8fhsBRVmW2ptvcUlXmer94YfPSZiu7BhyVYHMckeSMmJRSacyR30+zLl+2Qb/shjRGQTmNqA igYUQ/xIKmmQV8yejCMxu66Gqv8An6vJwfZkkRAM7xvexu5Vlb6cqbWAP+t7mm72NXqCgI9Kenz6 feBSfQ9CMe2J/tKdGnEg8tvqFa9gAfzz/t/ZIOWYTK7COhp+XTH0x1GhH+fomHyg+bm9dmddd3R9 R7t2Ns3fnWWwX3rSbo3zG+cwtBNQbgwWLnosrtjH0mQzNTHlosz46SpjpaikgnXXVBYFdgFOYEsN qjureGNH3AKa6iaJShqVXuNRUA1oDngD1QxKuoHJA/YesfTf8wHtrL7i+KGwN3fwLsHcnfHRWX3/ AJffHXWw87UdU5TdeIGcWkpMFvyhykOD2vNkWxca5Ja1ZqLHVDTRp6YhJ7CcVzbkWcc1spLrUtHU r56cmtOGeHrX1qY0OdH5+XQl9XfzWeq8z09mO5u76OT41bXwXZNL1DLW713TgN34XMb9nq5aBsbt /cOzWyFLXUkVRGCap0hpyrelmI93jba5omluGMChtJLUK1zgFCa/bpp1Q260rq+3/UOjoYz5e9Vz 75oetYew8VJvvJ7bot5YTbb02ZiqNw7RyVJ99R7n23VzY5MdnsKadWaWelllWkaNhOYiLe3BtNjd MI7e5RpCAQK0qD+z/NnpvwqUoeh3pO3ZYhEHqSFeKKWEmUOs0cih4pI2HpZGjNwQbEe25uVXWp8L Jrw6r4TeVelTR9uxyWJnjYah6W0E/wCPIubc/T6+yyXlqZKjQQaenVWjfVWvSppuz6CUesRA25/c A5/2IHsuk2O4U4J/Z1XS3nw6qx/mr9wwYro3dVHR1McUu563aHXdOpJ5jyNQ+bzpB1Kf3YikDD8C MH8+115FJtnKoBqJbicn7QBpX9lC359KY8Q/D3HP+Tok/wDJ+wmJzvyA3p2Lk6qbwdZbAelxh1Xj lze76lMasjqRYlcNDVLa4KsyH88hjb7SW5WaSOMlVKqflXh/g/y9UZewt8+tlml3LjanR450OoAX LAeoi9rX4tY/19qnsp0rqjPVAtRUcOnxKiF7aZEJIB9Lg/7ax9pSjCvaadVp1mBB5HPunDrXXiAf qB73U+vXuq8/5ovXlXvz4adlS4qgauyWwavbXaNNTxCPzPFsHOUWfyIh8g/zhxlJLYD6n8MLqfHU yuleI/mMj+fTiE1IrxFOtZ+rw9PPqaE6o3tJCeSPtpF1xyrqW9mjIa55APtGTWmMH/V/g60GIp0n qzb0R8ZMZQhtepQL8E3ANyFcDkH6gW960qaEHz68DTo5X8vH5FbS+FPX25eqI6Oo23QZ3sbO9gVe 6Y6Ooy9JuSv3G+uaozVRG61tBUUgtHp0TowAYc+3IiI10sKGvXmBc1B8ur0utvm7szeVPDIldh81 CwjD1GDr4auVfSCzyUKaMjF9eddOLH2oUg+fVDVeIz1Xl/OV+UmGzPR23vj5siWpkzfbFcMnuYGO WlbGbSwcvml82tEZjXVWmwHDKv8AX2zcEhKA5PV46aq+fRNNobDOyfiNuii+N2fw+Tz2B6koeyk3 Btzeu1t470pe3MxJHt7snEUHWO79qw7j6+FDsaSep/jWGraWJUgVJIqizzCoGmIhDXH258/s6tq1 Pn1p1r45nrsuZGeJ3eWV5ZpXu7yTzOZZpHPBLySEkkkeo+0DLXh6dKq8MdBdmOuALg09wzEm4Jtz fWxCixIH9fbZVhw/wfy63qr0Zn+Xx0Pt/cPyfxG/t94qmyHV/wAc9obx+QXYcGSp46vFT0OxcNWS YHE5SnqY5KSemzucmWn8cqlZCALH27bqDJrPwqK9VlPZg9xx045/4F4XuzYHxGyMFDDhPk186O6u 1t54unqU8Ox+u+iaaqyNZj8zUbfpIg2NpqA07Ok1P42EPAJ4Hu3hFhF5O5/l9nVdekvjsUfz6L31 v3p8+PhTjKzdvSfeHZOJ6Wh7D3f1hhczV1lRu/pTe24di1YTN0lBtrd8tV93TyUemZF0qBCxuF02 91Es0WQx01p8ut6Uc0KjXSvWwx/K6+bXaHzWh7f3H2zs7rTbe59jwdX7fGZ61xM+36Ld1LWnsTIr lctglc4rHV8MkhUfZoiOrEtewtFvuXMZZdkLLkLNw/5tdCblqMR/X6eBMf8Az/1ep18R9xF+CHX+ lz+f9tf2GOX8XKU9ejy9J8Mj5HrXB+UbD/Zn/kHdQwPb27Sx1HgCaH1EBeDc2B95FWNPorWnDQOo vuf9ybj/AE56ZPjt8tOlPhN8lukO9PkTuabZnU8e5dxdfZzd6YvI5em2zW792HunHYLMZigw9LXZ RcGMtBHDUywwytTpMJWXQjkKiCRQDPSYusZVnNBWnVyXQ+bTpn5B71i3rQZdchvjfGf7B2ZicNi6 vM5Hcez977sylftXO0sNJERRUGVppQ3krDTrAFfylNDWocjpSpp+3rUPqdsZfYPzFrOvtx7E6T39 uGg7i3/sXJbN75yYoelKnOZDN7ixrjeO4YshjI8fi8NXTrJHXfcRwxVEKMSUv7e4oOPDoocf4wQV UnUePDolPZu3q3fvzywmysPsvpbrPJzd/dbbQg2p0PWzZPpbGZPbm59t0FVPsjLHI5RsvicvU41q g1a1Ekc9RO7qQhAG/wAHTdNVwqqqg6hgcPy63ONmQ1Pbfyt3HvrZtJU1e3sfuzcW6crNWQTUVTis LSZSrydbV1lFLGaopSUgZmMaOHUXQsLEsnAp0d17ifLrUa/n492dd/IX+Z5292b1TmTuTYVZ1/0t t/B7jWkrqGnzv929h0mOyGSoqTI0tHkIsfJkRJHC0sSNKkXkACuPbqAhQD69E946tMSpxTot38q9 gn8xv4XMeP8AjO22f6XFqXJcni1yR9fZXzB/yQt3/wCed/8AB0v5d/5L2z/89Cf4etxT50Sj7fIA MeWmtyp40BRcaRb1C4/I9498tAHdLk0/Cesg+ZDTbIRX8Q6qq+JfXsnYvb3ZOPppKRqqi2dTVUFJ NV0sFVVrJnYY5BRU000UtdJEVBZYldgCDb3mh93GHarvc+aLXdNBDwRBAxANdTk6a/5Ooe300+np 6n/J0Zbe3x+r6GSenr8K8UymQsslPLBMlr8tG6BwT/Ur+fr7yQ3H24tph4m2XWnFaHgfTohWVhg5 6K7uroKnkMjR0/jJB9MiGwJ+oB5Bv/j7AG5cq73tmrxrUtEPxLn+XTyyg+dD0Vne3xzhlMnkxdnP kIqIFaGS4HFpISLg/m9x/X2RQXV7Ys30t1LC1eCsVr9o4H8x0mvNu27cU031nHIT5kDUPsbiPy6K FvT457mpXlnw2Vlay6vtK2GMBjc2RZ4ouAD+bf7H2fx84bwAsdxIHhrnSAjfyGk/sHQWvOR7N6tt 85jP8JyPyPEfnXoq27Nnb12q8smYwVc8KFr1kIetp7LzfTEraeOfp7MV5m29xksjf0hT+fD+fQau uWd2tal4dSeqmo/z/wAugTrN2FDJEiGPx3B1DSwMn4IjAt7Zl3TUNQNR0kXbyGz0l6rckz6g0oGn 0afx/wBTSLH2VzX8sh6XQ2nl0nJs07nhn1eP9Xk8nH549lU95LQnpfHD4eT0yzZaQ8anb88nn/iB 9R7TST+fTyJTA6ZajJSD+0dOs+j6W/5H7RPc9X0fPpnqMk3+qt/gP99f+vtG9zxz0+kB/PpqnrLa tUn6uGXyft8+0Lzg9KEtouHn02TZOINZfV/tQ8Uftl3zXz6U6PD4jpjmzEmn6J/1lH+P0/2HtnU3 r17w/n1xbMyLq0yer6Ko/wA5+fbL3A/LrWj59QJslOx1GTTpk13PMv0/23tM90KY6VJB03y1jepd Wpm/V9T/AIj/AA/4j2mknPDz6VJa0+3qJJL/AGVnHoP/ADa/5EPbPiTfPp7wf9VOuEksX7i6nX/g n/LX/X59t6z/ABdW0L6dQWEH9n+3b08/7b3XX17Qvp1gatb/AGH9Dz/xX3SnT+gdcGkt6frb/fD/ AB901r69N9YGPp/X6f68f8b918cf6j09X5dZdTadFv8AeOfp/wAU9tda6i6z/h/vv9j7d8cf6j1u vy6//9bQl/X/AIW/2P1/239PajrXTYnpXT6PT9fbScetnqazLpVVj8bflh+59f8AevbvWusPv3Xu lPuHApicbtvIRyIGzGK+8mR6uKoqI5PL5fKaWKH/ACGnngmj8Xtbc20NvHbTecvTEUxkluYfLpP/ APNvV6v95v8AS/tF0/13p1W9P/FL/wC9e/de6ie1fVuuPp/T/Tk/8V/Hv3Xusq/2uPx+n/ff09+6 91wPOlT/AKu5/wBt7917qR7917rv8/T/AGHP/I/fuvdeB0+/de6486v9p/3n/kfv3XupfuvSfrD/ ANe/dulHXG//AFj5b/b+/de68zer/gv++5/23v3XuvK39r8D0f0/5Hf37r3XtP1b9I/2N/8AD/H3 7r3XHVp1f0/1X+x5/wAeffuvdch/1L/2kX9+691k8n+H+8/8a916T9df8kf7V/t/dulHXLV/r/TV /vv8ffuvdden/kr/AHn/AH1/fuvdc/dl4da6menT+dVv7N73/wAL+/dMdYVf1cf7D2tT4h1vrJH+ f9h/xPsyXj0l6y/ge21/tT9nWvPrNH/vm/5F7X9a6kK/+qP+8f8AFPfuvdL3YfZe/etM5j9x7D3d n9p5jFV9HkqSqwuTq6CSKsx861NLMVhmRWMUyAgMCPfqCoIwwNQRggjgQfUdNPI8bqyMQR1tA/G7 /hSFWU9Hh8F8muqJMpVwU1JR5LfmwZoop6ySCNIp8rX7dqBDG1ZWaTJIsL6A5OlQCAJL2vnyYoke 52iysAAXU6XPqTTBJ4nHR5BvykKtzFn1H+bq7/pT+af8MO/KCmbZXeO3sTln8cz7Z3pOds5mlDLw JY8h4YQxIIGk/g+xpZ7/ALHe5S9EUnpJ2/8AGuB6NobyynFY5lr6HB6I/wDM35Vno7uvM7wyGB2X 3H0H2b1ruXaeSqcPnMbHk8Xjd4YWbb+9cDHujHVMq0YmRqWvp0kPpqadWWxv7hTn6/vrDmx4ktFv dmuUEkRiI1gkaZUV1rShCtpbHn1Sdo4y3iONHGvVb3Xf86bqvYtd8ZXyfXnYe7M78U8ruHC7Y3hX blpWm3p1Nmc5Nkp9k5yOKCmK1sEORq6YVDF4KynaLzR6lJYutdoleO0la2K3Ks1QSa6G8idPxDz8 j6dETbzaguFQso4Go/z9CVhf5p3wso+ovkt05tOm7R65wnbfYeF7q6+qBt7GVlThd74/Jiqqdq7o qKB5afI4B6SpaIVSxAaLI6Ffal+XXWO7WzkCwMQydykk+amnrwr+0dV/fVhSrJIsfqUPRp8F/Nw+ HeW+VXxW+Rg7I3dhqfB9Yba6w7z2vU4/O4/FNJjqCs29XZqLCgNiKzCHGVaPoRafTNGwAMZHup2S /knsbqMEvQKwFe3y+zTTgRkZ6cXeNsZafUgV9f8AL0dD+Xb/ADBPj9NuXf8A8e9vdzbNei/vbWZL pqipHShot6y5iuramoxe3cZL5q3Z7NSKKiDFgpQ3LrD6uCLuUUv7TcJdk3OKttUhGINFPkB8m9Dw PDj0ugu7KWYW6TqZOFPOvV01H2rURf8AKUykcaS1/wDXH5sfchybLA+DGD0YG2Wvw56VtD29UKUV 6ghfT/aK/Tggn+t+faCfluBgWVe49NfSj0PVOP8ANm72qY8f1Lttqu9Pnd47t3VUI0ikMMNSw4Ki UrqBAjSEID/adS3uH/diNNvi5c26NaLocmn2nJ/Oo+XVJIgukKPw9CX/ACmd5zYrqHtDegYA7v39 Q4qnnWYBmoNtY9zKjgco0lXWqQP+bP8Aj7MfbHYVv9hu79wCr3RA866FGf5n/VxusIaPPr1cNhu7 p4bD7pyU9SgvcjSCCTY/4EX/AMPYzueUI5DUIKdUe1xRePQybc788fjM06ugQNo16ir2tp5txf8A H49hW+5JJr4YNa+f+HpM0Dgkg/5eh3233VjK4Is88bOdKNY/qY2/SCf7IHsHX/K11BqIjIUZ6bZS fw9C7jt3YXJIrw1cQLH9JYXsfpz+Sf6ew1Pt11bsQ8Rp69UK0qfLpwylFidx4nJYTIxwV2NzGPrM dX0soWSKpoq2B6WpikRgVZJIpSCD/X2j0ulGp1oVWjDj1qJd09Db0+LnYuX6g3nRVK4airMhN1Lv ORScLvnrgVTSbehSva0abl2ripYsZkYJCJpJaYTi6Sj2kYFMcfTrZNat6/y6DKSLWS4BDr6dDJ6V FgDa9rhl5v7oCCAKdeBpX06jz0cciMfGh5ABRAqaQSdJX6Mf6/19+z5HHWq9NIxf2FRDXYuSrxVd ExkiqcZVS0NRHJrukp8DIJCGH0a4496yKgnPWxwPp13vzJ7t7GzUW5d/bly+79xw42DDR5ncFQaq up8TRKI6WhQlQI6anQAKtvdjVzSuR1sGlfToLJ9qtDM1RRSVNJUaLyTUk0tM7hg6mN3gdGlheNiN JurC4I/q2Vzwx/qz1sMMenSFyOyY3Mo02bTqPpsWtb9St6QSOfdSK+WOrBvl0ej4G/Ef4qdtQ7yz nyhqM1UxxZNcBsvbmJzs+34TJLEZK3N1dRSSRVD1dJcCJdWmNiDa9vbsUKkEv+zrTyFT24x0Jvb3 8q/O0MPa2z/5efZm7t7YfcuCx22O7tj7syeIxeCl21Wxwbnx21ot7+GOtzOX1tBM9ExJKvy3pYHb QNQ+G2Dx+zrwlrQsK06ry7C3T82vjb2Hid190dRZfAbp2R0NmPjh15lc/s6WHbOxNi5XHjHHObWr 8JE+Lhz0VISyVTMHlDEnk+2SZkNSnAUH5/6uPVx4bClcVr0EXVvyU2VtKr+G2B3n1N/eTqT4kNv7 cY2vhcjS5B+0Oz95RVr0+/NxU1eslGqUs9QqzQOpZ44tIP6fbauB4IZO1a49T69XKVDkNlv5U6sG /k9JsOTDd6ZfFxZWm7T3PunEbp7VoTSJRbRxiZvc3ZtdsfE7MgjCpHRYzDzzQz2FtSoBxb3FXuQF 1bI34j49f+qXQp5cr/j6+Q8On/G+tg7YDH7iL8+tOCTa5IBP+tb2FdhJFxGfmOju8/sz9h61x/lE r/7NF8ggpARu2d1K7BVNkMlOPXex5Y/Q295Gbea2Fof+FjqLbr/cm4/056q7+evS28+9ugcntLr1 aCq3hhtzbd3fh8blchFi6LMyYQ10NTijkagNTUlXPS5BjAZWSJpECu6BtQXA0NekU8ZkQqpz1cJt 7+atsXP9k9J9tdu9Ld29bbg290J1rsXsjbmMw2yN2YnGb/2mcsdxDbmZw3YdTHktqVdRUK9BUzrB UGJwJ4Y3Vh7poNKAefSgTqKFqg0614fl3v6n7Z7f7f7OixcmLpOyext8b4p8PVSx1U2Opd07gyGa p8fUToggnnpIKtUd1AV2BI4t7eUUAHRVO2p2NME9ET6+39H1J3P1f2f/AA1stT9cdi7R3pNh4ZUp pMhSbbzlHkqqhgmKtHBNU01O6RsfQHIJ4v78RUEdNI2h0elQCP8AD1scdUfz5Pih0HD3Nu7DbJ7v 35u/cOxN14fYm0U2ZicDjcpuLPYyqocZHuTceQ3SKfDYSkqaoPVzwx1cwjQ+GKViB7bKE06NTeQh Woany61Uu4Ox5e2N9VW9JcENtrVYrBYuHENWLXTQQYbHxUYmqalAImnqpvI5VbhEKi5IJLo6K3bU dVOjXfysyf8Ahxf4Yt+R3ptsgn62FJkhb6gHn/ePZRzD/wAkLeD/AMu7/wDHejfl0f7vtn/56U/w 9bgPzkmBpa3katcgNvqzBBf63ta39fePnKudwuj/AET1kBzOaWEAr+LrVX+Tmfzm3t7bby23c/mt uZSk/i7wZPBZOrxVfG3nxzALU0ckcjJqQGxJB9y1shkRrh45GVwVoVJBHHzHUV7jlo8V4/5OhU6j /ms/Lrqyjgx+4tw4/ujZNFLHBU0HZOFmrvAXCpFSQ7ppoD9tM6qAplkLC1z7lrYfdPnfl7Stvu5n tVI7JhrFPIVOR+3oma2hfIFG+XViXX/81n4s9jrT4/uLYW6Ols5KI45cxQR/3n2b93I2gyeaJfvK amUm9rCw9zTsX3iNtlEcHM2yvC3nJEda1PElTn9nSdrNh/ZsD9vRxdv4PqfuDHjK9P8AY2zewaOd DpiwmYo2yI1LqH3GKnlWqgIU2IIv7kq0vPbvnZC227lbSTHFKhJB69poR0zodDRgR/sdBdvDonxs 612HkhN2CkQtFr0khiAQA/I/F/ZLuvtnPFWTbLkNH6N/kP8Al6sJWwT0WndXQEEwmENMjKyuSskQ 1EvcW0sukjjn6+wBf7Fuu3Fvq7Jwg8+I6cWQevn0Sjs34cbSz/nat24KKqIKiuxyfZ1Ae/1vEBGx H15HsmA0VKEq3yNP2jgemJ7Czuh+rEAx8xg/tHRDt+/BzdWMeeo2lmBWxgsyUOUT7aoUC/ojqlHg Ygf6q3vXj3C0B709OB/n0Uy7AikmBgV9G/z9Em3x1v2FsOVo9y7Ty2PjWUgVYpZKihk0n6x1cAkh def6/ke2GnPAqVPzx/Pgfy6K5NvuoDSSIgevl+3oJJ8jydH6Rxd73Bva39b+0M14AOtLDLJ0zVGS 1K37nqX+zz/vPtI846eS2A4cemKXIyH0x+nm/wDvH19tdKHQ1oePUGWWpb9Tt6v9c/u/7b2w0gP2 dO+GfUdQJKi3q1a/85wn+wA+n9Pad34dW8NT5nqK0wK+prr/AE/1/wDH2mecfl0+ieJ9nUU1HCc2 0/15/bP9fp9D7SvJQ/Pp5ITXPHrjJUfqN/1f4f8AIvr7TdP9NrS3/UwP+8/717tqP8XTugep6wtP /wAG9X+8W9tU69oHWFgf7Uf+PP8Atvrb3XWvr1avWLyN/qv0/p/31/dPHH+o9er8uuDMz/8AIr+/ eOP9R69X5dZtXr/SPV/vv9e/trrXUTX6fV/yD73XqukdYvKvq/1P9r/ffT8e03V+snnf/D/be76z 16nX/9fQh9qOtdQ5v1f77+g9p+t9ZPajrXXvfuvdSG/V/bZf7P8AxPv3Xuo/v3Xus/4it+r/AH3+ w9+691D9dv8AUsD/AL7+tvavq3WTT6l9X/IX+++v09+691nH59sz8P29aPl1w/2kek/j291vrsMr fp/33+x9+691J9+691Gb/abL/qv+K/7b37r3XX4/av8A4f1/x/339PfuvdZfVo+vp/p/vHv3Xuuu F0/8H9P+9f7D37r3XL/avy36f96/1vfuvdYf8f8AH/O8fX/ff7H37r3Xf6h+nn/U/wDI/fuvdcrf T/avfuvdcP7WrjT/AEv+Pr9ffuvde4X/AGksP8f+RW9+691m8n+H+8/8a9+691jT/dP/AE8/4n37 r3WRmVP9R/yH/wAV9+691x0/2f8AD0/0/wCJ9+691nP190T4R1odcvbisQfn0x12r6V0/wBn/ff7 f2qRyT8+tOmr7es6sb6l/wCRe1KP4uR1vrjB+n/ff1PtavHpN1Iv6V51f4fn8c8n8+3Fan2da6lx sv1tq/C/74+3+tdZI/1MxXTxf8/0/wCKe9J8I6afg/59So7H/kH9Tf7C3+t7fjk8OuM9JeplPIwY MjSalIZWiOllZTcMG+oIPIP49mC+fXulMmTyUtKMfLkK5scJjVDHzVdQ9IKggr5xTNJ4fMVNtenV b28gFK0z14k0pXHXGBm0pf8AUo/sX/5H7fT4j0hk4P8An1Phe/oX0/7T/h7NIXx1SQ9oPz6lmZtQ 1N+oW9qE4dMjoVesuwNwdY7+2f2HtWsNLuPZO4cXuXDVANglfiauKsgDj6mKRotLj6FSR7XLq01R 9Lg1B9CMg/kfLz6chlaCaOZPjUgj8uthnb3/AAoW3+sqvuj49bVq/N45J5cNuzJ0MjyaQahEiqcd Uxo00t2El/RfT4yLECccwbgaeJBA+c4Zf8rUr9hHQiTnN6gyWI4eTf7HRhdtf8KCOuKsxDcPQ+9M e7gWOI3JiK+NHsukP91HRSGE3b1qGe4/RY39qo96dk1PYL+Uh/wFP8vTq86WpprsnH2EdEt+ZH8x /YPyh3LsnK4HaG58BQ7MptwU1LU5R6MVNXTZut+8SKrpKWrqIEqqJiY1dJHWSMBjpYlRGfOvJe/c 5XlvPbPbpHA0gTUzBmRzqUMACtUOK1yBWnTc3Oe2Ke+KQZPkOHpx6sK/lyfzEvjJ1v0YnWvYO9Jd nblg3zuLNPNkcNl5KKtoMxT0H29XNXUdLVR+ZHpmiaMXKABvoWIGPt9y9uXLXLf7r3aHTcLcOwZR rRlYLQ1WrA4pQqOltnzfy/JCGe98P/TAj+dP9Xr1clsz5K9M77ipZ9ldsbD3GlWsbwLid14ipmk8 rERxNAtX9wlQ9v8ANlRIPyov7HDwMjmKTtmH4WGlh/tWof29H0O47bdaWgvYnB9GWv2ceJ9Ohux2 66tXLJK6qrA316kH9Bwfrb/Hn3uezjCDUK1+X+XpVoBrQdCDhux66iddFXazauX+n9fr+QR/sQPZ TcbPBOtWiwf9Q6aMQIIK1PQw4DumtpWT/KStioF2YLY/6nmwv/r39hu75Tt5lPYDj8+kz2qtwFD0 P22fkFJFoWWpYC6/qcvwLawL+oj2DNw5GVqmJRX7KfZ0le2da0FR0rN+1PT3yG2VVbB7e2vit37c rWWfwVOmLIY2ujeKSlyWFycZWtxORgkjUiSFhqAKtdSQQVuHJ91FqAQ08v8AV/l6aKEGpUg9EU31 /LI2VlhLW9IduVmClZGMO2ew4GytBdlBSGPcGNT75ACLDVTWseW+vsL3Gy3EJo0bAg8RkfMn/Uem zQ8RToi3ZvxB+SHUqTVO4utchm8FTkM+59kOu6cKUFyJZUxbS1VAoIB/eRCL8j2VvbSrQaa4/P8A YcgdaA4nos61ULVATV4amNtEsE6tT1ETqbSo1JKqzElwdQ0nSRf2xUggaadbyOuMkAKSi68yEnj1 SLc2sxIZyF/2H496NO01z/l691DeiV20gIn+qOk/p4H9ACCvP14It7sKU9evfPponxkWoOIvLEGQ urJdWFwdBINiWtY/4e9Urkih9evV/b0UfBfLf5kfBDsHuWGo6B2r8rfin2JvSPsShwmTxldUZ7Zt bUYyChyVJgtyYJYc5tmpc0y+SKdpaI6VdACGBbEskZJ0ao6/s6cCRyKO6jdbD3wkz3yQrfjjtHvj rnZmHy20+5qrLdpVO1tjbwi3bnNmnctZJVQ7WzrslPV12Y21TD7Rl8f7KxiPkqT7VRuWQMBg9MsC rU9OjkYv5m4LKRSbP7h2lCiSukVfgd+4CP7dgqldNTS5anejmvcjkE8/7e9R1WtfLotPf/wW/l29 +bM3fvDC7Q/0S75p9vZXM0m4Osq1cUtRlKWnlqaIVOCkd8RWRz1AVDEi06sG5YfX3R4o3yVz1cOw 4HoOOhfiV1R8XspV5Lq7eG4twp23sjZOb3Rhdw/ZTybWzW3ny3lpaGtokhE9HWS7ol0o6aoRCAWY k+4j9z41jGx0PaTN/gj6FvK7FzfY8k/5/wCrBNhEioitz61Fv9iL/jj2CtiP+MR09ehFd4Q/Z1rt fJPC5fM/J35O1GIxOSykGD7E3dns3LjaKesTE4Slq8dS1eWyLQoy0eOgqamON5ntGHkUE+r3kbtu Nvsq8fDHUW3Obq5/056L5U7L3pl1rExGzN3ZZ6bCRbhq0xG2c5kWpsFOS9JnGSnoJWhw1XEpeOrc CmdQSrkA+1tfU9J6Ghweimdh01dBSxT1FNV01JkYJanHVFVTTwQZKlhqaiiepxs00aR19OlTA8bP EzqsiMhOpWAuOkz+vVenabSqarWbcBj/AMc1YgL4xb6At/hxe/u46RScT0ULcext8th6nd67J3tL tKngkqqndybS3E+0oolmNPNLJudca2ESmgqT4i7ThBJ6SQxt79XyPVKMRWhp0GuX2bvXGfaPlNmb yxq1+Dl3VQDIbWztEMhtaJS825qL7rHxfebbpkOqSvj1UiLy0gHveOvUYfhPDpN0mxt85zKLicDs feudyjYQblTF4Xae4ctkm228Zmj3GuPx+NqKt8A8VmWuCGlZeRJb3omnXgrHgpr9nRzP5XKyxfzG vhvHLFJDPB3vt2GaGaN4ZYZoKfKpNDLFIqvFNE6FXVgGVgQRceyjmH/kg7wf+XZ/+Ono55dH+7/Z x/y8J/h626/nHKCKy7H/AHaFNmBDkern+rKefz7gDlKpurs/L/L1PnNJAtbYHjq/ydaqHyz1Sbmx IUlNMOTClVLlZJqqghiYJYFrSMLD3Kuz4W4PzH+XqLr8kSR045/ydXNdQrvj42dA/GbHdjZ3p/oj 427Y2VuaX5j/ABx+RHTc2ez/AHnkN1VIy1NvDYG9MXs3cFbuKLfe3pIKTD/a53D1WMrDbwTO0asK kOiJQ1FHmCOP/F+Rr5cOiYjUzFak/L/V/LrXCyNTi58rmpsHS1eOwM+YzMm36Gtdpa+k23LlauTb 1JkZC37mQp8K0CVBuQZlYjj2hPHAxmnSihp69dYTI5LbmQizG2cxmNr5SBzJBlNuZCqw1ZG/F310 M1OkjX+mtHv7qBpcPGSsg4FSQR9hHDr3256P11V/M2+WHWkNLjM1ujFdu7cpxDEuK7Gxyz5IUsTW MUO46FRWByo/tRi5+pt7kLYPdTnrl3SlpvTTWo/0Of8AVWnpU94/JumWhibilD8urAOvv5onxx38 tPQ9s7I3J1Fl5tQqMpQRLujaaMW061ko/wDKqOInkmUagPx7mjZfvCbReKkHNmwvCSKGSH9RPtKm jD8tXTDWxFdJBHRxcBT9Wdt4wZPq3f2z9/0UyrIIcJlaOeuj8guiSYyZ469ZuebRm3se28Pt/wA7 Rq+ybtbtOc6VYJJX0KNpY/7z02yOmaEHoOd09KQapYZ8bJTSi4cGFuG5Uh1cB1+n59h3dPbvdLQk 2beKo8jg9eVyKauHRct2dBx1Ec6Ckhq4pFKSQvEroyaSHRo2Uhgykgi1vYGvNtvbJmju7ZkPzFR0 4JK4HRCu1fgt1run7iaba5wmQlLMcjt0/wALqFtxf7aOJ8e1zySYSWP5+tyaWyhkOtSUf1U/56j+ XTcltayk646H5Y/2Oq6ex/5eW+8G1TU7I3BSbggX1pjsxAcTXsW58aVMXmp6l7W9TmEHn2imsZVj IiAb7Mf6v29JJLBlUm2YV9D0Q7e/VvYfX9RJDvPamawwjWUGqmpHkx7WNtUeQg8tFID/AIP7K5mk jbTIhDD1HSF7WaP4loOg3ab9ViWb/a/99/X2kean29bSOlc56jM9tX9k/jnx+0UkhB+fS1EpQkZ6 9JJy2lvV/vPtN051Hkk1Bf8ADn/iPetQ6903vN9Q3+Fz/wAbJ91p07oHURpPSv8Avvp/xT3vq/Xe pf8AVf7wfbPjj/UetV+XXFl/Tz6v+KDnn37xx/qPXq/LrIzD9S/2j9fr/X211rqL5P8AD/ef+Ne/ de64ltK/q0+j+n+839p+t9Y9QUWsv+x9+6910zEKP9uTx+4PfuvdcPJ/h/vP/Gvfuvdf/9DQh9qO tdekX03U3v8A77/D37r3Tf7917rL+U/1j/vXv3XupP8A0V/08/3x9+691h9+691737r3XX+06k/r 9efavq3XvS2pv9b6W/3n/Y+/de69/qfV/wBI+/de6yf0P6lH6jx/xHv3XuuXp/3n9P8AtPv3Xuve /de679X6ufr9f99+PfuvdZ/fuvdYOef95/2//Fffuvdd3X/U/wC8n37r3XX5/wBTz/jx/wATf37r 3XXv3Xuvf2W/r/Z/3309+691y1lb/Vh/vv6+/de6x/6r8f7V/sP9h9Pfuvddt/a1f1/4p/xPv3Xu uVz/AFP+3Pv3XuuNv0/7SLf77/Y+/de656v9a3+p/Fv9tb37r3XlZdP+39X/ABP9R7917rvyj/D/ AJKHv3Xusv8AZbjV/j/t+OB+ffuvdc0/Sf8AUW/2P4ta/txeK9UfgPt65q2q/Fre1PVOpCt/yT+D /T2o6Rdcv0f7U5/6d3P/ACL2sVgR8urdSRa3H09q+q9Zj6b6v+QW+v5/3ke24OP7Omh59Z4m/wCT v1cf77/ePbvSef8AydOCSaXt/V/z/X2uheo6qOpdOzM3qbTp9f8A1i44/HtT17p2UsCvpTn9Tf6/ tWjiny6ZlQ/n1MTT6WDf8g8f52/1/wBb2qR/InpJIe0fb1NkZvF+n/kVj/h9fZgnHpgdPlJHILqd f++/PtfChrTz62elZR00hdV06hwB/vv8fZpa2pk6Lpn8ul1jcPJJY6f9j/x0/F/8fr7EllYSv556 LppvDi+fQm4vbskihXj1/wCb+p/4k/i/sZ2Gz+Jw4dElzf8Ar0Lm39lzyLH+3Zf6Xv8A0/Psf7Vs I4joN3m5dD5tPYterxtRpUROQg8lPrRrH6i6MCQT/t/Y8sOXUppkQMPmK9B263dENUYg/LHR+end 5d97EWGLanYu8MVSII1TG/xqsqsegjJKmGhq5ZqaBvxqRFOni9va655D5ev1YXFiFc/ijJjavrVC Kn7a4xw6QQe6XMGysrbfu0oQfhY6l/3lqj9lOrL+tvlD3tTpTx7ox23N6wBQJZKygbAZUqCLyR5T CmOjaQr/AGp6Sck8n/GP919sLiAF9n3qNovJbkAH8pIwv7WRj8+hZt33nJrIou/7RHJF5tGdDfsN Qejo7P8AkNicoKeLNbb3ZteqkKkkUb7mxyBuA61WFibJaCfzLQwgA8+403PYtx28GW+syqfxRss0 f5lO8fmnUwcue+/tzzEwt/3wLW780mGmh9NWQftNOjC4PedJkEMmIytJkgELOtHVRySwi9v8ppWY VFNILcrIqtf8ew6iQ3QLW8scirx0kEj7QMj8wD1LsMltdRiW2mWSIjipDD9oJHQgY3fdbSsqiV0t ouCzI1hck2Nha3tLLt0MldS92ettCp4rUdCpgu3chTMAamQX5byM2k2sF/NiP6/09kd5y7aTg/pj 8ukz2qk8KdD3tn5CVlP4kkqWBAUEh7i9xcnkXNhb2DL/AJFgk1mIYPkekz2zDI8upe7dv/Hbu5HT sjrXamar50ZTnaWmjwu40aQDXKubxRo69n1f6uQi/wCPYK3Dku6jDHw6r9lf9npho3U5GOiib4/l n7GzJkr+kO26zblRIGan2z2BTR5zFIPr4qfNUq01bTKx4DSJMw+t/YPudhubfUDGwp+f5UPD9vVK eWR0R3sv4ffJXqky1e4etq3cOEjM0j7k2DONz4xqaNTaV6OJDkota/W8IAv7KHtZo69taen+bB69 Snljosi1cKzyU07mlqYmtPjqyJqWrp5CbaJ6WqSKVJP9p5N/acrTBFG6169c2EyujxPpks4BAZGU qCFZACfrfm592JFK0NOtevThtTObu2Bll3B19urc2wM68vnOS2jnazDvNI7Fn+7SjkjgmWRiSysp Dk8/X3XUVJpgA/6h17iAejh7d/mBdvilhwHd+x+uvkVtqNEgaXdGDo8JvKKGO+paLO42GGnap0A3 mmilcnm/u4lIxx69QeY6DT5HfPj4t9G7DpezOsfi58kd/bwqMtjqPPdKYvKB+tU27XVsMW6a/Jbp pzXZdHocEZzRJDSBWnKkkAWO2lCiuk1/l1tY9RpUDpZfCn5rfFb5ibk3bWfG/bXcfXuU2htTCHsn rbteMzQbSrcvm8gmCXa2WLs2SpK1cdWLPqCOnhj1KNQvFHueVmg2VwCAJJQftKp/m6FvKwMMt8DT Kqf5t1bvsHipi5/tp/h9P8f9j7AuxjTPED0Ib01Qnqh/eG98JsL5x95127HyK7E3H2D2ZsXseLGR yTV77B3xi5sBuOfF08To1Tk8bT1i1tNGTpNTTJ7yRsM7faHz8MdRdcEC7uK8NbdPGQ+R+wdyzZPG Sdj9g9LYzaveG1d+bJy+1tu5PK1me6p2Ds/D7C2VsqSmwucxUuP3BgMPtxKqj+8aTHNUZGoMjI2o sq0n08umi49SKH+XRQvlTv7ozvnGbGzy9g1nV2V29Nv3G1fXzdZ53cFLh8ZvvvzfW/1qMXncNW0e GeDAbU3msj0yRxmeelaGMqXQi6hl8q/8V0nlKOAdVCK+Xz6om7bWNaiuipXFRTwVFYtPVPC9Oaum WRxTzNTyM7w+eMB9DEsl9JJI9uA9F0nxfLo3eW+ZHRafEb4p9cZHsKPIZ3ofZO38d2T0jlsb8qKS XsSfb/yh3P3Dktk4iTae/Mb8Xsxgt3bIykFJNVbmwVfMkskqNKvjpjFTSdRNOP8Am/b0oEyCKJNX wjI7s5rT04eo6l5z51dEYHtDvHsHc/yp7n+X+0+2Nl/PebaXRnaGxez9s9YbGX5GbPwuK6360yuQ /vTj97YXO5uamOIzp2tV0u2cVi8bTyUlT5HNvaDQDTTh1YzIGdvFLqdVAQaZ4D/isdMe6fn58eOz tjbf2J193lvj4Ebmx+xPgPVVfYvVmze6dyUEeP8Ajf1tv/aG/PjXR5PCbkyPbdVtvZm6tz0ef21V V9fW4jM1sTrXTI0cEw1pIORUZ68Z0ZaK5Q9uQD5Dh6/Z0A/RHc+0/kV/PL2R31sTb9TtXZvbvzSy m+9sYPIQUlFk6XD5yfMz0tZmKPHvJQ0Wcziqa+uhgZ4oqyqlVWYDUSrmAaeXt4B4i1k/46el+xOH 5k2p1HabpP8Aj3WyL84JrisCtcgznk2KghRYWtq4/J/4j3AnKArPeGmKf5ep25qNLe1Hz/yda7s/ UOQ7x+SOxtnwxbd/u7hsduTf/YlfvLO1u3doYnrjZMS5bd1ZubMYqCrzFHjJKNVgL0sTTLJKpWxF /cr7IhczLjiD+VD1F24vpZT8j0YP5RfIDbWV+CPSGG+N+T+Q3SfR+5cl2b1fiuoMr2Nju3elu1ca m4KKu3/uCLc+clyO/duZ/Ex/a1GKhrZI5jj0KwBQZLCOWT9EKqla1H7OP+o/y6KkX9SpNfP9v+ry 6pkloCxUqy6WvqJGmx5ZAAL/AIPH9faHVTjx6fC+nHqDJTsuvxv6hcG5PNjYkDgf63593GaGnWuB z1HcSRqpYMR6RcD1EnhV0gFmYg2AFySbD37FSBTrwFT1wjkWRY5EYMjAaHWzIws3qX8AkX/23vwI 8+veXTnicxlcBkosvt3K5TA5WKRJIshha6pxdasi/oZqmilhlex/1RIN/fkrE2uNijjgQSDX1qKd e8qGnR4ur/5kHyg68jp8bmNyYztPbtMAP4Xv+hirqvQbKBT5mFYauJkX6O2tr+5G2H3Y575eWOKD eGubVceHcDxB9gLVKj7COqNEjZpQ/Lo+uwf5mfx73qKei7S2duXqjLzeOOTK48f3k2s8z2VpPQoy UEWv/AKo9y7tfvvy5uoW25s5fa3Y4MkP6iVPElG7gP8Abfl0w1sSKrQ9G9wS9W9tUAyPW2+Nnb7p J4/SmKylIMlEo5K1GOnkjqo3UH9PqJ9iyDZ+Sea4jNyvv1u0p/AGCOPkUen8q9MlXTiD0g909J0r O6tRvSS8kxywFBx+RqQHSGN78+w/uXJG97cWIh8ROPChp6063rpwPRbN6fH2nrqeopqzE0uQpZEZ XjqKWOphdWuOUlVwAw/rb2D7i3KExXMJHyYdXD1xSo6rs7Z/l4dY7nepqMfhJ9q5FiziqwRMERe3 Ly0TXhlP9ePZNcbJaTAlAUb5f5utFI2/DQ9Vw9ofy/e2dqfc1e1J6feVBFqdaYD7PKqgJ+sMloZX t+FYc+yOfY72KpjAkX5cf2Hptrc/hNeiN7l2purZtY9Bunb+UwVVGChjyVFUUyswJFo5XURS/T+y x9lUkUkR0yIVPz6qY6ca9JLUP9UfV/vv6f1/r7Y6v1CZraf9bX/h/vuffuvdZWLW+un/AFH+35+h 9s+OP9R61X5dYmbVq/1v+I9tda6y/T/a/wDebf739ffuvdQ/fuvdcT/aX+0OP97/AD7T9b6x6tXF 9P8Aj/xvi3v3Xuvfq/4M30/b+n0/4r7917rH7917rndP6H/ff7H37r3X/9HQh9qOtddsdX+ta3v3 XusHq/5J/wB4/wB9b37r3XX+pXgf6n/WPv3Xusn51aOf+I/p9b+/de6xe/de6kMv+0/8FH+9D37r 3UT2r6t17kH/AGr/AH3+vxz7917rJ+5/vtPv3XuuWr1af99/X37r3Xr+pf8AU/8AWv8APv3XuuP/ AAX/AFZRf99/X37r3Xf+1afV9P8AiP8Abe/de65/hf8AU/2b/wBP+K+/de646v8AW4/Vr/of96v7 917rJ6l/1en/AFSe/de66H1H+uP979+691xP0/Vp/wBq/wBh7917rhr/ANV6f8f+R39+691k9+69 11+Bp9X4+vv3Xuser9P/ACd/vX+xNh7917rn9f0+r8aRb37r3XL37r3XvfuvdY10j+1/xA/3n6+/ de6zK5/4N/sb/wDFffuvde8y/wC+v/xT37r3U3/qZ78vHpP1xH9r/U/7H/ffT2/Hx/Lr0n9l1kRv +liP9vYf8a9qkf1PW+u9X+q+v9k/4/7x+fZgvHpL1Lj/AE3/ANV/vX9PbitT7OtdS421en8/o0n2 /wBa6yKyo31/3X6fH/zc976TTpUV6zRvyukf8cyv0/1vbscnh1xnpnqbAf7TN+r+n+8/6x9rUcEV HDr3TlF9BqX+3/Y/2319qo+B6o3l0oIadpOV4/2r/kf19mECcadIXkIJpx6UlDimk061H+w/3359 ncNtX7OkTyAD5dLrG4OSTTZf8Wb/AI6Aj/X9iOz2zxKdF81z0J+F2tNJo8cGr1/0/wAfY0sNklk8 uiabcEjz0Nu3OvKuqaLTSyKr/q12/wBjb8+5C2rliWTj0F7zdYo+jE7T6lmm8LNTuzftx6fHyQef r9Le5O2rlXw+PQPv9++fRo9m9JtM0bfYlmP9I/8AbfX6fT2NrbZ4oOgVf8yZ/S6N5sXoOoqZqeGO hmlkk0GGnpo/LJJIPrFFFFD+/wC1M1zbWcXQGv8AmQeLQfq3HR8uvfiDuqojgqMhiYdu0LD1VOek /h8kZ5/5QD5srf8A6d+wBvHuLsFn+jDc+Lc/8K/U/wCufRethv26cbbwrb/hv6fRrtr9LdY7Tjjf KV025KqH6w0f+4/F2H/N6LzV35/46Q+423LnbftwP+J230tt/wA5JOjK25e2uP8A3MufF/5pfpx9 CI28MNtun+027icbh4F9C/Z00VPJJHb/AHZVf5+f/p57Cz2l/uEom3K5nl6PraaGzi/3W7dDF0A+ 79x4zNSGorUQZDW0kdfTQrBkInT9QjrqeaOsRlPIIcWIv9fapdi2qoafbwX9eDfkwow/b0abdvnM m2Sifadznt5V4FHI/lwP5jpCjunPbMXUm82ylNBcvQbnFLlYDZbOTWE0+UCD/Grax5+nBtLy4Zc2 V29P4ZAJB+3D/wDGz/k6mPYfe3m/btMW7Rw3sPqRoen+mXiftXpUbf8AmpsFnFNuZP4Q0elZslis hBX46RiodpftJzFWQwgf2VMtv9UfZLNse6RyPGbDxKHBjapI9TGwDj8tXUx7L7ycq7kUhvvEs7pv J6Mv+9LUAfbToadjfJnZG9d2f3b2u2eraZqWpnp95LQGPak9RRGIz4wTuwqRXaZbpddBCsL3t7DB u1O5PtT2FysorR3jKISBUr3UYH08iRTqS7LcNv3RBLY3KSxHgyMCD/q+fRl8XvKpUB6erjq0XnXT TiQcnhm0EkD/AFx7dkt4mwyUPzHSpoeIP8+hNwnbORpNBFZKtiq2YtpJHJBN+Pr7KLrYbS41BoR0 ne1U1xQ9Dltj5BZGkKXrJFU8FRKSji3CshbQ6H+hBHsJX/I9tKCY1FekptiPh6d90Unx/wC7adqb tHrTaOfqJUF8zDQw4fPwSEEB4cnj1hcMt/qVa/sC7lyJPECYlqBinEfb6/z6aaN1oCpp0VDen8t/ rbPrLW9K9sZLaVQS8kO2t8w/xrDec+qOOPL0uqsSEfQ+RQLc+wbd8tXdsWXwmA/bj7D/AJK9NaeF ME9Ej7I+G/yS6thnrcp19Lu/b8DuTuXr6qTcVAxsSZ6impmaeCMgcrpJX2Ry2dzExDxnIr86fZxH XtJ6K8amNJGpqkSUtbFq10mQppKKridSQ6mCdY5Bcix4+o9pCO4LShr1XqSPKA2iQxCbRYq7aXWw KRugOho9RsPqB+fe6epwP9X8+vefRq/hbR46j7A3q9HjsZRVOQ2rTSV01DQUtFLVvR5rHxI1UaWK LzlPuDpLXIuf6n3F/ucpay2ry/XbP+0PQp5VcC5u61/sx/x7q4LYbaamG/4ZPpf+v4/rz7j7ZDpn iqfMdCe8AZGp1rj/ACj0H5QfIZnLaf8ASrue4AcD60tuR+Lnn8e8k9sNdusj/wALHUWXYIu7kf8A DD0W7Ln/ACV31RkrHHqdiLRK0hVEc6Te6Kbj8A29rvt6SnzPRa9/ehJJiR5NTObgFZUKsNZIHAYr YD62Huw9Ok79V/dny6PK9gFZnVYytl0FrMASLsoZiVuOfdwekUnEjojO5+KiZja4LlT+BcqSVX8A 3A/qPe+qdB7V2JLAHSSbLbkEiy/1uOP9t791rpIzgiRiw06LLpv9L/T6/W/1v/j711vo+H8r1tP8 xD4dNYenuzAEH6+r7HLfTkm/sm5j/wCVf3v/AJ5ZP+Ono65c/wCS/s3/AD0p/wAeHW2V825m1Vek 6gBNYkrxqLE8Dlrm3J/21r+4H5OA/wAbP2f4ep05rJ02o8qnqt34ndHdgdi9l9g9n9NVdZD211Mm 2qTGwUVPh9ywz9f7yw/Z9R2HR53rXLTxN2Ht/P8A90sbiZqSNW8UmQRyL6fcucvoSly6nvDD/Aa4 8+ot3QgPGpHaR/l6JH8+9zb5O9ti9L7mwHV/X2L682dg9+zdQdPbHl2Ftbr7sLsnH10ufotwUFRJ JV5PfsONhEVdNIEESyLGFAUEmkxYsqmnqQPU/wCXpGgCgkE/n8uq/wCSAJcFGAYf2gCeLj6i/I9s afIdOausDQIVZLKRyAbDn6WZjySePeqHr1eB8+j1fyz+l8D258x+uKnfFCtb1b0tQbl+QnbTVMAn xqbH6iwlbuysosnrBgWDJVOPjiRX4keyc39vW61kqR2gV/Z69NymimnE/wCXoZs58Q8T8i9nfHbt Knp59t/JL+ZH8yO1JOrNu4yKKg2JsL48UeSmir901W2aeKJUocbk6asqIpIwqCmgKD029uaPECMF 73Y0+Q6rqKlv4VX9p6rn7J6D3110u+s1HTS7s6w2R3Nubope3sLTSLszc2/dszSx1GMw07jVLPUw Q+SNADf6D20ystTSqA0r5V6uCDQ1zStOgQBYIr2LoV0qbEC/PBWwa6n+v9PfsHAOer/Efl12slms DqBuWBPJsBc2+n9f9h71Sop14A4qPPqbi8hksHXR5LA5TJ4DIxsrQ5LB11Ri6yJiTZhJSvGPqL8q b/63vSVicSRMySjgVJU/kQetV49HN63/AJhPyZ67SDHV+5sf2VgIXjV8RvujFVUCnhsviiy8K/dG Rgv1f8/7zImw+6vPWwBIod5NzaCn6c48RaDyBOR+3qhjjbuK56PVsH+Zf0duwQ0naOzc/wBYZF/T PlsYBn9sBywCl5INU1JExNyCLqPr7lCw96OVt4QQc38uNbSEZkh70r/pTkflXpkwNjSfLo3+Cqep e2cemT6+3rtLecEoB04rI0wyKM638cmPkZKlXRW5uv49iS22flXmNQ/K3MEEjN+DUA9fQo1GB6TH xVajRn7ekVufpWmcuI6fQ4BXxyx6edR5DEAMf949k25csbvtuoy25aMeY6sJP29Fa7F+NuGztLNR 5/beNy9HKsivFXUMNUhQ/qs7oWUkj+yb+w5NBFKDHcQgj0YdO6lIyK16rS7Y/lp9c5tqmr2qcpse ulLvox4FdiCTyqjH1LK0KFjzpkFh9B7I7rlu0nqYZGjb9o/nw/aevaEYAg06rt7J+B3eGx3qanE0 FLvXHRFyJsIzLkdIuVQ4yo0TzS6fr4tYv7D91y/fwVaNPET+jx/Zx/Z02Y2Hz6JzmsHmdv1kuPzu JyGHrqdtE1PkaSeknib+jJMiN9fZIysjFXUhh5HqlCOPTH5T/j/yUfdevdYvfuvdcfafrfXvfuvd Ydf6v91/7V/vvp7917rj/hf/AH30vb37r3Xh/Z/6F/4j6f717917r2ldP1/5B/2P+v7917r/0tCH 2o611737r3UFvS2lvSo/33+9+0/W+pXq/X+n/avajrXXL/Vf2fWf+I/r/X37r3WH37r3UjTq4t6v 7X4/p+fr7917r2pvVp+v5/334+vv3XuontX1brH+v/C3+x+v+2/p7917rN+Fb9X+q9+691kPp/V6 lW4f/iD7917rj/08/T+n/jXv3XuuXDH8+k/8T/vV/fuvdc3W8q+pF/2p/wBv/E/T3RPhHWh10zHV 69Daf+pf+9fX3frfXFgdSsv/ACEffuvddf7Tq9X1/wCJ/wBt7917rn7917rjw3pDfqPH++Hv3Xuu HH+oP+3Pv3Xuui/qP+08W9+691kZo9K+m3+qb/ffTn37r3Xv9T6hx+v/AA9+6913+pfT/wAlc+/d e6ye0nVeuC/p/Vf/AG/PtX1brioK6v8Abrz+f+Re/de6yK39T/gv/HT37r3WVfVpKg3/ALP+9e/d e6yIfUP9j/vXuyjHVNA6mc/j9f5/1v8Aev6e9Lw6a64q9+P+Sbf7wL+zNHNajj0l4dc/Ur6l/V/t JH++49rVYEfLrfUmI/p0+n8fn2/H59aPXa/8i/5Zf737d6a6mwKzJ9S3/BP9j7vH8X5dIW8ulLSU fq/ToX8J/gP68ezGKKnXnfR0qaLGzTW9Okt+nR9P+J+n+x9ndtZh+kMs3idLzF7dln8dkdm/1Pj/ AOJt7ElntUktOiya5ij6FbA7Fqpyt4/qP6H63/pz9fY523luWTohudyiA6HnbPV8kzRr9u3q/T/y K/8Ar+5O2bk/xOgtf750ZfaPTryNDpo/9o/zf/Iz9R7lTaOUoo/LoE7lzD0bTY/Q1ZWeFVx7yav0 /ty6Pz+f9f2OLbbrazOB0At15qhj/wCJPViPVHwj3pnIaWunw6YXEy+N/wCK53/cXRhOOYopf8vr vr/yjRTeyHeOeeXNj/R+p8W6/wB9RfqdBV7zdNw/srb/ABb/AH7L+nH0fPZfxV6r2fDHUbiyVRua qpk8k0NMP4Pg/wDePNla4c/8dKP3Gu6+5e/Xn6O2230tt/zkk/61/wDVzqqbRFJ/uZceL/1Tj/62 f9W+hkXeHX+wqc0O2Mbt7AssUnpxtPFJkJP+Wsvmlys97f7tk9gyaHet4lE243M0v/Vv/rX0awm1 s/8AcO1gi6QuW7Shkj+4aqasaQ61mrJJfH/y1+1H7EHtTBYeH+jXwur+DLcgTS9A/uDuiNY5FepM gf0rH+1GI/8Ap0Zofa1LKHpctgaDOei/7o7szEiSLHW4rGD/AI7TVFTkPGY4v+Of2eO/62+1cKWs fSlLAYx0WndXc0bSVEeS7GrJFb0eHCUlBH45DeW/7U1ZP9v/AMtP+tften/Cdt/5y9G0O29Ft3F2 ZjaxmWmrs3kpP0RzZKTxxxxx/wCajihiH4/5Z+zKGaWPh4EQ6Vpt2ileHTfh99tqWnhwqZSsq/2V atqPJH5JP819rSxUcM9/dLmaX/lK/wAW6eSzp9vTuuf3ptesNXjqzIYmo8i1AmwdXPDEhbkRJ9pI /kFPf6Nce0EzbRult4V7apKn9IA0+w8R9oIPS6xa/wBslE+33ssM3qjFf20OfsOOhr2X87e59lzR JX1lPumlg0RlMor0df41t6Y8lTeMrx+Wjcn2FNw5Ks5Knb72WAn8Lfqx/sYiQflKPs6lTZvdTmax CRXzR3kIH4xpf/elH+FT9vR3+uP5nGwcnNT0e+KHK7aqpDolmqI48lji9vSFrqUpWKLj6yRKB/X2 DrrY+Yduar2iXFv6xONY/wCbchU/kGkPUm7T7q8vXvhxXqy2k5OQ4qv5MK/zA6PpsX5Edc74pIqz bm6sXXpIiOppcjFL+4wHoC3R0Yf6lrEfTn2U/WWvii3kJjuP4HUo4/2jgMftAI8+HUgWt/Y7hGJb K6jlQ/wsD/l6HvGb1PoeCvSRW06V8qKWNrrZuBz/AEBPt3w4ZgwFCR+0fkc9PmNGqAM9CTiOzcjQ FbVE8bDkBmOnV9DYEi49l9xtFrPh4hnpl7YEVI/Z0Nm2O+Mpj3ikFXKj+kCSOZozY/q4UqeR+L8+ wtf8m2lwGVEFPSnSZramQSOlBudeje6KVqXs7rfaW46qZWjOUaghxWejBHMi5rF/aVkkgPIaVpee bewJuXIjIWISq8eHr/P8gQOmTE2aio6KpvX+XV1luET1fUPZ+X2dUODUQ7e3lEm4MMhIutPDlqRa fIU8N+B+w5H9fr7BN3ypcW/dEGHl6j/LTpsrTiCOg16f+O3a3QnaVfFv+iw0uKzmyM2mF3Bt7LQZ DG5KfH7l2c0sXg9NZRTLDWh9MyqSCbfQ+4O92LG6tLDavFGDctQ/7Q9CTlai3NzqHb4X/Pw6sP2K SKmH8WeP/XHP+2/2/uL9mqJo6+vQpuqFWpw61xvlLz8oPkE3qdD2vuZWVCDJq1Up4/oTY8f0F/z7 yU2v/km2Nf8AfS9RVe5vLr/moei75b0QursPRFYlgoWRyWYKoA55AAJvYEe146Snh0WjfwQU9QPV KumwV/Sx08IH/oRc8j3ceXSd+q+uzldpKmOGKecql2SGGSeRQ8kgV3EKO6XIIHAF+Px73Wg6QyBq nSCT0SDdME0NS0dRBUU0jF2hSqgmp5JY9V2nEc8cbSRB+CyggE2+vvYNeq0YU1KQfn0HVWoKtclf SbFTcg/kn+pIXi3vfXuknOR5Vvqaw/oDyeSp55tf3r0699nR6/5YP/bw74eEfVe68Cb24AFBliDw eQfp7JeZccvb2f8Al1k/46ejnlv/AJWDZf8Anpj/AOPDra7+bk4MlWv6uJzdOPoQvAuTa/4v9PcF cmL+ndt9nU5c2HNqv29a/O58XkqrflZnsLkMnhs1gUxc2MzeEyVbiMziqlqvKyrVY+voZYKilnRq dSHUhlIFufcp7QD4UrA51f5Oo1vj+ov2f5eg93jgs/uTL5Xcu6M1mNy7lzVS1bms/uKvrMznczWt GsLVuWy9dLU19fWtEigySuzWAF/Zoak6j+3j0h+XQU5DakiEjxOxUkcC6ll/1Vr21A/X36pHnUdb C1x59WJfAH+Uf8gf5i21+2d39Ubk2TsnA9WZOi2795vyPLfbbt3TV46PKvgsNJh4J3okpaGaMy1c qSrG7hdBPtRFA8oLKQBXz49NSOsbaSDXpI9g/wAvv+ZR8S9+716fxvWnYTbk3x1hlzvHHdH1kW9K Le3UU1U1JlYMvLjIhVwYGqqYAHhq46OZmtpuNXvxhuEJXSTXjTr2qJhq1cD58egi2n84Pkt0d2l1 NuTckWPG9/jv09uz4/dRbY7J2XUbaTrrZu7aCtxlbJhcR48NLUbtoYa+Vo6+Q1TmSRtVwV0UWSWN lJFKAjPXgiMpC+Zr1M6q+YOJ2ljvhvsHsLqml3X1H8VO2t791bi21QZQHK939ibzlnrE3LvQZmnn xSPia+Uft6ZkliFtI5B2JiBGrpVVNft68UqWIOT0B/ZO4ujN6daZLc1LtzeFJ8ot4d/dh723ZWQP Q43qXDdRbnqKzJ7d2ntfD0j3OUxGRqkQyGKARwwlVBRh7qzIyV/0QnPVgraqH4Kfn0WKpoUjQl2R YgCXdmCJYcli7WHFjze1h/T22HHHq/DSa9Qft7hHicNG1jGysHR1IvdHW6uvNwVJFvdwRTrVaA1H WArIg0sLqCx4J1lf6D+gsTz79ipI69g/I9cDKFPDFdN1e3DWI4t/X/H6+9iuetgGuB1KxldWYaqi yeEyFdhMjDIJIshh62oxVastiA5moZYHlIH/AB0LDgcH3paxOJYiVkGaqSp/aOvZrw6N/wBb/PP5 HdeJT0VVumk7CwVOFj/he+6Nayo8Qa7JFmaRI6uEmPgExyEfn2Ptk9zeddjCxRbsbm0H+h3A8QU8 6Me4fkR1Qwo3FM9Hs2H/ADHenN1iGg7L2lm+vMhMUjkyNAv95dtAm2qS8K/xCmibk3kVQB7kKy91 OVd40xczbC9rOceLD3qPnpJDD/ej9nSd7ZgKowr8+jV4Obqjtag+/wBhbu2vuqnqFEtsRlKVquNb jiWglaOojcjgqFJHsTwbVsm9KJuWeYLe4Uj4CwWQfaraWr9gPTJ8SP41IHSH3R0mAJPHS6H9XodG jfT9AQGUW9J/x9ld3td/YvourZlNfT/Uf5deSdG+FhXopnZnxq21uinlo90bUxeagCBAMjj4ahkV iDeKZ4jLCVaxBVlIPPstls7a6UpPEreWRkf5enq14jPVana38tfZOQeqqtl1WU2hWkyOlLd8nii1 tXMM96iKO/8AqZLD2Q3XKdtLU2smh/Q5X/P1oxoRVTQ9Ved4fG/sLoieim3RDTVmDyc81Nj83jma SlknhXWYKiNh5aWZkOpQ1ww+hJB9gzdNovNsZDcIPDbAI4VHl6j8+mipXj0Xz1p/tPP/ABH+xPsp 611x/wBVqvf8f776W9+6917/AIN5Lf7z4/8AC3v3XuuK+n/or/H+v19+691x4/Vz+n/ePr/t/fuv dcv7X6f+K/X9P9ffuvdf/9PQh9qOtde9+6916S2pb/8AINvp+P8AiffuvdQ/3P8AfaffuvdSNX+0 +n/W/wAf9t7917rEPoP9Yf717917rv37r3XvfuvdcPavq3XJP+S/9q/4n37r3WP/AG30/wCpnv3X uvE/8nf2v8bce/de6k/gafT+fp7917rjx/j/AKv8e/de67/23+0/7b37r3XtXqv/AMh/8Ra3v3Xu vavVp/339ffuvdRdX+x1f2P9bi/++/r7917qZ7917qL+r/kE/wDLTj/ihPv3Xus3k/w/3n/jXv3X usP4/d/rz/X/AA/2P/Ee/de646v9VywP+9/4+/de6za/9q+v+r9+691zDa2b+h/33/E+/de6z2H/ ABzT/ksf8U9pOq9RvKP8P+Sh7V9W6y+r/U/7Wv8Ah/t/p7917r34/t/X1/77+v8AxPv3Xus2r0/8 F/s/09+6915fqt/1fj+v19+691OA1/8ABv8AU/8AIv6+3EenSfh1w/TpYN7U9W661av0r9P0/wCP ++Ps0Xj0k6nRxsW/4n8f4/7x72vDr3T7S0ckp9Nm/wB9/wAT7WonidJJnwB0qcbhJmK6YwzD+n+P /En2d21hLSnl0ga5ij49CPidpvN49Su2r1rot/xQ8+xPYbP4nRXdXnDxuhf2/wBfyTeO1P6f964/ 2Hsf7VyxLJj6bHRBebrXowu1eq55mjVaX9Xj0sI/p/sLf4+5U2TkyWT/AIjdA+/36KvnXo1Wyeh6 +saELQv6v7U1/wDW+l/ofcu7RyZFbf23QB3XmqKP/iV0eXqn4m57c9ZT0eJwdflqz9uRqXG4+Wol jjvzLL4of8npx/x1k9iqX9zbHa+NeXMEVt0ALzmqW8l8Gz/VuerMeufgrh9ux0+Q7EzGOwUKprbE 0H2mZzluD4pZL/wqh/6mzewHuvujaR/o8ubb4v8Aw2X9OP8A62Sf9U+iN4b69Hjblc+F/wBVJOjX bdo+qevFWn2PtOlkrqRAn94MrHDmMpH4/wDdsVVU+Ghofr/yjeH2ANy3TmPeM7xuX+L/AO+ov04/ +tn/ADk6etra1t/9w7b/ABn/AH7J1F3F3Ri6HzSV2Sh+4/W7TVkUh/5tf1/44+yqHbZeEIx0vS3l kr43Re9zfJDDztUCHKQtSwvomqvvIqeOOT/m7JVfj/llH7NI9pljz0uhsPU9F53F8kNv4mGqrqOq hdqp+GhkjkrKyQ/tCY/dTffT+1fg3NxWHozttq8uiy7m+UmaqqiQY+lRYf3DHJU1EslR+5/nfGR/ mPaxLCKv+5PRkm26PPoGc13zvDIeRaeqhx8cno0w0/kk/wCplV5v+BHvTwWEfn0ZLYcMdBTmN4Zj ITSNmMpWVEy/Rayomkkj+h/zUv8AmPby3MMf9j0qS3PHz6SU2ehI0tNrbj0+T/itve/q4unVth5n HUanzlPJMsaT/uM5SONB+5IP9ube0z3kUfHh1b6YevQ6bbymBwdKtWqwyZCSH9yprKjyPTySf8q0 VLND4Lwf83fYdvN1luf+ebp9LPrDluzKWKOTxujSebX6/LfxRyzftfa+Y8Qeb/dvm/3X+57LXu6/ b0pSzHlw6CHMdhVEheGP0rNNr8TJH4zJ4oTLL4v2YIPP4f3faZ9xl4Q9L0s+NOklJuEVjHzMEZvG n7Mcckgij/d/zsMEPg+3g92TdZPy6v8ASH5dMtTvvIYGpWbbeSy2Fqo2EqVlFk56WVSsd1InhdSb Ef7t9otwvYL6MxXlrHLH6Mob/COltlDcWzCS2naNx5qSP8HQ69e/zE/kf1jLFEu8Yd1Y2F0R8XuB RWgxMblEr1CzIf8AG5Iv7C0myWpcSbdcywOvAA60H+1etB/pSOh3t3OO/WelZLjxo/RxU/t49WPd Rfzjtv1zwUPYW18rgZmCpLWY7xZjFlvoXakcpVRp/X1Hj/W91NtvUHcPCmhA4q2g/wC8OSCfsfoZ WXuJYSaU3CBopPUdw/Zx6sL2z/MD6Qz2Ogy2Lz+LylFHLAMyMZloqHM4OnqpoKVMg+AyPilrqaCa a9QsF3jjUsDYG5RuHNEO1SIdwspFtKgSNQ6kJNAdOQy+tDjj0KrTf9qv0SS0u0dD86Efkc/b0evF btlaCCto6r7mkqYY6iGqppVqKeWnmQPDKJImZVDKwPJBH0t7FD24kjV9IaIgEEZFD8xUdHRiXBUe X7el/ieya+ldCtU/DKL+QsLAA35vcj8W9l021WkyEPCKHphrfUeAI6WSb9qd153B4+eYy/aYTcFW Lnlb5Ha8f0v/AEl94n/ec2eDb+X+XJ4VAD35H/VJ/wDN0abFEI7uc0/0I/8AHl6MJsYgVEN/qXjv +OLiw+vvE7aSBcJX16EVxXw8DrXG+UFh8ovkEhdlb/SvudtKXudT05U203fkg8G9zbj3krtZB22x INR4S9RVeAi8uq/78PRc8vINBUWBRCpU8tyODpJ9RNvwbe1/SY9Fs39pEUy3LMqseOCNTNqLH9Ru Da54/r7sOk79Xsf8J1u6ek9hdU/Mai7V7T6k2JuUfJrDxYih33vbZe1twSbN/wBBHU1RQyU9Pncn Q5KfASbknyhhkCmBqsVIU61ks3JWvSi00+Gaca56Cn/hUx2d0H2f8Tvj3U9b9i9RdhbswHf/AJBJ sXeWz91bixWArdg7tpsk7pt7J12QpsJPXGkWYuBTmfw39ej36L4vl03fkeEmRXV/kPWpB1h/Ly+c nfWwsN2h0z8We3+yut9ySZODA722tgaas27lJ8NkajEZaKmr5chTr5cflKKWCUNp0yRkfTn29qUG hOekCwTOoZYyVPRau9fj/wB3fGvetP19371lurqbfFXhKLc1NtbeFLTUWXl2/kqito8fl1hpqqsj FHWVOMnRG1AkxNwB9d1ByDjqjo8Z0utD0Yj+WIQv8wn4gNcADujBk3NvpjssfqORYeyTmf8A5Vzf f+eWT/jp6OOWq/1h2X/npj/48Otqv5qSXnq9GmziYlW1K19XGkEDVpC/Uce4P5M/3HuT8x1NvNn9 pbU+fVX/AFtsPDZjZnde8MrRUFbkYtw9b7R2s801amRocjX/AN9MrlMjQwxTLR1dLT0FHHHUrMjF PLGUK83lbZh/is7Yr4lB+wdRpuDETIP6P+U9JXNbBVtRjiMhKlTrjWNCSfpYAKQVFr39mekZ+XSI N6dBdluuywbRBoj12s62uARZgSASAT7qUyTxHV1k0mo49bbn8jf5I/CbqT4s7K+OQ7s2BtH5BVud 3Tu/sXY+8srBtTO1+59w5WasviavOfY0Gex8OP8ADDSCnnkkEaaSgP1MbYqIlWvd5/b0lnqZGY+f VsPxYq6HszcXeXyEhraTL0W/t+z7F2TXQT09dHB1/wBVmo2/TwUtXAZIvt6/d0+WqGVGKsChNyPb 4Na9M9Kzvn4Y/Fz5N4mpxHeXR3XnYcVTG0Zrs1t6h/jUGpdJelzlPFFlKZwPoUkB4H9PfmAcUZQR 1sEqag5618vk/wD8JevjnuKjzO4vjB21vDo3Kw01bXUu1t0SrvHruOSKN6gowrT/ABDF0h0kF9bl Bz7SvaRkHQSp/aP2dOidsA561c/kt/LU+ZPxQ28+++0+qpa/qiR6f7Dt7ZGQg3LsKtoa6dKfF5We shEVVi6XKtLH4xLGVUyhS1/qikgkjWrr2evSlZEaulu708+ln/K76xw+8PkZmN1bs6ug7I2xsbrT etLiq3M7Rj7E2H192xunHR0vWO9uzOvRUw1m5dh4/JwSJVNHHIlG8glcHTYXtlBkJ01UD9np1WUl U9G/ZjpJ/MHonqfo3p/pbbuZ3H1vnPm9Xdhdo13f9P03mMxmNjU3WmVX+JbEqMsMlR0ONwO46TMs 8MGPx0fgioJwCzFTb06pGoAp4lf5eXXoyWOcLTqu6SgFgbXH6WJYWsfqf6n6/wC8e0+rPTlOmyah bkKFBAHI/IBI0k8WH+P192BGKnrYOSDw6bnpWUko17jgHi/LCxB/1/r+Pe68BTrwbyI6iF/0kAtE xKLMil4S6gHx+bS0WsHkrq1f4W59+x68et59esvlPAN78/7Yc2t/qSDx79jI60RX7OpWPra7EVi5 DD5DIYqvjKmKuxVbUY2rR1s401FK8cgGpPoLD3tS6MJI2ZJPVTQ/tHXuIzSnRuuu/nd8iNgpDRVW 5KTsDCQsoOI3rTLWTGFFF4ocpEErEcgga5Gf2N9p9xubtoVYV3L6mzH+hzgSD0oCcj8j0w9tDLTV HRj5jGejq7L/AJiHTW7lgouzdpZjr/IuoWTJ0Y/ju3jO5CtaRFFXBGL3sFsB7Gln7j8tbg3+73aJ rScjLwnWhPqVbI/I9MfRyxVMclVHkejKYiHqftGkFdsHeW2tzCQtpSgyNOa0F/WVkopXWqRoy1jf 2L7NNt3UB9i3iC5Q0ourTJ+atTP5nqhZ4/7RSD1XX/Mr6PSm+LPYGenpArbarsDmaWTT6o3TICld o2IFlaOoI/xvb8+w9zlZTQ7ROtzAVkRlOR86YPDz614muiqcAZ61a/8AgvjHHpb/AH1yPcP9e66/ Pr/5C/339Pfuvdde/de683+H+On/AHm1r+/de64t/Z/4L/b/ANh7917rl7917r//1NCH2o611737 r3XUnK2P9n/efx7917ritTIsckfoVZP1ftfuf9TvdNY+fXqdYvd+vde9+691737r3XQ+g/1h/vXv 3XupK/4/4av94ve3v3Xuotz/AFP+3PtX1brl+P7DX/1v+ND37r3XH9P6T+n+17917rh/un/kL37r 3Xmb9X+qb6/43Pv3Xuuen16v9rt7917rIo/sgv8A77/bnn2zPw/b1o+XWL+0PJ+n+1/r8f1/Ht7r fWP/AKE/33+x+vv3XuvHn0v6W9+691J0/wCc1H0n/ev9e/tnxx/qPWq/Lrr/AG+q/wDvv8b39tda 669+691K9X/JX+8/76/v3XuvL9f66v1f8Tz/AK3v3XuuX1/2n+3f6+/de64/7U3qv/j+f8ffuvdc tX9rT/he/wDxr37r3UL/ABUadP8At/8AD2r6t1kX08/qb/H37r3XJf7X+c1c/wC+/wBv7917qQrf 8k/ov/r/AOP+x9+6913Fdtat/T/Y+7r8Y6o/Afb1KjjaRv6N/a/33+w9q0QUoOHSZ3pUA56dqeha Rluoa17BPrf2ZRReQ4dJWYUOcdKrHYOST+z6W9aqns7hsJZRjpBNc+vDoS8LtKSbTqh9P+pT/H/b 29iew2fxPPonubzy6GnbXX1TWtGiUrsP9UIz/hf/AF/chbPyrLcA/wCLdB683eJMjoy+0Ol66qaP y0vjb8/tyn/Y/j3MGw+3ssn9tbDoGX/MkUfHo3+w/jvJO0Pko3mY+PSr82+p+n9Pcx7VyRYWdPGG eo33XnD/AFf5erHulfhLu7dMNPWY/bppcOrxxy5rJeKgw8Y/46/f1X+f/wCWVN5vZjuXMPK/K/6E 1z/jP++4v7T/AFf81OgNNve6bpiH/cbqxTZPxb6j67jhm3VXPvTKRpH/ALjcVFNi8PE9/wDNSyxj +K11Px/x0o/cfbr7i79uH6Oz230tt/v2X+0/61x/9VOij6P/AJTLnxf+aX+rxP8Aq30J2e7Vwuy8 X/DMPT4XaeJj/wA3Q42npaf7j6/ufa4//KJ57f7tl9gyOzl3S6M15cT3Vz/wzoySGX/Qf0uir7y+ SFMvnWijmyFR+5pmyUkQpI/+bsVLF/n7/wDNz2fQ7V4fH9LpTDYdFd3d33unKeSF8zNDC/o+3pPF Rx/6/ipTEfa9La1g/wCI3RrDYRVA6L/mt9ZKsE7NNWSLJ5XkkHlkt/x18stv8P3fepr6GM16N4dq lp0F9ZnMhXMzU9PVTC//AAIv4qf/AI5ftVUn7E55/wCOvsuud7tbf+1uejiHbZSa9J/Is0cbSV2U oIdX6hG/l/b/AOWv+Y/H/HT2STc1RRj9Ho1XapfXoC852VReTw0MT06w+RGmeTy1FZJ9fLL9YYP+ WUXtlt7yPGHS9NqlqfBHSTXtbIUE001DOkNSyeGOseOKSpp/r5vtJZR+xUfvf532gn3iKTpT+6pu kZW7+rKqRpJqqaSd3/ckaeWSSST/AI6j/d/tM+9HgeHSr91H5dc6PMVlQ2qsmko6dU1ln/clk8n+ 6vH/ALov5v8AdvtBNzBWvg9KP3bH/F0/Uebp6VpDC2uTRH6ppfLUfuf8cpT4PB7RPvEsnHpxLKKP ieno7q8yKrVTp5PH5Lf8dP6fn3VLz049e+lh9D+3purNzwNpVah29f6nkt5Obj/jt7p9VH8+nUtc 9MH8f80yx6tWrjV5PH72k+vy6U+DF6DqfWZ37anaQyaXZL6kj/c/2Ak93km8L7emfpfmeg4rq+So bUsj+r1v+5LL+P8Abe0Tzy9PdMklV6WVm8i/6m/+c/a+l7+6ePJ8ut9P+362Nqo6l1K36V/5Z/48 W9qYZv29alTxI6dT9z5JROHjPjmCaQ8LlHi0Cx9SEMLg297vJndSkiAqfIio6ZtVaKNSpIPQl9U/ M/5IdLSRnr/tfclBQUrKwwuQrJMvh5NJFlloK5poXW3FuOPZJ9FBC/i2byW71/0NtIP2plD+a9Cy y5m3rb6CK9ZkH4X7h/PP8+rRuov54m7aD7ah7l61x2440slTntqyHEVjcC9VJSuJadkH9LID7fF1 uMX9qYZ4v4mPgv8AtFVJ/JR0LbL3DXH7yswv9JT/AJD1d58G/m10v8td9V9P1jk8v/FtubAzGRz2 CzdA9JWY2Ou3Hsynpm8sZkpJVlljlC2fUQhNrD3i996W/jueVeWVFtNFONyNVkWmBDIDQgkGhpjj kY6kvlLe9t3u4mNlKWKw1IIoQCy049XN7II+5gPH6k5/H6h+OR+feHm1Gs0Z6GF0NKsB5da4/wAp v+yovkIwBa3au4vSCbXIpSx4INrfn+vvJfaf+SXt+f8AQh1FN7/ubd4/0Q9F0yxYxMxe39oH1aWs LEX/AFBbre/09mPSU9Fr3290mFv7LAnSPXyTxY3A/wBuSP8AH3YdJn62j/8AhPj1d1q3wt3dviTY GzJt57s797Jpdzbsn23h6jcWepMBTbaxeDo8pmZqSXIVdDiKCBY6aB5DFANRRQWYlp/i6V2wHhA0 zU/4egS/4VHdcdfU38uCi3hS7H2jR7s2/wB/dRUGG3PS7dxNLnsXjs7U7gpMzj6HLU9JHXwUOUhR RPCsgil0KWUlVI9Ge8fZ1W8UG3YkZBHWpt8Hustjdm9JZWfMfDP+Zv8AI/Nbd31mMTkN4fEDtur2 31Nh6arocXlMXtuv22u1c2mO3dTxVUtRUuJQKmKoicKDe77Gh4gdIYVDL/ZSHP4TjquL5b4rDbe+ QG+9t4Hr7vPqfG7dmxGIXrb5J7o/vf3RtGriwuPqsjjt45hcdiY1knrqqSppqcU8Zp6WeNWu+pj4 cOmJQNZGkj5Hj+fQtfyyCF/mDfENvrbubCfQi3OOywFxxYX9knNGOW9+P/LpJ/x09HHLX/Kw7J/z 0p/x7rac+acwNRWKXYsFkspHBBa49WngA3uP6j3CfJoIsrg0wWH+XqaOa2/XgFc0PVfHx6xf8Um7 BDGaWFMtjT4GlbwLMtJU6ZY4OUE7JOwZ+CVAF+PcrbGB9NJq4az/AIF6jTcifGX00/5T0OlZtdHG iSIgktoRY9Vit9RYW1FXv/vHs3OBjz6QBh5dIrKbMjkQF4gDYgKUsVDBQSReyhj/AF/PuunPDqwP l0Em7epdv7ihjp9wYHE5uOBj9scjj4KmajkBBEmPrmjNZjnuLh6eWN9X9r3og4NerBujSfFr5nfK /wCEG3qPYvRm8sXJ1Vj8nW5Sm6s3rj587tyiqMjP91lDi8k08uboVr5ru6iVlEjM31J93SZkGkcO qsqsanj1dL0j/wAKCNl1RpcV8leldybCqQBHVbv2FOm8NsqQQrVdXQr48pj4D9bWkI/p7ULcKfiB HVDEfwmvViW5P5gXxQ7x63p9s9O/Ifqqu3f2rNTbT25gM3vDG7U3JJHlZ4qbMTU+Hz0tDXPWYzHS SP49HJFr8j28GVh2sD00VI4jopv897uTYvRv8szeXT2PlwFTuLvaPa3RewcAlTRCpmo3lp87uPLY +ij1SmHD7W29UOJY1CwVE0JuCV9t3DFIWA88dXiBaRaHrWy+JnVvUnWPxZ2PuPfmw987f7k35vfL bowWeMu+ut8l21ts1VBJ1Nhtqd042en2DsXqCOikrf701ea8p8sAMUUgLWSwgLEGIOon7KjyofIe vSiQszEeX+qv59Vw/P7d1N2N8rezJdv78l7K2ZtKpxmzNjblkmw+RSPDUGKoq6uwFFubBYfB0e9c Pt3P11VS0OYNOrVsEYe9iCWJmDSP3VUU/wBX2dXQURTSh6JRLRyxsVK3uNTcEC/PC/7b/ePbRAx1 uvUGWMIFZ9KqGUXchQ+r6KxNvqBYe6FerA8R1wpaTHff46fIrPJjafI0VRkI6JVlq56GGqikrIKe OSSKN5pIVKqCygn8j3ZTQgHI/wAHWqYrXPVr/YO0tq5fbtDg9uYTr3r74kdg9Y1u7m7HXH0mP3cO x4qKTLYSjxtHlJDkoc3W0tFSU9TTxhVlEkjJ6Rcq2CkYAEZH8+mQePm46pxkoiyFlVzcMYy4Cy6F kIVyl7KWVbkfi9vaYMOHT4bhUmnUOWBwODcA/Q3P0+jA8c/8R7sDmnXganP+r16wHyLbWpCg31ab gAC1yPrf/iPfvWnHrfkSOuCtb1nUOG5U8X5Fj/qR731vFCARTrLRVdTiqtK/EV1diMhExlircPWz 42pRyBqZZaOSIO5H5YNf3pex1kjJWQcCpII/Z17B8v8AL0Ke7+9u2t/dW7i6Z31u2s3hsPc1NR09 XS5Yomdphj51qaV6XPRRPKskcyA2eFlawv7EB5p5hfb5drm3R5rB6VWTuIoaijcRnyr00beJyWUU b5Y6rx3J8Y6c+WTae5Wguxdcbuan8QItcRw5fGippWA/DTx0/wDj7LVulPxrTphrduKmo6AHc3Ve /dpIajNbarTQoT/uVxoTJ4ogH6/xGgaopRcc2LA/1HtSrq3wt0yUZeI6Dwi7rcEE3BuOef6j/Y+7 dV69x+m36r/T/ffX37r3XvwNPp/P0/33Pv3XuuHr/wBp/wCC/wCH09+691//1dCH2o611737r3Xv fuvdN/q/5J/3j/fW9p+t9TP9r/3j/ePr7Uda6x+/de697917rl+9/tPv3XuuPv3XupDN+Gb9P++/ 1/fuvdRvV/0X+P8Ab+1fVuuPv3Xuvf7Tf02t+ffuvde9+6913c3v+ffuvdde/de6kc/6gf7ce0nV eo/tX1bqbbTp/wBgdXPtJ1XqN/t9V/8Aff43v7917rOf7X/Q3/E/X/e/fuvde1f8hM3++v7917qP 7917rJ5X/r/vf/FffuvdY/fuvdZP+pnv3Xusfv3Xusqt6jb+0P8AeB/yL37r3Unn+yo/4Nx+ffuv dQ/z6dH+H9f949q+rdT1j1+n6D+n++/1vflXXgdMdONPRtJ/Zsv+quf95+l/ZjbW1Mnj0meY+XSm x+FebxrpPPrH+PHs7trOvHh0gll8PHQmYXZlVUaVWHSvo0/2zJH7FVhsksnRVc35jPz6HTa/WNRU NH+y/wCUZvH+P9f/AFj7kXZ+T5bj/iPnoMXm9RJ59Gk2T0jLUeFVoXLB4zq8Yktwf91D3NnL3t1n 9a26Ae5cz/y6Ox198ca6uamX+HuzSeNFTx/7sk/bii+n19zNtXKVht8X63HqNd45wiz1aN1D8A9y VUNHkt1Q0eycPInm+8z0YjrJI7c/a4aL/crP9P8AdnhhP/HT2j3Ln/lzZ/0dt/xq5/4V/wBbP+vn QPubzdNwIlp4Vt/w3o8+2+u+hen6enakw8G7s9S/pzW4Y4vs45IyT5aXDRf5DAbf8dfN7jzcuZ+b OYD/ALk/S7b/AL6i/wCtn9p/1b6LNFrH5eLc/wCr/Q/+tnidYtzd/UskZaoq5vFD6YsfjfFTx/bR /teWWrqvDBQ049kqbN9Of0f+qnRnDbS3H9r0UrfnyiaH7ijxdRR42H/djUcn3kklrf8AKfx5+T7O LbbbWIeNN+r0a222y/6Da+F0VrcHZu4crNJMIawGofXJWZGT7KMeQkeXy1X78/nt/uv3e53iws/s 6PrbYZcdIeo35t/G6mysn8Yq/wBzVR03ljo/27fuyy1X78//AFh/5Z+wxf8ANX++f0uhBbcvCvSB zHcEbqy0eNxuNjjjk8Php4vJH5P+bsMP5HsKXPMP/Lz0ewbREmB0E+c7YeoP/A120+jx+T/Ocg/8 cZvx/wAcvZRNvcjkVPRom2xx8OgmyXaVVM2oVWmNfJ6nt5PoD9Jbf5/2WzbrLw6XJZxCpp0g8pv3 zf5KplkkkeRI5ft/JHTpzLLL+7/kPtL9eZPs6U/Rj1H+r8ugwqJKTVqqJZmkf1t4ZPLTySfvTAj/ ADP/AFx9uvvMoz0+tnNSlM9NstVi5JI38AVUTRp8lX+4L/tC8sw/yj2x+9ZXOetPbdY0yNLT6ZKY JCzfpmI8kkY/2/8ASH2yb+aQdX+m/wBX+o9cf7xOis3nTWqSJqsfJH+3+OfP7cS8irw699F/qp1F bcL6lWP1MyaHaRzrMf8Azd/2I9ufVD0HVPpj/q/4rrHHuIeMq0n7fL/iP/N/82v9j7XeN9nTegdd tnJGVVWT9Pj9X7sn+7f+vHt7xh6dV0np8ocwkEfmqC6yMfS31/4j3dWBHy6r02ZDN6mKwh/GtvT5 P9t/T357gfl0oEMshyOk02W1Kyqw9X6hrP8AX/dX+t714qevTekfPrpsi+ni6/8AG/8AevdfGHp0 4kJ4npzweU8dUur6/t62P4593SX06ZZf2dSdzZbyMqxeptH1/P8AxT3aa49erJGZD8+kX90zN65N J51Kjk/X/YfT2j8cfLpUlrL1w++0+lT6fxzx/vHtl5pafPpV4B9etgL/AITwVl/lH3NSfibomepv flzBvzZkYa3+AqfeNH3oCW5S2EniNzH/AFauOpS9rE0bvfiuPp2/6uJ1us7Jb/KqcX/Mf+v+r6Af 63vD7aT+rF1Ml38L9a4/ymdT8pPkGbnQe0twEMCqgaTSK5Cm5NufeTGzgjatvr/vpeoovv8Ac27p /vxui65hoxHKPIgBQaSR/SwtYAfUH6A2/wB69mXSVui0b9K+Kcj9fqN76iTyCRawB4/23uw6TP1t o/8ACfD/ALIErf8AxYPt+9jfnzYD/X9sv8XSu2/sh9p/w9AT/wAKkjf+WDWLa/8AzkJ0Wf8AWvlN wi/vcfxjrV5/uO/2j/D1pL/BvJYOoTsrbWfpv5kWeVDt7PYvA/y/dw/aij8prsXlsr2bhJKSuV3q tFHBjatFU+iSJyfQA+3kRT8+i2CncD4n+1/y9V+dp5WnznZW/ctR1e/MjRV279wS4+r7SyK5ns2X Hrk6mLHr2BlVuldvOGhijjyMi2Q1SOFAUADfCnTLGrManj58fz6NR/LONv5gPxG+h/4zLhDb6cDH ZYj8f4f7b2Q81f8AKs79/wA8kn/HT0d8s55i2T/npj/w9bRXzJmDVtaCxBXzcWIUai36VuLamHB5 sB7hvk9SNvlP9If4Opi5pYG6iHovRPfitC0tL2NpMYZty0IVmADejGBigYXuP3BwP6+5T2QD6V/+ ah/46tOo33Ijx1r/AA/5T0ahoUY+PSyi62VVDqn+ra5BbxP/AE/Hs4oDWvDov8q9NVZiEkFxEt7F So41xg8OwtqZgpH+J96A9eHXuktW4CLTpaPUNJ9IAZhyAGso/P1/1veqasenVg2OkfktppIOIVvo +h/QSS3JW3AIvb+p91pjJrXqwbpDZLZsYLMkKk2Gpwt9JN9PNrcD6/T/AGPuhHDyPVq/t6CXdXUm 2tyUk1Jm9tYPM0spEk0WWxVFkIZZ476ZGSpp5x54j/m3/wA4h+hHHutCDXy62DTjnpB0fR2Oy26N sUdVmshTz1FdiNpYXOb/AN7bqz+F2JicpkI6B5MbNubLZiPau3qEVzyyx0axwxQhwioGfV4guQC3 n16oUYXPV0u6uptv/CjDZjcn2XcDbGh2TnP7x9L7E792R3n8T+4abdOCqcNRbgyuC3XNHnMXgFzl XHVvUUuJjFNMoVJA/wBFJXwgW7tNOFQQa/b/AJuqBteKCteNKHrW+qOvpFB10kcejW/hg1eCDzSN L9vAGAfwU/k0R6udCj2X6cnHSmvQa5HZ0vmkbwlgrHixFwPp+L3Fv9f3unkDTq2CT6dXg/8ACf34 u9S/Ib5Cd64ftj46bR7txOyNq7RrJM/2RWQ1mytmUmfjlRsdidktRSruLcWd8TsaqeU08cSldF1D lVaIrFyy1+3pNMxULpag6uu+S3/Cc34G9tvkcv1hSdi/E3ddX64n2Dkv72dbpLqZvXs7c4y1LQ00 jE3SgloAB9Le33tImyvaem1nYYOetZf+Yv8Aycfkl/L82Rj+zNzb92V3Z8fZd1R4Kn3ntWTLYWp2 jmst5DhRufY2WnydHjWzIhZFrKaslBnUK6rdPaSW3eMVrVK/s6fSVXNKZ6qBanXkFdJ5vwQf6H6i 44+o9pdJ49PfLz6hyUKkFRyCDYAAEXa97aeT73UjPWqA9N0tAqyWC8WsGJ1WNzw4I/Tfg/n3vWaN 16h4Dprmx/L8WkDAnSDx+q9vwbg/7H3YHAPEdaqaU8qdNstHJH6h6wQpNvT9f9T/AGrD8j/D3aoO fPq1eHr1gcOoTUCCL+r624HA4B/3k+/A8cdeB4464akI/qV4B4uL3HBI/oP9f3vz6tXyp10n7ZaS nd4ZGFjJDI8MrKbgq7RurSIbAEG4/wALe/cDXIPWqA8R0g9yda7I3WZGzO2sdJVSXvkMbGMLlPIR /nDU41YKapc2uTUQzk+3kuJFGWqOm2hQ1wB9nQA7k+MafuzbS3JpuxaPHbkh8a3/AOOaZXHI6SHm 13pox/U/n2oS7Q01jSf5dJ2tzSqnoB9z9Xb52nrkyu3aoUaFv9yVEq5LGlFv6zWULTxRAgf7sKH/ AA9qFZWyrA9MlWHEY6QXu3Vev//W0IfajrXXvfuvde9+691BZfU1vT/qf99/h7T9b6lf4atK/r9q Otde/R/jf/YfT/b/ANffuvdY/fuvde9+691737r3Xatyrf0/3j/kXv3XuuvfuvdSP98q+/de6ie1 fVuuVl/1X+8H37r3Uo6mX+n+6/8Ae/8Ae/aTqvUb37r3WX8v/rD/AHr37r3WG4/qP9uPfuvdd+/d e697917rL/qdQ06v1f63+v7917qN/wBfPfuvdZPfuvdd3Pq/2r9X19+691nH+1er+t/z/wAi9+69 1g/Po/5B/wB9/T37r3XXv3XupS/p4X9f++/3j37r3WONC+pf6H/ewOfahEp9vW+nKCkaVrWKj/ff X+gv7eht5ZOk7zRRnPSmocDJMy6Y/wBX9j/bfT/X9ntttp9ekU9znoSsLsqSoZLxDTza3+8+xVYb JLIT0SXO4fL/AFY6HravWM1Q0f8Ak5N/7XjMhPH+x9yRsnKU1x/xG6DF/vcadGw2H0ZVVksS/ZvJ cR+lIx/rW9zZy37dyyD/AHGx0B915o8MU+p6P5078SdwboyFHjMTgazJZCo9UdLTUctRUSf83fDF DNensPcx2fLezcv2v1m5XMMVt1Fu585+JN4MX6vVt3VfwJ2ntGlhy3bGchxfjSOZttYGSlrMxJ/z ar6/96hof+nXm9h7cvciKP8AxPlXbfF/4ZL/AGf/AFsk/wCqfQSmubq4/WvLnwv+F/6J0ZqHenUv UlP9t17tXCYGaOGSFst/wMzkn/N2XKVU81dAJ/8AjlF4YfYGvP39zB/yWNyml/4V/Zx/84/+tnTK OP8AiHbf9ZJOi5dgfKJmab/cgP8Aav3P9bn2ZW21Wtv0ph2q6uJR43RX8x3dkMyk0wp6yoV3dIZ6 ms/h+Hv/AMdTLFBNXV3/AE7v7ZvNytbP/iT0KrPlutT0X7cm8FnaSqy2c/znldaehkNPRx/kxUss s9ZPPTj/AJZeyG55sEY/Q/6q9CS22GLPQP5DsrE0Gmqo46VR4ZXWb/OPaOURGWIVXmnsfYSv+ZLq T/iT0JIdq6CfcHbFRVTNpqHLyevUsvrkj/z3+d/f4mnPsNzbwfy6OIbAR9BVN2PL+5I1RKi/to0c f5kj/wB2y3/5Y/8AHX2Tzbr0vSz/AGdJLIb+aqWdY59UuiRNL/uRx/8AHK/kt5+f3fZa9/4flnpY ln+3pGy7pqmhZp5PHM3k+4byeT/Ocx/u/wCv4vbT35rjp9LKLpkqNyKq6mmcqt/V5L+STiWbxf53 2w94enktvn0wvnqhl9Mzf7r1a/xJ/u36e9eL1bwV9OmJtxBVZRM/mX0NbxyD/D/mxa/vaXJpjq/0 48h1DbJDU2qSElf9Rf8Ac+n+9W93S5OM/wCr/V8+vfTj0/1ft6wxZZG1ep7t+pX/AOpVvalHP59U 8Lw8jrr7+J/VqKk/X/ivHt7xG9B17R4eOs3mVVC6tWn0CO/5v/r+7eIOvaIv9VeuK5GLR419Wrya fbupuveDF6dSaKq1aWv/AJt/0p/t/wDiPau2eXxcHpNJDo8+ptRnCq+OO7sv++/PtZJPn59USOWm R0zNk3ke7Tah+v6j/W91+tPy6syeLXrv+Nfq06NbeTji/wDsD/T37xj16nUdqzUvDepuF/33Puus fPrdOnnD1HmnXVyP9T/hH7UQz+vTNzWTh17OVTeRtX/Ef7z7vO+Pl162QREE9Jhqv0tp5/3r2k1j 59KvEb0HUxY4pYxrLrI39rn+n/HI+6+Ifl1TX/T/AJ9X+f8ACd4VEfy77XBljlpW+PWbQMWHlFQe wuu3RNP1KtHFISR9CB/Ue8avvLFm5N2XxPiG5r/1auP8p6lH2tbVve4UOfpm/wCridbuWy2tPBc/ lSP9bVx7xE2o0lj9a9TPdcHp1ri/KUsPlN8hFAPHaW4WLArYM0dLIha4NgB/W9/9b3kzs51bVtzf 8JX/AAdRNfYvrwf8MP8Ah6LzlrLCQ6qTo+nAW6qQwFzcC/P5+nPsy6Snh0WnfnpjnJIblj9LMA17 BSpBY+r6/n6e7D59Jn62Of8AhPh3B2nkPib3jsrZ3WO3N30PWHyx3Pt5Kqq34+0K56PdXU/WHY1T W1MdVtzPU1XJTZTcxpI0ieL9kBm5U3af4ulVsT4Qx5noKP8AhTx2T2Q/8vrbG1N7dc4TZqbu+SPW lNTy0G+hvCZ6Tb23d5bpFSUh23go6N5a+hNMUZpPQC4PIA3H8XVb1iIKU4sB/l/ydaVPxU7S211X vndVfvPvH5QdD7azXX+eoU3F8U81FiN8ZzdlG9NXbN29uZKjPbfpqrY9TkVkascyvNTOEkiRjf28 wxgD8+iyJlUnU7AU/D/q4dEvrKiqq6qerrppaitq5p6uuqZppJ56mtqZDPV1E88rNLUTzzuztI5L OzFjck+99N1Pnx6O5/LSY/7P78STcC3cWG5P4/3G5f63H5I/1h7IOav+VZ36nH6ST/jvR5yxT+se yf8APSn+HrZ7+ZExatrebWEukjUF0lmtqN/UfcQcoLTbXPq3+TqX+aDW8T5L1l/l0fGPBd29Tdq7 kXsCs2bu7H9q1ODoIJ6Ja7AVtFBtDatdTyVkKkTxTrU5KUF720gf095Acj8pT79st1dwTlGS4ZeF QexD/l6j6+jLSqafh/z9GJ3z8Q/kBsMT1kW3aPfeEhYXzOyKpK5jHpLeSfHMxnSwBJRRx7UX/K29 2FWktNcfqmf5cR0WlW9Oi0VFQ+PqjQZSkrMTVxFlkosvSzY+sVlLB/251T0gqR/sb+w+QVfS6kH0 NQf5+nWqYOeuJNO6kx2Y+kgjjXzx6he9vr7px60BXPUR6RJVuqqxLXTV9GW6kWHGkKoPB/1/dqca nNOt8D0y1GGRpGuq6UQqFj+hVlJBYWubHj3oktQEdbrgY6T1bt+JxJH4V0Ek6iAF5Go6Ta9v95tz 7rQYNc9erQA9OXXGbm6p39t7sCi2ltDesuAepkO2d+4n+L7WyMFdST0FRBk6IhvIftqlvG4F0kAP vwqjVoD1YkGornoa/lB8nKXv/qnb3XOH6+i65oMRuF8tXbWx1JiKnatFFHFrT+6OUp40zVJT1dRK xnpKlmTSq2HHu8sokUACn+DrSLpNa16rTymxQyERx6Q9wUCAFksSPqLmwN/aYpk46dB49BhkuvAi sRCGIYykhALG5Ck3AP8AZv8A4e66fTq+omnV+H8rf+Yj8VPi51VtPqHuDC53qXe21aXJ7bHcuB2w M5tTee06rM1GVwlPviopo2yFNW4KSrZEeQOFUekhT7VW8qIiqy0PTEiM51j9nWy71T8j+sO58RDm er+wev8AtfETxLKKnY+46CryCo4BUVGBqJlyMUmk3KlAR/sD7WBlYVU9MEEGhHVQn8/rvr44YP4N 9m9Abuq9rZTuHuKj2xPsrrGpqoot5QHF7miq6Tfow9O7VVLRYOrx0qCeQKsmp0BIJ9s3LqkTBvPh 05CpaRaDz60FKzbk8SqHRmZQqyMFszPoVXdR9bOy/wCt7Khwz0uYVYmvUvZ/X2R3vvHbuyqLLbd2 9XboylNhcfmd3ZNcLtmhr60mOhGXyzo6UNPVVRWISMLB3Ufn3sAMQARn/V+XVCSBU9OXcPSPY/RO 7p9h9o4Smwe5IIErBFRZGmydLVUMgPjrKaopiymCoAvGT+pSG5B96eJkajcfLrwbUKqcdBG1Mt+A RYcC/wDasbNxzcX90IOer1rQ9QpqIE/X0gjgfUi5Bv8A15P+x97BI4jrRA8j03SUA5GngsbAr+CD 6ifwFFve64qT1oVBxx6apsaSttLI1wqtYDgn6n88WPu2qv2dbrxr59N0lNNGxCkvc2Uj66dQI5Nv 1f7f3YmoyOrceo7hoyCQ11Nj/QXAJ+nHP49+GePDrwJ4+VOuBKtYavTc2/JBP9QRxYn8e/f4OtAY 4dcQpDXjPjP0/aPjDD+0SpIRgw/1Q96ppqQSPs61QUyfLpLzbN2pNmKTPSbdwn8YpJJJIMlHQQwy 3kikgY1EEQFJWNombSZUJR7MvIHt4TShSuvj5+Y/PqnhrWukV6//19CH2o611737r3XvfuvdYqlf Qrf63+9e6Pw/Prw6iNq/tf77/be2ut9c/V+j/fW/1/6e1HWusvv3Xus3+1L9ffuvdYLj+o/249+6 9137917qR/qfV/vv99zx7917qP7917rs/X9Wr/av9j7917rr37r3XvfuvdSv9T/tR9XP+P19+691 hi/WP99+R7917rH7917rvn9f/J3++/Hv3XuuvfuvdZuGH++49+6917/gv+bb/ff19+691h9+691w U/qb/H/eB/xr37r3XP37r3XvfuvdTFjaQ/6/+x9+691NhpXZraf1W/5Hz7fWID7Om9Z6eaPEtIY9 Iur/AO9f8U9nFvYeLx6TPc9CBh9qyTMoWMEft+n8H/Y/j2J7Da5ZPt6J5r/NK9DxtXreqrGj8dK7 aj+rx/14/wB59yDsnKV1ccbboL3+9xRjo12xOkKqsaF3p9Jb9SpHf/D8H+vud+WPbSWT+26AG68z xR16sE6Z+Kea3NkKPHYPbuQzGRk8brT0dPLUSiP/AI6yn/MQU/8Azdk9zXZ8sbDy3a/WbjcwxW3/ AA3qMd15wlkl8GHq37qX4M7X2jBDXdoZSmSSOGOb+7O25IpZY5OJfFlMzLDNQwfT/NU3m/5aew9v HuXFH+jyrtv/ADdl/wCscf8A1s6B831V4f8AHLn/AJtdGhruwti9X4WTD7dXbGx8atkkShji/iFQ I/8AduQq5Zvvq6o/5a+b3HVz9fvN19ZuV1PdXP8A1T6ehhl/sYR4XRNOxPlJtX9yloJMjnKkPoVU qZaOOsk/5a/5/wD6dR03/Tz2ZW9tLb/74i6MrbYZZOPHolPaXemdWn1ZSvxuD80I+z27QnyVHjkk /wA5X8TGH/lrLLNN7p+9bWL+x6FVpsPh56KRXdlZjOVkYhk+4jE0fkkqZJY6P/O+TxSyxC//AE6j /e9h7cuaoYosXHQnttn6c8x2hNHGsclY9X6NEk3/AAH9H73+apbD/J/+OXuOrnfZpPLo7h2roDc/ 2lNJNN5Kh2j0er/jp47/ALX9b+D2Hpt49ejmHbZfXoI63elTULUSSVsyzyet1f8A453/AN1eaLzi 3srm3WWStOjFNt8ukZVboabxs8yNG2tJEm/dk/5tf0g/6lxe0U16HrnpYlmOmabNXja9R4m0aFRx D4/H/vB9o3vfLy6UfRx+o6ZajcNMrMqks2n9KW8ev8/532x459P9X7en/A+3pjm3CW9WqQf6ov4f 85/yyP49+8c+nV/BHoP59NsmcdtXr1NaTSlvFJ4/zz4Pajx/t/l1vSfTqNJlXbUWk/V/qz+P9v7v rb16b8EfPpu+89RWSTWq/pH/ADbHu0c/n17wR8+uf8Qoh/afV/vH+8D+ntUjngePXvB+3rgtc7fp M/8Atj/xX25jpjR/R/l1xmqmbSq+v1/qS/0/1x7fhmMXTTrI/XYqjFpZpL6vz+f95/w9upN+zqvg y+h6z09Q0pVV9K24c/1/p7WpNXqn6v8AZdKH7w0sbKraW5Rvx/h/vHtRq+XVHQEUPDpkkdpJNV5P 1/1H4/4n3Xxh69X8T5deUer0y6l4/wAfR/yx931/Lq9euSv/AMhW/wAP+J/Pv2v5der11943+oH+ un+9Hm3t7xD0z4cXz6UOFqF866m0qJLH8W+lh7dgfy6Ykj8P7OvZyq1SatXv07+XWwhlqT0nWqm/ tBG1f4H8+03T3gw9Z1qn0qWP1/w/x5/r7rr+XT1er6f+E7+Z/wCc1t8ULScZP4/bwdY/SbyUm8tg Tl1IRCP276uNLG1vofcAfeQSvI1pTGjdISV9NcM3+bqRfbU6d7uUr2i2ZR/tWXref2Y3+UQXt9UA 44+t/p9Tx7w72w/qxfb1MlzkP1rjfKu4+UvyAJayt2jnm+n6isNFZW0Ekrc/S3+P0HvJnZP+SPtv /NFeonv/APc+9/5qHou+Xt4CwJIFxYrcKt7nTf8AK3+v9fZp0jPQDbt2punL418viNr7lyuKmzlF taPLYzB5aux8u5squvFbcirqallppc/k0KtT0SsaiYH0ofdgRw6YYEioHn04fFH52fO/+WfuftbF dE7FxO5dsd1ZvIbu3L1P3H1Vv7Kx0u+urduQbT3nu7ZddtbNbR3Dj6jC7Z23TU+5aWb72mpP4ask gpXSUtplVsk9USeWCqeHUV+f59AJ/Mo/mF/zHf5jO2+m8D310kuxer5qvJb06o271b0l2hg8R2fl aLb9VVV268fuXeNduiu3xT4DbBqaqNcVKtLS0TzTyB0JkXaqqk0OeqTzTTBA0VF4jjnqmzcnWnZW 3tn7c7G3B1zv7B9e70eSDZ+/M3s3cmJ2Tu2eJZJJI9sbqyGMp8Bn5EjiZ7UlRLdUY2IUkXqK0rnp MVYANpIU+f8As9A3N/nOeL3ItY8W5vx/j9ffutf4ejufy12A+fXxLIP6e4cMb/0P8OywJtb6A+w/ zX/yrG//APPJJ/x3o85Y/wCVj2T/AJ6U/wAPWzX8v5S1dXEMWX982B06RquCVYn1N+f949xPyqKb Xw/F/k6lrmU1vh/pehN/lfZufEdUdmPHK0SS9vZF7fgsmzdnKTpvyQGHvNb2Jt1l5SvtSV1bg/8A 1bh6CLrVnJPVsWD7Mr6Nllgq5onQKFeCZonHPq51Agn/AF/p7ly62iJqh0Gek5gD1xXpRZvJ9f8A YdC1D2BszbG6o5keLzZLG06ZFF9JYx5CmWCr8o/1TM/+t7Cu5cmbdfms9sj+tR+XEZ6Ya2Hljot+ 7vhT05ucS13Xe7M715kJbyR47IONwbfDf7rjUkJWQRsTYhUaw/PuPNz9sIqs1jK0Teh7l/zj+fSc 25XgOio74+I/feylqKykwOO35h4kaRsns6pFXOkIYEPLiXZKyFiBz+f8PYA3Hk/fduDO9t4sQ848 n/eeOOmjERwPRZ6+eTF1U1DlqOvw1fHKVeiyNLUUFUkxa2gpVrGX/T9FJHsNMGQlJFo3nXGemtJx UY65ySJIyrYD/NlP02Ok3N21aTwfoCPdRTz61gCh6iVFLHMtm0rqkCXX6fjVq/wSxAJtb37zBA63 xPTJVYqNkUaDyS1wASVuCr8KLcfj3bDVqP8AJ/q/PrYI8z0ma/BJKw9AYljwtrKpQj1CwILA3/wP 491KgcOHWwRmp6SNftWF2e0YBANyQfr9NJtYAWAPulPXqwPz6TFN13LnsxisDSihpqrN19LjKSqy NTHRUMdbWyLT0/3lXMVhpYnldQzsQBf3orqYAHHWy3E9LfPfE7tTqXG1/ZO2twxbez2183kMZmqj YG6cjtvc9FlcLIq5KejrcZUYuTcVFi0KSSyQmoi0SA8kMFsYyg8QGh86HrXiA0B4/wAuiZ702VWb s3hmOxN35PO727BztJDj8jvjeGayW5tzVeMpmd4cbFksrU1ElBjYpnZxTU4igDMSEAsAw2pqVbpw ECgoB0EeW6/C+QNGeVII03/J02ci3uhU0BpTpzVnoePifsKlx+6dybmxW/8AYWyew8TjjTbPw/Ym Kwebwm7aWso6v+J4tMduLH1uNlrqueGGGKTVTyU8kiOkqH6uRKKkkjV5dUckgCmOii997g3n2xvz cnYO9cfRpuaqpVpKrDYaZZcXSvg6Q0sWLxLeeop4Kd5INKCNzEL+niw9tO7O9SaNw/1f5urKgA0j I6LDhaTKZjB02Uym36rbddO84fFVhV6qH7eQIkjGwJinQ3FwCbf097ftYjXUevXhVhXh8uvT4yWN iLG+m9uWuRbm+njnm3uuOJ69U/l03TUx/tLYAnmxuQAP1Dngi3/FfddOOthjwPUN6VWHIBsdQuBa 5Fv68XHv2QTjreD59Ns2PJJsqEi+q1lUcggqD+T78Gpx4deofLj03T4+yerk/XSBcEE/W1gQTb3Y Nk060Aw4dNE+PNzYWP0uo0E3+hI/JsOb/wBPdwa/Z1uvrx6b5KaZQRpBAJ/BuRb8ckkEf73799nW +GQesGiT9OlrG3FvUbAkA+q4AUn375U61TNOv//Q0IfajrXXvfuvde9+691yb1q3+wt/sePfuvdN ftP1vrNH+f8AYf8AE+1HWupH6tX+w/R/jf6f7f37r3XlX+0f9fn/AHv37r3WP37r3XX4/wBT/tuP +I9+69137917r3v3Xuuev1f9E/n/AG3+v7917rL6W9f/ACAn9bX9+691H9+691737r3XvfuvddXH 9R/tx7917rv37r3XvfuvddD6D/WH+9e/de669p+t9Y9X9m/+Gr37r3Xl9Tfq/wBj/Uf8QPfuvdS4 Fv8A63/Xz26nD8+tHrNDTO/q4/pp59q0Sn29V1jp3o8a8mnSo9X++H+uPau2tJpadMvN4fS8xO2K iZk0x/7H/W/3r2JLDZ5ZOiq6vIuHQ2bX65kqGS8Lv/bGi39ePr+L+x/s/KstxL0HLzePD6NTsXp2 apan00Y1N6L+P6W+v+9e5t5Y9upbj/iN0At05k8Lo/PT3xize5K6hx2HwNZlMhK0bR0tHRzVEnj/ AOOsoi/zFP8A83ZP2fc9bbyltfL9r9buVzDFbRf796i7eOauEMI6t36l+Eu0Nnxx13amWhaoj8T/ AN1dsTxVFbHc/wDL6z3/AABov+WVN5v+Wnsq3X3Fijh+j5V23/m7L/1jj/62dAy4muryX/HLr/nF 0Z3L9xdfdUYkbd2ri8Tt+n0R+HE4enikra2SP/NfdeL/AC6uqP8Am7Uye45mj3TfJfrNyuZ5bn/h v+r/AKt9XitqH9A9E07S+TWYqo6j+IZp9s49kHhxdNJ9znMhf6SyxRTQeCn/AOWksP8A089rYksL P+x/VHR/bbJNJw6r8313ktdUu1PM9PCvpUVNZLWVD8f52qqv2f8AKP8Aln7pc73FFF8+hNZ7II+H Rbcp3hXY2okqMfXeOo0aEk8cdRJH9L+LywzGD6+wZuvMPiDoUW21Rx16APPdoVVdUTzPM9VLUPI8 klTJLJJJLJ/u2U/mx9hW836X8+j2120jptocxkoZGrshkPDqi8kdIn/Ny8vil/44cf8AHP2DL/fv Ex0aw2HCvTXlt5NJJp8zzyR+Px06eKn8f/N3/fSH2HnvSejVLeI5HSFym7ptKwtImhZo/Sknk/3a P3ZeIT+x7R/WN6jpSlt4Z+fSRrNyGZv25HkT/jsl4xJ/y1t7T+LL0p8E+n+Dppm3CUT/ADivIPJ+ n/ll7beenXvBb06bJM5q1cyal/tPIJPHH/uq/vX1Q9OveCem1sq0jM2pPGvrZnJ/ck/6c+369Uki 8j1Ckycjcs31/wBTIPJ/vHveo+vW9Mnoem9sk8f6vSp9elJP+R/n24rft6ujmtRx65/el2NvTq/s keS/049vI+c8enf8V67XIN+PVq9a+3kcUp5dMyJx8GvXL78t/a/V+r/kXtRrb16Z6zLX/TS1/wC3 +P8AW/1jb2945+fV9Xy6zfft6lLal/tf7C/+2H+8e1HjD061WKX/AFZ6lrLA36UKn+v++PveeqeC OnOnbxqzMyfT9X4/3w9qInMeekkyTP5dYZ67yN6hqH1t+P8AXF/9f299QP8AV/xfVPB/371h84/r /wAnD/invXjn1PV/pYf4h1y8wUfm39Db/it/ar6r5/6v29NfTy/wjrOtQ3+r/wCOl/6f73yfdvHX 0/1fs694Uv8AD12Khv8AgzKeb/717c8QenVHUpx6fMRU/ucflPof99b28rep6bHgydeyct5mJ/Ro 9I/2H59+ZunyemX7mX9Wo6vp9Px7Z1r1bwZOu/4gW0rot/tX144/3w911t8uveGfXq87/hPVUyJ8 +q5JH0rU9EdkRKnHrdc3sqULe/FlQn83t7gn7w9X5BiNPh3CE/8AGZR/l6kD25QpzA9fO3f/AAr1 vp7N/wCBMH0HK8f7H/Y/nn3hztopJGD69TPcEEORw61xvlVKv+zTfIE+Rv8AmZucXQfwVgojcC91 J/r/AIcf195NbH/yR9s/5or1E+4f8lC9z/oh6LpmFcxPpLAgMCeF9TKSAAl9XrH+2H4Ps06Rt0br 4xfLHp/o3pLcu0uxp6mpztH2vlu89n4enxeTqox2P1ns3aeR6Wq566moqmiTH5be+MrKGrjZ1MUD mRyiaW91ZSTjhTrySoikNxrUfb5dF47j+Xfxw3BufN9u1XcFTR5zq2f+ZDjtv7Bl2NvqXcPdMXy9 wm6qXrrNbPz9Ji227tmigyW7nTNR52ox1RSRUpkjScyKvveluFMY/l0w80RbXryNeKHOrhT/AC16 CzI/zAfjY9F0XX7y+Suf3BuLBVoNR/dTaffG28PhsJR/B/tjoWPId39Sbkqd19Y4LtPCbk3Fh8Bi q/qypXG5XHfc1uSp4rqV9obPb/qr/q49bFxFRKyVP5/wkZHCv2dV/wDzn+TXU3c/R+UzHX3zI7tz sXZsPxgoMH8BarZG5cX1b8dcf0b1dT7MzFFuPdO5Kys2bkott5OiK7Tn2f4pcjDWzTZVQ3pW6qQf h9c9MTSK6dspzTt8hQf6qU/PqkyckP6r/T6Ec34/of6D6e7npL0df+W4T/s+vxRI/HbuKN/pyMZl /wCh4H4v9fYf5s/5Vjf/APnlk/wdHvLH/Kx7J/z0p/h62Xvl04atrT+XWRiObjlv9gRq/PF/97ir ljG1Af0v8nUq8xZvya/h/wAvVAO8/wCYZ8gfh93Bktu9Xbtlotq5Gkx2fy218hjaXL4GvyVQJKOa okppY1qoKiWlx0KO0UsetUUG9veRvttvG77PtTybfuLQxm4YlTQox0qMowIr5VAB8q9Rxum5T2d5 oQgx6QaH1z1Yt0F/P82jmBBjO8uvXxk+qJG3LsBvKkrM/jaWs25WzJLBAi+tvAHdR9R7mC19yrxd H7z2+KccCY28KT7dJ1IT9mnrdvv0TCksBDf0e7/B1ch0x89fi/3fFB/cPuHbUlfMgf8AgmcqDgMv ETa6TUOSEUkDX4/dEX09imw525X3Dw1O4/Tzt+CceGa+gfMZ/wB6HRxBPBcrqt5Q6/LPRxcdu5lS GpgnjnpplV4amiq4aummj4AMVRTSS080f/BWNj/tvYxNos0SyRyK0TCoYUKn5qwJB/b1Zkp8Yp/q 8+l9iuxK2nZGiqrEENYMyHUB9fqVNh7Lp9qiYd8P5jqhiBBGOn3N5HY3YFH9lv3aW3tzwycFsrj6 eWpQkaSyV6otUjAcizj2Gdw5R22+1fUWkcnzIzn5jPSd7cHgM9Fv3T8LOn9x66vr3c2Z6/r3DtHj 6mQZvbrSPyf8mqD5aeMXtwxNv9b3HO6+1ds2ttvneFvIHuWv55p+3ph7c+X8uitb1+JXemzFnq6D D4/feFiB8VbtGp11QiCktNPiqo+Zi1/0qfr7j7ceR+YtvLOLQTxDzjNT+zj+zpO0LKTTos1bJW4y o+zzWPyWCroyVlpM1Qz42eMBmRtUdSgjax5BBN/x7CUivCTFOhRx5MKH+fTenTx65eVHUOEjEZW8 Zso1so+uu35/qf8AivvVKgenXqfPPUOWmhmCmyci0nBAu5Um1rhQCLX5+n4924cOvcK46bGovBPT 1UQQy09RTVccbLrUz0sqSx6r8OhdBqB/HvVO6gFOt1+XQr9g9tV+9NuJgYNo4jbU7YyrxNXkcdV1 07yw5DIQ5OtampqmZ46NquphbyMCQyylbcA+7M9V0gAfZ1UAA8eio5DasZPjEZsgJFk4UG4+t+Af wLce2KYz04CekRlNmw3KmAEkhApuQw+t1t6QR9TcXv71TFa9WB9T0HGY2HDPqjenSW+lgssalADc g2PFgRcW/PupA8+rBug4ynX4sdMQJJJOkW5N/Vq4/te6Facfh63qFegwzGwDdi0d3f1AlCSwUEEX At9bce60pw4dXr5joM8psWWN9TJpaxUXUc2F78qQBfi3591I8gOt1rx6QeS2jURF7R2FlUDT9QTY W4NhY+919OP8+vCnEnHSOq8BLEGbx3AuCoIA0gn9P9GU8+/VHAinWiOmCbHSIxsCALsNXHAPp5v/ AI+/UHpnr1Tw6hyU5jKFlH0vYj6Hgkf4/wC9e66QagcevVJHDHTbJRo1wLg3JH0Cj6ix+t/fgWFe t4oPXqBLjrAlQWIDHVf6C4AHIvZf979+LDz4daI6gfw8awdK2+p5/Nj/AMT73qPr1vPX/9HQh9qO tde9+691737r3XvfuvdN7el2Uf7f/Y8+0/W+uX+86v7X/EW/Hv3XuuPH9f0n08f4/wCt/T37r3Uj 2o611k/X/hb/AGP1/wBt/T37r3XLi/8AtPOq1v6f737917rD7917r3v3XuuX7P8AtPv3XuuPv3Xu udxr0/j9d/8AYX9+691y/T/rf2m/33P19+691i9+691k/wBf/kD/AIj/AIj6+/de6i+T/D/ef+Ne 0/W+vam/1Xqva35/p9ffuvdcSP8AkL/VfW3+39+691y9Wr/Vaf8AWH1Hv3Xuuaxcam+n++/2/u+g 9er1IWFj9Pb8cdfs61x6cqehYst7aWv9L/776j2rhtvE4dNM4pXy6V+LwEkzr6f66v8Ap3/vfs+t tq6Lpr0x9C5t3Y81Q0emH/XH+v7Ge1bDLcdEF5uXh/Z0ZzZPUlVWSQrDRuyNz/m+fx/vPuX+W+Q7 q7l/3G6Bm5cwxW8Xz6P90z8Vt0burqPG4bBVmSrpNDtFR0clRJH/AM3aqXiCCn/5uySeH3P21ck7 Xsdr9ZvFxBFbf8N6jLeObf8AfPHq3zq34U9c9c0dPlu1spTZesj8bLtrD1ksdHF/zarspF+/W1B/ 4403h/6iPbV3z14f+Jcq7b4X/DZf+tf/AFs/5x9AK9v7u8P61z0NGe7u2b17i5MDs/H4rbOLj/5d uBp4aeoqf+OUtfVf8d/+bsks03sOPbXW4S/Wblc+Lc/8N6ahtJZOij9jfLaaKlmocPUJRr/brH/4 EF/93SxRf9dZfbDx2tv+tNc9CCw2D5dEs3Z8lqqFppMXM8ddUJIlZl62Q1mQkkk/zv2s0v8AwCt/ yz83/Nz2Q7hv8f8A1DdC2z2Hw8eXRSN0dv19ZNNNJWTyTSOHkkmk8jy/8tZpRN/X2Fb/AJjl/LoT w7Voz0Cea3rUTeRqiq1Ny4h8nPP+P+HsJXO+SydHcNhjoNq7dDTEJ5kTV6NTyeOOM/X936+yG53L 59GsNn+l1E/vPg8Xpk+8hyFYX/zkccsnj5/zNL+z4Pp7DVzeXNyPn0vS2iTqLJvJcitRNS1UzMf8 4r+iSP8A6deyqZ5acOlKr8s9J2pzUksja5vK2nxqB+3/AMsufaZ5vTh0pSDpN1WSiT/gRUPpb0LG ZP2/+OZPl/z/AL94x9enkhpw6ZZMvDJ6UiEca+R7fuR/776+/O+fn1fwY/X+XTN99TM37ZMY/wCO j/5y/wCObe6eIfTqn0vzPWdsijN+sySf6px/xz5+vMHtzp7S3p03tX6v91BdP9lB/X6fUe29fy69 4MXy6zNX6f0y+r/EfT2r8ZvTqvhfLri9Y1tLhP8AauLf1/wt9fbqzeH0n8Gb168axqq/q9Qvb28j /s6pJH4dM9clVvS2p0/1P/FPr7vr+XTVesy5JvS1vUv9v/e+Pavx/l0rp1nWq9X6vV/t/wCnP49v o5r8+kbKZTQ9ZxUE/qXTb+v7dv8AkXu3TToCKHh06UsrMwOo/wC3+n/I/aiFxT5dXTz6dZsnFpVV AW/9rj/fD2p1f0utaD69N61QdvV+P7P/ABr+vvyP05w6cFqRq1atPo/4n/W9+6Z0t6dQEjlb+3/s P+N29u6x0/XqYJvTx/vXH0Ht5JiM06TCD0r139wv9f8AoX/ivv3iH06r9L/S6fsPUfuar/7z/vr/ AOx9rIX8ukco8Pj1iyU7NOw/1Hpsf9b/AGPv07+XTluufn006/8AOf7xf/Yg359teI3oOt16ytVs v6v+QT71rPSqnV1X/Cf3JPB/MW2zTluMp1T2nSEf6rw4amydv8ecff8A2HuFPfhvE9vbuvldQHj/ AMMA/wAvQy5CTw+YYjU5ikH/ABmv+Tr6BG0WtUw3J+qfn/W/pz9feG9if1l+3qZZPgPWuD8rLL8p /kAqkaj2XmmY3s12goSCDxZv8PeTWxGuzbYf+Er1FO443C9p/v1ui7ZYnxSowIso9AN20tc3DWsf pzY3/wBh7NfPpEfPote/GXw1BDEgqwPqLcAH0Bvo1r3/AMR7t0nfogfZq0xMx8xuQSRqXjgg/wBk 2sf96936RPSvRK9wiPzyBJA12b8i5BH9mwFiB/vPvfWukDWqNHNrG4Avcj6C344J9+690kpr+X62 b/bixsOfyPej5da6On/LfIHzx+KhP0HbWKNuf+dXlvpaxB/1vYf5s/5Vnfv+eWT/AAdH3K//ACsW yf8APSn+HrZV+WkoavyAvcfuMOebcgc2udP+9n3F3LYptMXrU9SlzAf92En2DrUL+cs4bvzJoSCI tv4OK7EfQrVS/wDXX3PfJQpsQPrM/wDk6infTXcG/wBIvRN3kGssuvU3+oH7n/EexX0XQ8T07Y3d 24MNLFNj8nURyQPrpSZis0Xj/wA1LDPDb7f2ldY/I9XeSlD1YB8ff5p3yl6BenpcRvmvyuCR4mlw m4pRm6KUgWCionm/iqEAf2JSP8PfrWfcNsZf3PuF1ZScS0Lkxn7UaqkfaOjS13u7C6WZXHz6u/8A j/8Az89mbi+xxvce048NVusUcuXxLSy0hYgK8rLSQ/d041ggBqaX68t7F9h7q83bcsabptMG5R1y Yv0ZqetMxsfyXo7h3SxnBLakY+uf9nq53p35r9D9x46DJbJ39iZBICWpJsnRVEsOhrESvSyMq6rc FlQkfUA3Hsb7f7tcjX5jh3K6fbr1vwXK+HQ+msVQ/kejJYWkr9OwkUea5/lxHRssTvCOshSpoKyn roD6hNQ1MU6BXsRqMLNa/wDT2P4Vtb6IT2V3HLAwBDKwdafaKjqhjphkz0IOI33WUzaoamRW4JGt la1iD6lI4I+ot+PaSfb1B704+Y6aManh5dPGXyOzt70bUO+dr4HctPMoR/4nj6eWdU+gEVVGizRn /Hm3sP7jyxtm5KY7qyjkHzXP7eNfnnppoPl0XbdXw26Z3QJqnZObzPX+QmLyLRtL/FsG0rD0DwSk 1EcY/oLC3uNt09qLCQvJttw9u/p8S/Z6jpM1qOIFPn0VneXxC7w2fFLU4mixXYGGp7OKnbdSBX6S X4fGSkMAUPNiSPce7lyBzNtpZxai4iH4o8n814jphrd61GTjotmRGQwdU+PzuLr8FWIWRqbK0k9H MGXgqomRRIQD9VuPYQmjlgk8O4jeOX0YEf4emStDQg16irNFJpBkX63YgMRpKkhdQBF/z9fx7bx5 cD/xXVfIY6xS00RDBeDdjIwFxewNwp50sPx+L/4e/YoKjHWw3yPTRNjIZxpsSb6lurDSQpDfgks3 9D9fftNPw063qocjpO1u3kmRzoH5Gor9SnIUcXBNr2/F/dCpFaHHW6jy6SOQ2tG3PhUKV4Wwtdvq Qw4IufdaVrQdbr0h8ls6I6R4rab6vSOAbAgGxHIH/E+6lcHFerauOePQdZbYyt5C9OdRFxdQPpex X8aef9496K+nHqwY9BnlNgK+o+Dkhhe30Avc/kHn8e6lTWtMdX1efl0GeV2AdJbwj6FRePSfUbEc L/Rvxzf3UilT5db1VOeg1yexZIy9oy/4FlJIP00r+SByP9h71QUyKDr2OkNW7VljZ9UTFuQx030q BwBx9T/T/D3U1HDh/h63QefHpI1eDljOlV44IsDYcANqAFyfz/h73WnGoHWqZHTDNQTxcENxa5tp A/oCebfX37j9vXuHHqGaYFl/bXi44X0/65Gn6c/W3uuk/l1uvHGev//S0IfajrXXvfuvde9+6917 37r3UOX9XB/V/wAVuP8AH8+2n49bHWG34Uf7x/xA90691yU/j8MLf8b9+6913z/h/q/z7917rL79 17rLf1afX/r349qOtdcPfuvddfj/AFP+24/4j37r3XXp/wCiPz/tvfuvdcf2/wDfavfuvdek/H+x /wCI9+691z9f+oP+39+691i1X4t+r/eP7P8Asfp7T9b6899P+1f2bX+v+Hv3XuuP1X/gp/3g/wDE 39+69171L6V/2H++/wBb37r3XL9z/faffuvdS1jY+nV/sP8Abe30Q1+fWuPWeClaQH02/wBVo+v+ +Pt1IaefVXY1+fSkx+Jkksum/wBAp/P059mtvYSy/b0kkucdCZg9nVdX49MP0/Sz2t7GG27JLJ/Y 9EdzfxR06MXs3q6WqaP9p2Zv6R3j+v8AvfPuUeXuSZbyXPHoJX+/RR8ejs9V/H2szFdj6GixNTkK 6smihp6Olo5aioqJP+bUUUM0/wCPeQnLft7a2cX1l4PCtuo13jmrw+rdOo/hfhNr0EGa7aySbfp0 8brt2gqKWTKSf0+/rx5qHFGf/m35pv8Aln7ENzzhYbfEbPlW28W5/wB+/wCh/wDXTqOr/crq8lHR kMt3x171fhZNu9f43FYfHx/qWgj5qJI7nzV9VLN58rUD/jrJJ7B9xDuG6XJvN93LxbnpLbbbdXFO iS9jfKDIZCSZlrpr86WeolvH/wAsvbb39jt8Qhh6Elny95TDome8O7K+q8xkyD+r9KpJ/r/7z7DF /wA0V88dDCz2WKMdFx3B2VUzNIBUPqX/AFf9L/4+wVf794hr0JLbbePQOZjfDSBtVR+f+Ol5PYVv N48To7ttt+fQb5DeHLadZZv0Nb9H/EeySa/APRslnFXpD124pJdX72g/6n+n49lU1/jPShE/3yOk 3VZeWQN6n0t5PV/yz/3nj2ie7r9vSlbaWTpkmybFjqZNP5/P+v8Ake0/1I9f9X7elKWcQFadS6PL faxyMY3Z5PQrPJ4444/J5bfucDzz+0E1wZM9PJEa/PqTJn4vp5HVv9UB/wBffaTWPn1bw5fQ9Mcm TLf2vVo/t+X/AFv9v79rHV6dQvvFK/q4F/x4/wDYWHu6P17h03zyrNyZNWn8Jb/kX193RxT5dbB6 4NWPETpb9X6V/wBsPbqP+zrfHrgKth+lnb6WX/b293j8+vJ+pw6zLWjlW0f7rP4/3w9udb8D7Opa 1anVyFb+yP8Ajf8AX3qnTOj59Z/uNXqX9Lfp/wB9z791TritSRq1Pp/1Ovj+vP8AsPalJvXrfhD0 6lLP90NIb/gzH/dn+PtSj/s6RSR+HTPXlmZDZ+f97/3n2oR6fZ03x6cYKlmb1DVq16vbyPxx0qI6 dvuTDH6fz/xQX9qa9IvBl+X+r8+on3Qkb/av+Ke/dU6kxzKV/Vp/24v/AL4+30f9vWkcUqOHWZZh p/3r6+1fTvUhav8AzY/5P/4m9/besfPrdOsy1A/1Wn/bf8U931/0uvZ64E6uR+v/AH1/r/h7ujin y62D0/42XRK7Dm/+wtxb/evbsT5+fSW5XxIusdfUWdv9T9P9v9L/AJ/HujuZD8+tQp0xrLq4A1/7 E/778e99KNHi+XWczf6zf1v7Z631c7/ILnQ/zJetyzsr/wBwO2vEFsFkd9k5GN1cWJKCGRmFiDqU H6XHuIffFifb6+AyDcQV/wCcg/y06F/I5pzBBX/fcn/HT19CzaJ/yiAf4j6f6/0+v094dWR/VT7e pik+A9a4nyvcD5T9/re+rsnLt+QFIpqCwuRYcW/wF/eTWw52Xa/+aK9RTuP/ACUL4f8ADW6LlmiP AboxuthyCF/C88gCxPI59m46RNw6LZvzlJxyfRIxuRe4BUKeCRq/Fv6+9inSd+q+ezzSrO8BkVai RZWjjaRfLIqhrskRbW4TnUQDb3fpE/E9EzzrwfdzU6yRtNHZ5YfIhmjViSrNHcuFcHgkAH3vqvSF rG4Om17AG/FgRxYD6j/W9+690kpf85b8i/4+lrer+v191J690dL+XIWHzs+KxIU6O2cY2o2AsuKz BJPPFrE+yDmoV5a30etq/wDg6PuWP+Vj2T/npT/D1si/Kuo11+QIbVcytqHNuWIuL/gG1/z7jTYk 8PbIlpwJ6k7fc7hMa9ag3zimDd/51fQSmHwS6T9WJpWe/wDyS4A/wHudeTBTZE+cr/4eor3w/wC7 GT/Sr/g6J9UAwtGrP62hjd/p/uz/AHV/j7FfSDxj6dRaqT/ah6f1H8fn/efaYdUfj1l8zaP9Tx+n 8e2249PJ+Hrh5NFmbXHIv6dEvj/2/uvXul7szsTemzchDkNs7kyuKqqf1x1FFWVVG8fj/d/ztLNF 9Pens4rmHwZrbxetGaWPMPVh3V/82X5NdWUjUbZ5c0ykLT1+VE8tfBLe4leroamhkyS3+omBHsnh 2ZtjuP3hsW53NgfMW7sFP2pUo35g9H1vzHfGPwpyk7epGfyPH+fR6eoP+FAfeG35gOytpbH7IxcZ YyNixWbR3DHCFAuSJMtR10xAvdkpUJPuQNv92eYrUrDuFvHcRClWcaWP5rQV/Kny6Ux7hOKeJGG+ zq1PoT+fb8Lu1HosZvXK7l6YztR4Y2i3ljRW4SOZ7IwbPYZ6qGKNXP1KNYcm3uQts9yuW78hLxJr SY0yf1E/atGH+8n5npZHfQPQHHVwnXvdvX3ZuMhzfXu+trbzxkyCVK3bObx+WjWM20tKKKeSWnJJ +jqpH9PY6t3trxa2VxHMlPwMGx8wCSPzA6W6QwBI6GbHbwq6co0VSwZbaWDkFfxdeVcW/wADzf3V 7dCcrn+deqGJfLp2yuQ2pvOl/h+9NuYTctK4MZ/i1BT1EwDKQzLV6UrFY3IvrNvZLuOwbduUbJe2 ccoI/Euf96wf59MPBqHd0XLeHw86d3R5arZeXzXXtfMhEdLDOMthFa+r00lXd6ddSg/t3Ye433T2 n2ubW+2zyW8np8af5CP59Jzaoa6fLorW9fiJ3TtJJarDUuN39iozI4n21UCLKLELjW+JrH8jEqPx Io54HuOdz9vuZ9tq0dutzCPOPJoP6JzX8ukzW7Lmlei05B8hgq04/P43IYKuRiJKPMUVRj5xIOGs 9UEilNz/AGHbj2Cpo5Ld/CuYXjlHkwKn+eOmStOsJmjkDX0m51aQCAQQDcab2Lf191qDSnWqHrC8 CMCilQpS9rk2Bb9A4BZr/i34/wAPeio+09b+0dNU+MRw97u2r03CgiwP5BI/pb3UjPW/s6T1XgY3 RjoLElr3XkkuAGK8i31H049148et1yOkdkNsI630abagSAF5bgXDccEf649605x59brnh0ishs9d La4tRtwAebD6mxF7Aj6/gi491oDxHW614HoOsrsdbuBCtzzqsQQbfS30Hqv9Pz71pFadWr0G2W2L q8jCEKFI/H6vqL8ADn/H6e6aR1auegyy2wm/cPi0mzFLIb8j6/SxPvVP2dWrWh6DjJ7InCFtBYCw taxK3AW/HAH+HugoCRwPW8fl0jztVxWAeFvVJbSTwbK305/1X+w977sZFfXrf593X//T0IfajrXX vfuvde9+691737r3WKdfT+rRp/I/330t7o/D8+vDqF/T0/09I/2/5PtrrfXvofxqX/eD/vNvfuvd cj9X/wBj/wBDD37r3XfH6uf1/wC8fX/b+/de66/4Ktv9T9fx/tx7917r2o2/T+f+sf8Avf09+691 m9+691jt/wA3P95/437917r34/2pf95F/wDeRb37r3UhW/TpUf8AE/T/AHj2o611j9p+t9YfT/X9 L/8AGv8AY+/de69/b/5C/wCJ9+691z/tc2/R6v8Aifp+ffuvddKj3X/fWv8A4fi/u+g9er1LhiY/ 73qP+N/9f2/HHX7Otcenqjx7S6T/AGf9V9Of9e3tbDZ+L0nebRx6W+J2803iZY3bV+lfx5P8L8+x FZ7V4nDotubzw+hu2vsWSoaNRDdv+WX/ABP0t7H+z8ty3HQYv91ijAHRueu+m67LVVLBTY2aomqH jhhhhp5ZJJJJP81FFF/yse525U5Alk/Wm/3G6AG8cwxRdWk9S/C+so6Wly2/66j2jS/tu2NeP7zc FRGPpEaGOb7fFCf/AKaZPN/0z+5Eh3XYNjHg7dbfVXP/AFT/ANX+rxOo03LfpLv+x6NrD2J1z0zi 5sb17hqKjqryQ1ucrP8AKMxWWi/3bXynz/8ATqLww+yq/u7/AHj9beLn/Fv99f6H0XQbbdXn60vD oqnYXyKyOUmqJJ8pNVf5y2uov4/r/mvZVNuthZxfo9COz2GKPoou7O35pmkElVy39nyfj/erewlu XM9ePl0KrPZ/PovOf7Mlm1N9wPz/ALb/AHj+vsE3/MPicOhJb7V69A9mN9PMZP3fVeT/AHZ/T/iv sMXO7SuOjuHb44wcdBpkN1TTatUn+upk9k01/UY6XpBEnSOqs+0rM3k/V+prftn/AA/r7KprsefS xbaV+mGbJyM1g2rUnp0A2tJ+1/X2ja8H5dPJbevTLUV8kUbMyuE/1bfn/CL2n8fXkjpYi+fSbkyb N6uf92I30PuutvXpzpwhKpree0h1hvH/AMcv+Wv+NvaKa8FP0enUQ1qePUqas1f2vx6m/wBv7Q9X 6htVavUrO2r9Osf8V/r7917qI0+pf1en+t/+KH37xJut6B/D/LqPrGr1SjS1/wDdv59u+P8A6q9e 0D+D+XWP7hg36v8AXbj+n7Xt5HFPl0n8Cvp1h85bnTJY/wBDx/vXt7xh6db0Tf6v+L6yg+Xn9LP6 2/6d/wCH1/HtxXFPl1sRsPMdcHqRr5On/Vf7H8/6/t1Gp9nXhIfl1zWVj/tLW9X+8f717f6f6nfc aW/saf7X+9k+/dNyRkmo49SPN6m0+k/2tf8Atvfuk7oa0PHrMs9nXV/Z/Tbj/jf+7vaiOTpl0Eg+ XUuOcMn6f0/2R/x1/wCK+30ev29VeE/6Bx6dIn+2VXL+nR+r82te319vo/7ekHHrC1U0jD+1/rj/ AGP+w59v+IvoejDWOpCT29Tekf6n/Y/8QPbqOKfLpNiUf0upCv8A71+P2/8AjXv3iN6DpnwW9OpC TW51elvz+f8Afce30f8AZ026FDQ9c1m+i/8AJX+8n+vtzxPl1vX8us/m1f2j/vH/ABHu/jHrWr5d ZFmXV9B+Lf77/X/1vanX/S6vnp+xNRx/sOef+N/7f35Pw9e8+olfOsEzafSR/Zv/AL7+vvzv17j0 2fcD1Lcf77/b+/a/6XXs9Z2mvf8A2r9TfT3TxB6HpvX8urh/5DVYIf5mXSkAJDV22u36cgX5EfVe 7K2xt9Rekv8A7D3FPvUyt7d7xjIlt/8AtIjH+XoV8lOf6x2Q9Vk/6tt19FDaZ/yiE/UkqR/t78WP 1494Z2Z/VHU1P8B61wPlaT/s1XyCIsw/0k5QMGv9BTUCkaOCWY/Q/S3vJvYCDse1HyMC/wCDqKNx /wCSjff81D0XHLm0LckuVFjclj6BqtbVpNxbjj/D2bjpE3256Lbv2RWWpBvcKT/S5II4AI0n02/r /vfu46Tv59bLn8rD4L/Fz5Jfy6+t8D3F1Ltnd2L7c372ruHtd5qVqDO9hDr3sh8fszb2b3djJKPd lPtHDjB0crYyjrKalqJqcGVWWSdJmnYh8HpVbxo0A1KM8f29Aj/PC/l8/EP43/ynu56XpjpvbWyo um+2ept29VVFLTJkM7sGbsXsfb+H3ttzAbtyq128P7l7hh3VXyyYmqyFTRwzzgwJEsUCReQkuKnq l1Gi27UQClKft60BcnJHEo1SKgfgAuFLfQHSbg2H+H0HtR0U9JeUnyXI5H+vxxYWtb/e+PdTx630 c7+XU3/OdHxbNvp2rQXUkgf8WfMX54Ivf2Qc1f8AKtb7n/iK/wDg6PeWP+Vi2X/noTrY5+U8qtXV 1gNRDkjV9ABYN9Tc88iw+nuNtkBG2QD7epM3o1v5j9nWoT82IZJ/kBulks+mlwEOgfq4w1Ixtfi1 5Pc7cnCmxW/zd/8Ajx6jDeH07jMDwov/AB0dE7m88f8AnlfX+hWeL/iv9PYo6Juspb0+ptK/2v8A ev8AYe0TcelXUbyH9Op/r/vv8L+69e67SZr6tWr/AFLP/vre7aj17pzpWZ1Laf0/9O+f9sePamHB H5dJZn4enUaok1P/AKrgf6//ABHtHuH9l/q9elFr/aj7D03K/wCph9V/SR/sf9j7JOjLpskhjk1N +lv9V7r0o6XOxO1+2eqKsZLrPsXd2zawsjNPtjcGVxAmMf7yNJHSVa00iIRw0guPb0VxcQMGgndG BqCpII+ynWwzL8LEdWndD/z3fnV07JQ0W8NyYbu3bVMyLPjuxcak+Yli0hGMe7Mf9rnxKo5XXLIm ocqQSPY32v3H5msCiXN39VbD8MoDNT5SEax/vVPl0rjvp0wx1L8/8/V4Hx+/4UT/ABh359jiu6tp bx6YzM3ihlyccabw2k01gJJ3rKCOmyWOpb8gPBKQOCxNrj3bvdTYbmi7jazW8h8xR1/lRgP29LF3 CFqa1Kn9vV1nTnyv6F71x9PlOoO39i79p5grLT7e3DRTZONSNYefCzyQ5imUD8vCo4I+oPse2O57 Tu6a9r3OGcU4A0cD5o1GH2laV6WLJFINSuCOjK0O6aiAAxVDqeSNLWta/wDsDb/efat4QT3J14px 6m5Wp21u+kei3jt3C7jo5F0MMnQwTTAW/sVBXyp/sCLeyjcdh2zdE8O+so5Qf4lBP5HiPy6aeBSK FQcdFz3V8PumtyyTVe0MlluvslKGkEVLN99h3mbhEaiqCwSJSfwfcb7p7RbPch32y4ltnzgd6V+w 56SvaUzWg6LDvH4g907VD1WBTGdgYxG1+TBTCmyenmxagnLamB+qpbn6e433T215q2ws8Ful3APO M93+8n5eQ6TNC61xUdFprIMnj6uqoMpi6zGV9FI8NXR1sDwVFPMpIZJQSwja/wCL39gSSOeCWSK4 jZJlJDBhQg+h+fTXA0PWH7iF20gaTpBKDg3HJW55sNJ90JFB6deoafn1hmiimIX6iQknyLx/tWk/ SwANv6+60pw8uvUNOmioxkUgZiiAeT6m5uq3NxzzqH4+nHv3AefW/OnSdq8BFIQI4yR49T6UHJFy AoJJuST/ALH/AG/vRocnj16vSQyG1kkJLKGZ2tpKgEFbk6ioAD2+g9+pjt4dbBA4DpD5PZySI94r H6EhLhradNr/AE9X1/o3uvVgfnXoPsrseOS5SHVY2W0fJta1+OF45PupXh1uvr0gH2L/AJdC3231 d006T/qH5H9OfetHV6+fX//U0IfajrXXvfuvde9+691737r3XvfuvdNv9rT+f94+tvafrfXLW39f 94H/ABT37r3Xv1N/tP8AZt/gP9a3v3XuuPv3XuuS6v7P++/2/v3Xuvej/U+r/ifp/W/v3Xuvev8A 2r/effuvde/2rTxf6f778X9+69176al+v/Gj/wAU9+6913/qf7S/i3H19+691x/2+q/++/xvf37r 3XX5/sG6f4X9+691y0t9f9j/ANS/9h/j7917qTHGD9V/H+H+9+30Q1+fWuPThDSav7Or/X/1vahI lHVdY6UuPxbTadIvq/s/761vZrbWBl6RzXPQnYHZ81U0a+E/8i/239fYw23ZJZM9ENzfimePRktl 9YyVUkBaF2Vr+op/vZ+vuXuW+SZbiQ56CG5b2Y/qerEuk/i3lNwR0eUrKeHB7fV/3M1koz+5HH/n YsXS8T11Qf8Am3+z/wA3Pcy2m3bDy1F+t+ruX++uoz3XmGWQ/ocOj/YCq6t6TofHt2nSbLKoSbcF ekVRmKj9r937X/dGKpv+bUf/AE8kk9s3+63+6H9Y+Fbf76i6DH0d1ezfr8OgN7B+StTUrUQ09c9P T/oZUqB53I/46y/8V9kNzuttZ9H1hsXhn5dE63b3PNUeXTUO7N/b8h/4qfx7Cu481eJ0LbfZfOY9 F+zvZFVUav8AKNKmx9H7f/E+wZeb9LJnoQ221CLoIMtvSSbVaZ/6Xf8ANvz7DVzufifb0cJYRR9B 1kNyNIx/cs39oE+yua/9el6Q8fC6SFXnJG48n6v1La3+8cceyp7wP0sWy/38Ok9U5l2v4x6tWgf8 iv8A19pZJvE6fSGKPh0xNO0jMruLN69X4/6y/wCHtK83Sivp11JkFj9EP6tH+d/3v/jjf6+2HmEv Dq3gfZ/PqCZZpuC1l/q//HMc+2fqfDGOnEtv29e1xxr6G51/q+v1lPtNJdSyefSpLXPz6wyVdR/Z l+n6f+Okn/Tr2xr+fV/B+Q6jsWXSoe3+0f8ANz/b8+/V6v4fz6xtHz+5V/n9Se/az69e8P59SGqv 7P8AZ/1P0/330916c6h+VtOn9Sf9TPbvjD06a8P59c9dLq/Ea/2m448nv3iN6dU8GHrpZin/AAY+ v6f7r9qo5/PprwJj+L/B1gWb/kL/AGm9+P8AX9u9V6mrM3Jtp/1729qOtdZQxurH/D9f/E+3Ufw/ t6TugA+XWNJP0s3pf2q69mI+XDqZHJpb02/2P+c/p79074x9Opccxv6fX/vr+/dekj8T7estPf0/ 7Ul/6fue3kc1oePSVl49O7T+pdNvz+P+Re3tbenTH00XXFZV9Or1f74/717ujV+3r300PUgP6v7D H6K1/wDef9h7dSXzHSd4ZY+HXazfp0s6/T/ePahHNfn0z1JiqP6Lwvu6Pxx0+ZF9D1mEyL/hx6SP +Kc+7o4p8uqSJDJjh1kST+n+2P8AvfHv3iN154YRknrIsjf6r9z/AJF7v4g9OmPB/ofy6fMZLqU6 j/rf7x7fR/U9e+HqLWzXkbnT/wAU/wB8PddbevVCgfB49N/l1MG/V/vv6f4e616c8GX5f6vz668x 0t/vuf8AXP1921t69a8GX5f6vz6uG/kRSov8zvoPUSS2I7e8ZY+pJJOoN7oWX+pMbMOfwfcXe8jM 3t9vArjxIK/854/8vQs5MjK8xWRI/DJ/1bbr6NG1D+/EP8V/A+n+Nv8AW94dWeJF/LqaX+FutcD5 YyW+VfyA/wAeyctxYk2NLQkm6i6kk/T68+8muXhTY9qFP9AXqJ9zxuV96eIegc21jsFl947Vxe5q w4/b2T3Bi6LN1gqI6NqXH1VXHTzyGteGojo421hTMyMIVYuQdJ9nHSLBIrwr07/Lvr/ZuB6r2/X4 n+72Krdo587Px2NxW2N4bazGdizMmYzeUzG5J94T1825apTBGaephmUUdLGsMkKNKFTynPVZlUIM jB62Qv5HLq/wC+PNmViuf+RKtpIJVh2xmCVYAkq1iCQeefbb/Een7b+xX8/8PQU/8KM5Ej/lTfK8 PIiGXePxyiiDOiGWVu3tgFYo9X65CFJCjk297j+MdVvP9x3/AC/w9aOHxmpcBt7qqhzvXfVEHf8A 2BundkNN2/jayux8K9ObMw38cix2XmgqcFUyUeEzWNyE9RUVAnjJkpR/lCACNXm45NOkEVAlVTU1 c/LqtztrHde4rsbdGN6my9dnuuqOthi2tl8mZTW11GKCkaollM1HjpXjXI+ZI2MKkxqp9Q9TbqeJ 6TPpDEIar0Y7+XebfOL4wNx6e0aE8EfQYjM/Xi9/9b2Q80/8q3vlf+UZ/wDB0d8sf8rFsv8Az0L1 sTfKKYGvyJN9V5NVwfrf6X4vx7jnahp2229NPUlbsa31x6161R/ltimre7t41i6nMEeLjKL+shcR RN+1/j6ufeQHJdkz8tQTRjuYv/J2HUT75OF3adfQL/x0dE+yy+OGRP1E/p/3Xf8AH+w9msn4emMf 2/SRa/qXV/wX/b/8T7Ttx6c6iyf2v+T/APiP98PftR691wX9S6fVp/tf77/X9++L7Oraz6dPNFqW Aeo/X9X/ABH+PtdD/k/y9F0vn9nTPkJtUriNdTfX/Hjj2T37jA6MbNP29TMfipJF81Qupo01rSp/ uz/jlFN7KejbplrFFNUMvjeFZPX4X/3VJ/xy+vv3XuovkUr+rTf37r3Tjq/DBAv++/HPtJ1XqK1L C36dcdv7P+++nv3XunHA5zdOzspDm9pbhze3cxTkGDJbfytfhsrEVYOvjrcdUU9QgDAHhrXHt2Ge a3cS28zJIPNSQf2jPWwxU1UkHqzbob+dB88eiZKKhn7KTtHbdIUiOB7QoUzkiUahQ1PR5uA0uWp3 9PEkkk5BJ4I49jLbvcPmrbgFXcPFjHlIA38+P8+lKXtwn46j59XX9Af8KROo9wNRYv5BdU7j64rp Ai1O4do1B3Zt2NwQrO1D4qfNqHJ1cQsFHFz7H+0+7e33BSPerAwvTLx1Zf8Aefi/w9L49wjagkWh /l1dL0n/ADBfib3/ABUsnWXemxstWzIGGGq8zTYfNRtcXilxmTkpqjzgHlQCR7kXbOaeXtxQiz3S FmJ4FgrV+xqfs6VLNHJ8EoPSW+bv8z3pb4Pdd5bNZLcke5+05KHTtfr3a1ZDX5uGuq1kFBk881NJ JFgseXjJR6gq0pUhFYggE3OHM0PLm2XUlvGJ9yK0VRlY9XB5SMKAMhSat6U6SXl7a27i3Myi6b4V 8z+XWiB3f/MF+S/dPc+Q7om7H3LtLOPUVRw2P27mKumoMRS1NQ9Q6eFpGhrauZnvLNIhZiBawAHv FaZ5bmaa5upDJcyOWZjxLE1J6LGkdm1E56M91D/OF7z2itHju0tvYHtDGQaI3ySltvbl8Y4kqJau lSWkyNVYkjWkYJ+p9sGFSag9eEhHEdWm9Q/zSvi52eKOiy26K3rHPz6UGO39TrRY5HZlFv7x07zY MBm4XVKjf4c+07wuOGR1YMpPHqwLD7twu4qClymDyeNzeLqoxU0mQxFbT19FND6f3oqqleSKRHAI HJA90yK149W/PPT8tXCw1BgxHkK24cSckgD6re9/6X96IHn14j06jNEkgtdW12fUQbarWvx6RcWv /j79519P9Wet/Ppqmx8cg9SAkg6j/ZUDnSDcG1yPfq0Iz/q9evVIpQ9MFXg1IuQxYpqLAEA6uQRw PSef9t79RSDn8ut16Tx23F98rcXuTr/BfQT9f6A/j3qh/Lrdcdf/1dCH2o611737r3Xvfuvde9+6 91737r3UJ1OtvT/vv+J9tPx62OsA+if7D/oU+6de65fq/tepf7X++Hv3XuvatXN7/j+nv3Xuul1H 0/8AJK3/AKe/de679+691y/Vq9Om3+8W/wB49+691x41av0/639P8f8AW9+691y5/Vx9Nf8AsPr7 917rizfpX/bMn+w+nPv3Xuvfo/x/4P8An/e/fuvdZ1T/AGn/AJB+v0v/AMR7voPXq9So4Qjf9Ct/ xX/b+3446/Z1rj07U1Ezsqn/AF/97+gHtXBbenSd5vD6WOJwck7fpf8A33+t7ENntv7ei25vPD49 DXtnZsk0it4f1f2fH9PoT7H+1bDLJL0HrzcvDPRuusem8xuKop4cfi5qr1xJNN4ylHT/APN2vq5f 8ngp+P8AdnuZtk5YtbOLxrz9LoB7rvfVhOyevuuOsaWnyG4JqbcWepfWsb/8WOjk/wCbUUv79dUf 8tP2f+bfsTzb39PF4W3fpW3/AFU6CEyXO4Ym49e3x8jqqRGhx8iU8MaaF+l/H/WKL/lHPsMXO8RW /wBnSuz2HyPRR92du1tdJO01dLMzeR7vJfn/AGHH9fYYv+ZJZD0JLbZ4kIHQD5zf0jtIWqSfwv7n +twT7B9zvGvoQw7b4XQUZTebPr9en/XkNvZDNuR8uPRlDbxR9IDIbkmm1+r6HX/vvr7Kpr/OTjoy S2/390jajOmf/NPqP1X/AI5/X2ge6/Z0pW2iiz0yVGUd0JPH4/3x/wBb2jeX9nTuj0PTTNXlvVq/ 5C8o/wB9e/tN9Svp/h6e8H7P59N7VjNp1N+r/Y3/ANv/AI+2nuun0h9c/wCr06waGmvp0al/Uzyf X2l8f7f5dKvB+zrMrRLqaR1kbhAtj/xP09saj/F/PrWiH16zSVCL/wAGD/4/8j916UdNUmhhp0ov +1/6/wDsfe6nquhfTrtp/W3qOpv1a/ddQ6t100w9S6h/tX++597691ikk9X6k1N+ryf7b/mz7917 r3k0te3+K/7b3rUOvdcfLf8A2q3+P/Gzb/b+99e65LJ+rV/T0/m3v3Xusyyf2v8AkAtf/eLe/de6 jll/r/vf/FPamOQk/PpiSDxCc9ZdXp1afz/Tx/uWvz7MI5PE+3ph0FPl1lWRvT+tV+vA4/437v1X rMUEq6uQ68MI/wBz6c+3FOOm/DUeZ6z3Zm/3Xpb9VuP+nXP+Ht5JPInqvhn1HWSJvWv6PV/aP+67 3/F/bvV4eJ6dFqPGukfq/R/t7f8AEe/dNyR0+zrj9yzN9f8AkL/ifrzb3qnTGj59Zkkvp1N6f9V7 fRzX59X6zB/xf/a2/wCKe3vEb0HXq9Skl/VqYW/1P+t/vv8Aefdta+h6aeKOTj1kXSwZtfpv/b/3 x9vavl0n8Aev+r9nWRBp06fqv14/3w+nv2v5dekStOu/K/8Aqj7e1npNTrJ9w39P96/4p7d8f5dX 8RvQdPmPn9L8f62v3dHFPl1XMp8uHUStqf3G/wB9+3/xq/8AvHvzuKfLp3EQ/pdRDP8Aq/5LcX/2 F/dNf9L+fVPEb0HXvPb/AGm/+P8AxsX/ANv794/y694jeg6tp/kX1bQ/zRPjUmq/3P8ApVp2H9S/ TPYDW/26e4293W1cg76PP9H/AKvxdC/lNgd/sB/p/wDq23X0kdqsBUQ/1DKPr9fyL+8O7U0kX8up ffKN1rffLBifld3/AOvSV7JybFgAAF+xxy2LWYNzyf6e8nOXTXYtpP8Awheon3P/AJKd9/zVPRdM s+mBteogRgliAoPJF29IB1A/T+hv7OR0hbouvYFfW1MBjq6+urY4RMKaOqq6ipjpzIR5WhjmeRYz II1B06bgD62FrDphz9vUn4k/zPvlL/Lr35l8n1jual7B6czMeYrMz8eOxFafYcO78nR46ik33tPN 42NN0bOzU0GIgWspaadsdXlWklgE7eb3pkDZ8+mo7p4KgCq+nRcP5lf83f5Z/wAxiuh292Pk8D1v 0jjqnB5ih6J66hm/uvXbwwVPUwRbz3XuHKCTcu6crGKtvtKeaRKCgCK0cJnvM3kTSeGeqzXUk9F0 0T06qJbJ5THLVLj8lkcctZEsFauOr6qgSsgUuVhqxSzQrVQr5Gsr6lGo8cm7nTAJHA46Qs3+dGk8 Cx44HP4/1gf8Ppx7r177Ojj/AMvW3+zvfGUtzbs6jNgb3ths1e1r+yLmn/lXN7/55n/wdHvLH/Kx bLX/AJSF62GPk5KXr8k/OnVMq3JJ5vq/oLAn62v7jnbgV2+2B/gHUj7ma3twR/F1rH/IumaTtneF UL6jW0ShWHocJiqFbH6Hi3vJ7kGMLyntstPwyf8AV1+ob5gb/dxe18iv/HF6JRuql0z1SJoCxPJ4 /wDfc/g+3ryDw5fA6at3GD0GY1KxDf8AaSO34t7LJPiPSyP4fz6gs3HpXUf9T4/x7Y6c6yxJrIX6 ev06P9j7diUcPLpuTh+fT/I3iptNtGpPp/j9B7Xv+nF0XJ+pKR6dJuMs0kkn1k+qceT/ADnP09hi 8fXL0IbZPDir59ZP4lUU7/st+2ySzTFv9j4vyPaTpZ03ZDJTZCSOaSNI9MOj0f7s9+6903+T0gM2 pbepvfuvdS/Jq/taf9qvf/D6/j2k6r1l8n6vT+k+rj37r3XFZP8AavVx/vufyPfuvdctSt/nERv9 T/vr/n37r3TXU08YDNH6bf2U/wB59tPx62OsFLV1VDPHVUVTUUdTC2qKopZpKeeJh/ajmiZJEb/E Ee6gkGoOevdKbb2+Mzh8vLkqiaTMx5FFpc1QZSeWops1j1Gh6Wt8rO7KqC0Ml/2Lccezbbtzn22Y TRky20v9pH/H0jv7CLcIvCr/AI1/ocn+++nvd20aI0EW9NmtLWbSrptFRTuP9yG268/uS4vKRR/9 Ypf93Re1267VF4X732j9XbpD/wA4/wDhcnSOwv5RL+7dy/5KP/VzoLvV6f8Ajf1/2n/Y+w10cdcf 1D9Xq/qD/wAb9+690JnXfc3avUtf/Eetewd17MqNYkmTBZispKKpIOq1bjVkOOr0JHKzROp/I91K q3EdbBI4Hqy/qL+cH3Ttc09F2ttTbXaONTSs+UpFGz91OllW5q8bTz7fk06b840Ox+r/AJDZhHke riQ+Y6tE6i/mc/F7s77WjrN2V/Ween8Mf8K3/jjT0ElQ49cVHnsa+QxghjJsJqo0lxyQPp7ZaJx5 V6vrB8+j6YTdOK3FQ02WwWVxm4MJUKFp8tg8hR5nFyjQvMVfjJ56aYxkjkOTYi/tvyIHHq1cdPS1 cZ0/lDYn1C5PptzY2UXtb6H3XTXzz1r/AA9ctCM2tjGHjOtDpFmDHkgfmy39+r+zrdR1/9bQh9qO tde9+691737r3Xvfuvde9+691FqF/S3+pv7afj1sdRf1f2vUv6v99xf3Tr3XK/8AtH+0fp9+6915 m/s/p/335P8AsPfuvdet+FH+8f8AED37r3Xvfuvde9Krq1fT/b/7f37r3Xf+w/UfT9f9t/r+/de6 69+691y0N/T/AHkf8V9+691lWIW/GnX/AL697/T3fQevV6nRw67enj8E/wC93+vtaiU+3qmsdPtH Q69Ppv8A2P8AHn8fT2utrbxcnh0nnn0ZPQg4Xbs1TpVY/V6PJ7FVhtssn2dE1zeeFnof9ndf1NdU UtPDTvNUzSaI4aaPySSSSf8AHKP/AGHuS9k5b8T+36CV/usSdHu6/wCmcJt2Onym8tHkj9S4OGTX JL+P8vqov8x/yyj/AOpnuQIZrDa4vAh/3J6BlzeXV4P0eHQqZrtbH7fo1xuJjpMbTQp+xj6COKnp 4/8Am944jxz7RXO9+J9vSa22fxJei67q7dqKxpfJWDR9PGkn+b9hi837oQ221evQE5jf8kmr9x2d uSzyaPqf9j7DFzvPifZ0d222+H0GGV3hVTav3NHI0rEf8P8AH2Qzbl+zo1Sy84T0hK7PySavJKW/ 1QS/+P8AxX2WTXcteliWfl0lqrMatSxtZG/tf77+vtC8p/PpYq04jPTFUZVm/wCOn+2/r/vPtn6g 9a0fPptlrNS8H+n0/wB1/n/b+0j3XS1IfXP+r06gyTn6sjhvoB9TJ+R/X2l8f5n+XSpIT5nPUOCd tKh2dubr/Qf6/Ptgnq6JShI65NUer1csn6v+J/x916c6x/cMral9LNz6P+R+9ah17rAalhyGddWj /b/1/wBt7bZqfb1vrBqP+q/5O/4379rX16er1gab0/S/51eT/eP8ffta+vXq9dX1f2gV/wCWgB/3 1/fta+vXq9dam9P+H+8ce3dQ6911qDf2jf8A3n/eR7r1vrn5NXGjT/sP+J493p03oHXaz/pvb/kD /fX9+p17QOpmrVxfT/j/AMb4t71031kVtXP6fx7917rIrf7Vy3+++v09+691wd9fqV3b/ffUcQke 3Y5PD+zpt019ctXNtJDf8b/r/T2tScfl1TwD8upCkfq1al/2PP09quk3WVZP9q1f7SP+Of8Are/d e6cVa6/q08f8tP2/96F/b6PT7OvcOorEv+ltQb0av9v9bf77n25r8XqmiWSvXlkZdPP6f99/sPbn THU6OT0q2kX+vv3Svrks6r6f+Sh+ffuk8kdPs6cPL6PSdX+0n/Y/63t3WOm6dctbLzq1fT/lp/xX g+345BSh4db65iYF2tz/AMbP/Ee3uqaIo+HDqQKj/atPH6f+Wlvp7b8Rfn1rT8+uCzJzyNV+PraT /efanqn08Xp090M3p4P6vQR/vre6K3qekjp4dM56hzSfuMdXpZ/0v/sf97t78zcc9OLBrwDnrH5B f6/q/tX/AD+PddTevW/BXqL5I/8AVOjf77/YH27059MP9VerY/5H9dHB/ND+LzEgmbJ9j0qE2uPu Oot/xGxP5s1vcde6y6uQt9+QiP7Jo+hLyqCu/WBI82/443X0q9rH9+H6fqS1v63H5+p594fWxo6e vUvt8Lda3fyzdT8rPkAP7P8ApJyKsCeQBRYwEkcaQfrc/wDEe8nOXf8Akg7R/wA0F6ibdP8Akp3/ APzVPRc8nIxgIN72YEc8j1Eg2UH8cX9nQ6QGtOi4b9YeKZ0NxpYrYsQFXWLk3IPI+n9Pdh0w/RAe zCCZzckHVwo/1Q5ZrXBAt7t0jbj0TrOf55r2uTfm5U2P+wZeP97979eq9IevAIP1sP6WU6v6kW5+ n49+698uklIW8hAN/wAf15+h/wB4Pup630cH+X01vmz8aWva3ZVORcC9hhM3/hxyPZHzLnl/eR/y 7t0ecs45h2b/AJ6F62CfkpLrq8gSVDEuRo5AFufVfn1fT3Hdqui1hUVoB59SNuFDd3B/pHrWg+Qm Qhi7L3mZCtoq6JAG+ski0VKPGf68e8pORpY4uT9lduIV/wDq456hbfvE/ft+w4VX/ji9Enz9b5mk fTq8zyHX/rf53/be2byfXLnq1mnQc1a+k/4n9X/HP+lv9v7Lpfi6WR8Om31elVXU3+x/pb2yvBen OnfGU/8Au3Txb0r/AIf7yPz7MbaHovuX8+uWWmVVWNfUzPz/AK//ADaPv25TiOLq9nD4oH2dNsMf pmZpNLSPo/6dm319hBuPR7001itHGzauZNCKyf8AHOP/AF/fulHTPq9Nv7S/8Uv/AL37917pV0dR QrRrR1UenyPrP7f+c/6e+0nVemOSRXkbSulW/Sqf8c/fuvdcLm9/z7917rvy+r1H8f77/evfuvdZ PJf9V/r+n/fWA9+691FZv22v+Ut/t+f97PtP1vpr/wBq49P6Vv7917r2q7L/AF+n+v8A1/3v37r3 Sz2VvKu2jkJJ6eOGux9dCKPL4Ws/4t+Xx/8Au6lqQAfDN/xyl/3T7Odq3WXa5vFi/Ut5P7WL+PpD uG3xbhD4Vf8AGf8AQ5P999KTeWzaFMem+NlSzV+0sjMY56dxfIbXyB/clw+UhjH7PgF/FL/mpofa zdNqhjtRu+0HxNsl/wCqf/C5OkdhuUvi/u3cv+Sl/wBXOgk/2kek/j2Gujrrl7917ri1/wDgy/6k /wDGvfuvde/t/wDIP/E+/de6Err7uPtTqrJR5Trvf+6toVkYUE4XM1tHGyD6xSQJL4JInBsylbEE g/X3oqDxHWwSOB6se6u/m6957Yggx/Y23dr9jUkYjiGUanO3twQRRrpBE+MCUVXPJ9XeeJ3Y83ve 7TQqalTQ9XEhHHoeP+HnpgghXp2m0mYiSVtw1BbwaQ6tGPsfTICNBJHJN7W9t/Ttx1Cv2db1rWtO v//X0IfajrXXvfuvde9+691737r3XvfuvdeqP0y/64/3o+6Pw/Prw6bQAv6f9vb/AHv211vr3v3X uvf7Rz+j/D9P1/2/v3Xuvf2/9q/43/tvr7917r3Nv+R2vb37r3XHV+rj9P8AvP1/4p7917rJzpfT /wAbtz7917rpV/s/S3v3Xupyxg6f95/xvz7fRDX59a49TKenZ2/RZm4Y/n2oWIDqrtn59KOhxzMy +lyy/p/H+xv9Pp7OLaz6QTXP7OhOwO3WmaMmOy/lvH/vj7GG27V4nDokubyn29GY2D1vUZIQ1Eip R49f89kKn/NAR/537X/leqP+WfuRbOwtbQ+NP0ErzcvE/Rh6NBicltnYtL4cLAklV49FRlan/gZJ c/8AHUW8NP8A82ovam537jD0VJYS3n9t0He5O3KiTyR09R6b/wCcF+OP91fm/PsO3O9y06MrbZ8d AhmN9VE7MzVT6m9frk5v/hz7JLnc5ePRrDaRR9BxkN0PJqDSP6rfrkP+3Hsomv8AOeHRktvLxp0j KzPO9v3Ha/5/H7n/ACy5/Pste5z0sW3ii6TlVmC2u3I/Xa5/3309o3uB+XTuj59Mc2QZj6mCM31/ P+t7RvdZ6fSA1+fTf59WpV1s3+0f7f8Ac/x59syTn8+liQ4xw6xn0NrqZOf9Sn/HP/eefaN5f2dP olMkdcWrKSHV41Q2jjfUPH5PdPFHr1bQvp00TGCaTyMNX9fR/vfu+vr2hfTqN5XOofq/zn/FPx/h 7ozACp4dP6B69Y9Z/p67eS/++/x911r69Wr1j0H0jVq+g/xt79rX169XrH5PTp1cf635/r9Pd+t9 TGYt6f8AVX4/2H+39pOq9N3mX/fX/wCKe1fVunDUF/tG/wDvP+8D2k6r1Gt6tN+f94+tvbvjj/Ue t1+XWDyf63P6f99/re3ut9Z1bSw/1v8Aff7H37r3Xrn+p/259+691z8yf4/7b3bUOtdZ/fumOpVv 1f7Sbf77/Ye/de6zeT0/6n/U2/4n6+/de6yK36Sv9px6v9t+17917rGGN2Vfp/qvx/X/AHoe18c/ n0kZDWnn1Ig1O2v9Onx/776+1ScOmj1Ikk1Fl/T7dVhT5de65q9j+r1f9dPz+Px79qPXuuYk+ip6 dN9LePgH/bf4+1CP5E9eB6y31cfpb+yz34/3x9u9MP8ApGoPXlB9Lf6qT37rXj/Z1L8pP+o/5KPu /iH0HXp/8nXazFXHq0n+n+w9069mU+XDqSsgP4/4r/vZ9qOveCfl1z1v9C+lef0fT/fD3vHVfDk9 OuSy6/oqf7f23rHz61Tp4oZHC3bhbfq8n+9fj6+3Nf8AT/n006CSuOoNRLqZjqTT9PwPetf9P+fT uesCyAN/yev+B9+1/wBP+fXs9R9bf8dP97/4p7f8Qeh6rr+XVpP8l6s+1/me/Ek3AEu99x0hYpb/ AIGddbypLX/F2lA/2PuPfchg3I/MIof7Ff5SJ0fctmm+bcf6f+Q9fTS2yT5oP66lve3A/P8AT3iF bV1L1MB4N1rd/LJyPlb3+dWlB2Pk3B5NwKDHEg2INja3N/r7yd5c/wCSDtH/ADQXqJ91/wCSpf1/ 36ei6ZVlEEqi/IILfpVuLnSOQ3A+gsfz7Oui9vPotm+ntHULbTcG7f1tcmw/TbkWv7t0w/QH1uz+ nK7pvee6d6ZuWi7Gm7HxGytk4ePI5GKKoxtdt98lXZWWixtDVJTilrCFNXkHhoPT4r6zf3s1Bp5d MaY9DFj3VoOgo+a/x66C6WwFDlen+0k7GyOf7m39j6Kkh3NhM1Lt7qSmwWKm2NSZ+lxdPFId5xZ2 lyseQqxoppYhT+ONdV20pJOR5dWnijjA0NUlj+Q8uq0a46gV4N73/qLAm4PNiCP8Pr7v0n6SM1hL 9b+n/HkXH9OAT7qePWuje/AFwvzS+NzAkW7HhNx/2o8yfybA8+yXmMV2Hdx/whujzlr/AJWDZv8A noX/AC9X+fI2oWWormUACzg82INrkaRewt9QD+fcdx1WJFJrjqR73uuJyBxY9arnyLyFVVd3b/oE fUUzUEcaBmNlago3H7aDVf1e8guUZpDy/tUS/CsZ/wCPt1Eu+Qg7jev5lx/gHQkdM/DXsTuRYZsX i5mhn/TK8csgH5AtFB9Pcs7DyBf7xD43/EboEbpzVa7PTxbnpe9vfy5+wut8b/EK7GV8kctNI+oU k0cZkjHsy3j2rv7OLxof1ekG28+WG4S+D1Wnmtq12FrpKaoheNo30NrjtxH/ALz9PcVybbLbzeCL boeR3kUkPWO60sLNqTV4zybXvf8A2I+p9r8wRdIf7SX5dI6pqvNMz/2Y/W1/wI7f7b2D9yuPFl6E lnD4cJ6jLVeOKH06mkeTUv8Auz/ifx7Lul/USsrPMqwafSr69X/HT/X9+691j/t/6r/aU9pOq9O1 RXQ/a6V/UqaNLx/g/wBP9h7917pib0lv6f8AEcH37r3XtRX/AGn/AH3+N/fuvdYPK3+r/wB5Hv3X uuP+3/2r/b+0/W+uXk9LD66v999ffuvdQ2b8rZP9j7917rj/AGf9T/xH+9e/de65e/de6XGz935D ZuQkdEhyGMr4fs81g6w/7j83j/8AdlLVRWtDUQ/7ql/z0M3s52rdZtoufGiPi20v9pH/AB9INy2+ LcIqcLn/AEOX/ffT7vLZ+Pioo957LabIbQyEp8sbj/chtvIf52XD5SKL/M+D/dU3+am9rN12qIxf vfaKy7ZL/wBU/wDhcnSTbdyl8X927ifC3GL/AKqdBQ35b8/1/wBc/wC2/PsNdHXXH6f8h/7xf/e/ r7917rn/AF1W0/7z7917rr0f46df/Ee/de69q/Vx+n/efr/xT37r3XM/5xfSPz6fx+n37r3X/9DQ h9qOtde9+691737r3Xvfuvde9+691737r3Tay2Zlt6V/3n/kXtP1vrj/AGf9V/xP+9+/de67/I/t fX1cf4/7H37r3XS6V/6Nv/h+Lc+/de65f2v+Cn1C3v3XuvW/Kj/FuPfuvdctDf0/3kf8V9+691Pj jsf9q/1v6H6e30Q1+fWuPThDDq9On/W/5Hz7VQw+Q6adxT5dKfHYtpG4TUrf6/8AyO/s/srDpBPc 56Fra+0qitqIYaeN5Hl/spb/ADf/AC2J9jOw23/RpuHQeub39v8Aq/1f8V0Zbb228DtmFKjILDkM gLHw/wCcpKf/AOrqg+z76yGz/Ri6IXe6uD08ZTfmmM2fwRx/pFvGkcf+6vZVc7sZRXp6CziQY6CX Nb6mnDKZH8euyr5P6/6/9R7KZr+oyc9GSW/++B/q/b0G1duby8eS5b+zb9wW9lzXg/LpYtn/AL+6 SdXnpJJPGf1f9PZZf9j7QTXNc9LEi4mHpomqKqb1ztpv+lXk/wA5/wBOv8faN7z9vTyQnppn85bS zJp/46+S0f4/2/tM910pS1H5dQpGUsdUwfT/AGU/3ZH9Pz7TvcHz6eMPhj5dRDLTx2/buFt6vJ+P 6f4+2Xl9en0Sn29R2qPTaNtK/wCPi/4r/X2z44/1HpRX5dY5KiT/AFWnT/h/vv6+2utdR9baP9q/ t/776/j37r3Tff8A1J1Kf8f+N+3fHH+o9br8uuOj+1r/AOCr/sP94FvfvHH+o9er8uu9X09J/wBp /wB9+PbXWuuOv9H+08f8i9+691n1f6lvR/qvfuvdRWPLf2f98P8AYf4+6ax8+vU671Nx/tP6fd+v dZf9q/st6/8AY/X37r3WH37r3UrVp/T/AGv6/j68e/de6hq2r+0f959q+rdZVbT/ALTr/V/sP9f3 7r3WNf8Aeben+l+f+J9+691JJUf2f95PuiPX7etces/P+H6P0f778f7x730x1J1f2rf4es+3Ovdc L/7WP9sP+K+9ah17rkreq2jS/H/GiPazq3UtpTp/w/ta+P8AiPe45zw8+kzQny49e1f4f8F4/wBc f19qtficOmGUUOMdZFbSBZv02/31vby8F6r1nWT0/p1H+tuP99b3ZWFPl17qYsn+q/P6fp/vvz7t 1rrgqauEkK/7T5P+Rf193SSnljqnhr8+slh+q+tl/wB9/vXu/jn/AFHr3hr8+sOv1fX1f9S/+K/1 9u9M9StTXP8AyBYf1/HJ9teJ8unk/sfy/wA/WDyN+fV/vf8AsPd9a+vVfEb0HUjyW/Va3+8/8b92 6f6dKOdVVvV+n/bXJ9+6TyR0+zqDPMzSNr13I/1/98ffunAgiBJ6weS36rfT9P8Avrk+/dOdS/Jz f+z/AKr8X9+6TeB9nVkv8nauFH/M2+IEzhVSTsypplVhe0lbtLctFEwv9HWScFT9QwB9gv3EUvyV zAB/vkH9jqT/ACHQh2A03iwr/H/kPX0+dsteaH6XBX68c394gW7DxUWmepbZG0ljw61ufloSPlb3 +blr9iV/oBFj/kGN5Gr6EsRY/Tj3k/y3nl/Zz/wheok3b/kq7h/zVPRccqzeF1/2i7elSBqFiApY Wbn/AFvZ50Xn7Oi377IWOfhrEMDcXLWvdxybm30H0A/PvY6Yfh1Xt3NlqXA4rM5utjqJKXGUFVXV aUcBq6t6eBGkaOnp0sZJDbgXA/JsLn3atAT0k0lmCjiT0T5sjSZmgoMzRRSxUuUo6etpUqaY0tWs NTGJUjqIWv4ZEU2IuRf6H6H3utc9VI0kqeIPSXrgPpzpH4Or6XN7H8kf429+610kZSBL/X6DUDYj +o+gsD+Ob+6nPXujd/AZtHzO+OTLcf8AGQ4zf62/3BZw/Q8XJ49kvMQH7i3f/mg3R3y3/wAl/Z/+ a6/5er7/AJDTFqnI/SzGS3p06BYMV/w+t/x9fcbIaQxgn8I6km5zLMafiPWrlv1afJ/KnesFU37I 3hSU8mq/j8Yp6OM/61tPvI32/ijlsdkVuOj/AAsT1EPMzaZNyPnq/wAgHW7r/Kv6N2GeucdUVFLQ S1i/bzfSKSTx1H+24/Z95l3T/uvaraGz6xQ3u5+r3S58bo7/AMxOhev8l1nmJaijoxJSwyOrJTxf 7si8RsD/AK3v3L25XNzdeDLw6K5B9H+vD18/v5kbRxG0eytxUuN0LTrWSTQ6P+Ocn9L/AOPuMfcC wi2/c7kw9T1yrdy3lha+N1XzmMgs/wCyyoyt6BJ/h/sP9b3Dm538Uueh/Z2/+jdIORfHq1fp18t/ x09gm5h8KXoQo44+XUZptLNpOqTR6f8Am3/re2un+sbN/ab6f7H+vtJ1XqTDMsLamVG/1vfuvdeq KjzFSq6dPv3Xum337r3WPVb1Mv6f+RH+ntP1vrjwg/2r/Y2tf/Yf09+691x/1Wm9vz/vvrb37r3X LV6T/qv9t/xH19+691j9+6915rsPrz/xH+w9+691xX/aRq59X1v/AK/+t7917r3+q/H+0v8A6/P+ w9+690ttobwyG1q+Z4Y4chjcjD9nmcRN/wAW/J4+5PhqSRaGeG/7cv1hPs12rdZdrl4+Lay/2sX8 fSHcLCPcY8fpXcf9nL/vvp73htHHwUMW79nyPkNpV82ho3H+5Db+Q/zsuHykcX+ZEP8AuqW373sw 3XaovD/e+0fqbbJ/1T/4XJ0lsL+QSfu3cv0tyi/6qdBdww/33H/G/Ya6OOvKum/N7+/de65H/H+z /wAbv/X+vv3Xuser9JH6SP8AjXv3XuuWnjTq/wCRX/p9be/de6//0dCH2o611737r3Xvfuvde9+6 91737r3XvfuvdN831P8AweP/AHqL20/HrY6wn/df+w/4j3Tr3Xm/TJ/waL/e/fuvdeb/ADa/8tB/ 1q9+691nH0H/AAcf717917rh/ak/5Z/9covfuvdZ2/Sf9h/vY93Tj149Tk/Qn+t7VQcP2deHn0/0 H6T/AK0n+9RezSz/ALQ9Ibjj0IGJ+tP/AMtPYq2r+26Jr7+zP2dGW2J/xb8h/rp/1x9i5/7LoOXX x2/+r16eq/8Azf8A07Psln8v9Xr0vTieg5z/APmn/wCDp/xPsof8f59KU/sf9Xz6CrIf2P8Alm// AFuHsv6MumOu/wCBDf63/RvtsfB00nA9YKb6P/y3T/ov2WXPxf6vn0uT8H2DqO35/wCQ/wDrYfaU 9LI/PqDN/mn/AOD/APEze07/AAnp3pq/sL/wSL/rr7uenH4dRH/SP+Wcf+9n2l631Dl/U/8Asf8A evfuvdR0/wCKe3YOH7Otjz6xSfVv+D/8R7a611yn/Wv+sf8ArV7917rD+F/4J/xEXv3XuuEn6h/w f/iT7afj1sdcU/W3/Bf+Jk90691xb9a/7D/e/fuvdZ3/AEf8gf8AXU+1HWusX9v/AJBj/wB7qPaf rfXa/Qf8tD/1sPtSOqNw65H6H/WP+9e9dW66j/TL/wAG/wCJ9uz8P29bPl1yP+6/+WY/4j211rrz fqP+w/3oe1R60/DrlH9T/rR/9bT731frkfpH/ryf737917rn7r0n6y/2D/wX/iD7cT+yH5dP9ZV+ p/4Kfd1/sj9vTPl1lH9n/p3/ANb/AHo+fXk/supC/qi/334HuvWuuz9R/sfamD+2/Ppqf/P12Pp/ yGf96h9qU+EdJR1nX6t/rf8AXMe1Z6s/HrPF/mH/AOWj/wDWmb3rqnXL+1F/08/3r37r3XKP9cn/ AC0i/wB7b37r3Xp/1L/y3/65we1af2f5dNt/Y/l1IX/iYv8ArcPbnTaf2J+3rGP8yf8Ag0f/ABHv 3Ves0H+aP/IP/Ee9dMt8R6cqT6Sf68Xtx+PRiOo1R/uz3Tr3XA/5wf77+vv3SX/Qf9Xp10P1P/wV /wDej791uD/J1Yr/ACk/+3lHw6/8THhP/cTI+whz9/ypvMX/ADzN/hHR9sf/ACV9v/5qDr6hu2f8 7F/rr7w4tv8AcgdTG39kPs61u/ll/wBlZd+/+JCyH/uBi/eUPLX/ACr2z/8ANAdRBu//ACVr/wD5 qnoueS/zEv8AwUf9DJ7PPXouPH8ui2b8/wCA0v8AwR/97Pu/p0xJw6IX2P8A5yX/AIM/+9P72vSJ /Pon2c/z83/LRv8Aej7t5daHw9Iqv/zL/wDBf+IX3ry62OJ6Q8v+db/p1/0Mvup4/t62eHRuvgb/ ANlmfG//AMSCn/uhzPsm5g/5IO7/APNBv8HRxy3/AMl/Z/8AmuvV9XyD/Xkf9ef/AK2e40X+zj+w f4OpLm/tJP8ATHrVn37/ANlN9h/+HlU/9aqP3kRyP/yT9k/5pD/Ceok5g/3Luv8ATH/D1vLfypf+ PCx//aqp/wDe4vea95/yRdt/P/L1iVvP/JUn+zo/Py9/5lbuT/tVVP8A1qHunLv+5Z/Lojuv7WDr 57Hzm/5mTmP+W1T/ANbJfcb+6v8AyVD/AKvTrIHk/wD3A/1fLqtOt/Wv/B0/67e8edw/zdSrZcG6 Z5/+Arf8GP8AvZ9ll5/uNafYOlUX9qeoh/Q3+vF7JulPWNf1J/rp/wBax7917rHH9H/4PH/vXv3X uuK/WL/g/wDxA9+683FusUf1/wBiv/E+6Pw/Prw65P8ApT/g/wDxA9+fh+fXh1h/1f8AwWP/AIn2 11vrzfpX/ffmD37r3WSf9a/8Hj/6K93fj14dRm/zcn+v/wBEz+6de66/69+/de6yyfU/8EH+9t79 17rsf5xf+W0f/Qs3v3XuvH9b/wCx/wChB7917odOr/8Ajxu3P+1XiP8Aesl7G3Ln/JE5j/5oxf8A WXoMb/8A8lTZv+a0vQDj/Of9O/8ArjD7BPQn68P1n/g0f+9j37r3XH/r57917rIv6ZP+QP8Arb79 17rD/wBHf9cffuvdf//Z --oVRejI1DFODqd8kef=_lcffDxK9JFrLHTM-- From david@fromorbit.com Thu Mar 31 19:43:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C5B387CA3 for ; Thu, 31 Mar 2016 19:43:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2B64CAC003 for ; Thu, 31 Mar 2016 17:43:15 -0700 (PDT) X-ASG-Debug-ID: 1459471264-04cbb07ad6189250001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 7AKpv8OktG5cdBVl for ; Thu, 31 Mar 2016 17:41: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: A2AvDwC5wv1WPDGaLHldgzNTfY04mUAMAQEBAQEBBowSiXIlhWICAgEBAoFGTQEBAQEBAQcBAQEBQkCEQQEBAQMBOhwjBQsIAxgJJQ8FJQMHGhOIHwcPw1MBCx4ZhT2FDoQmhW4Fh2iHEYh5hXOFXoItgXAXh16FMo8WhF0oMAEBA4hoAQEB Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail06.adl2.internode.on.net with ESMTP; 01 Apr 2016 11:03:01 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aln1I-0000Xt-3B; Fri, 01 Apr 2016 11:33:00 +1100 Date: Fri, 1 Apr 2016 11:33:00 +1100 From: Dave Chinner To: "J. Bruce Fields" Cc: Andreas Dilger , Christoph Hellwig , "Darrick J. Wong" , xfs@oss.sgi.com, linux-fsdevel , linux-btrfs , linux-api@vger.kernel.org Subject: Re: fallocate mode flag for "unshare blocks"? Message-ID: <20160401003300.GS11812@dastard> X-ASG-Orig-Subj: Re: fallocate mode flag for "unshare blocks"? References: <20160302155007.GB7125@infradead.org> <20160330182755.GC2236@birch.djwong.org> <20160331011813.GJ30721@dastard> <20160331075440.GA4209@infradead.org> <20160331111850.GP11812@dastard> <20160331180821.GD22462@fieldses.org> <779E9BCF-8224-44FE-8AAE-E0341A7B475C@dilger.ca> <20160331222023.GR11812@dastard> <20160331223417.GA24069@fieldses.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160331223417.GA24069@fieldses.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1459471264 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28351 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Mar 31, 2016 at 06:34:17PM -0400, J. Bruce Fields wrote: > On Fri, Apr 01, 2016 at 09:20:23AM +1100, Dave Chinner wrote: > > On Thu, Mar 31, 2016 at 01:47:50PM -0600, Andreas Dilger wrote: > > > On Mar 31, 2016, at 12:08 PM, J. Bruce Fields wrote: > > > > > > > > On Thu, Mar 31, 2016 at 10:18:50PM +1100, Dave Chinner wrote: > > > >> On Thu, Mar 31, 2016 at 12:54:40AM -0700, Christoph Hellwig wrote: > > > >>> On Thu, Mar 31, 2016 at 12:18:13PM +1100, Dave Chinner wrote: > > > >>>> On Wed, Mar 30, 2016 at 11:27:55AM -0700, Darrick J. Wong wrote: > > > >>>>> Or is it ok that fallocate could block, potentially for a long time as > > > >>>>> we stream cows through the page cache (or however unshare works > > > >>>>> internally)? Those same programs might not be expecting fallocate to > > > >>>>> take a long time. > > > >>>> > > > >>>> Yes, it's perfectly fine for fallocate to block for long periods of > > > >>>> time. See what gfs2 does during preallocation of blocks - it ends up > > > >>>> calling sb_issue_zerout() because it doesn't have unwritten > > > >>>> extents, and hence can block for long periods of time.... > > > >>> > > > >>> gfs2 fallocate is an implementation that will cause all but the most > > > >>> trivial users real pain. Even the initial XFS implementation just > > > >>> marking the transactions synchronous made it unusable for all kinds > > > >>> of applications, and this is much worse. E.g. a NFS ALLOCATE operation > > > >>> to gfs2 will probab;ly hand your connection for extended periods of > > > >>> time. > > > >>> > > > >>> If we need to support something like what gfs2 does we should have a > > > >>> separate flag for it. > > > >> > > > >> Using fallocate() for preallocation was always intended to > > > >> be a faster, more efficient method allocating zeroed space > > > >> than having userspace write blocks of data. Faster, more efficient > > > >> does not mean instantaneous, and gfs2 using sb_issue_zerout() means > > > >> that if the hardware has zeroing offloads (deterministic trim, write > > > >> same, etc) it will use them, and that will be much faster than > > > >> writing zeros from userspace. > > > >> > > > >> IMO, what gfs2 is definitely within the intended usage of > > > >> fallocate() for accelerating the preallocation of blocks. > > > >> > > > >> Yes, it may not be optimal for things like NFS servers which haven't > > > >> considered that a fallocate based offload operation might take some > > > >> time to execute, but that's not a problem with fallocate. i.e. > > > >> that's a problem with the nfs server ALLOCATE implementation not > > > >> being prepared to return NFSERR_JUKEBOX to prevent client side hangs > > > >> and timeouts while the operation is run.... > > > > > > > > That's an interesting idea, but I don't think it's really legal. I take > > > > JUKEBOX to mean "sorry, I'm failing this operation for now, try again > > > > later and it might succeed", not "OK, I'm working on it, try again and > > > > you may find out I've done it". > > > > > > > > So if the client gets a JUKEBOX error but the server goes ahead and does > > > > the operation anyway, that'd be unexpected. > > > > > > Well, the tape continued to be mounted in the background and/or the file > > > restored from the tape into the filesystem... > > > > Right, and SGI have been shipping a DMAPI-aware Linux NFS server for > > many years, using the above NFSERR_JUKEBOX behaviour for operations > > that may block for a long time due to the need to pull stuff into > > the filesytsem from the slow backing store. Best explanation is in > > the relevant commit in the last published XFS+DMAPI branch from SGI, > > for example: > > > > http://oss.sgi.com/cgi-bin/gitweb.cgi?p=xfs/xfs.git;a=commit;h=28b171cf2b64167826474efbb82ad9d471a05f75 > > I haven't looked at the code, but I assume a JUKEBOX-returning write to > an absent file brings into cache the bits necessary to perform the > write, but stops short of actually doing the write. Not exactly, as all subsequent read/write/truncate requests will EJUKEBOX until the absent file has been brought back onto disk. Once that is done, the next operation attempt will proceed. > That allows > handling the retried write quickly without doing the wrong thing in the > case the retry never comes. Essentially. But if a retry never comes it means there's either a bug in the client NFS implementation or the client crashed, in which case we don't really care. > Implementing fallocate by returning JUKEBOX while still continuing the > allocation in the background is a bit different. Not really. like the HSM case we don't really care if a retry occurs or not - the server simply needs to reply NFSERR_JUKEBOX for all subsequent read/write/fallocate/truncate operations on that inode until the fallocate completes... i.e. it requires O_NONBLOCK style operation for filesystem IO operations to really work correctly, and for the above patchset that is added by the DMAPI layer through the hooks added into the IO paths here: http://oss.sgi.com/cgi-bin/gitweb.cgi?p=xfs/xfs.git;a=commitdiff;h=87e98fb84c235a45fc5dea6fced8c6bd9e534234 i.e. recall status was tracked externally to the filesystem and obeyed non-blocking flags on the filp. hence when the NFSD called into the fs with O_NONBLOCK set, the dmapi hook would return EAGAIN if there was a recall in progress on the range the IO was going to be issued on... > I guess it doesn't matter as much in practice, since the only way you're > likely to notice that fallocate unexpectedly succeeded would be if it > caused you to hit ENOSPC elsewhere. Is that right? Still, it seems a > little weird. s/succeeded/failed/ and that statement is right. Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfields@fieldses.org Thu Mar 31 21:00:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 50AAE7CA1 for ; Thu, 31 Mar 2016 21:00:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 242A9304032 for ; Thu, 31 Mar 2016 19:00:08 -0700 (PDT) X-ASG-Debug-ID: 1459476006-04cb6c2462189920001-NocioJ Received: from fieldses.org (fieldses.org [173.255.197.46]) by cuda.sgi.com with ESMTP id Y6Q2mGTP16B8sObU for ; Thu, 31 Mar 2016 19:00:06 -0700 (PDT) X-Barracuda-Envelope-From: bfields@fieldses.org X-Barracuda-Apparent-Source-IP: 173.255.197.46 Received: by fieldses.org (Postfix, from userid 2815) id EF54EC56; Thu, 31 Mar 2016 22:00:05 -0400 (EDT) Date: Thu, 31 Mar 2016 22:00:05 -0400 From: "J. Bruce Fields" To: Dave Chinner Cc: Andreas Dilger , Christoph Hellwig , "Darrick J. Wong" , xfs@oss.sgi.com, linux-fsdevel , linux-btrfs , linux-api@vger.kernel.org Subject: Re: fallocate mode flag for "unshare blocks"? Message-ID: <20160401020005.GA25132@fieldses.org> X-ASG-Orig-Subj: Re: fallocate mode flag for "unshare blocks"? References: <20160302155007.GB7125@infradead.org> <20160330182755.GC2236@birch.djwong.org> <20160331011813.GJ30721@dastard> <20160331075440.GA4209@infradead.org> <20160331111850.GP11812@dastard> <20160331180821.GD22462@fieldses.org> <779E9BCF-8224-44FE-8AAE-E0341A7B475C@dilger.ca> <20160331222023.GR11812@dastard> <20160331223417.GA24069@fieldses.org> <20160401003300.GS11812@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160401003300.GS11812@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: fieldses.org[173.255.197.46] X-Barracuda-Start-Time: 1459476006 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.30 X-Barracuda-Spam-Status: No, SCORE=0.30 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, NO_OBLIGATION X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28352 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.30 NO_OBLIGATION BODY: There is no obligation 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Apr 01, 2016 at 11:33:00AM +1100, Dave Chinner wrote: > On Thu, Mar 31, 2016 at 06:34:17PM -0400, J. Bruce Fields wrote: > > I haven't looked at the code, but I assume a JUKEBOX-returning write to > > an absent file brings into cache the bits necessary to perform the > > write, but stops short of actually doing the write. > > Not exactly, as all subsequent read/write/truncate requests will > EJUKEBOX until the absent file has been brought back onto disk. Once > that is done, the next operation attempt will proceed. > > > That allows > > handling the retried write quickly without doing the wrong thing in the > > case the retry never comes. > > Essentially. But if a retry never comes it means there's either a > bug in the client NFS implementation or the client crashed, NFS clients are under no obligation to retry operations after JUKEBOX. And I'd expect them not to in the case the calling process was interrupted, for example. > > I guess it doesn't matter as much in practice, since the only way you're > > likely to notice that fallocate unexpectedly succeeded would be if it > > caused you to hit ENOSPC elsewhere. Is that right? Still, it seems a > > little weird. > > s/succeeded/failed/ and that statement is right. Sorry, I didn't explain clearly. The case I was worrying about was the case were the on-the-wire ALLOCATE call returns JUKEBOX, but the server allocates anyway. That behavior violates the spec as I understand it. The client therefore assumes there was no allocation, when in fact there was. So, technically a bug, but I wondered if it's likely to bite anyone. One of the only ways it seems someone would notice would be if it caused the filesystem to run out of space earlier than I expected. But perhaps that's unlikely. --b. From sandeen@sandeen.net Thu Mar 31 21:05:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C15817CA2 for ; Thu, 31 Mar 2016 21:05:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 88FE1304032 for ; Thu, 31 Mar 2016 19:05:14 -0700 (PDT) X-ASG-Debug-ID: 1459476306-04cb6c245f189ae0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id XzPounrAgn7SdhQv for ; Thu, 31 Mar 2016 19:05:06 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 86EAC56A for ; Thu, 31 Mar 2016 21:05:05 -0500 (CDT) Subject: Re: [PATCH 03/19] mkfs: Sanitise the superblock feature macros To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 03/19] mkfs: Sanitise the superblock feature macros References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-4-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: <56FDD750.3040002@sandeen.net> Date: Thu, 31 Mar 2016 21:05:04 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.1 MIME-Version: 1.0 In-Reply-To: <1458818136-56043-4-git-send-email-jtulak@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1459476306 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28352 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > From: Dave Chinner > > UPDATE > o disable finobt when crc=0 no matter if user used -m finobt=X > o split line > 80 chars > o remove unused variable > o add omitted finobtflag > o change variables in spinodes case to look like surrounding code > o add I_ALIGN reqval Just FYI - generally, the patch changelog goes below the "---" so it doesn't end up as part of the changelog in git. ... (sorry for being late to the review party btw...) > } else { > /* > * The kernel doesn't currently support crc=0,finobt=1 > - * filesystems. If crcs are not enabled and the user has > - * explicitly turned them off then silently turn them off > - * to avoid an unnecessary warning. If the user explicitly > - * tried to use crc=0,finobt=1, then issue a warning before > - * turning them off. > + * filesystems. If crcs are not enabled and the user has not > + * explicitly turned finobt on, then silently turn it off to > + * avoid an unnecessary warning. If the user explicitly tried > + * to use crc=0,finobt=1, then issue a warning before turning > + * them off. > */ > - if (finobt && finobtflag) { > - fprintf(stderr, > -_("warning: finobt not supported without CRC support, disabled.\n")); > + if (sb_feat.finobt){ > + if (sb_feat.finobtflag) { > + fprintf(stderr, > + _("warning: finobt not supported without CRC support, disabled.\n")); > + } > + sb_feat.finobt = 0; > } > - finobt = 0; > } Is there any other case in mkfs where options are automatically disabled? I don't think so .. I'd just prefer a failure here, not a fix-up, even with the warning. But I guess that's how it was before, so probably not something to change in this patch. So never mind. :) But, do we need the extra indentation? if (sb_feat.finobt && sb_feat.finobtflag) { fprintf(stderr, _("warning: finobt not supported without CRC support, disabled.\n")); } sb_feat.finobt = 0; would suffice as before, no? Meh. Not a big deal I guess.... > @@ -2962,7 +3038,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), > /* > * Free INO btree root block > */ > - if (!finobt) { > + if (!sb_feat.finobt){ ^ please fix whitespace :) > xfs_perag_put(pag); > continue; > } > From dchinner@redhat.com Thu Mar 31 21:44:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8A2427CA2 for ; Thu, 31 Mar 2016 21:44:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4C969304032 for ; Thu, 31 Mar 2016 19:44:19 -0700 (PDT) X-ASG-Debug-ID: 1459478657-04cb6c245f18a5d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Mo1s320MPi3ROne7 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 31 Mar 2016 19:44:18 -0700 (PDT) X-Barracuda-Envelope-From: dchinner@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8DAFA63142; Fri, 1 Apr 2016 02:44:17 +0000 (UTC) Received: from devil.localdomain (ovpn-113-67.phx2.redhat.com [10.3.113.67]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u312iFPX022218 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 31 Mar 2016 22:44:17 -0400 Received: from dchinner by devil.localdomain with local (Exim 4.76) (envelope-from ) id 1alp4H-0003GH-Qo; Fri, 01 Apr 2016 13:44:13 +1100 Date: Fri, 1 Apr 2016 13:44:13 +1100 From: Dave Chinner To: Joe Lawrence Cc: xfs@oss.sgi.com Subject: Re: list_add corruption after "xfs: mode di_mode to vfs inode" Message-ID: <20160401024413.GB2072@devil.localdomain> X-ASG-Orig-Subj: Re: list_add corruption after "xfs: mode di_mode to vfs inode" References: <56FC9FA6.1080700@stratus.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56FC9FA6.1080700@stratus.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Fri, 01 Apr 2016 02:44:17 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1459478658 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Mar 30, 2016 at 11:55:18PM -0400, Joe Lawrence wrote: > Hi Dave, > > Upon loading 4.6-rc1, I noticed a few linked list corruption messages in > dmesg shortly after boot up. I bisected the kernel, landing on: > > [c19b3b05ae440de50fffe2ac2a9b27392a7448e9] xfs: mode di_mode to vfs inode > > If I revert c19b3b05ae44 from 4.6-rc1, the warnings stop. > > WARNING: CPU: 35 PID: 6715 at lib/list_debug.c:29 __list_add+0x65/0xc0 > list_add corruption. next->prev should be prev (ffff882030928a00), but was ffff88103f00c300. (next=ffff88100fde5ce8). ..... > [] ? bdev_test+0x20/0x20 > [] __list_add+0x65/0xc0 > [] bd_acquire+0xc8/0xd0 > [] blkdev_open+0x39/0x70 > [] do_dentry_open+0x227/0x320 > [] ? blkdev_get_by_dev+0x50/0x50 > [] vfs_open+0x57/0x60 > [] path_openat+0x1ba/0x1340 > [] do_filp_open+0x91/0x100 > [] ? __alloc_fd+0x46/0x180 > [] do_sys_open+0x124/0x210 > [] SyS_open+0x1e/0x20 > [] do_syscall_64+0x62/0x110 > [] entry_SYSCALL64_slow_path+0x25/0x25 .... > According to the bd_acquire+0xc8 offset, we're in bd_acquire() > attempting the list add: .... > 713 bdev = bdget(inode->i_rdev); > 714 if (bdev) { > 715 spin_lock(&bdev_lock); > 716 if (!inode->i_bdev) { > 717 /* > 718 * We take an additional reference to bd_inode, > 719 * and it's released in clear_inode() of inode. > 720 * So, we can access it via ->i_mapping always > 721 * without igrab(). > 722 */ > 723 bdgrab(bdev); > 724 inode->i_bdev = bdev; > 725 inode->i_mapping = bdev->bd_inode->i_mapping; > 726 list_add(&inode->i_devices, &bdev->bd_inodes); So the bdev->bd_inodes list is corrupt, and this call trace is just the messenger. > crash> ps -a | grep mdadm > ... > PID: 6715 TASK: ffff882033ac2d40 CPU: 35 COMMAND: "mdadm" > ARG: /sbin/mdadm --detail --export /var/opt/ft/osm/osm_temporary_md_device_node > ... > > I traced the proprietary-driver-dependent user program to figure out > what it was doing and boiled that down to a repro that hits the same > corruption when running *stock* 4.6-rc1. (Note /tmp is hosted on an > XFS volume): > > -- > > MD=/dev/md1 > LOOP_A=/dev/loop0 > LOOP_B=/dev/loop1 > TMP_A=/tmp/diska > TMP_B=/tmp/diskb > > echo > echo Setting up ... > > dd if=/dev/zero of=$TMP_A bs=1M count=200 > dd if=/dev/zero of=$TMP_B bs=1M count=200 > losetup $LOOP_A $TMP_A > losetup $LOOP_B $TMP_B > > mdadm --create $MD \ > --metadata=1 \ > --level=1 \ > --raid-devices=2 \ > --bitmap=internal \ > $LOOP_A $LOOP_B > > MAJOR=$(stat -c %t $MD) > MINOR=$(stat -c %T $MD) > > echo > echo Testing major: $MAJOR minor: $MINOR ... > > for i in {0..100}; do > mknod --mode=0600 /tmp/tmp_node b $MAJOR $MINOR > mdadm --detail --export /tmp/tmp_node > rm -f /tmp/tmp_node > done > > echo > echo Cleanup ... > > mdadm --stop $MD > losetup -d $LOOP_A $LOOP_B > rm -f $TMP_A $TMP_B > > echo > echo Done. > > -- > > I'm not really sure why the bisect landed on c19b3b05ae44 "xfs: mode > di_mode to vfs inode", but as I mentioned, reverting it made the list > warnings go away. Neither am I at this point as it's the bdev inode (not an xfs inode) that has a corrupted list. I'll have to try to reproduce this. Cheers, Dave. -- Dave Chinner dchinner@redhat.com